Not 18: Timer1 Kesmesi – 2 (Senkron Sayıcı Mod)

Yayınlandı: 13 Temmuz 2012 / Microchip PIC Programlama...
Etiketler:, , , , , , , , ,

Bir önceki notumuzda Timer1’in zamanlayıcı olarak kullanılmasını incelemiştik. Bu yazımızda ise Timer1’in senkron sayıcı modda çalıştırılmasını inceleyeceğiz. Bir sonraki yazımızda ise asenkron modda bir osilatör ile kullanılmasına deyineceğiz. PIC16f628’in Timer1 modülünü kontrol eden T1CON registerının “TMR1CS: Timer1 Clock Source Select bit ” isimli bitini 1 yapar isek artık Timer1 için gerekli saat sinyalini PIC’in saat kaynağından ayırmış ve dışarıdan (RB6 veya RB7) almış oluruz. Artık timer1 mikrodenetleyicinin saat sinyalinden bağımsız fakat ona senkron bir şekilde çalışmaya başlar. Buradaki “senkron çalışma” ifadesi Timer1’deki artışların, kendi saat sinyalinden yeteri kadar pals almış olsa bile, PIC’in dahili sinyalini beklemesi gerektiği mânasındadır. T1OSCEN biti 0 iken eğer saat sinyalini RB6’dan uygular isek, saat sinyalinin her yükselen kenarında (eğer prescaler 1:1 ise tabiki) bir sayma işlemi yapılmış olur.  Eğer T1OSCEN biti 1 yapılırsa RB7 ucundan uygulanan saat sinyalinin de her bir yükselene kenarında bir sayma yapılır.

Timer1’i senkron modda çalıştırmak için T1SYNC bitini de 0 yapmak gerekmektedir. Şunu bilmekte de fayda var ki TMR1CS bitini 1 yaptığımızda yani harici sinyal kaynağı seçtiğimizde RB6 ve RB7 pinleri artık giriş-çıkış işlemleri için kullanılamaz.

Şimdi yapacağımız örnekte RB7 pinine bağlanmış bir butona 4 kez bastığımızda (yükselen kenar tetiklemesi kullanacağız, bu yüzden T1OSCEN=1 olacak) Timer1 kesmesi oluşturacak programı yazalım. KEsme her oluştuğunda ise PORTB.f0 daki ledin durumu değişsin. Bunun için Prescaler değerini 1:4 yapacağız. Bunu T1CON registerının 5 ve 4. bitlerine “1-0” değerini yükleyerek yapıyoruz. Timer sayaç registerının içerisine ise 0xFFFF yüklüyoruz(TMR1H, TMR1L)Böylece her 4 yükselen kenarımızda bir artış sağlanıyor.


//****************************************************
void kurulum()
{
trisb.f0=0;
portb.f0=0;
INTCON.GIE=1; //Tüm kesmeler aktif.
INTCON.PEIE=1; //Çevresel kesmeler aktif.
PIE1.TMR1IE=1;//Timer 1 kesmesi aktif.
T1CON.T1CKPS1=1; //Prescaler t1con'un 5 ve 4. bitleri "10" yapılarak 1:4 seçildi.
T1CON.T1CKPS0=0;
T1CON.T1OSCEN=1; //  PORTB'nin 7. pini giriş olarak kullanılıyor.
T1CON.NOT_T1SYNC=0;// Senkron Mod.
T1CON.TMR1CS=1;// harici osilatör kullanılacak
T1CON.TMR1ON=1;//Timer1 çalıştırılıyor.
TMR1H = 0xFF; //Tmr1 registerlarının içerisine 0xffff değeri 16 bit olduğu için parça parça yükleniyor.
TMR1L = 0xFF;
}
//****************************************************
void main()
{
kurulum(); //kurulum altprogramına git.
while(1); //sonsuz döngü;
}
//****************************************************
void interrupt()
{
TMR1H = 0xFF; //Tmr1 registerlarının içerisine 0xffff değeri 16 bit olduğu için parça parça yükleniyor.
TMR1L = 0xFF;
portb.f0=~portb.f0; //PORTB'nin 0. pinindeki led durum değiştiriyor.
PIR1.TMR1IF=0; //Kesme bayrağı sıfırlandı.
}
//****************************************************

Devre şemamıza bakarsak eğer RB7 pininden 10Hz’lik bir sinyal uygulandığını ve bu sinyalin her 4 yükselen kenarında bir kesme oluştuğunu görebilirsiniz.

Büyütmek için tıklayın.

Bu notomuz ile alakalı dosyaları buradan indirebilirsiniz, iyi çalışmalar.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s