rozhodl jsem se, že se na arduinu naučím používat přerušení od časovače. (a pak to celé budu chtít zabalit do knihovny, to bude mazec)
Pro začátek jsem se podíval na TENTO příklad (odkazuje na něj arduino.cc.
Protože se mi stránka zobrazuje zmršená, tak dole přidávám vykopírovaný program ze stránky.
A teď, co mne zaujalo je, že autor potřebuje, aby mu TIMER2 probíhal 250x a nikoli 256x. Tak to řeší tak, že po každém přetečení přiřadí do TCNT2 hodnotu 6. To je podle mne dost prasárna. já bych si myslel, že by bylo správnější uložit do registru OCR2A hodnotu 250, nastavit si režim TCCR2A.WGM2 = Mode2 (CTC, clear timer when reach) a pak reagovat na přerušení "TIMER2_COMPA_vect" (TIMSK2.OIE2A =1, TIMSK2.OIE2B=0, TIMSK2.TOIE2=0)
Je moje úvaha správná? Nebo je nějaký důvod, proč tuhle metodu nepoužívat?
--- kód ze stránky ---
Kód: Vybrat vše
#define INIT_TIMER_COUNT 6
#define RESET_TIMER2 TCNT2 = INIT_TIMER_COUNT
int ledPin = 13;
int int_counter = 0;
volatile int second = 0;
int oldSecond = 0;
long starttime = 0;
// Aruino runs at 16 Mhz, so we have 1000 Overflows per second...
// 1/ ((16000000 / 64) / 256) = 1 / 1000
ISR(TIMER2_OVF_vect) {
RESET_TIMER2;
int_counter += 1;
if (int_counter == 1000) {
second+=1;
int_counter = 0;
}
};
void setup() {
Serial.begin(9600);
Serial.println("Initializing timerinterrupt");
//Timer2 Settings: Timer Prescaler /64,
TCCR2 |= (1< <CS22);
TCCR2 &= ~((1<<CS21) | (1<<CS20));
// Use normal mode
TCCR2 &= ~((1<<WGM21) | (1<<WGM20));
// Use internal clock - external clock not used in Arduino
ASSR |= (0<<AS2);
//Timer2 Overflow Interrupt Enable
TIMSK |= (1<<TOIE2) | (0<<OCIE2);
RESET_TIMER2;
sei();
starttime = millis();
}
void loop() {
if (oldSecond != second) {
Serial.print(second);
Serial.print(". ->");
Serial.print(millis() - starttime);
Serial.println(".");
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
oldSecond = second;
}
}