Forum: Compiler & IDEs Timer Problem


von Florian (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Florian wrote:

> TCNT2 = 0;  // Startwert

Ist übrigens Default.

> TIMSK |= (1 << TOIE2);    // IRQ bei Überlauf 0xFF -> 0x00

Wo ist der Interrupthandler dafür?

> TIFR |= (1<<TOV2);     // Clear TOV2 clear pending interrupts

Falsch.  Muss:
1
TIFR = (1<<TOV2);

heißen.  Steht in der (avr-libc-)FAQ, warum.  Muss außerdem (damit es
Sinn hat) vor der vorangegangenen Zeile (Aktivieren dieses Interrupts)
stehen.  Hat für dich keine großen Auswirkungen.

> OCR1AH = ((F_CPU/1024.0) * 3) // Takt= 16MHz => 16.000.000/1024 = 7812,5
> => 7,8125 Zählerschritte pro ms
> OCR1AL = (uint16_t)((F_CPU/1024.0) * 3) & 0xFF;    // Vergleichswert

Kannst du auch gleich als
1
OCR1A = ((F_CPU/1024.0) * 3)

schreiben.

von Florian (Gast)


Lesenswert?

Danke für die Tips.
Aber wie Du schon sagst: bringt nichts.

Die Handler sind da
SIGNAL (SIG_OVERFLOW2)
SIGNAL (SIG_OUTPUT_COMPARE1A)

und funktionieren ja auch (nur nicht, wenn ich Timer0 und Timer2 
gleichzeitig benutze (wobei es nicht an der IRQ Behandlung liegt, 
sondern irgendwo anders (ich denke irgendwo bei den I/O Routinen).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ich glaube, man kann das ohne den gesamten Programmcode zu analysieren,
jetzt nicht mehr näher eingrenzen.

Auf jeden Fall sind Timer 0 und 2 voneinander unabhängig benutzbar.
Die Beschreibung klingt so, als würde der laufende Timer 2 irgendwo
zu einem Absturz o. ä. führen (wenn du ihn mit AS2 auf asynchron
stellst, aber keinen 32-kHz-Quarz dran hast, dann läuft er in diesem
Modus ja gar nicht erst an, das erklärt, warum dann immer noch alles
OK ist).

von Florian (Gast)


Lesenswert?

Ja, der Code ist wohl etwas zu umfangreich und - vorsichtig ausgedrückt 
- individuell, als das ich ihn jemanden zumuten will. ;-)

Also die Nutzung meinerseits wie oben gezeigt ist aber erst einmal OK, 
demnach? Keine groben Schnitzer, die ich übersehe? Kann es an der 
Nutzung von delay.h liegen? Ich weiß nicht, wie da die Zeitverzögerung 
umgesetzt ist, könnte mir ja aber vorstellen, daß die einen Timer 
nutzen. Würde aber eigentlich auch nicht erklären, warum es klappt, wenn 
ich nur einen der beiden Timer nutze...

von johnny.m (Gast)


Lesenswert?

Die Funktionen aus der delay.h benutzen keinen Timer. Das sind 
einfache Zählschleifen-Funktionen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.