PIC18F4520 Timer/ Zamanlayıcı Modülleri

Bu yazımızda PIC18F4520’nin zamanlayıcı modülünü inceleyeceğiz, daha önceki yazılarımızda bu konuyu Arduino kartlar için incelemiştik. Önce zamanlayıcıların ne olduğunu, onların masıl çalıştığını göreceğiz ve daha sonra PIC18F4520 zamanlayıcılarını sırasıyla 100ms ve 500ms gecikme üretecek şekilde yapılandıracağız. Sonunda ExploreEmdedded Zamanlayıcı kütüphanesini nasıl kullanılacağını göreceğiz.

Timer / Zamanlayıcı Hakkında Temel Bilgiler

Adından da anlaşılacağı gibi, bu modüller zamanı ölçmek veya doğru zaman gecikmesini oluşturmak için kullanılır. Ayrıca mikrodenetleyici kendi başına döngüler çalıştırarak gereken zaman gecikmelerini de üretebilir / ölçebilir, ancak zamanlayıcı modülü, mikroişlemciyi bu gereksiz ve tekrarlayan görevden kurtarır ve diğer görevler için maksimum işlem süresi tahsis etmesini sağlar.

PIC18F4520 Timer/ Zamanlayıcı Modülleri timer nedir,pic timer,interrupt nedir,interrupt nedir elektrik,interrupt nedir ne işe yarar
PicKit programlayıcısına takılmış bir PIC18 mikroişlemcisi.

Zamanlayıcı, saat atımlarını (Dahili / Harici) saymak için yapılandırılabilen basit bir ikili sayaçtan başka bir şey değildir. Maks değerine ulaştığında, bir OverFlow bayrağı ayarlayarak sıfıra geri döner ve etkinleştirilirse kesmeyi/interrupt oluşturur.

PIC18F4520 Timer/ Zamanlayıcı Modülleri timer nedir,pic timer,interrupt nedir,interrupt nedir elektrik,interrupt nedir ne işe yarar

PIC Timer / Zamanlayıcı Modülü

PIC18F4520, zamanlayıcısı, sayaç veya PWM üretimi için kullanılabilen üç bağımsız zamanlayıcıya sahiptir. Aşağıdaki tabloda üç Zamanlayıcının ayrıntıları verilmiştir.

İsim Boyut Kontrol Kaydı Sayım Kaydı Min Gecikme Maks Gecikme
TIMER0 8 bit OPTION_REG TMR0 0.2usec 13.107ms
TIMER1 16 bit T1CON TMR1H, TMR1L 0.2usec 104.857ms
TIMER2 8 bit T2CON TMR2 0.2usec 819usec

Zamanlayıcı Hesaplaması

PIC Osilatör frekansı 4’e bölünür ve daha sonra kontrolöre beslenir, Şimdi bu frekans, gecikmeler aralığı oluşturmak için presakalar ile daha da bölünebilir. zamanlayıcı sayısını bir arttırmak için zaman (zamanlayıcı tick) aşağıdaki gibi belirlenebilir.

