Hallo
Ich versuche den Timer3 des ATmega so zu konfigurieren, dass er keine
Aktionen an den OCR3n Pins ausgibt, sondern nur intern hochzählt und
periodisch einen software Interrupt auslöst...aber ich komm nicht drauf
warum das bei mir nicht klappt.
Mein Code:
1 | OCR3A = 20000; //Maximum value for TCNT3
|
2 |
|
3 | TCCR3A &= ~( (1<<COM3A1) | (1<<COM3A0) ); //Normal port operation, OC3A disconnected
|
4 | TCCR3A |= (1<<WGM32); //CTC mode
|
5 | TCCR3B |= (1<<CS31); //Prescaler 8
|
6 | TIMSK |= (1<<OCIE3A); //Interrupts enable
|
7 |
|
8 | ...
|
9 |
|
10 | ISR(TIMER3_COMPA_vect)
|
11 | {
|
12 | if(PINB & (1<<PB6))
|
13 | PORTB &= ~(1<<PB6);
|
14 | else
|
15 | PORTB |= (1<<PB6);
|
16 | }
|
Wo ist da der Haken?
Also zuerst setze ich den Maximalwert, dann lösche ich (explizit) die
Bits COM3A1 und COM3A0, damit der OC3A-Pin nicht ins Timer-geschehen
eingreift. Mit WGM32 auf 1 aktiviere ich noch den CTC Mode mit
Maximalwert für TCNT bei OCR3A. Anschließend noch der Prescaler und das
Interrupt aktivieren.
Ich sehe da einfach keinen Fehler.