Haberler:

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

Ana Menü

16f877 rb0 dış kesme hk.

Başlatan yolcu27, 21 Mayıs 2020, 23: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/