Delay med TIMER1
ATmega328P.pdf ( Register summary on p 428 )Processorn ATmega328/P har tre st timer/counter, två 8-bitars (TIMER0 och TIMER2) och en 16-bitars TIMER1.
TIMER1 förenklat blockschema för Normal Mode (räkna upp).
TIMER1 16-bits räknaren kan räkna flanker pos/neg från T1-pinnen eller processorns klockpulser via en prescaler. Prescalern kan dela med 1, 1/8, 1/64, 1/256, 1/1024.

TCCR1B |= ((1 << CS12 )); // Set up timer clk prescaler as Fcpu/256
// "CS12 CS11 CS10" = "1 0 0"
För att blinka med 1 Hz behöver man toggla LED 2 ggr/sek. Delay t = 0,5 s.

TIMER1 kan läsas/skrivas som 16-bit variabeln TCNT1. Varje 0,5 s, som tar 31249 TIMER1-tick, togglas LED och därefter nollställs TIMER1.
if ( TCNT1 >= 31248){ PORTB ^= ( 1 << PB5 ); // period is 2*0.5 = one second
TCNT1 = 0; // Reset timer value
Det fullständiga programmet finns här:
blink_tmr1.txt
(for Arduino use code stored as: blink_tmr1\blink_tmr1.ino)Clear timer on compare mode, CTC.
Till TIMER1 finns en compare enhet. I stället för att läsa av och jämföra TCNT1 i huvudprogrammet, kan compare enheten läsa TIMER1. Huvudprogrammet läser interruptflaggan OCF1A och togglar LED. Reset av TIMER1 sker automatiskt vid compare.
Det fullständiga programmet finns här:
blink_tmr1_cmp.txt
(for Arduino use code stored as: blink_tmr1_cmp\blink_tmr1_cmp.ino)Compare enhetens interrupt kan helt avlasta huvudprogrammet. Huvudprogrammets loop blir tom _NOP();. TIMER1 0-ställs automatiskt vid compare, och LED togglas i interruptrutinen.
Det fullständiga programmet finns här:
blink_tmr1_cmp_int.txt
(for Arduino use code stored as: blink_tmr1_cmp_int\blink_tmr1_cmp_int.ino)
William Sandqvist william@kth.se