Professional Documents
Culture Documents
Deney-5 Kesme (PIC16f8.)
Deney-5 Kesme (PIC16f8.)
DENEY-5
31
KOCAELİ ÜNİVERSİTESİ - MEKATRONİK MÜHENDİSLİĞİ MİKRODENETLEYİCİ LABORATUARI
Program aracılığıyla yapılan belirli zaman aralıklarında sürekli olarak kontrol edilen işleme
‘yoklama’’ adı verilir. Yoklama işlemi ile aynı anda sadece bir işlem yapılacağından,
mikrodenetleyicilerde çeşitli kesme birimlerinden faydalanılır. Program ile yapılması gereken
işlemler kesme alt programı tarafından donanımsal olarak yapılırsa aynı anda birden fazla işlem
yapılmış olur. Bu nedenlerden dolayı yoklama işlemi yerine ‘kesme’ arabirimi kullanılır. Özetle:
Sürekli denetim (yoklama) işleminde
o Mikrodenetleyici, yalnızca bir bayrak ya da giriş/çıkış ucunu kontrol edebilir.
o Dolayısıyla başka bir işlem gerçekleştirememektedir.
Kesme yönteminde
o Mikrodenetleyici normal çalışmasına devam
de etmektedir
o Herhangi bir kesme sinyali oluştuğunda o kesmeye ait alt programı gerçekleştirip,
ana programa (kaldığı yere) geri dönülmektedir.
o Bu sayede mikrodenetleyici aynı zamanda birden fazla işlemi gerçekleştirebilir.
32
KOCAELİ ÜNİVERSİTESİ - MEKATRONİK MÜHENDİSLİĞİ MİKRODENETLEYİCİ LABORATUARI
Mikrodenetleyicide herhangi bir kesme meydana geldiğinde o kesmeye ait bayrak (flag) ‘1’
olur. Kısaca kesme bayrağı aktif olur. PIC16F877A mikrodenetleyicisinde 14 adet kesme kaynağı
bulunur. Bu kesme kaynaklarının kontrolü ve ayarları için kullanılan kaydediciler şunlardır:
33
KOCAELİ ÜNİVERSİTESİ - MEKATRONİK MÜHENDİSLİĞİ MİKRODENETLEYİCİ LABORATUARI
clear_interrupt(kesme_ismi);
Kesme bayraklarını temizlemek için kullanılır. Bir kesme altprogramına girildiğinde kesme
işlemi sonlandırılırken kesme bayrağı otomatik olarak temizlenir. Kesme bayrağını elle
temizlemek için kullanılır.
○ clear_interrupt(INT_EXT) // Harici kesme bayrağını temizle
○ clear_interrupt(INT_CCP1) // CCP kesme bayrağını temizle
34
KOCAELİ ÜNİVERSİTESİ - MEKATRONİK MÜHENDİSLİĞİ MİKRODENETLEYİCİ LABORATUARI
Harici kesme özelliği yoğun bir komut akışına sahip sistemlerde acil olarak duruma
müdahale edilmesi isteniyorsa sıklıkla tercih edilir. Kesme işlemi sonrasında sistem tekrar
kaldığı yerden çalışmaya devam eder.
NOT: Uygulamada yer alan butonun sorgulanması işlemini önceki uygulamalarda verildiği
gibi sürekli döngü içerisinde yapılması durumunda nasıl bir sonuç alınacağını test ediniz.
Animasyon 1
Animasyon 2
Animasyon 3
Animasyon 4
Animasyon 5
35
KOCAELİ ÜNİVERSİTESİ - MEKATRONİK MÜHENDİSLİĞİ MİKRODENETLEYİCİ LABORATUARI
DEVRE ŞEMASI
36
KOCAELİ ÜNİVERSİTESİ - MEKATRONİK MÜHENDİSLİĞİ MİKRODENETLEYİCİ LABORATUARI
AKIŞ DİYAGRAMI
37
KOCAELİ ÜNİVERSİTESİ - MEKATRONİK MÜHENDİSLİĞİ MİKRODENETLEYİCİ LABORATUARI
UYGULAMA KODLARI
38
KOCAELİ ÜNİVERSİTESİ - MEKATRONİK MÜHENDİSLİĞİ MİKRODENETLEYİCİ LABORATUARI
TIMER1 birimi ile 1ms süreyi elde etmek için hesaplama formülünü yazarak bölme
oranını ve sayma başlangıç değerini belirleyelim.
Tov = Tosc x BölmeOranı x (65536 – TMR1)
1000 usn = 1usn x BölmeOranı x (65536 – TMR1)
1000 = BölmeOranı x (65536 – TMR1)
TIMER1 biriminde 1:1, 1:2, 1:4 ve 1:8 olmak üzere dört tür bölme oranı vardır. Basit bir
hesapla bölme oranı 1:1 seçildiğinde 1000 kez zamanlayıcı değerinin artışı toplam süre olarak
1ms’ye karşılık gelecektir. TIMER1 birimi 16bit olduğunda bölme oranları ve sayma değerinin
ayarlanması oldukça kolaydır. Bu durumda programda kullanılacak komut şu şekilde olacaktır.
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_1 );
#include "16F877A.h" //Mikrodenetleyici başlık dosyası tanıtılır.
#fuses XT //Kristal osilatör kullanılacak.
39
KOCAELİ ÜNİVERSİTESİ - MEKATRONİK MÜHENDİSLİĞİ MİKRODENETLEYİCİ LABORATUARI
SORULAR
1. Yedi segment gösterge üzerinde 0’dan F’ye 100ms aralıklarla sayma işlemi
gerçekleştirilirken kesme butonuna basılması durumunda sayma işlemini durduran, sayma
işlemi durmuş olduğu anda kesme butonuna basılırsa tekrar saymaya devam etmesini sağlayan
programı yazınız.
2. Mikrodenetleyicide PORTD’ye bağlı ledler üzerinde 20ms aralıklarla 8bit binary sayıların
artarak saymasını sağlayan, kesme butonuna basıldığı anda o anki sayma değerini PORTC’ye
bağlı ledler üzerinde gösteren ve yine PORTD’Ye bağlı ledler üzerinde saymaya devam eden
programı yazınız.
3. Aşağıda verilen program bloğunda her bir satırın yanına açıklama yazınız. Tüm sistemin
çalışmasını kısaca özetleyiniz.
#include "16F877A.h"
#fuses XT
#use delay(clock=4M)
int1 stop = 0;
int8 sayac = 0;
#INT_EXT
void ext_isr(void)
{
if(stop == 0)
stop = 1;
else
stop = 0;
}
void main(void)
{
set_tris_d(0x00);
output_d(0x00);
ext_int_edge(L_TO_H);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(1)
{
if(stop == 0)
{
output_d(sayac);
sayac++;
delay_ms(20);
}
}
}
40