www.mikrocontroller.net

Forum: Compiler & IDEs Timer Problem


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
// Timer auf 0
TCNT0 = 0;    
TCCR0 = _BV(CS02) | _BV(CS00);

// ... 1)

main:
// 8-Bit Timer2 für Sekunden-Takt 
ASSR = 0; //_BV(AS2);    // Taktquelle. Muß zuerst eingestellt werden
TCNT2 = 0;  // Startwert
TCCR2 = _BV(CS20); // Timer mit CPU/1 Prescaler, 
TIMSK |= (1 << TOIE2);    // IRQ bei Überlauf 0xFF -> 0x00
TIFR |= (1<<TOV2);     // Clear TOV2 clear pending interrupts
//OCR2=0;

//16 Bit
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 laden 
TIMSK |= (1<<OCIE1A);       // Interrupt wenn Timer Vergleichswert erreicht
TCCR1B = _BV(CS12) | _BV(CS10);  // Timer mit Div 1024 starten
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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
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
OCR1A = ((F_CPU/1024.0) * 3)

schreiben.

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: johnny.m (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.