Zápisník experimentátora
Hierarchy: Časovač (timer)
Mikrokontrolér ATmega2560 je súčasťou dosky Arduino Mega 2560. Obsahuje viac vývodov a jeho autori pridali aj viac timerov. Obsahuje dva 8-bitové a štyri 16-bitové timery. V tomto článku sa pozrieme na časovače z hľadiska CTC režimu. Na generovanie programov budeme používať online kalkulátor.
Prvé tri časovače sú identické s ATmega328P.
Okrem nich sú doplnené tri ďalšie časovače, ktoré sú presnou kópiou časovača timer1.
Pre každý časovač som napísal vzorový program, ktorý bliká internou LED diódou na frekvencii 1 Hz. V príkladoch uvidíte, že 8-bitový timer sa musí nastaviť na vyššiu frekvenciu a následne je treba doplniť internú deličku, aby sme sa dostali na požadovanú frekvenciu. Pri 16-bitovom časovači to nie je potrebné a požadovanú frekvenciu možno nastaviť priamo.
#define ledPin 13
volatile int divider=0;
void setupTimer0() {
noInterrupts();
// Clear registers
TCCR0A = 0;
TCCR0B = 0;
TCNT0 = 0;
// 100.16025641025641 Hz (16000000/((155+1)*1024))
OCR0A = 155;
// CTC
TCCR0A |= (1 << WGM01);
// Prescaler 1024
TCCR0B |= (1 << CS02) | (1 << CS00);
// Output Compare Match A Interrupt Enable
TIMSK0 |= (1 << OCIE0A);
interrupts();
}
void setup() {
pinMode(ledPin, OUTPUT);
setupTimer0();
}
void loop() {
}
ISR(TIMER0_COMPA_vect) {
if(divider==0)
digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
divider++;
divider%=100;
}
#define ledPin 13
void setupTimer1() {
noInterrupts();
// Clear registers
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// 1 Hz (16000000/((15624+1)*1024))
OCR1A = 15624;
// CTC
TCCR1B |= (1 << WGM12);
// Prescaler 1024
TCCR1B |= (1 << CS12) | (1 << CS10);
// Output Compare Match A Interrupt Enable
TIMSK1 |= (1 << OCIE1A);
interrupts();
}
void setup() {
pinMode(ledPin, OUTPUT);
setupTimer1();
}
void loop() {
}
ISR(TIMER1_COMPA_vect) {
digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
}
Zdrojové texty sa nachádzajú na serveri GitHub.
14.09.2017