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.

pic timer, PIC18F4520 Timer/ Zamanlayıcı Modülleri
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.

pic timer, PIC18F4520 Timer/ Zamanlayıcı Modülleri

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.

İsimBoyutKontrol KaydıSayım KaydıMin GecikmeMaks Gecikme
TIMER08 bitOPTION_REGTMR00.2usec13.107ms
TIMER116 bitT1CONTMR1H, TMR1L0.2usec104.857ms
TIMER28 bitT2CONTMR20.2usec819usec

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.

İsimBoyutGecikme hesaplama formülü
TIMER08 bit$ RegValue = 256 – ((Gecikme * Fosc) / (Prescalar * 4)) $
TIMER116 bit$ RegValue = 65536 – ((Gecikme * Fosc) / (Prescalar * 4)) $
TIMER28 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ıtAçıklama
OPTION_REGBu kayıtlar TIMER0 Prescalar, Clock Source vb.
TMR0Bu 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
76543210
RBPUINTEDGT0CST0SEPSAPS2PS1PS0

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

pic timer, PIC18F4520 Timer/ Zamanlayıcı Modülleri

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
76543210
GIETURTATMR0IEINTERBIETMR0IFINTFRBIF

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

pic timer, PIC18F4520 Timer/ Zamanlayıcı Modülleri

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;
    }
}
pic timer, PIC18F4520 Timer/ Zamanlayıcı Modülleri

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.
TMRIHBu 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
TMRILBu 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
PIR1Bu kayıt Timer1 taşma bayrağını (TMR1IF) içerir.
PIE1Bu kayıt Timer1 Interrupt Enable bayrağını (TMR1IE) içerir.

 

T1CON
76543210
T1CKPS1T1CKPS0T1OSCENT1SYNCTMR1CSTMR1ON

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

pic timer, PIC18F4520 Timer/ Zamanlayıcı Modülleri

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;
    }
}
pic timer, PIC18F4520 Timer/ Zamanlayıcı Modülleri

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.

RegisterAçıklama
T2CONBu kayıtlar TIMER2 Prescalar, Saat Kaynağı vb.
TMR2Bu kayıt, prescalar yapılandırmaya bağlı olarak artırılacak zamanlayıcı sayım değerini tutar
PIR1Bu kayıt Timer2 taşma bayrağını (TMR2IF) içerir.
PIE1Bu kayıt Timer2 Kesme Etkinleştirme işaretini (TMR2IE) içerir.

 

T2CON
76543210
TOUTPS3TOUTPS2TOUTPS1TOUTPS0TMR2ONT2CKPS1T2CKPS0

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

pic timer, PIC18F4520 Timer/ Zamanlayıcı Modülleri

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;
    }
}
pic timer, PIC18F4520 Timer/ Zamanlayıcı Modülleri