Hallo,
ich habe ein Programm geschrieben, welches in ein Compare Match Register
Zeit lädt und bei erreichen des Compare Matches etwas tun soll.
Das ganze läuft auf einem Atmega8 und betrifft den Timer1 (16-bit)
Leider funktioniert das ganze nicht wie es soll und ich möchte den
Fehler finden. Das Compare Match tritt manchmal richtig auf (alle Zeiten
vernachlässigbar gleich), manchmal aber auch nicht, dann gibt es
Differenzen. Der Fehler tritt eher sporadisch auf, d.h. es sind mehr
"richtige" Compare Matches, als "falsche". Hierzu habe ich direkt am
Beginn der ISR Compare Match die Variablen des OCR1A, TCNT1 und der
Vorladezeit (ulTimeToCompareMatch) für das OCR1A Register in ein Buffer
geschrieben und lasse diese mir auf einem Display ausgeben. In c quasi
so:
1 | ISR (TIMER1_COMPA_vect){
|
2 | DisplayBuffer[1] = OCR1A;
|
3 | DisplayBuffer[2] = TCNT1;
|
4 | DisplayBuffer[3] = ulTimeToCompareMatch;
|
5 | slDifferenz = ulTimeToCompareMatch - OCR1A;
|
6 | }
|
Nun habe ich folgende Unstimmigkeiten:
Fall A:
Der Wert von OCR1A unterscheidet sich von TCNT1 und
ulTimeToCompareMatch. TCNT1 und ulTimeToCompareMatch sind
(vernachlässigbar) gleich (die paar Timertakte zum schreiben der
Variablen macht wohl den unterschied)
Fall B:
ulTimeToCompareMatch verschieden ist von TCNT1 und OCR1A, aber TCNT1 und
OCR1A gleich
Ich weiß, dass ohne vollständiges Programm der genaue Fehler eine
Rätselei mit der Glaskugel ist. Dennoch lassen sich vielleicht mögliche
Fehler so finden.
Fall A kann ich mir ehrlich gesagt nicht erklären, wieso ein Compare
Match auftritt, TCNT1 und OCR1A aber verschieden sein sollen und
gleichzeitig TCNT1 mit ulTimeToCompareMatch übereinstimmt.
Fall B könnte auftreten, wenn beispielsweise ein anderer Programmteil
OCR1A verändert.
Kann mir jemand helfen, dieses Gedankenspiel fortzusetzen, wann Fall A
und wann Fall B eintreten könnte?
Besten Dank.