Pic ile adc yada darbe sayici icin yardim edebilirmisiniz?

Abi ordamisin bilmiyorum ama musaitsen bi sorum olacakti iki gundur ugrasiyorum cozemedim bu isi. simdilik diger taraflarini hallettim. Abi benim picin herhangi bir bacagindan 5 bitlik bir veri okuyup bunu bir degiskene aktarmam gerekiyor. x = 11001 gibi. bunu ccs ile nasil yapabilirim? bu konuda bana yardimci olabilirmisin
 
Arkadaşın bugüne yetişmesi gereken projesi varmış.
Onu bitirelim, senin sorununla da ilgileneceğim.
 
Sana sıfırdan proje yaptım.
Aşağıdaki bağlantıdaki RAR dosyasının içinde hem CCS projesi var, hem de Proteus devresi.
Ortadaki butona basdığında, birinci PIC'in PORTB'deki durumu tek kablo üzerinden ikinci PIC'e gidiyor.
İkinci PIC'in PORTB'sine bağlanan LEDler sayesinde veriyi görebiliyorsun.



Kod:
//Verici Devre Yazılımı

#include <16f877A.h>
#fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOPUT, NOWRT, NODEBUG, NOCPD
#use delay (clock=4000000)

int1 BIT0, BIT1, BIT2, BIT3;
int1 BIT4, BIT5, BIT6, BIT7;
int8 Sending = 0x00;
int8 Temp = 0x00;

void main(void)
{
    set_tris_a(0x00);
    set_tris_b(0xFF);
    set_tris_e(0x01);
   
    while(1)
    {
        while(!input(PIN_E0));

        Sending = input_b();
       
        BIT0 = bit_test(Sending, 0);
        BIT1 = bit_test(Sending, 1);
        BIT2 = bit_test(Sending, 2);
        BIT3 = bit_test(Sending, 3);
        BIT4 = bit_test(Sending, 4);
        BIT5 = bit_test(Sending, 5);
        BIT6 = bit_test(Sending, 6);
        BIT7 = bit_test(Sending, 7);
       
        output_bit(PIN_A0, 1);                // Start biti gönderildi
        delay_ms(10);
        output_bit(PIN_A0, BIT0);            // Verinin 0. biti gönderildi
        delay_ms(10);
        output_bit(PIN_A0, BIT1);            // Verinin 1. biti gönderildi
        delay_ms(10);
        output_bit(PIN_A0, BIT2);            // Verinin 2. biti gönderildi
        delay_ms(10);
        output_bit(PIN_A0, BIT3);            // Verinin 3. biti gönderildi
        delay_ms(10);
        output_bit(PIN_A0, BIT4);            // Verinin 4. biti gönderildi
        delay_ms(10);
        output_bit(PIN_A0, BIT5);            // Verinin 5. biti gönderildi
        delay_ms(10);
        output_bit(PIN_A0, BIT6);            // Verinin 6. biti gönderildi
        delay_ms(10);
        output_bit(PIN_A0, BIT7);            // Verinin 7. biti gönderildi
        delay_ms(10);       
        output_bit(PIN_A0, 0);                // Stop biti gönderildi
    }
}

Kod:
//Alıcı Devre Yazılımı

#include <16f877A.h>
#fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOPUT, NOWRT, NODEBUG, NOCPD
#use delay (clock=4000000)

int1 BIT0, BIT1, BIT2, BIT3;
int1 BIT4, BIT5, BIT6, BIT7;

void main(void)
{
    set_tris_a(0x01);
    set_tris_b(0xFF);
    set_tris_e(0x00);
   
    while(1)
    {
        while(!input(PIN_A0));
       
        delay_ms(15);       
        BIT0 = input(PIN_A0);
        delay_ms(10);       
        BIT1 = input(PIN_A0);
        delay_ms(10);
        BIT2 = input(PIN_A0);
        delay_ms(10);
        BIT3 = input(PIN_A0);
        delay_ms(10);
        BIT4 = input(PIN_A0);
        delay_ms(10);
        BIT5 = input(PIN_A0);
        delay_ms(10);
        BIT6 = input(PIN_A0);
        delay_ms(10);
        BIT7 = input(PIN_A0);
       
        output_bit(PIN_B0, BIT0);
        output_bit(PIN_B1, BIT1);
        output_bit(PIN_B2, BIT2);
        output_bit(PIN_B3, BIT3);
        output_bit(PIN_B4, BIT4);
        output_bit(PIN_B5, BIT5);
        output_bit(PIN_B6, BIT6);
        output_bit(PIN_B7, BIT7);
       
        delay_ms(100);
    }
}
 
Abi cok sagol ise cikmistim cevap veremedim eline saglik abi. Bi sorum daha olcak abi :) verici devrenin gonderdigi sinyal su an butona basili tutuldugu zaman isleniyor. bunu butonu biraksakta gonderen; ornegin 110101 arasinda 100ms beklemeli gidiosa ve 300 msde buton birakilsa dahi 6 bitin tamamini gonderecek sekilde nasil ayarlariz? vaktini cok almak istemem kullanman gereken su seklinde bi cozum sunabilirsin abi (kullanmam gereken fonksiyon yada ozelligin ne oldugunu bilmedigim icin :) ) birde alici tarafinda bu bitleri bir stringe blok blok atayip onu karsilastirma isleminde kullanabilirmiyim? ornegin; str[6] = {'input(pin_a0)'} ikinci satirda if(str=="1101") gibi.
boyle detayli anlatmis gibi oldum ama nasil anlatacagimi bilmedigim icin bu sekilde anlattim abi yanlis anlasilmasin :)
 
Benim yaptığım devrede, düğmeye basılı tutmana gerek yok.
Birinci PIC'in E0 ucuna bir kereleğine lojik bir gelmesi yeterli.
E0 ucu lohik bir olduğu anda karşıdaki PIC'e veriyi göndermeye başlıyor.
İkinci PIC'teki karşılaştırma olayını yapabilirsin.
 
evet abi onu gordum bi kere basip cekince veri diger tarafta gorunuyor. demek istedigim basili tutunca degerler surekli degisiyor o da sanirim gecikmelerden kaynaklaniyor. birde alici tarafta alinan bitleri bir diziye nasil atarim abi nette baya aradim dizi islemleri var ama atama yapmiyor lcd de gosterdigim zaman acayip karakterler gorunuyo
 
O kadar olacak tabi, ben sana sonuçta bütün eksiklikleri ve kararsızlıkları giderilmiş bir proje vermedim. :)
Sadece mantığı anlaman açısında senin istediğini yapan ve çalışan bir proje oluşturdum. :)
O dediğin bitleri char dizisine çevirmeyi de internette bir inceleyeceğim.
 
:) cok saol abi yoruyorum senide, gonderdigin alici vericinin bi benzerini ben ext kesmesi ile yaptim dun gece ama stop bitinin mantigini kuramadigim icin oyle kaldi :) sevmesem su isleri sanirim bu kadar dayanamazdim sanirim iki gunde hic okumadigim kadar kitap okudum :)
 

Forum istatistikleri

Konular
129,720
Mesajlar
929,240
Kullanıcılar
452,436
Son üye
hekici

Yeni konular

Geri
Üst