Timerinterrupts am Uno: Timer 2

Funktionierendes Script, um Timer-Register Nr. 2 am Atmel AVR 328P zu schalten. Besonderheiten: im CTC-Modus bleiben die Pins 3 und 11 passiv, es müssen aktiv die Timer-Interrupts gesetzt werden. Im 011-Fast-PWM werden automatisch die Pins 3 und 11 angesteuert. Achtung: die ‚tone()‘-Funktion läuft nicht mehr bei Nutzung de Timer2-Registers.

void setup() {
  //Disable Interrupts, damit man die Register setzen kann.
  cli();
  /////////////////////////////////////////////////
  // BIT Nr.      1        2        3        4         5       6        7       8
  // TCCR2A = [ COM2A1 | COM2A0 | COM2B1 | COM2B0 |   --   |   --   |  WGM21 | WGM20 ]
  // TCCR2B = [ FOC2A  | FOC2B  |   --   |   --   |  WGM22 |  CS22  |  CS21  | CS20  ]
  /////////////////////////////////////////////////
  //Register 2A und 2B löschen.
  TCCR2A = 0;
  TCCR2B = 0;
  //Counter auf 0 zurücksetzen
  TCNT2  = 0;
  /////////////////////////////////////////////////
  //Compare Match Output, Funktionsmodus setzen
  // 00: OC2A aus | 10: NichtInvertiert | 11: Invertiert
  TCCR2A |= (1 << COM2A1);
  TCCR2A |= (0 << COM2A0);
  // 00: OC2B aus | 10: NichtInvertiert | 11: Invertiert
  TCCR2A |= (1 << COM2B1);
  TCCR2A |= (0 << COM2B0);

  //WGM: Waveform Generation Bits
  //100: PWM Phasenkorrigiert bei 255   | 010: CTC Clear Timer on Compare  !!!!
  //101: PWM Phasenkorrigiert bei OCR0A | 011: Fast-PWM bei OCR2A und OCR2B!!!!
  TCCR2B |= (0 << WGM22);
  TCCR2A |= (1 << WGM21);
  TCCR2A |= (0 << WGM20);

  // Prescaler Values, Basis ist 16 MHz;  000: "Disabled" Timer ist ausgeschaltet
  // 001: /1 | 010: /8 | 011: /32 | 100: /64 DEFAULT | 101: /128 | 110: /256 | 111: /1024
  TCCR2B |= (1 << CS22);
  TCCR2B |= (0 << CS21);
  TCCR2B |= (1 << CS20);
  /////////////////////////////////////////////////
  //Duty Cyles für die Pins: Output Compare Register
  OCR2A = 255; // Pin 11 für 011-Fast-PWM-Modus und beliebigem Pin bei 010-CTC-Modus
  OCR2B = 1; // Pin 3
  /////////////////////////////////////////////////
  // Nur relevant bei CTC-Modus
  TIMSK2 |= (1 << OCIE2A); // Für Interrupt-Einschalten für OCR2A bei CTC-Modus an beliebigem Pin.
  TIMSK2 |= (1 << OCIE2B); // Für Interrupt-Einschalten für OCR2A bei CTC-Modus an beliebigem Pin.
  //Enable interrupts
  sei();
  /////////////////////////////////////////////////
  //Für Fast-PWM-Modus 011
  pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
  
  //Für CTC-Modus an beliebigem Pin, hier 12:
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}

void loop() {
}

ISR(TIMER2_COMPA_vect) {
  digitalWrite(12,!digitalRead(12));
}
///////////////////////////////////
ISR(TIMER2_COMPB_vect) {
  digitalWrite(13,!digitalRead(13));
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.