01 Haziran 2020, 05:36:29

Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H


16f877 rb0 dış kesme hk.

Başlatan yolcu27, 22 Mayıs 2020, 02:42:57

yolcu27

Merhabalar öncelikle devremi anlatayım


64 adet ledi 74ls138 ler ile bir buton sayesinde sırası ile yanacak animasyona sahibim. bu animasyon sırasında rb0 pini ile de re0 pinine bağlı bir ledi yakıyorum. kesme oluşuyor re0 ledi yanıp sönüyor daha sonra led animasyonum kaldığı yerden devam ediyor.

Örnek vermek gerekirse 35. ledim yanarken kesme oluşunca kesme içindeki ledimi yakıp söndürüyorum ama dönüşte yine 35. ledden yani kalan yerden devam ediyor. Ben yeniden 1. ledden yanmasını istiyorum. aklıma kesmenin sonuna ledler(); fonksiyonunu eklemek geldi ama bu seferde hiç kesme oluşmuyor.
Kodlarımı ekliyorum.

/******************************************************
 Uygulama Adı      : 74138 Ä°le Port Ã‡oÄŸullama Uygulaması
*******************************************************/
#include <16f877.h>     // Kullanılacak denetleyicinin baÅŸlık dosyası tanıtılıyor.

//***********Denetleyici konfigürasyon ayarları************
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000)   // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor

#use fast_io(a) // Port yönlendirme komutları b portu için geçerli
#use fast_io(b) // Port yönlendirme komutları b portu için geçerli
#use fast_io(c) // Port yönlendirme komutları b portu için geçerli
#use fast_io(e) // Port yönlendirme komutları b portu için geçerli
int i// Tamsayı tipinde deÄŸiÅŸken tanımlanıyor
int x;
/********* ANA PROGRAM FONKSÄ°YONU********/


void ledler()
{

 
//while(1) // Sonsuz döngü
  // {
      
for(i=0;i<8;i++) // 1. 74138 entegresi Ã§Ä±kış kontrolü
      
{
         
output_c(i|0b00000000); // Ä°lk 74138 seçiliyor ve sırayla Ã§Ä±kışlar aktif yapılıyor
         
delay_ms(250);          // Gecikme veriliyor
      
}
      for (
i=0;i<8;i++) // 2. 74138 entegresi Ã§Ä±kış kontrolü
      
{
         
output_c(i|0b00010000); // Ä°kinci 74138 seçiliyor ve sırayla Ã§Ä±kışlar aktif yapılıyor
         
delay_ms(250);          // Gecikme veriliyor
      
}
      for(
i=0;i<8;i++) // 3. 74138 entegresi Ã§Ä±kış kontrolü
      
{
         
output_c(i|0b00100000); // ÃœÃ§Ã¼ncü 74138 seçiliyor ve sırayla Ã§Ä±kışlar aktif yapılıyor
         
delay_ms(250);          // Gecikme veriliyor
      
}
      for (
i=0;i<8;i++) //  4. 74138 entegresi Ã§Ä±kış kontrolü
      
{
         
output_c(i|0b00110000); // Dördüncü 74138 seçiliyor ve sırayla Ã§Ä±kışlar aktif yapılıyor
         
delay_ms(250);          // Gecikme veriliyor
      
}
      
       for (
i=0;i<8;i++) //  5. 74138 entegresi Ã§Ä±kış kontrolü
      
{
         
output_c(i|0b01000000); // beÅŸinci 74138 seçiliyor ve sırayla Ã§Ä±kışlar aktif yapılıyor
         
delay_ms(250);          // Gecikme veriliyor
      
}
      
        for (
i=0;i<8;i++) //  6. 74138 entegresi Ã§Ä±kış kontrolü
      
{
         
output_c(i|0b01010000); // altıncı 74138 seçiliyor ve sırayla Ã§Ä±kışlar aktif yapılıyor
         
delay_ms(250);          // Gecikme veriliyor
      
}
      
          for (
i=0;i<8;i++) //  7. 74138 entegresi Ã§Ä±kış kontrolü
      
{
         
output_c(i|0b01100000); // yedinci 74138 seçiliyor ve sırayla Ã§Ä±kışlar aktif yapılıyor
         
delay_ms(250);          // Gecikme veriliyor
      
}
      
            for (
i=0;i<8;i++) //  7. 74138 entegresi Ã§Ä±kış kontrolü
      
{
         
output_c(i|0b01110000); // yedinci 74138 seçiliyor ve sırayla Ã§Ä±kışlar aktif yapılıyor
         
delay_ms(250);          // Gecikme veriliyor
      
}
   
//}

}

#int_ext                // Dış (External) RB0/INT kesmesi
void  ext_kesmesi ()    // Dış kesme fonksiyonu
{
disable_interrupts(GLOBAL);

   
output_high(pin_e0);
   
delay_ms(200);
   
output_low(pin_e0);
   
delay_ms(200);
 
output_high(pin_e0);
   
delay_ms(200);
   
output_low(pin_e0);
   
delay_ms(200);
  
output_high(pin_e0);
   
delay_ms(200);
   
output_low(pin_e0);
   
delay_ms(200);
   
clear_interrupt(INT_EXT);
  
enable_interrupts(GLOBAL);

   }
   
   

void main ()
{
   
setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   
setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   
setup_adc_ports(NO_ANALOGS);    // ANALOG giriÅŸ yok
   
setup_adc(ADC_OFF);             // ADC birimi devre dışı
   
setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   
setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
   
set_tris_a(0b00000001);    // RA0 ucu giriş olarak ayarlandı.
   
set_tris_b(0b00000001);    // Rb0 ucu giriş olarak ayarlandı.
     
set_tris_e(0x00);    // e portu tümüyle çıkış olarak ayarlandı.
   
set_tris_c(0b00000000);    // c port cıkıs olarak ayarlandı.
     
output_c(0b00000000); // 
   
ext_int_edge(H_TO_L);   // INT_EXT kesmesinin düşen kenarda aktif olacağını belirtir

   
enable_interrupts(INT_EXT);  // INT_EXT kesmesini aktif yapar
   
enable_interrupts(GLOBAL);   // Aktif edilen kesmelere izin ver 
 
   

 
  
while(1)
 { 
    
  if(
input(pin_a0)==1)
  {
  
ledler();
  }
  
 } 
 } 

selimkoc

kesme içinde bayrak kullan. Döngü içinde bayrağı kontrol et. Kesmede mümkünse bekleme ve döngü olmasın.

https://elektrokod.wordpress.com/2013/10/07/pic16f628-mikrodenetleyicinde-rb0-kesmesi-interrupt/