Timer interrupt i UNO board
Arduino UNOPosted by Ole Bent Nielsen Fri, February 13, 2015 18:38:54Jeg har lavet en lille demo her på hvordan timer interrupt kan gøres på et UNO board.
Bemærk at den timer der bruges, somme tider anvendes i andre biblioteker, så det skal vi lige være opmærksomme på.
Jeg har fået inspiration fra denne side http://letsmakerobots.com/content/arduino-101-timers-and-interrupts , som giver et godt overblik over de funtioner der er til rådighed.
Kodestumpen er sakset på nettet og modificeret til demo. Ikke det store program; men det viser funktionen, så der er noget at gå videre med.
Timer interrupt er jo meget nyttige, når ting skal ske med bestemte intervaller, som f.eks. timebase o.lign.
------------ her er koden til at klippe ud og sætte i Arduino compileren -----------
/* Denne kode er sakset og modificeret så der tælles og udlæses hvert sekund
da det er en 500 mSec timer interrupt skal der tælles op med 2 for hver ganf der skrives ud
til terminalvinduet
OZ8NZ, Ole den 13.02.2015
*/
/*
Example Timer1 Interrupt
Flash LED every second
*/
#define ledPin 13
int cnt = 0 ; /* counter fra interupt */
int timer1_counter;
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
// initialize timer1
noInterrupts(); // disable all interrupts
TCCR1A = 0;
TCCR1B = 0;
// Set timer1_counter to the correct value for our interrupt interval
//timer1_counter = 64886; // preload timer 65536-16MHz/256/100Hz
//timer1_counter = 64286; // preload timer 65536-16MHz/256/50Hz
timer1_counter = 34286; // preload timer 65536-16MHz/256/2Hz
TCNT1 = timer1_counter; // preload timer
TCCR1B |= (1 << CS12); // 256 prescaler
TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt
interrupts(); // enable all interrupts
}
ISR(TIMER1_OVF_vect) // interrupt service routine
{
TCNT1 = timer1_counter; // preload timer
digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
++cnt; /* add 1 ved interrupt */
}
void loop()
{
delay(1000);
Serial.print(" Counter har talt til ");
Serial.println(cnt);
if (cnt >= 100) /* Reset counter hvis > end = 100 */
{
cnt =0;
}
}