Not 17: Timer1 Kesmesi (Zamanlayıcı Mod)

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

  Daha önceden de belirttiğimiz gibi PIC16F628A içerisinde 3 adet timer birimi bulunmaktadır.  Şimdi inceleyeceğimiz timer birimi Timer1 isimli birimdir. Bu birim Timer0’dan farklı olarak 16 bit uzunluğunda  registera sahiptir. yani bu demek oluyor ki sayabileceği en büyük değer 65535’tir. Eğer bu değerden 1 fazla sayar ise o zaman timer1 registerı 0’a döner ve  kesme oluşur. Timer 1’in Timer 0’dan bir diğer farkı ise harici bir osilatör ile beslenebilmesidir. Timer1’in osilatör girişlerine bağlanacak 32.678KHz’lik bir osilatör ile çok hassas saat uygulamaları yapılabilir. Bu konuya “Timer 1 Kesmesi -2”  isimli yazımızda detaylı bir şekilde gireceğiz. Şimdi inceleyeceğimiz kısım ise Timer1’in zamanlayıcı olarak kullanılmasına yöneliktir. Zamanlayıcı derken yanlış anlaşılma olmasın. Timer 1 her zaman bir sayıcıdır ve girişine uygulanan saat kaynağının oluşturduğu darbeleri sayar. Biz bu yazımızda PIC’in saat kaynağını kullanarak Timer 1’e zamanlama işi yaptıracağız. 1 ms’lik bir kseme oluşturup 200 ms’de bir PORTB’nin 0. bitinin durum değiştirmesini sağlayacağız. Bunu yapmamız için bir takım registerlarla işlemler yapmamız gerekiyor. Fakat öncelikle kesmelerin diyagramına bir göz atalım.

Çevresel ve diğer kesmeler diyagramdan açıkça görülmektedir.  En sağda görülen çevresel kesmelere izin vermek için INTCON registerının PEIE bitini 1 yapmak gerekir.

Şimdi gelelim Timer1’i kurarken bize gerekli olacak registerlara . Bu  registerlar datasheet’in 51. sayfasında gösterilmiştir. Timer1’i kurmak için gerekli ayarlar;

INTCON registerının GIE ve PEIE bitlerini 1 yapmak, PIE1 registerının TMR1IE registerını 1 yaparak timer1’i aktif etmek, TMR1L ve TMR1H registerlarına belirlediğimiz değeri girmek ve t1CON registerındaki ayarlamaları yapmaktır.

T1CON registerı timer1’in ayarlamalarının yapıldığı registerdır. Bu registerda sırası ile şu bitler bulunmaktadır;

– Görüldüğü gibi 7. ve 6. bitler boştur ve değer yazılamaz.

– T1CKPS1 ve T1CKPS20 bitleri prescaler değerinin ayarlandığı bitlerdir. Bu bitlerin aldıkları değerlere göre oluşan prescaler değeri aşağıdaki resimde görülmektedir.

– T1OSCEN registerı Timer1 için dışarıdan osilatör bağladığımızda önem kazanmaktadır. Bunu bir sonraki yazımızda inceleyeceğiz. Şimdilik 0 yazıp geçebiliriz.

– T1SYNC biti ise dışarıdan saat kaynağı uygulanıyor ise önem kazanmaktadır. eğer PIC’in sinyal kaynağı kullanılacaksa 0 veya 1 olması birşeyi değiştirmeyecektir.

– TMR1CS biti ise timer için saat kaynağı seçme bitidir. Eğer 1 ise harici kaynak, 0 ise PIC’in saat kaynağı seçilir.

– TMR1ON biti ise adından da anlaşılacağı üzere Timer1 registerının açıp kapatıldığı registerdır.

Bu bilgileri verdikten sonra gelelim hesap kitap işine. Diyelim ki biz 200 ms’de bir, işlemciye  bir iş yaptırmak istiyoruz. O zaman  en basitinden şöyle yapabiliriz. 1 ms’lik bir kesme oluşturup bunu 200 kez saydırırsak 200 ms’lik bir süre değişimini algılatmış oluruz işlemciye. Bu süre sonunda da istediğimiz işi yaptırabiliriz. Tabi artık burada farklı yollardan da 200 ms’lik bir değişim algılatılabilir. Ben sadece 1 ms’lik bir kseme oluşturmanın örneğini vereceğim. PIC saat kaynağını seçeceğimize göre PIC’in osilatör frekansını 4MHz olarak kabul edersek , işlemci bunun 174’ünü kullandığından 4/4=1MHz eder. Bu durumda t=1/f formülünden işlemcinin komut işleme süresi (instruction cycle) 1us eder. Yani işlemci her 1 mikrosaniyede bir işlem yapmaktadır. Bizim prescaler değerimiz 8 olduğu için timer bu sinyali 8’e bölerek kullanır. Yani işlemci 8 işlem yaparken timer 1 işlem yapar. O halde timer’ın adım süresi 8 us olur. Biz 1 ms’lik bir kesme elde etmek istyor isek eğer: 1 ms/ 8 us =125 çıkar. Yani timer1 125 kez sayar ise 1 ms’lik bir süreyte tekabül eder. Peki biz kesme oluşturmak için ne yapacağız? Kesme oluşması için Timer1 registerlarının (TMR1H, TMR1L) içeriğinin 65535 değerinden 1 fazla olması gerekiyordu. Bu durumda 65536-125=65411 değerini buluruz. Bu değeri hexadesimal sayı sistemine çevirirsek 0xFF83 değerini buluruz. Bu sayının High 8 bitlik kısmı olan FF TMR1H içerisine , Low 8 bitlik kısmı olan 83 ise TMR1L içerisine yüklenir.

İsterseniz örneğimizin kodlarına bir göz atalım.

char i=0;

//****************************************************

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|=0b00110000; //Timer1 prescaler değeri 1:8 olarak seçildi.
T1CON.T1OSCEN=0; //dahili osilatör kullanılacağı için bu bitin önemi yok
T1CON.NOT_T1SYNC=0;// dahili osilatör kullanılacağı için bu bitin önemi yok, 0 yükleyip geçtim.
T1CON.TMR1CS=0;// dahili osilatör kullanılacak
T1CON.TMR1ON=1;//Timer1 çalıştırılıyor.
TMR1H = 0xFF; //Tmr1 registerlarının içerisine 0xff83 değeri 16 bit olduğu için parça parça yükleniyor.
TMR1L = 0x83;
}

//****************************************************

void main()
{
kurulum(); //kurulum altprogramına git.
while(1)   //sonsuz döngü;
{
if(i==200) // eğer i değeri 200 ise , yani 200 milisaniye geçmiş ise..
{
portb.f0=~portb.f0; //portb'nin 0. bitini tersle..
i=0; //i'yi sıfırla.
}
}
}

//****************************************************

void interrupt()
{
TMR1H = 0xFF; //Tmr1 registerlarının içerisine 0xff83 değeri 16 bit olduğu için parça parça yükleniyor.
TMR1L = 0x83;
i++; // i değerini 1 arttır;
PIR1.TMR1IF=0; //Kesme bayrağı sıfırlandı.
}

//****************************************************

Devre şemamıza ve osilaskop görüntüsüne de bakacak olursak portb’nin 0. bitinin 200 ms’de bir durum değiştirdiğini görebilirsiniz.

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

Bu not ile ilgili kaynaklara buradan ulaşabilirsiniz.

Sorularınızı ve isteklerinizi bana aşağıdan iletebilirsiniz.

To be continued…

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