Timer0 und Timer1 funktionieren nicht gemeinsam

OP #4845221
Hallo,

ich habe einen Atmega8 und einen externen Quarz mit 4MHz.

In meinem Code habe ich Timer0 (Overflow,Vorteiler64) und Timer1 
(CTC,Vorteiler 1 + OCR) initialisiert.

Im Timer0-Overflow ist meine Entprellroutine. Der CTC-Modus toggelt PIN 
OC1A.

Mein Problem ist, daß Timer0 nicht funktioniert. Ich habe nun die 
Entprellroutine probehalber in Timer2. Und da klappt es.

Ich habe das Datasheet durchgelesen. Da steht: Timer0 und Timer1 haben 
das gleiche Vorteilermodul, können aber unterschiedliche 
Vorteilereinstellungen haben.

Was könnte die Ursache sein?

Julius
Angehängte Dateien:
#4845965
Man sollte es dem Helfer nicht unnötig schwer machen.
Nur wenige schauen sich ein .txt an.
Sie wollen schon die Programmierspache wissen, d.h. ein .c, .cpp, .asm, 
.bas sieht sich viel besser an.
Und das der Quelltext alle nötigen Include und Defines zum fehlerfreien 
Compilieren enthält, versteht sich natürlich von selbst.
Gast #4845973
Bitte poste den vollständigen Quelltext.

> Mein Problem ist, daß Timer0 nicht funktioniert.

Was hast du erwartet, was tut er stattdessen? Warum bist du der Meinung, 
dass er nicht funktioniert?
OP #4846213
Hallo,

im Anhang nun mein Code in asm. Im Timer0 habe ich die 
Tastenentprellroutine. Und die funktioniert nicht, bzw der Overflow 
Interrupt wird nicht aufgerufen. Zur Kontrolle lasse ich im Interrupt 
eine Variable hochzählen und im LCD ausgeben.

Wenn ich den Code der ISR nun in den Interrpt des Timers2 kopiere, 
funktioniert es einwandfrei.

Ich könnte ja die Entprellroutine im Timer2 belassen. Aber ich will 
einfach wissen, warum das so ist. Und vielleicht brauche ich den Timer0 
ja doch noch...



Julius


P.S. Peter, deine Entprellroutine ist super! Habe ich bisher in allen 
meinen Projekten eingebaut.
Angehängte Dateien:
Gast #4846242
Timer1 wird im CTC Modus gestartet und der Compareinterrupt zugelassen.
Ich kann nirgends entdecken, daß OCR1A gesetzt würde. Demnach tritt der 
Compareinterrupt irre oft auf (hat übrigends auch nur ein RETI in der 
Vektortabelle)
Der Timer2_Overflow ist vor Compare Match A Interrupt in der 
Vectortabelle und hat Chancen dran zu kommen.
Der Timer0_Overflow Vector steht nach den irre oft Compare Match A 
Interrupts und kommt einfach nicht dran.
Disable mal den Compare Match A und schau ob es dann mit Timer0 klappt. 
Print aus der ISR ist auch keine gute Idee.
OP #4846349
Hallo Seeger,

das war der richtige Hinweis.
Mein Gedanke war, mit zwei Tastern einen Schrittmotor zu starten 
(rechts/Links) und dabei den OCR-Vergleichswert zu laden. Aber bis zum 
ersten Tastendruck ist noch kein Vergleichswert geladen. Habe jetzt in 
der Init OCR 0xffff geladen und jetzt geht auch der Timer0.

Das bit OCIE1 habe ich aus dem Code entfernt. Im Timer1 soll es keinen 
Interrup geben, sondern nur der Ausgabe-Pin getoggelt werden.


Danke für deine Tipps!

Julius

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.