...
Code Block |
---|
#define XTAL 3686400L #define TICKSPERMS (XTAL / 1000 / 5 - 1) #include <avr/io.h> #include "led_drv.h" #include "timer8_drv.h" #include "uart_lib.h" #include "uart_drv.h" #include "timer16_drv.h" void wait_ms(uint16_t ms) { uint16_t a, b; for (a = ms; a > 0; a--) for (b = TICKSPERMS; b > 0; b--) asm("nop"); } int main(void) { TCCR1B |= (1 << CS10); //16bit Timerin setup U16 temp=0; Uart_select(UART_0); //Uart 0 valittu uart_init(CONF_8BIT_NOPAR_1STOP,115200); //Uartin initialisointi kirjaston valmiilla funktiolla (8bit data, ei parityä, 1stoppi bitti, 115200 nopeus) for(;;) { temp=TCNT1; //Rekisteri, josta loytyy kellon tikitys uart_mini_printf("\r%u\n",temp); //Tulostetaan vaylalle } } |
16-bit ajastin
16-bittisen ajastimen käyttöönotto tapahtuu rekistereiden avulla.
Code Block |
---|
TCCR1B |= (1 << CS11);
|
Yllä oleva koodi käynnistää 16bittisen ajastimen (Timer1) asetuksella "clkI/O/8 (From prescaler)".
Code Block |
---|
TIMSK1 |= (1 << TOIE1);
|
Yllä oleva koodi sallii Timer1:n ylivuotokeskeytykset.
Code Block |
---|
sei();
|
Yllä oleva funktio sallii keskeytykset (laittaa SREG rekisterin I-bitin arvoon 1).
Tämän jälkeen timerin pitäisi olla päällä ja tikittää kokoajan. Pelkästä timerista ei kuitenkaa aina ole hyötyä. Esim. pidempiä aikoja halutessa, tulee laskea timerin kiertämät kierrokset. Se onnistuu ISR funktion avulla, joka löytyy avr:n interrupt.h tiedostosta.
Code Block |
---|
ISR(TIMER1_OVF_vect) //keskeytysaliohjelma, hypataan tanne joka kerta, kun timer1 ylivuoto tapahtuu
{
Timer++;
uart_mini_printf("\rTimerin arvo: %u\n",Timer);
}
|
ISR funktioon (keskeytysaliohjelma) mennään aina automaattisesti, kun Timer1:n ylivuotovektori täyttyy (joka kierroksella). Tällöin voidaan kasvattaa vaikkapa Timer muuttujaa, jolloin tiedetään kierrosten lukumäärä.