Kesme Yapamıyorum, Lütfen yardım

Başlatan hakansefau, 22 Nisan 2012, 23:35:35

hakansefau

Arkadaşlar ccs c derleyicisinde 16f628a işlemcisi ile bir devrem var , yapmak istediğim bir adet butonum var bu butonla 3 tane çıkışım var.

Butona bir kere basıldığında bir çıkış verecek ve bu çıkış verildiğinde bir kere daha butona basılmadıysa 90 saniye boyunca çıkış aktif olacak sonra sıfırlanacak.

Sonra bir kere daha butona bastığımda çıkış verecek bu süresiz çıkış verecek gene bir kere daha butona basılmadıysa tabi hep çıkış verecek.

Sonra ki son çıkış için bir kere daha bastığımızda gene ilk çıkış gibi butona tekrar basmadan beklersek 90 saniye çıkış vermesini istiyorum bu böyle devam edecek. Kesme kullanmayı iyi bilmediğimden oradan oraya zıplama atlama bir şeyler yaparak halletmeye çalışıyorum , konudan anlayan arkadaşlardan yardım istiyorum bir de kesmesiz uğraştığım kodu göstereyim


#include <16f628a.h>
#use delay(clock=4000000)

#fuses INTRC,NOMCLR,PROTECT,NOWDT
#fuses PUT,NOLVP,NOCPD,NOBROWNOUT

unsigned int j=0;

void bekle()      //bekleme süresi
{
      for(j=0;j<=90;j++)
      {
         delay_ms(1000);
      }

}

void main(void)
{
set_tris_a(0x01);                         
set_tris_b(0x00);                         
output_low(PIN_B7);                       
output_low(PIN_B6);                       
output_low(PIN_B5);                     

delay_ms(20);                       

while(TRUE)                       
{

if(input(PIN_A0)==0 )           //a0 butona bastık 
{  delay_ms(50);
   if(input(PIN_A0)==1);         
   output_high(PIN_B5);         //bu b5 pininden 1. çıkış sonrasında 90 saniye bekliyecek   
   bekle();                         
   output_low(PIN_B5);             
   delay_ms(25);}
                   
                      if(input(PIN_A0)==0 )            // bu 2. çıkış süresiz bekleyecek
{        delay_ms(50);
         if(input(PIN_A0)==1);           
         output_high(PIN_B6);                                         
         delay_ms(50);  }                 
                                   if(input(PIN_A0)==0)           
{              output_low(PIN_B6);
               delay_ms(50);
               if(input(PIN_A0)==1);             
               output_high(PIN_B7);        // //bu b6 pininden 3. çıkış sonrasında 90 saniye bekliyecek             
               bekle();                                   
               output_low(PIN_B7);             
               delay_ms(25);                   
}
}
}


sorun bu if lerin içine girdimi o bekleme arasında müdahale edemiyoruz programa, bazen bu sıralamalarda şaşıyor önce(eğer işlemler esnasında butona tekrardan basılmadığını kabul edersek) 1. çıkış verilip 90sn ,sonra aynı butona bir kere basınca süresiz bir çıkış verip bekleyecek, tekrar bastığımızda da 3. çıkışı verecek 90 saniye

umarım sorunumu anlatabilmişimdir :)

serhat1990

Merhabalar , kesme kullanmak pek zor bişey değil. Saba örnek olarak rb0 kesmesini kullanarak yazdıgım basit bir program göstereyim diger butonlara diğer kesmeleri kullanarak yapabilirsin iyi çalışmalar.

/* RB0 KESMESİ */

#include <16f877a.h>          //16f877 kullanılıyor.
#use delay (clock=4000000)
#use fast_io(B)
#use fast_io(D)
#define baslat pin_b7
int zaman=200;
int a=0;
// dıs kesme rb0 kesmesi bölümü //

  #int_ext    //dış external rb0 kesmesi
  void diskesme()        //kesme gerceklesince yapılacak işlemler bu fonksiyonun içinde tanımlanır
    {
      for(a=0;a<10;a++)    //a=0 dan a=10 olana kadar fonksiyon içindeki işlemleri 10 kere tekrarla sonra cık
         {
             output_d(0b00000001);delay_ms(zaman);    // d0 deki ledi yak 200 ms bekle
             output_d(0b00000010);delay_ms(zaman);    //d1 deki ledi yak 200 ms bekle
         }
    }

   void main()             //ana fonksiyon
   
   {
      set_tris_b(0xff);output_b(0x00);       //b portu giriş olarak ayarlandı ve sıfırlandı
      set_tris_d(0x00);output_d(0x00);       //d portu giriş olarak ayarlandı ve sıfırlandı
      ext_int_edge(H_TO_L);                  //ınt _Ext kesmesinin düşen kenarda aktif olacagını belirtir
      enable_interrupts(INT_EXT);            //ınt_ext kesmesini aktif yapar
      enable_interrupts(GLOBAL);             //aktif edilen kesmelere izin verir
      
      while(true)
      {
         if(input(baslat)==1)             // baslat butonuna basılımı ?
         {
         while(1){
            output_d(0x01);delay_ms(1000);   //d0 daki ledi yak 1 sn bekle
            output_d(0x02);delay_ms(1000);     //d1 deki ledi yak 1 sn bekle
                 }
           }
      
   
      }
   }

hakansefau

Cok tesekkur ederim kodu deneyip en kisa zamanda donusu yapicam. :)

serhat1990


hakansefau

/* RB0 KESMESİ */

