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