Delay med TIMER1

Tillbaka till startsidan

Processorn ATmega328/P har tre st timer/counter, två 8-bitars (TIMER0 och TIMER2) och en 16-bitars TIMER1.

TIMER1 inställningar


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:

Med Compare enheten

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:

Med interrupt från Compare enheten

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:


Tillbaka till startsidan

 


William Sandqvist    william@kth.se