#include <16f877a.h>          //16f877 kullanılıyor.
#use delay (clock=4000000)
#use fast_io(B)
#use fast_io(D)
#define baslat pin_b7
int zaman=200;
int a=0;
// dıs kesme rb0 kesmesi bölümü //

  #int_ext    //dış external rb0 kesmesi
  void diskesme()        //kesme gerceklesince yapılacak işlemler bu fonksiyonun içinde tanımlanır
    {
      for(a=0;a<10;a++)    //a=0 dan a=10 olana kadar fonksiyon içindeki işlemleri 10 kere tekrarla sonra cık
         {
             output_d(0b00000001);delay_ms(zaman);    // d0 deki ledi yak 200 ms bekle
             output_d(0b00000010);delay_ms(zaman);    //d1 deki ledi yak 200 ms bekle
         }
    }

   void main()             //ana fonksiyon
   
   {
      set_tris_b(0xff);output_b(0x00);       //b portu giriş olarak ayarlandı ve sıfırlandı
      set_tris_d(0x00);output_d(0x00);       //d portu giriş olarak ayarlandı ve sıfırlandı
      ext_int_edge(H_TO_L);                  //ınt _Ext kesmesinin düşen kenarda aktif olacagını belirtir
      enable_interrupts(INT_EXT);            //ınt_ext kesmesini aktif yapar
      enable_interrupts(GLOBAL);             //aktif edilen kesmelere izin verir
     
      while(true)
      {
         if(input(baslat)==1)             // baslat butonuna basılımı ?
         {
         while(1){
            output_d(0x01);delay_ms(1000);   //d0 daki ledi yak 1 sn bekle
            output_d(0x02);delay_ms(1000);     //d1 deki ledi yak 1 sn bekle
            output_d(0x04);delay_ms(1000);     //buda 3. cikis icin olsun diye ekledim
                  } 
         }
      }
     
   
   }
   
bu verdiğiniz koda sadece 3. bir çıkış ekledim 3 çıkışlı olduğu için şimdi gene kodla oynuyorum aynı zamanda serdar çiçeğinde kitabı var oradan da bakıyorum fakat gene çare bulamadım.

Benim proje de şöyle bu butona bir kere bastığımda bir çıkış verecek.

Aynı butona bir kere daha bastığımda diğeri sonra bir daha bastığımda diğeri arka arkaya sırayla 3 kere basmamla 3 farklı çıkış vermeli ve bu 3ü tekrarlayacak yani b0 a bastım d0 sonra d1 sonra d2 den çıkışı verek aradaki süreler tam dolmadan basarsam mesela d0 çıkışı veriliyorken basarsam d1 e geçicek.

Aralara gecikmeleri falan ben ekleyebilirim.

taso

yanlış anlamadıysam    bir tuş 90 sn   1 kere bas 90 cıkısı aktıf et eger 90 sn ıcınde 1 kere daha tusa basılırsa sonsuz aktıf et 90 sn bekleyıp basarsan 2cı cıkısı aktıf et sonra 3





int mode,button;

#int_ext
void isr_control(){

button++;

if(mode==0){
if(button==1 ){ output_high(pin_d0); delay_ms(90000); output_low(pin_d0); mode++; button=0;  }                       }
if(button==3 ){output_low(pin_d0); mode++; button=0;}
}

if(mode==1){
if(button==1 ){ output_high(pin_d1); delay_ms(90000); output_low(pin_d1); mode++; button=0;  }                       }
if(button==3 ){output_low(pin_d1); mode++; button=0;}
}


if(mode==2){
if(button==1 ){ output_high(pin_d2); delay_ms(90000); output_low(pin_d2); mode=0; button=0;  }                       }
if(button==3 ){output_low(pin_d2); mode=0; button=0;}
}

}



void main(){

ext_int_edge(H_TO_L);                 
      enable_interrupts(INT_EXT);           
      enable_interrupts(GLOBAL);

while(1);


}

justice_for_all

Birinci yalnis kesme icinde kesinlikle bekleme yapilmaz.
ikinci yalnis ise kesme icinde dongu kullanilmaz hadi dongu kullanmissin neyse ama sen dahasinida yapmissin dongunun icinde bekleme yapmissin.

10 dongu x 200 ms +200 ms den napar 4  saniye boyle bise kesme icinde olmaz kesme ici olabildigince kisa tutulmalidir yoksa ozelligi kalmaz zaten.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

taso

#7
http://letitbit.net/download/48724.4422560146b2acdb750b3bb1fc31/basit.rar.html


2 tane eksiklik varmış kusura bakma benim düşüncesizliğim


int mode,button;

#int_ext
void isr_control(){
   
     clear_interrupt(int_ext);
     enable_interrupts(INT_EXT);             //1cisi
     enable_interrupts(GLOBAL);



button++;

if(mode==0){
if(button==1 ){ output_high(pin_a0); delay_ms(90000); if(button!=2){output_low(pin_a0); mode++; button=0;}  }                 // button!=2  eklemessen yinede kapatıyor lambaları :)       
if(button==3 ){output_low(pin_a0); mode++; button=0;}                                                                                                             //interrupt iç içe gelse bile kaldığı yeri unutmuyor takdir ettim
}

if(mode==1){
if(button==1 ){ output_high(pin_a1); delay_ms(90000); if(button!=2){output_low(pin_a1); mode++; button=0;}  }                       
if(button==3 ){output_low(pin_a1); mode++; button=0;}



if(mode==2){
if(button==1 ){ output_high(pin_a2); delay_ms(90000);  if(button!=2){output_low(pin_a2); mode=0; button=0;  }    }                   
if(button==3 ){output_low(pin_a2); mode=0; button=0;}

}



void main(){

ext_int_edge(H_TO_L);                 
      enable_interrupts(INT_EXT);           
      enable_interrupts(GLOBAL);

while(1);


}