Forum: Mikrocontroller und Digitale Elektronik Timer0 und Timer1 funktionieren nicht gemeinsam


von Axel H. (mf-futzi)


Angehängte Dateien:

Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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?

von Axel H. (mf-futzi)


Angehängte Dateien:

Lesenswert?

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.

von Seger (Gast)


Lesenswert?

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.

von Axel H. (mf-futzi)


Lesenswert?

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

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.