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