TIMER modul


      Ezzel a modullal időzítéseket és késleltetéseket csinálhatunk a programunkban. A modul használja a TMR0-t és a megszakitást. Ezért erre figyelni kell a modul használatakor. A TIMER_TMR0pre és TIMER_TMR0val értékétöl függő periodusidővel generélódik egy megszakitás, ami a számlalók értékét csökkenti. A megszakítások generálásának periódusidejét a T = 4 * TIMER_TMR0pre * TIMER_TMR0val / xtal_freq képlettel számíthatjuk ki, ahol az xtal_freq Hz-ben behelyettesítve az eredményt másodpercbe kapjuk.

A megszakítások generálásának idejét a kivánt késleltetések függvényében határozzuk meg. Ha például hosszú időzítéseket akarunk csinálni, akkor a TIMER_TMR0pre és TIMER_TMR0val értékét minél nagyobbra válasszuk. De ha a legrövidebb időzitésunket 10 mS-nek szeretnénk, maximum 10%-os hibával, azaz minimun 10 IT generálodjon a 10mS alatt, akkor az IT-k gyakoriságát válasszuk 1mS-ra. A TIMER_TMR0pre állítsuk (kisérleti alapon) 16-ra, a TIMER_TMR0val értékét pedig a feni képletből levezetve a TIMER_TMR0val = T * xtal_freq / (4 * 16) képlettel számithatjuk. TIMER_TMR0val = 1mS * 4Mhz / 64 = 62-re állitjuk.

Ellenőrizuk az szamítás eredményét: T = 4 * TIMER_TMR0pre * TIMER_TMR0val / xtal_freq = 4 * 16 * 62 / 4000000 = 0.992mS. Tehát ezzel a beállítással 0.992mS-onkent generálódik egy megszakítás. A pontosság javításához duplázhatjuk ez előosztó, és felezhetjük a TIMER_TMR0pre értékét, ezzel a maximális hiba 10%-ról 5%-ra csökken. De vigyázzunk, túlzásba ne vigyük, mert a sok IT generálás, sok időt felemészthet.

Szükséges definiciók a főprogramban

xtal_freq       EQU     4000000         ; oscillátor frekvencia
                                        ; Itt használhatóak a base modulban
                                        ; definiált  kHz és MHz mértékegységek.
                                        ; pl: xtal_freq       EQU       4 MHz
					
core_freq       EQU     xtal_freq/4     ; Az MCU magjának frekvenciája.
                                        ; A 12x es 16x sorozatnál ez mindig az
                                        ; xtal_freq negyede.

TIMER_TMR0pre   EQU     256             ; Timer 0 elooszto erteke (2, 4, .. 256)
TIMER_TMR0val   EQU     128             ; TMR0 futasi ideje (1-256)
TIMER_DIVIDER	EQU	100		; hosszabb időzítésekhez a TIMER_DIVxxx macróval használható (előosztott timer) 

Opcionális definiciók a főprogramban

#define DEBUG                           ; Ha definiálva van, akkor forditási időben
                                        ; információkat kapunk.
#define NO_DELAY                        ; A simulálához kiiktatja a várakozásokat.

Makrók

