Micro C döngü sorunu

kaijax

Üye
Katılım
19 Ocak 2009
Mesajlar
2
Puanları
1
Yaş
39
Ilk once yapmak stedigim ile baslayayim.

elimde 9 button var ve hepsi ayri bir ID icin.

1. button a basildiginda pic seri porta "1111"
2. button a basildiginda pic seri porta "2222"
.
.
.
.

9. button a basildiginda pic seri porta "9999"

ID'lerini gonderiyor ve bilgisayardaki arayüz programı ID'leri alarak database eslestirmesi yapıyor vs vs...

dolayisi ile pic buttonlarin basili olup olmadigini kontrol edip ona gore seri porta data gondermeli.

Ilk olarak interrupt ile yapmak istedim fakat 16f877'nin interrup icin kullanabilecegim 4 pini oldugunu ogrenince vazgecip primitif yontemlere basvurdum.

Basit bir If dongusu ile olabilecegini dusundum ama yanildim..

Yazdigim kod :

while(1) {
if (PORTB.F0 == 1 )
{ Usart_Str("1111");
}
if (PORTB.F1 == 1 )
{ Usart_Str("2222");
}
if (PORTB.F2 == 1 )
{ Usart_Str("3333");

ile baslayip devam ediyor.

1. button a bastigimda 1111 datasi gidiyor ama dongu sonsuz oldugu icin ben button'u kapatana kadar onlarca kez gonderiyor. Sonsuz dongu olmadan da button durumunu devamli test edemiyorum.

Benim istedigim sadece 1 kere gondermesi. Saatlerce ekrana bakip dusundum ama bunu yapacak bir yontem aklima gelmedi ve interrupt'a yonelmeyi dusundum.

Interrupt kullanmadan duzeltme onerisi yapacak olan arkadaslara simdiden sonsuz tesekkur ediyorum..
 
Hic Pic bilmiyorum ancak belki bir yardimi dokunur:

if (PORTB.F0 == 1)
{
if (B1 == 0)
{
Usart_Str("1111");
B1=1;
}
}else{B1=0;}
......

Seklinde olabilir belki.
B1 herhangi bir degisken.

Ayrica 4 tane pini vardir fakat sana bir tane pin yeter su durumda. Herhangi bir butona basildiginda bu interrupt rutini portu okur ve cikisini verir. Yani senin while dongusunun yerine interrupt kullanmis olursun....
 
Her pin icin ayri bir interrupt gerekiyor sanirim. Her button icin ayri bir ID oldugu icin hepsi icin ayri interrupt subroutin gerekiyor. Dolayisi ile 9 interrupt pin gerekiyor.

Ayrica verdigin ornek ayni button'a 1 kere basarsak gecerli oluyor sanirim. 2. kez ayni button'a bastigimda B=1 oldugu icin Usart_Str islevini gerceklestiremeyecek.
 
Her pin icin ayri bir interrupt gerekiyor sanirim. Her button icin ayri bir ID oldugu icin hepsi icin ayri interrupt subroutin gerekiyor. Dolayisi ile 9 interrupt pin gerekiyor.

Ayrica verdigin ornek ayni button'a 1 kere basarsak gecerli oluyor sanirim. 2. kez ayni button'a bastigimda B=1 oldugu icin Usart_Str islevini gerceklestiremeyecek.

Dikkatli bakarsan

"else{B1=0;}"

seklinde bir satirimiz var. Yani butonu biraktiginda B1 sifir olur ve birdahaki basisin icin hazirdir.

En iyisi sen interrupt kullanma.
 
Her pin icin ayri bir interrupt gerekiyor sanirim. Her button icin ayri bir ID oldugu icin hepsi icin ayri interrupt subroutin gerekiyor. Dolayisi ile 9 interrupt pin gerekiyor.
interrupt kullanmana gerek yok.. basit şekilde nasıl yapman gerektiğini yazacam syntax ı sen düzeltirsin..

Kod:
while(1)
{
   if (PORTB.F0==1)
   {
      data=1111;
   }
   else if (PORTB.F1==1)
   {
      data=2222;
   }
   .
   .
   .
   .   
   .

    if(data!=previous_data)
   {
      previous_data=data;
      usart_write(data);
   }
}

kodun sonundaki bu kısım sadece bi kere data gonderiyor
Kod:
 if(data!=previous_data)
   {
      previous_data=data;
      usart_write(data);
   }

previous_data'ya ve data'ya mainde birbirine eşit initial değerler atamalısın..

anlayamadığın veya takıldığın biyer olursa yardımcı olabilrim

kolay gelsin

not: bu yazdığımı denemedim kafadan yazdım hata çıkabilr hata çıkarsa haber verirsin..
 
@kaijax,

Ilk olarak interrupt ile yapmak istedim fakat 16f877'nin interrup icin kullanabilecegim 4 pini oldugunu ogrenince vazgecip primitif yontemlere basvurdum.

4'ten fazla Buton için de interrupt kullanabilirsin,

Butonlarının birer ucunu gnd'a , çıkış uçlarını istediğin pic pinlerine bağla

tüm butonların çıkış uçlarını aynı zamanda 10r dirençlerle rb.0 interrupt pinine bağla

rb.0 pinini 10 k dirençle pull-up yap

rb.0 interrupt'ını kur

böylece herhangi bir butona basıldığında interrupt oluşur

int. alt programında buton kontrollerini yap, hangi butona basıldığını bul, o butona ait işlemi yap


kolay gelsin
 
Sn tyildizak ustam söylediğiniz olay mantıklı bir olay olmasına rağmen konuyu birde şema ile aydınlatabilirmisiniz ?
 
sn. Has_Artvinli;

Şöyle: Önce bildik ext. kesme kurulur (rb.0 kesmesi), kesme rutininde (henüz buton basılı iken) portb 1-7 test edilir ve basılan buton saptanır.


(diyotlar yerine uygun değerlerde dirençler de kullanılabilir, denemek gerek, ilk mesajdaki 10r değeri hatalı)
 

Forum istatistikleri

Konular
128,220
Mesajlar
915,906
Kullanıcılar
450,007
Son üye
harunppp

Yeni konular

Geri
Üst