tick = (Prescalar / (Fosc / 4)
tick = (Prescalar / (20Mhz / 4))
$ tick = (Prescalar * 4) / Fosc $

Şimdi gerekli gecikme için zamanlayıcı değeri aşağıdaki gibi hesaplanabilir.
Gecikme = TimerCount * tick
Count = (Gecikme / tick)
RegValue = TimerMax- Count
RegValue = TimerMax- (Gecikme / tick) = TimerMax – (Gecikme / ((Prescalar * 4) /
Fosc )) $ RegValue = TimerMax – (( Gecikme * Fosc) / (Prescalar * 4)) $

Aşağıdaki tabloda üç zamanlayıcının tümü için formül bulunmaktadır.

İsim Boyut Gecikme hesaplama formülü
TIMER0 8 bit $ RegValue = 256 – ((Gecikme * Fosc) / (Prescalar * 4)) $
TIMER1 16 bit $ RegValue = 65536 – ((Gecikme * Fosc) / (Prescalar * 4)) $
TIMER2 8 bit $ RegValue = 256 – ((Gecikme * Fosc) / (Prescalar * 4)) $

TIMER0 – Zamanlayıcı 0

TMRO modülü, aşağıdaki özelliklere sahip 8 bitlik bir zamanlayıcı / sayaçtır:

  • 8 bit zamanlayıcı / sayıcı
  • Okunabilir ve yazılabilir
  • 8 bit yazılım programlanabilir ön ölçekleyici
  • Dahili veya harici saat seçimi
  • FFh’den 00h’ye taşma kesintisi
  • Harici saat için sınır seçimi

TIMER0 Kayıtları

Aşağıdaki tabloda PIC18F4520 TIMER0 modülü ile ilişkili kayıtlar gösterilmektedir.

Kayıt Açıklama
OPTION_REG Bu kayıtlar TIMER0 Prescalar, Clock Source vb.
TMR0 Bu kayıt, prescalar yapılandırmaya bağlı olarak artırılacak zamanlayıcı sayım değerini tutar
INTCON Bu kayıt Timer0 taşma bayrağını (TMR0IF) ve karşılık gelen Inetrrupt Enable bayrağını (TMR0IE) içerir.
OPTION_REG
7 6 5 4 3 2 1 0
RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

RBPU: Zamanlayıcılar için NA

INTEDG: Zamanlayıcılar için NA

T0CS: TMR0 Saat Kaynağı Bit
1’i seçin – T0CKI pininde geçiş
0-Dahili talimat döngü saati (CLKO)

T0SE: TMR0 Kaynak Kenarı T0CKI pininde
yüksek-düşük geçişte bit 1-Artışı seçin
0- T0CKI pininde düşük-yüksek geçişte artış

PSA: Ön ölçekleyici Atama biti

PS2: PS0: Ölçekleyici Oranı Seçim bitleri

PIC18F4520 Timer/ Zamanlayıcı Modülleri timer nedir,pic timer,interrupt nedir,interrupt nedir elektrik,interrupt nedir ne işe yarar

Timer0 modülü ile Watchdog Zamanlayıcısı arasında karşılıklı olarak paylaşılan sadece bir ön ölçekleyici mevcuttur. Timer0 modülü için bir ön ölçekleyici ataması, Watchdog Timer için ön ölçekleyici olmadığı anlamına gelir veya bunun tersi de geçerlidir. Bu ön derecelendirici erişilebilir değil ama kullanılarak yapılandırılabilir.

PS2: PS0 bit OPTION_REG .

INTCON
7 6 5 4 3 2 1 0
GIE TURTA TMR0IE INTE RBIE TMR0IF INTF RBIF

GIE: Global Interrupt Bit
1’i etkinleştir
-Maskelenmemiş tüm kesmeleri etkinleştirir 0-Tüm kesmeleri devre dışı bırakır

PIE: Çevresel Kesinti Bit
1’i etkinleştir
-Maskelenmemiş tüm çevresel kesintileri etkinleştirir 0-Tüm çevresel kesintileri devre dışı bırakır

TMR0IE: TMR0 Taşma Kesmesi Etkin bit
1-TMR0 kesmesini etkinleştirir
0-TMR0 kesmesini devre dışı bırakır

INTE: Zamanlayıcılar için NA

RBIE: Zamanlayıcılar için NA

TMR0IF: TMR0 Taşma Kesme Bayrak biti
1-TMR0 kaydı taştı (yazılımda temizlenmelidir)
0-TMR0 kaydı taşmadı

INTF: Zamanlayıcılar için NA

RBIF: Zamanlayıcılar için NA

PIC18F4520 Timer/ Zamanlayıcı Modülleri timer nedir,pic timer,interrupt nedir,interrupt nedir elektrik,interrupt nedir ne işe yarar

Prescalar ile 1ms, 20Mhz için Gecikme Hesaplamaları: 32: $$ RegValue = 256- (Gecikme * Fosc) / (Prescalar * 4)) = 256 – ((1ms * 20Mhz) / (32 * 4)) = 256-156 = 100 $$