Név Paraméter Leirás
TIMER_INIT Inicializálja a TIMER modult
TIMER_START tvar, time_ms Egy 8 bites timert indit a tvar változóval. A Timer lejártát a TIMER_OUT macroval lehet figyelni. A tvar változó csökkentéséhez a IT rutinban fel kell hivni a TIMER_UPDATE macrot. Ne feledkezzunk meg, hogy az IT végén a TIMER_SETTMR0 macro-t is egyszer fel kell hívni!
tvar Egy fileregiszter nevét kell megadni, amelyben az adott Timer visszaszámol. Ha 0-át eléri, akkor lejárt az időzítés.
time_ms Az időzítés hosszát tudjuk megadni millisecundumban.
TIMER_START16 tvar16, time_ms Egy 16 bites timert indit a tvar16 16 bites változóval. hasonló. mint a TIMER_START, csak hosszabb időzítést lehet vele készíteni.
tvar16 Egy fileregiszter pár nevét kell megadni, amelyben az adott Timer visszaszámol. Ha 0-át eléri, akkor lejárt az időzítés.
time_ms Az időzítés hosszát tudjuk megadni millisecundumban.
TIMER_STARTW tvar Egy 8 bites timert indit a tvar változóval. Hasonló mint a TIMER_START, kivétel az, hogy az időt a W regiszterben várja, és a mértékegysége az TMR0 megszakítások közti időkülönbség. Pl. ha a megszakítások 10 mS-onken következnek be, es a W-be 50-et állítottunk be, akkor a timer 500 mS-nal jár le.
tvar Egy fileregiszter nevét kell megadni, amelyben az adott Timer visszaszámol. Ha 0-át eléri, akkor lejárt az időzítés.
TIMER_START16W tvar16 Egy 16 bites timert indit a tvar16 16 bites változóval. hasonló. mint a TIMER_STARTW, csak hosszabb időzítést lehet vele készíteni. Az időt a timer_hi:W -be kell megadni.
tvar16 Egy fileregiszter pár nevét kell megadni, amelyben az adott Timer visszaszámol. Ha 0-át eléri, akkor lejárt az időzítés.
TIMER_DIVSTART tvar, time_ms Egy 8 bites előosztott timert indit a tvar változóval. A Timer lejártát a TIMER_OUT macroval lehet figyelni. A tvar változó csökkentéséhez a IT rutinban fel kell hivni a TIMER_DIVUPDATE macrot. Ne feledkezzunk meg, hogy az IT végén a TIMER_SETTMR0 és TIMER_UPDATE_DIVIDER macro-kat is egyszer fel kell hívni!
tvar Egy fileregiszter nevét kell megadni, amelyben az adott Timer visszaszámol. Ha 0-át eléri, akkor lejárt az időzítés.
time_ms_x_div Az időzítés hossza (TIMER_DIVIDER * ez az ertek) mS
TIMER_DIVSTART16 tvar16, time_ms Egy 16 bites előosztott timert indit a tvar16 16 bites változóval. hasonló. mint a TIMER_DIVSTART, csak méghosszabb időzítést lehet vele készíteni.
tvar16 Egy fileregiszter pár nevét kell megadni, amelyben az adott Timer visszaszámol. Ha 0-át eléri, akkor lejárt az időzítés.
time_ms Az időzítés hossza (TIMER_DIVIDER * ez az ertek) mS
TIMER_OUT tvar, tlabel A tvar Timer lejártát ellenörzi. Ha lejárt, akkor a tlabel cimre ugrik, egyébként a következő utasítással folytatja a programot.
tvar 8 bitest Timer fileregiszter.
tlabel A timer lejártakor erre a cimre ugrik.
TIMER_OUT16 tvar16, tlabel A tvar16 16 bites Timer lejártát ellenörzi. Ha lejárt, akkor a tlabel cimre ugrik, egyébként a következő utasítással folytatja a programot.
tvar16 16 bitest Timer fileregiszter pár.
tlabel A timer lejártakor erre a cimre ugrik.
TIMER_NOTOUT tvar, tlabel A tvar Timer lejártát ellenörzi. Ha nem járt le, akkor a tlabel cimre ugrik, egyébként a következő utasítással folytatja a programot.
tvar 8 bitest Timer fileregiszter.
tlabel Ha a timer nem jart le erre a cimre ugrik.
TIMER_NOTOUT16 tvar16, tlabel A tvar16 16 bites Timer lejártát ellenörzi. Ha nem járt le, akkor a tlabel cimre ugrik, egyébként a következő utasítással folytatja a programot.
tvar16 16 bitest Timer fileregiszter pár.
tlabel Ha a timer nem jart le erre a cimre ugrik.
TIMER_UPDATE tvar A timer-ünk müködéséhez, ez a macrót a IT rutinban fel kell hivnunk minden timer változónkhoz. Ez a macró minden IT bekövetkezésekor csökkenti egyel a változó értékét, mindaddig, amig nulla nem lesz.
tvar 8 bites timer fileregiszter.
TIMER_UPDATE16 tvar16 Mint a TIMER_UPDATE, csak a 16 bites timerokra.
tvar 16 bites timer fileregiszter pár.
TIMER_DIVUPDATE tvar Az előosztott timer-ünk müködéséhez, ez a macrót a IT rutinban fel kell hivnunk minden előosztott timer változónkhoz.
tvar 8 bites timer fileregiszter.
TIMER_DIVUPDATE16 tvar16 Mint a TIMER_DIVUPDATE, csak a 16 bites timerokra.
tvar 16 bites timer fileregiszter pár.
TIMER_SETTMR0 A IT rutin végén kell egyszer felhivni, ujraindítja a TMR0 a megadott értékkel.
TIMER_UPDATE_DIVIDER A IT rutin végén kell egyszer felhivni ha elöosztott timer-t is használunk. Frissíti az előosztó értékét.
TIMER_WAIT tvar, time_ms Hasonló mint a WAIT macró, csak timerrel megvalósítva. Elindit egy 8 bites timer-t a megadott idővel, és meg is várja annak lejártát. Hosszabb késleltetés megvalósításához.
tvar 8 bites timer fileregiszter.
time_ms Az késleltetés hosszát tudjuk megadni millisecundumban.
TIMER_WAIT16 tvar16, time_ms Hasonló mint a TIMER_WAIT, csak még hosszabb késleltetéshez.
tvar16 16 bites timer fileregiszter pár.
time_ms Az késleltetés hosszát tudjuk megadni millisecundumban.