Ich verzweifle und ersuche um Hilfe:
Ich will auf einem mega32 3 Timer benutzen. Eigentlich funktioniert das
auch. Aber nur, wenn ich nicht die beiden 8-Bittimer Timer0 und 2
gleichzeitig benutze.
Hier mal ein wenig Code:
funktion1:
1 | // Timer auf 0
|
2 | TCNT0 = 0;
|
3 | TCCR0 = _BV(CS02) | _BV(CS00);
|
4 |
|
5 | // ... 1)
|
main:
1 | // 8-Bit Timer2 für Sekunden-Takt
|
2 | ASSR = 0; //_BV(AS2); // Taktquelle. Muß zuerst eingestellt werden
|
3 | TCNT2 = 0; // Startwert
|
4 | TCCR2 = _BV(CS20); // Timer mit CPU/1 Prescaler,
|
5 | TIMSK |= (1 << TOIE2); // IRQ bei Überlauf 0xFF -> 0x00
|
6 | TIFR |= (1<<TOV2); // Clear TOV2 clear pending interrupts
|
7 | //OCR2=0;
|
8 |
|
9 | //16 Bit
|
10 | OCR1AH = ((F_CPU/1024.0) * 3) // Takt= 16MHz => 16.000.000/1024 = 7812,5 => 7,8125 Zählerschritte pro ms
|
11 | OCR1AL = (uint16_t)((F_CPU/1024.0) * 3) & 0xFF; // Vergleichswert laden
|
12 | TIMSK |= (1<<OCIE1A); // Interrupt wenn Timer Vergleichswert erreicht
|
13 | TCCR1B = _BV(CS12) | _BV(CS10); // Timer mit Div 1024 starten
|
14 | sei();
|
der 16 Bitter macht eigentlich keine Probleme.
Den Timer0 brauche ich nur zum Zeit messen. Deshalb keine IRQs notwendig
Wenn ich Timer2 wie gezeigt aktiviere, gibt es irgendwelche Probleme
anscheinend an Port D, die ich aber noch nicht weiter einkreisen konnte
(Portzugriffe, UART und delay im wesentlichen). Auf jeden Fall reagieren
meine Funktionen, die den Port benutzen dann anders als sonst und
arbeiten nicht mehr korrekt, was sie sonst tun. Ohne Timer 2 geht's
wunderbar.
Stelle ich bei Timer2 ASSSR = _BV(AS2) (was ja falsch ist, da ich die
interne Taktquelle nutzen will), klappt der Rest, aber natürlich nicht
mehr Timer2.
Irgendwo muß ich doch da ganz was grobes übersehen, was ich aber nun
schon seit einem halben Tag nicht finden kann.