Program Kodu

  1. Gereken gecikme için Zamanlayıcı Sayısını hesaplayın.
  2. Presaclar bitlerini gecikme hesaplamalarına göre OPTION_REG olarak ayarlayın .
  3. Prescalar kullanmak için PSA bitini temizleyin.
  4. TOCS bitini kullanarak Dahili / Harici Saat Kaynağını seçin .
  5. Zamanlayıcı değerini TMRO kaydına yükleyin .
  6. TMR0IE bitini ayarlayarak Timer0 Interrupt’ı etkinleştirin
  7. GIE ve PIE bitlerini ayarlayarak Global ve Çevresel kesintileri etkinleştirin

Aşağıda LED’leri 1 ms gecikmeyle yanıp sönecek örnek kod verilmiştir.

#include<pic16f877a.h>
char value = 0;
#define SBIT_PS2  2
void interrupt timer_isr()
{  
    if(TMR0IF==1)
    {
        value=~value;   // complement the value for blinking the LEDs
        TMR0 = 101;     /*Load the timer Value, (Note: Timervalue is 101 instaed of 100 as the
                          TImer0 needs two instruction Cycles to start incrementing TMR0 */
        TMR0IF=0;       // Clear timer interrupt flag
    } 
}
void main()
{    
    TRISD=0x00;    //COnfigure PORTD as output to blink the LEDs
    OPTION_REG = (1<<SBIT_PS2);  // Timer0 with external freq and 32 as prescalar
    TMR0=100;       // Load the time value for 1ms delay
    TMR0IE=1;       //Enable timer interrupt bit in PIE1 register
    GIE=1;          //Enable Global Interrupt
    PEIE=1;         //Enable the Peripheral Interrupt
    while(1)
    {
        PORTD = value;
    }
}

PIC18F4520 Timer/ Zamanlayıcı Modülleri timer nedir,pic timer,interrupt nedir,interrupt nedir elektrik,interrupt nedir ne işe yarar

TIMER1 – Zamanlayıcı 1

Zamanlayıcı TMR1 modülü, aşağıdaki özelliklere sahip 16 bit zamanlayıcı / sayaçtır:

  • İki 8-Bit yazmaçlı 16 bit zamanlayıcı / sayıcı TMR1H / TMR1L
  • Okunabilir ve yazılabilir
  • 1: 8’e kadar programlanabilir ön ölçekleme
  • Dahili veya harici saat seçimi
  • FFFFh’den 00h’ye taşma kesintisi
  • Harici saat için sınır seçimi

TIMER1 Kayıtları

Aşağıdaki tabloda PIC18F4520 Timer1 modülü ile ilişkili kayıtlar gösterilmektedir.

Kayıt Açıklama
T1CON: Bu kayıtlar, TIMER1 Prescalar, Saat Kaynağı vb.
TMRIH Bu yazmaç, zamanlayıcı değerinin en yüksek 8 bitini tutar. TMR1H ve TMR1L, 0000 – FFFFh değerinden artırmaya eşleştirmek için çift olarak kullanılır
TMRIL Bu yazmaç, zamanlayıcı değerinin en düşük 8 bitini tutar. TMR1H ve TMR1L, 0000 – FFFFh değerinden artırmaya eşleştirmek için çift olarak kullanılır
PIR1 Bu kayıt Timer1 taşma bayrağını (TMR1IF) içerir.
PIE1 Bu kayıt Timer1 Interrupt Enable bayrağını (TMR1IE) içerir.
T1CON
7 6 5 4 3 2 1 0
T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

T1CKPS1: T1CKPS0: TIMER1 Giriş Saati Prescale Seçim bitleri
11 = 1: 8 ön ölçek değeri
10 = 1: 4 ön ölçek değeri
01 = 1: 2 ön ölçek değeri
00 = 1: 1 ön ölçek değeri

T1OSCEN: TIMER1 Osilatör Etkin Kontrol biti
1-Osilatör etkin
0-Osilatör kapalı

T1SYNC: TIMER1 Harici Saat Girişi Senkronizasyon Kontrol biti
1-Harici saat girişini senkronize etme
0-Harici saat girişini senkronize etme

