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();
}
}
}
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/ (https://elektrokod.wordpress.com/2013/10/07/pic16f628-mikrodenetleyicinde-rb0-kesmesi-interrupt/)