CCS C RB0 Yükselen ve Düşen Kenar Kesmesi

Başlatan vitruvius, 30 Kasım 2014, 18:20:46

vitruvius

Merhaba,

PIC16F877 kullanarak int_ext kesmesi ile bir uygulama yapıyorum. Şu an yapmaya çalıştığım şey rb0'ın yükselen ve düşen kenarını ayrı ayrı tespit edip ona göre işlem yapmak. Yani rb0'a bağlı buton basıldığında led1 yanarken, bırakıldığında led2 yansın gibi düşünebiliriz.

ext_int_edge(H_TO_L)


ile kenar tetiklemesini seçebiliyoruz ama ben tersi durumda da işlem yapmak istiyorum. Bunu nasıl yapabilirim?

Teşekkürler.

omenek

#1
 #bit kesme_yonu = getenv("BIT:INTEDG0")         //0=düşen kenar 1=yükselen kenar 
#bit sinyal=portb.0

if(sinyal==0)                 //rb0 (sinyal)sıfıra gitmişse
       kesme_yonu=1;           //bir sonraki kesme 0 dan 1 e olacak
       else                    //sinyal 1 e doğru gitmişse
       kesme_yonu=0;           //bir sonraki kesme 1 den 0 a olacak

      yapılacak işleri buraya yaz.

vitruvius

Hocam

#bit kesme_yonu = getenv("BIT:INTEDG0")         //0=düsen kenar 1=yükselen kenar 


Burada "Expecting an identifier Bad SFR name" hatası veriyor. Devamında da

#bit sinyal = portb.0


Bunda "Expecting a .", "Expecting a declaration" ve "Expecting a (" hataları veriyor. INTEDG ile oynamak benim de aklıma gelmişti ama nasıl yapıldığını bilmiyorum.

Derlenmiş bir kod var mı? Dediğim gibi çok basit bir örnek de olabilir.

Teşekkürler.

Salih

İlgili kesmeyi aktif ettik den sonra ihtiyaca göre;
Düşen kenar algılamak için aşağıdaki komutu çalıştırın.

ext_int_edge(H_TO_L)


Yükselen kenar için ise

ext_int_edge(L_TO_H)

ferdem

Herhangi bir anda ya yükselen ya da düşen kenar gelebilir. Açılışta örneğin yükselen kenarı bekleyerek başlasın, yükselen kenar geldiğinde kesmeye gidecek, kesme içinde led yakma vs. işinin yanısıra artık düşen kenarı bekle(ext_int_edge(H_TO_L)) demeniz gerekir.
Özetle; her kesme programına dallandığında hangi yön tetiklediyse tersi yönde tetikleme kurulur, böylece hiçbir geçiş kaçırılmaz. B0 kesmesi kullanarak pulse süresi ölçmek isterseniz aynı işi yapmanız gerekir.
Buton koyacaksanız RC ile yumuşatma devresi koymanızda fayda var.

vitruvius

Şu şekilde hallettim gibi gözüküyor. Yardım edenlere teşekkürler.

int1 edge = 1; // Rising = 1, Falling = 0
#int_ext
void ext_int ()
{
   if(edge == 1)
   {
      output_toggle(led1);
      edge = 0;
      ext_int_edge(H_TO_L);
   }
   else if (edge == 0)
   {
      output_toggle(led2);
      edge = 1;
      ext_int_edge(L_TO_H);
   }
}

omenek

#bit kesme_yonu = getenv("BIT:INTEDG0")         //0=düsen kenar 1=yükselen kenar

Verdiğim kodu 18f4520 de kullanmıştım 16f877 ile çalıştığını atlamışım kusura bakma
dış kesme 3 tane olduğu için INTEDG0 yazılıyor 877 için INTEDG yazmalısın

#bit sinyal = portb.0
PORTB için tanımlama olmadığından bu hatayı veriyor

Aşağıdaki şekilde düzelttim ama şu an imkan olmadığı için kodu derleyemedim,çalışması lazım.


#byte portb = getenv("SFR:PORTB")
#bit kesme_yonu = getenv("BIT:INTEDG")         //0=düşen kenar 1=yükselen kenar
#bit sinyal=portb.0

if(sinyal==0)                 //rb0 (sinyal)sıfıra gitmişse
       kesme_yonu=1;           //bir sonraki kesme 0 dan 1 e olacak
       else                    //sinyal 1 e doğru gitmişse
       kesme_yonu=0;           //bir sonraki kesme 1 den 0 a olacak

      yapılacak işleri buraya yaz