TMR1CS: TIMER1 Saat Kaynağı Bit
1-Harici saati seç RC0 / T1OSO / T1CKI (yükselen kenarda)
0-Dahili saat (FOSC / 4)

TMR1ON: TIMER1 On bit
1- Timer1’i etkinleştirir
0-Timer1’i durdurur

PIC18F4520 Timer/ Zamanlayıcı Modülleri timer nedir,pic timer,interrupt nedir,interrupt nedir elektrik,interrupt nedir ne işe yarar

Prescalar ile 100ms @ 20Mhz için Gecikme Hesaplamaları 8: $$ RegValue = 65536- (Gecikme * Fosc) / (Prescalar * 4)) = 65536 – ((100ms * 20Mhz) / (8 * 4)) = 3036 = 0xBDC $ $

Program Kodu

TIMER1’i gecikme üretimi için yapılandırma ve kullanma adımları aşağıdadır:

  1. Gereken gecikme için Zamanlayıcı Sayısını hesaplayın.
  2. İçinde Presaclar bitlerini ayarlayın T1CON gecikme hesaplamaları göre.
  3. TMR1CS bitini kullanarak Dahili / Harici Saat Kaynağını seçin .
  4. Zamanlayıcı değerini TMR1H, TMR1L kaydına yükleyin .
  5. TMRIE bitini ayarlayarak Timer1 Interrupt’ı etkinleştirin
  6. GIE ve PIE bitlerini ayarlayarak Global ve Çevresel kesintileri etkinleştirin
  7. Son olarak zamanlayıcıyı TMR1ON biti ayarlayarak başlatın

Aşağıda LED’leri 1 ms gecikmeyle yanıp sönecek örnek kod verilmiştir.

#include<pic16f877a.h>
char value = 0;
#define SBIT_PS1  5
#define SBIT_PS0  4
void interrupt timer_isr()
{  
    if(TMR1IF==1)
    {
        value=~value;   // complement the value for blinking the LEDs
        TMR1H=0x0B;     // Load the time value(0xBDC) for 100ms delay
        TMR1L=0xDC;
        TMR1IF=0;       // Clear timer interrupt flag
    } 
}
void main()
{    
    TRISD=0x00;    //COnfigure PORTD as output to blink the LEDs
    T1CON = (1<<SBIT_PS1) | (1<<SBIT_PS0); // Timer0 with external freq and 8 as prescalar
    TMR1H=0x0B;     // Load the time value(0xBDC) for 100ms delay
    TMR1L=0xDC;       
    TMR1IE=1;       //Enable timer interrupt bit in PIE1 register
    GIE=1;          //Enable Global Interrupt
    PEIE=1;         //Enable the Peripheral Interrupt
    TMR1ON = 1;     //Start Timer1    
    while(1)
    {
        PORTD = value;
    }
}

PIC18F4520 Timer/ Zamanlayıcı Modülleri timer nedir,pic timer,interrupt nedir,interrupt nedir elektrik,interrupt nedir ne işe yarar

TIMER2 – Zamanlayıcı 2

TIMER2 modülü, aşağıdaki özelliklere sahip 8 bitlik bir zamanlayıcı / sayaçtır:

  • 8 bit zamanlayıcı / sayıcı
  • Okunabilir ve yazılabilir
  • Yazılım programlanabilir ön ölçekleyici / 1:16’ya kadar PostScaler
  • FFh’den 00h’ye taşma kesintisi

TIMER2 Kayıtları

Aşağıdaki tabloda PIC16f877A Timer0 modülüyle ilişkili kayıtlar gösterilmektedir.

Register Açıklama
T2CON Bu kayıtlar TIMER2 Prescalar, Saat Kaynağı vb.
TMR2 Bu kayıt, prescalar yapılandırmaya bağlı olarak artırılacak zamanlayıcı sayım değerini tutar
PIR1 Bu kayıt Timer2 taşma bayrağını (TMR2IF) içerir.
PIE1 Bu kayıt Timer2 Kesme Etkinleştirme işaretini (TMR2IE) içerir.
T2CON
7 6 5 4 3 2 1 0
TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

