mhmt23
Üye
- Katılım
- 23 Şub 2010
- Mesajlar
- 1
- Puanları
- 1
- Yaş
- 36
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...
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...