WebElektronika

Timer0 időzítő a PIC18F családban

person access_time 2014.02.25.
Ebben a cikkben röviden áttekintjük a PIC18F családban található Timer0 modult, amely használható időzítőnek, számlálónak.


A PIC18F családban négy időzítő/számláló (Timer0,1,2,3) modul található. Tekintsük most át a Timer0 alapjait.
 

Timer0

Talán nyugodtan mondhatjuk, hogy a PIC-eknél ez az egyik leggyakrabban használt (ismert) modul, nagyon sok példaprogram található ezzel kapcsolatban a neten. A Timer0 lehet időzítő és számláló is, használhatjuk 8 vagy 16 bites üzemmódban is (1. ábra).


1. ábra   Timer0 8 bites módban
 

A Timer0-lal történő számlálás vagy a T0CKI bemenetről érkező állapotváltásokkal, vagy pedig a FOSC/4 belső órajellel történhet. Tekintettel arra, hogy az FOSC/4 jel periódikus órajel, ezért ha ezt a jelet választjuk számlálásra, akkor időzítőmódról beszélünk.
A T0CS bit segítségével dönthetjük tehát azt el, hogy melyik jelforrás (időzítő vagy számláló) kerüljön felhasználásra.

A PSA bit segítségével tudjuk beállítani azt, hogy használjunk-e előosztót (PSA = 1), vagy ne. Ha használunk, akkor a T0PS0,1,2 bitek segítségével tudjuk beállítani az osztási arányt.

8 bites módban 0 - 0xFF között tudunk számolni, túlcsorduláskor újra 0-tól kezdődik a számolás, és a TMR0IF flag logikai 1-be vált. Ezt a flag-et csak szoftveresen tudjuk törölni.

Ha a Timer0-t 16 bites módban kívánjuk használni, akkor a következő architektúrát alakítjuk ki a PIC-en belül (2. ábra). Tekintettel arra, hogy 16 bites módban használjuk a Timer0-t egy 8 bites architektúrán, ezért két regiszterben (TMR0L, TMR0H) kerül eltárolásra az eredmény. Természetesen ezek a regiszterek is írhatók, olvashatók.


2. ábra   Timer0 16 bites módban
 

A T0CON regiszter segítségével tudjuk beállítani a Timer0 működését, tulajdonságait. Ha megnézzük a T0CON "belsejét", a korábban ismertett biteket találjuk meg (3. ábra). 


3. ábra   A Timer0 konfigurációs regisztere
 

A T0PS0,1,2 bitek segtségével tudjuk beállítani az osztási arányt (ha ezt engedélyezzük a PSA-val).
 

Példák

Készítsünk először egy számlálót, számoljunk el 0-tól 15-ig. Láttuk az előbb, hogy túlcsorduláskor a TMR0IF flag állapotot vált, logikai 0-ból 1-be vált. Ezt fogjuk figyelni mind a két példánál, tehát túlcsorduláskor szoftveresen töröljük ezt a flag-et, illetve a LED-ek állapotát is módosítani fogjuk.

Számláló : Először tiltjuk a Watchdog timer-t, illetve az LVP-t. A main() függvényben beállítjuk a "C" port minden bitjét kimenetre (TRISC = 0x00), majd a kimenetet is nullázzuk (LATC = 0x00).
Ezután a Timer0-t felprogramozzuk a T0CON konfigurációs regiszter segítségével. A regiszter bitkiosztását a 3. ábra személteti.
Láthatjuk, hogy először még nem engedélyezzük a Timer0 működését (7. bit 0), illetve a 16 bites üzemmódot állítottuk be (6. bit 0). A T0CON regiszter 5. bitje (T0CS) is 0, tehát a belső órajelet használjuk fel a Timer0 számlálására. A 4. bit (T0SE) csak akkor érdekes, ha a T0CKI lábon történő állapotváltásokat szeretnénk használni, tehát itt lehet akár logikai 0 vagy 1 is. Használunk előosztót (PSA = 1), és az osztási arány 1:8 (010).
A Timer0 működésének a beállítása után engedélyezzük az időzítő működését, a TMR0ON bit logikai 1-be történő beállításával. 
 

számláló villogó

#include <p18f14k50.h>

#pragma config WDTEN = OFF
#pragma config LVP = OFF

main()
{
    TRISC = 0x00;
    LATC = 0x00;

    T0CON = 0B00001010;
    TMR0L = 0x00;

    T0CONbits.TMR0ON = 1;

    while(1)
    {
        if(INTCONbits.TMR0IF)
        {
            if(LATC < 15)
            {
                LATC++;
            }
            else
                LATC = 0x00;

            INTCONbits.TMR0IF = 0;
        }
    }
}

#include <p18f14k50.h>

#define T0ENG   T0CONbits.TMR0ON
#define T0F     INTCONbits.TMR0IF
#define LED0    LATCbits.LATC0
#define LED1    LATCbits.LATC1

#pragma config WDTEN = OFF
#pragma config LVP = OFF

main()
{
    TRISC = 0B00000000;
    LATC = 0B00000000;

    T0CON = 0B00001010;
    TMR0L = 0x00;

    T0ENG = 1;

    while(1)
    {
        if(T0F)
        {
            LED0 = !LED0;
            LED1 = !LED0;
            T0F = 0;
        }
    }
}


Villogó : Ennek a példaprogramnak a felépítése hasonló a számlálóéhoz, de itt elneveztük a felhasznált "C" portbiteket LED0,1-nek, a TMRON-t T0ENG-nek, illetve a TM0IF flag-et T0F-nek. Ezeket a #define segítségével tettük meg, amelyeket akár egy külön *.h file-ban is megadhattuk volna.