Természetesen egy ilyen egyszerű paranccsal nem lehet sok mindent csinálni, egy komoly program megírásához ennél több minden szükségeltetik. A következőkben bemutatok pár általános dolgot.
Az összes elérhető függvény leírását megtaláljátok a feltelepített CCS Compiler könyvtárában, vagy itt.
Timer modulok használata
Mikrokontrollertől függően 3, 4 vagy esetleg 5 timer modul is rendelkezésünkre áll.
Pl. A TIMER_0 modul 8 bites, 1:1-től 1:256-os előosztóval rendelkezik, a TIMER_1 modul pedig 2×8 bites, 1:1-től 1:8-as előosztóval rendelkezik. Ez alapján kell konfigurálni őket.
C nyelven a timereket mindig initializálni (beállítani) és engedélyezni kell. Ezen túl, bármely timer/counter használata előtt engedélyezni kell a Global Interrupts bitet.
Így néz ki a program fejléce:
#include <16F876A.h>
#zero_ram
#fuses HS,NOWDT,NOPROTECT,NOPUT,BROWNOUT,NOLVP
#use delay(clock=12000000)
#define XTAL_FREQUENCY 12000000 //kristály frekvenciája Hertzben
#define TIMER1_FREQUENCY (XTAL_FREQUENCY / 4)
int32 Ticker;
// ide jön majd az ISR és az inits() függvény. lsd. lentebb
//===========================================================================
void main() {
//===========================================================================
inits();
while(1){
; //semmit nem csinál!
}
}
Az inits() függvény, és benne a Global Interrupts bit engedélyezése
//===========================================================================
void inits(void){
//===========================================================================
set_TRIS_A( 0xFF ); //0=kimenet, 1=bemenet
set_TRIS_B( 0x01 ); //RB0-ára van kötve egy LED
Ticker = TIMER1_FREQUENCY;
setup_timer_1( T1_INTERNAL | T1_DIV_BY_1 );
enable_interrupts( INT_TIMER1 );
enable_interrupts( GLOBAL );
}
És végül az Interrupt Service Routine (ISR), ami a TIMER1 regisztereinek (TMR1H,TMR1L) túlcsordulásakor hajtódik végre. A Compiler maga törli a megfelelő biteket, menti az akku tartalmát, hogy nekünk ne legyen már gondunk semmire. Ha lefutott az ISR, a processzor ott folytatja a munkáját, ahol abbahagyta.
FIGYELEM! Az ISR "függvényben" a lehető legkevesebbet csináljuk, csak az épp szükséges változókat inc/decrementáljuk, vagy állítsunk jelzőbiteket, amit a főprogramből kérdezünk le.
//===========================================================================
#int_TIMER1
void TIMER1_isr(){
//=================== halál pontos 1 mp-es időzítő ==========================
Ticker -= 65535;
if ( Ticker < 65536 ) {
Ticker += TIMER1_FREQUENCY;
output_toggle(PIN_B0);
}
}
Ez így néz ki:
A cikk még nem ért véget, lapozz!
Értékeléshez bejelentkezés szükséges!