CTC timer v mikrokontroléru ATmega2560

Zápisník experimentátora

Hierarchy: Časovač (timer)

Mikrokontrolér ATmega2560 je součástí desky Arduino Mega 2560. Obsahuje více vývodů a jeho autoři přidali i více časovačů. Obsahuje dva 8bitové a čtyři 16bitové timery. V tomto článku se podíváme na časovače z hlediska CTC režimu. Na generování programů budeme používat online kalkulátor.

Časovače

První tři časovače jsou identické s ATmega328P.

  • Timer0 - 8-bitový.
  • Timer1 - 16-bitový.
  • Timer2 - 8-bitový.

Kromě nich jsou doplněny tři další časovače, které jsou přesnou kopií časovače timer1.

  • Timer3 - 16-bitový.
  • Timer4 - 16-bitový.
  • Timer5 - 16-bitový.

Příklady

Pro každý časovač jsem napsal vzorový program, který bliká interní LED diodou na frekvenci 1 Hz. V příkladech uvidíte, že 8-bitový timer se musí nastavit na vyšší frekvenci a následně je třeba doplnit interní děličku, abychom se dostali na požadovanou frekvenci. Při 16-bitovém časovači to není nutné a požadovanou frekvenci lze nastavit přímo.

Příklad Timer0 - 8-bitový

#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;
}

Příklad Timer1 - 16-bitový

#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

Zdrojové texty se nacházejí na serveru GitHub.


14.09.2017


Menu