2 tane 16f877a yı rf (seri) haberleştirme

mhmt23

Üye
Katılım
23 Şub 2010
Mesajlar
1
Puanları
1
Yaş
35
Arkadaşlar öncelikle merhabalar, sizlere bir konu hakkında sorum olacak. Şöyleki iki tane pici seri olarak haberleştiriyorum daha sonrasında ise rc6 ve rc7 pinlerine verici alıcı koyacağım. Programda 74hc595 ile display sürüyorum. Problemim şu ben geriye doğru sayıcı yapıyorum. Örneğin 40 dan başlayarak sayıyor. Kesme kullanmadan alıcı tarafında main fonksiyonu içerisinde dediğim karakter birinci picten gelmiş ise işlem başlıyor. Ayrıca birinci picteki bir başka buton ise yine başka bir displayi birer birer artırıyor (Bunu da int_rda kesmesi içerisinde yapıyorum). Geriye doğru sayan displayler sıfır olunca program sanki resetlenmiş gibi oluyor ve ikinci dediğim yani birer birer artan display kaldığı yerden devam etmiyor ve tekrar birden başlıyor. Alıcı tarafın kodu aşağıdaki gibidir.
ALICI:
.........
void sifir() {output_d(0b000);output_d(0b001);output_d(0b000);output_d(0b100);output_d(0b000);}
void bir() {output_d(0b000);output_d(0b010);output_d(0b011);output_d(0b010);output_d(0b110);output_d(0b010);output_d(0b000);}


void asifir() {output_b(0b000);output_b(0b001);output_b(0b000);output_b(0b100);output_b(0b000);}
void abir() {output_b(0b000);output_b(0b010);output_b(0b011);output_b(0b010);output_b(0b110);output_b(0b010);output_b(0b000);}

void display_gonder()
{
switch(deger)
{
case 0: sifir(); sifir(); bir(); bir(); bir(); bir(); bir(); bir(); break;
case 1: sifir(); sifir(); sifir(); sifir(); sifir(); bir(); bir(); sifir(); break;
case 2: sifir(); bir(); sifir(); bir(); bir(); sifir(); bir(); bir(); break;
case 3: sifir(); bir(); sifir(); sifir(); bir(); bir(); bir(); bir(); break;
case 4: sifir(); bir(); bir(); sifir(); sifir(); bir(); bir(); sifir(); break;
case 5: sifir(); bir(); bir(); sifir(); bir(); bir(); sifir(); bir(); break;
case 6: sifir(); bir(); bir();bir(); bir(); bir(); sifir(); bir(); break;
case 7: sifir(); sifir(); sifir(); sifir(); sifir(); bir(); bir(); bir(); break;
case 8: sifir(); bir(); bir(); bir(); bir(); bir(); bir(); bir(); break;
case 9: sifir(); bir(); bir(); sifir(); bir(); bir(); bir(); bir(); break;
}
}

void display_gonder_A()
{
switch(adeger)
{
case 0: asifir(); asifir(); abir(); abir(); abir(); abir(); abir(); abir(); break;
case 1: asifir(); asifir(); asifir(); asifir(); asifir(); abir(); abir(); asifir(); break;
case 2: asifir(); abir(); asifir(); abir(); abir(); asifir(); abir(); abir(); break;
case 3: asifir(); abir(); asifir(); asifir(); abir(); abir(); abir(); abir(); break;
case 4: asifir(); abir(); abir(); asifir(); asifir(); abir(); abir(); asifir(); break;
case 5: asifir(); abir(); abir(); asifir(); abir(); abir(); asifir(); abir(); break;
case 6: asifir(); abir(); abir();abir(); abir(); abir(); asifir(); abir(); break;
case 7: asifir(); asifir(); asifir(); asifir(); asifir(); abir(); abir(); abir(); break;
case 8: asifir(); abir(); abir(); abir(); abir(); abir(); abir(); abir(); break;
case 9: asifir(); abir(); abir(); asifir(); abir(); abir(); abir(); abir(); break;
}
}

.....

void main()
{
enable_interrupts(global);
enable_interrupts(int_rda);
while(1)
{
if(a=='C') // C karakteri gelmişse birinci display sayi değişkeninden başlıyarak geriye doğru sayar
{
birler=sayi;
onlar=(sayi/10);
deger=birler;
display_gonder();
deger=onlar;
display_gonder();
output_d(0b100); output_d(0b000);//kilit
delay_ms(100);
sayi--;
if(sayi==-1)
{
output_d(0x00);
break;
}
}

}

#int_rda
void seri_veri_geldi()
{
a=getc();
if(a=='A') // A karakteri gelmisse displayi bir artırır.
{
aKisi++;
aBirler=aKisi;
aOnlar=(aKisi/10);
adeger=aBirler;
display_gonder_A();
adeger=aOnlar;
display_gonder_A();
output_b(0b100); output_b(0b000);//kilit
sayi=40;
}
}

Program kodu bu şekilde arkadaşlar. Süre geriye doğru saymaya başlayınca sürenin herhangi bir anında A karakterini gönderiyorum. Bunu bu şekilde 10 defa yapsamda sıkıntı yok. Ama Süre sıfır olunca sanki herşey resetleniyor tüm değişkenler ilk haline dönüyor ve doğal olarak ikinci display 1 den başlıyor artmaya kaldığı yerden değil :( yardımcı olabilirseniz sevinirim. Teşekkürler...
 
74hc595 shift register entegresidir. 8 çıkışı vardır her çıkış başına 100ma verebilir. segmentlerin kaç ma çekiyor. yada her segment için ayrı direnç kullanıyormusun. (kullanman gerekli) bütün digiterin sıfır olduğunda neredeyse bütün segmentler yanıyor ve total akım artıyor. piclere vcc ile vss arasına 100uf ve 74hc595 in vcc ile gnd arasına 100nf bağlar isen sorun çözülecektir.

tahminim anlık akım çekilmesi sonucu bir ripple oluşuyor ve picin resetleniyor.

bunu bi dene olmazsa başka bir çözüm var.



not : ayrıca seri haberleşmeyi tamamladığında aynı kod ile rf haberleşmiycektir.haberleşsede arada bir sorun olcaktır.rf te preamble ve senkron karakteri chcksum gerekli ondada yardım ederim.


kolay gelsin
 

Forum istatistikleri

Konular
128,126
Mesajlar
915,255
Kullanıcılar
449,842
Son üye
hpysu

Yeni konular

Geri
Üst