Timer0 Zamanlayıcı Uygulaması

Timer0’ı zamanlayıcı olarak kurmak için sayıcı girişine sistem clock sinyali uygulanır. Bu sinyalin her saykılında ölçeklendirmeye göre belirli bir oranda sayma gerçekleşir. Zamanlayıcı olarak kullanımda kesme kullanılacaktır.

timer0_block_2

Timer0’ı zamanlayıcı olarak kullanmak için sistem clock’unu kullanacağız. Belirlediğimiz zaman diliminde kesme oluşturup zamanlamayı ayarlayacağız.

Zamanlama Ayarı

Timer0 8-bit olduğu için max değeri 255 olacaktır. Sistem clock’u kristal frekansı 4Mhz olduğunu varsayarsak sistem clock’u 4/4= 1MHz olur. Peryot yani bir saykılın oluşması için geçen süre de 1/F olduğundan T=1/1Mhz =1uSaniye eder. O zaman timer0 max zamanlama süresi 255uS. edecektir. Kesme max değerden 0’ a geçişte oluştuğu için 256 olacaktır.

Zamanlama dilimini 1 salise yani 10ms olarak alalım. 1saniye =100 salise = 1000ms dir.

Süre = 10ms=10.000us

Frekans = 4Mhz /4 =1Mhz

Peryot= 1/1Mhz= 1us

Prescaler (Ölçek) ve Sayma adımı hesabı:

10.000/256=39.0625 olacaktır. Yani 39 defadan fazla taşma olacaktır (Kesme oluşacaktır). O halde biz ölçekleme olarak bunu 39 dan büyük bir değerle böleceğiz o da 64 eder.  Prescaler değerimiz 1:64 tür.  Sayma adımı ise 1us*64 =64us’ dir.

Ön değer hesabı :

Kesme süresi = sayma adımı süresi * (256-TMR0 ön değeri)

=64us*(256-0)

=64*256

=16.384 -10.000 =6.384 /64 =99,74 eder. Tam sayı yükleneceği için bu sayı yaklaşık 100’dür.

Toplam süre hesabı:

Kesme süresi=64*156=9984us= 9.984ms eder yaklaşık olarak 10ms.

Görüldüğü gibi 8-bit timer olduğundan hassas zamanlama yapılamadı.

Yardımcı araçlar :

Aşağıdaki adreste web üzerinden hesaplama yapılabiliyor.

http://eng-serve.com/pic/pic_timer.html

Aşağıdaki adreste timer hesaplama programı var. Bu programla sadece PIC değil diğer MCU’ların timer hesapları da yapılabiliyor.

http://www.libstock.com/projects/view/398/timer-calculator

Ekran görüntüsü;

Zamanlayıcı olarak kurmak için;

  • Timer0’ı zamanlayıcı için kullanacağımız için T0CS (Timer0 Clock Source- Timer0 kaynak seçimi) “0” yapılmalıdır.
  • Prescalar(ölçekleme) değeri 1:64 olacağı için PSA2:PSA0 bitleri “101” olacaktır.
  • Ölçeklendirme TMR0 için olduğu için PSA biti “0” olacaktır.
  • TMR0 ön değeri “100” olacaktır.
  • Kesme istediğimiz için INTCON registerinin .T0IE biti ve .GIE biti “1”, .T0IF biti “0” yapılmalıdır.

MikroC ile zamanlayıcı uygulaması

Bu uygulamamızda Saniye bilgisini PORTB çıkışlarındaki led’lerde göreceğiz. Osilatör dahili 4Mhz’lik osilatör ve MCLR disable (kapalı)

portb_led

</p>
unsigned char salise=0,saniye=0,saniye_eski=0;
//---------------------------------------------
void InitTimer0()
{
 OPTION_REG.T0CS=0; // sistem clocktan sayma
 OPTION_REG.PSA=0; // ölçeklendirme timer0 için
 OPTION_REG.PS2 = 1; // bits 2-0 PS2:PS0: Prescaler Rate 1:64 Select bits
 OPTION_REG.PS1 = 0;
 OPTION_REG.PS0 = 1;
 TMR0=100; // Timer0 ön değerini yükle
 INTCON.T0IE=1; // timer0 kesmesine izin ver
 INTCON.GIE=1; // bütün kesmelere izin ver
}
//-------------------------------------
void Interrupt()
{
 if (INTCON.T0IF) // eğer Timer0 kesme bayrağı dikilmişse
 {
 TMR0 = 100; // TMR0 içeriğini ön değeri (100) yükle
 INTCON.T0IF = 0; // kesme bayrağını sıfırla
 salise++; //salise'yi 1 arttır
 PORTA.B0=~PORTA.B0; // salise bilgisini görmek için PORTA pin0 tersleniyor.
 if(salise==100) // eğer salise 100 olduysa;
 {
 saniye++; // saniyeyi 1 arttır
 salise=0; // saliseyi sıfırla
 }
 }
}
//------------------------------
void kurulum()
{
 CMCON=7; // PORTA dijital
 TRISA=0; // PORTA çıkış
 TRISB=0; // PORTB çıkış
 PORTA=0; // PORTA'yı sıfırla
 PORTB=0; // PORTB'yi sıfırla
 InitTimer0(); // timer 0 kurulum ayarlarını çalıştır
}
void main()
{
 kurulum(); // kurulum fonksiyonunu çalıştır.
 do // sonsuz döngü başlangıcı
 {
 if(saniye_eski!=saniye) // eğer saniye değeri eski değerinden farklı ise;
 {
 PORTB=saniye; // PORTB'ye TMR0 içeriğini yükle
 saniye_eski=saniye; // saniye_eski değerini tazele
 }
 }while(1);
}

Proje dosyalarına buradan erişebilirsiniz.

Reklamlar

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