TOUTPS3: TOUTPS0: Timer2 Çıkışı Son Ölçek Seçme bitleri
0000 = 1: 1 postscale
0001 = 1: 2 postscale
0010 = 1: 3 postscale



1111 = 1:16 postscale

TMR2ON: Zamanlayıcı2 Açık bit
1-Zamanlayıcı2 açık
0-Zamanlayıcı2 kapalı

T2CKPS1: T2CKPS0: Timer2 Clock Prescale Seçim bitleri
00 = Ön ölçekleyici 1
01 = Ön ölçekleyici 4
1x = Ön ölçekleyici 16

PIC18F4520 Timer/ Zamanlayıcı Modülleri timer nedir,pic timer,interrupt nedir,interrupt nedir elektrik,interrupt nedir ne işe yarar

Timer2 kullanarak 1sn gecikme oluşturma: Timer2
8-bit olduğundan ve 1:16 prescalar’ı desteklediğinden, 1sn gecikmeyi doğrudan oluşturmak mümkün değildir. 1:16 ön ölçekleyici ile maksimum gecikme:
$$ Gecikme = 256 * (Ön ölçek * 4) / Fosc = 256 * 16 * 4 / 20Mhz = 819us $$

Şimdi 500us, 1 saniyelik bir gecikme elde etmek için sayacı 2000 kez artırmak için kullanılacak zamanlayıcılar kullanılarak oluşturulabilir.
Prescalar ile 500usec @ 20Mhz için Gecikme Hesaplamaları 16: $$ RegValue = 256- (Gecikme * Fosc) / (Prescalar * 4)) = 256 – ((500us * 20Mhz) / (16 * 4)) = 256-156 = 100 $$

Program Kodu

Gecikme üretimi için Timer2’yi yapılandırma ve kullanma adımları aşağıdadır:

  1. Gereken gecikme için Zamanlayıcı Sayısını hesaplayın.
  2. Gecikme hesaplamalarına göre T2CON’daki Ön ölçekleyici bitlerini ayarlayın .
  3. Zamanlayıcı değerini TMR2 kaydına yükleyin .
  4. TMR2IE bitini ayarlayarak Timer2 Interrupt’ı etkinleştirin
  5. GIE ve PIE bitlerini ayarlayarak Global ve Çevresel kesintileri etkinleştirin
  6. Son olarak TMR2ON bitini ayarlayarak Timer2’yi başlatın

Aşağıda LED’leri 1 sn gecikmeyle yanıp sönecek örnek kod verilmiştir.

#include<pic16f877a.h>
#define SBIT_T2CKPS1  1
char value = 0;
int count = 0;
void interrupt timer_isr()
{  
    if(TMR2IF==1)
    {
        TMR2 = 101;     /*Load the timer Value, (Note: Timervalue is 101 instead of 100 as the
                          Timer2 needs two instruction Cycles to start incrementing TMR2 */
        TMR2IF=0;       // Clear timer interrupt flag
        if(count>=2000) //500us * 2000=1000000us=1sec
        {
            count=0;
            value=~value;   // complement the value for blinking the LEDs
        }
        else
        {
            count++;  // Keep incrementing the count till it reaches 2000 to generate 1sec delay
        }
    } 
}
void main()
{    
    TRISD=0x00;    //COnfigure PORTD as output to blink the LEDs
    T2CON = (1<<SBIT_T2CKPS1);  // Timer2 with external freq and 16 as prescalar
    TMR2=100;       // Load the timer value for 500us delay
    TMR2IE=1;       //Enable timer interrupt bit in PIE1 register
    GIE=1;          //Enable Global Interrupt
    PEIE=1;         //Enable the Peripheral Interrupt
    TMR2ON = 1;
    while(1)
    {
        PORTD = value;
    }
}

PIC18F4520 Timer/ Zamanlayıcı Modülleri timer nedir,pic timer,interrupt nedir,interrupt nedir elektrik,interrupt nedir ne işe yarar