Dış kesme sayma işlemi (ext_interrupt-->counter)

Başlatan mechanicalengine, 21 Nisan 2014, 10:38:47

mechanicalengine

Arkadaşlar merhaba;

Kullandığım dış kesmeyi (RB0 --> ext-interrupt) saydırmak istiyorum. Hangi yöntemleri kullanabileceğim konusunda yardımcı olabilir misiniz?

Yapmak istedğim sekiz dış kesme meydana gelince kesme ile yakmakta olduğum B1 ledini söndürüp B3 ledini yakmak. Kesme işlemi ile program başlangıcında yanmakta olan B2 ledi söndürülüp B1 ledi yakılıyor.

Ana program:       output_high(pin_b2)

Kesme programı: output_low(pin_b2)
                          output_high(pin_b1)

Sekiz kesme oluşunca: output_low(pin_b1)
                                  output_low(pin_b2)
                                  output_high(pin_b3)

yapmak istiyorum.

Yardımınız için şimdiden çok teşekkürler.

esensoy

bir tane global değişken tanımlayıp her kesmede bir artıracaksın, akabinde de 8 oldu mu kontrol edeceksin,
bakmadan yazdım, syntax hataları olabilir;
int i=0;
#int_ext0
void kesme(void){
   if (i>7){
      output_low(pin_b1);
      output_low(pin_b2);
      output_high(pin_b3);
      i=0;
   }else{
      output_low(pin_b2);
      output_high(pin_b1);
   }
    i++;
}
void main(void){
enable_interrupts(INT_GLOBAL);
enable_interrupts(INT_EXT0);
while(1);
} 
En tehlikeli an "zafer" anıdır.

mechanicalengine

@esensoy hocam verdiğiniz bilgiler için çok teşekkürler. Kesme işlemi içerisinde delay komutunu kullanmanın kesmeye olumsuz etkisi var mıdır? Bu konuda bilginiz var ise paylaşabilirseniz çok sevinirim. Aşağıdaki gibi delay kullanmak programın çalışmasını olumsuz etkileyebilir mi?

int i=0;
#int_ext0
void kesme(void){
   if (i>7){
      output_low(pin_b1);
      output_low(pin_b2);
      output_high(pin_b3);
      delay_ms(3000);  //[b]delay komutu[/b]
      i=0;
   }else{
      output_low(pin_b2);
      output_high(pin_b1);
   }
    i++;
}
void main(void){
enable_interrupts(INT_GLOBAL);
enable_interrupts(INT_EXT0);
while(1);
} 


esensoy

Jargonda kesme içinde delay kullanılmaz, ama benim kullandığım yer de var, kullanmamaya özen gösterdiğim yer de var,
Siz 3 sn bekletmek istiyorsunuz, ccs ön tanımlı olarak kesmeye girerken diğer kesmeleri kapatıyordu diye hatırlıyorum,
yani orada 3 sn içinde ne olursa olsun programınız yanıt vermeyecek,

Bunun yerine ;
int i=0;
int1 bekle=false;
#int_ext0
void kesme(void){
   if (i>7){
      output_low(pin_b1);
      output_low(pin_b2);
      output_high(pin_b3);
      bekle=true;
      i=0;
   }else{
      output_low(pin_b2);
      output_high(pin_b1);
   }
    i++;
}
void main(void){
enable_interrupts(INT_GLOBAL);
enable_interrupts(INT_EXT0);
while(1){
   if (bekle==true){
      delay_ms(3000);
      bekle=false;
   }
}
} 
yapmak daha doğru olacaktır,
En tehlikeli an "zafer" anıdır.

mechanicalengine

@esensoy hocam  verdiğiniz bilgiler için çok teşekkürler.

Sebebinin ne olduğunu bilmiyorum fakat bende delay komutu kullanınca kesme çalıştı, bekle komutunu kullanınca kesme çalıştı fakat öteleme gerçekleşmedi. Size de bilgi vermek istedim. Ana program içindeki if(bekle=true); ise  dikkate alınmadı.

int i=0;
int1 bekle=false;
#int_ext
void kesme(void){
   if (i>7)
   {
      disable_interrupts(INT_EXT);
      disable_interrupts(GLOBAL);
      output_low(pin_b1);
      output_low(pin_b2);
      output_high(pin_b3);
      delay_ms(3000);
      i=0;
   }
   else
   {
      output_low(pin_b2);
      output_high(pin_b1);
      delay_ms(1000);
      output_low(pin_b1);
      output_high(pin_b2);
   }
   
    i++;
}