Forum: Mikrocontroller und Digitale Elektronik AT90S8535 - wie timer compare interrupt einrichten ?


von Helge W. (Gast)


Angehängte Dateien:

Lesenswert?

Guten Abend,
nachdem mir mein AT90S8535 jetzt nur noch murks serviert und ich den
ganzen Tag dafür in den Sand gesetzt habe hier die Frage an euch:

steckt da irgendwo der Fehler (code im anhang ?)

Ziel:

ich verwende einen 2.048MHz Quarz... mit dem CK/1024 prescaler und der
compare value 2000 (0x0D70) würde ich auf 1 Interrupt/sec kommen...
nur irgendwo ist hier derb was faul....

Danke schonmal !


PS: symptome sind derzeit: ein viel zu schnell laufender counter,
eigenartiges Verhalten beim Einsetzen eines größeren
Vergleichswerts...
sind vielleicht irgendwo falsche Registerinhalte ?

von Hannes L. (hannes)


Lesenswert?


von Helge W. (Gast)


Lesenswert?

ich habe jetzt mal ne warteschleife gebaut.. so funktionierts..
meine Frage wäre nun:

was ändert der Interrupt an Register ? kann es Überlappungen geben ? (
nebenher findet noch lesen vom EEPROM und Ausgabe an die Ports statt )

von Hannes L. (hannes)


Lesenswert?

Wenn im Interrupt Operstionen stattfinden, die die Flags (Statusbits in
SERG) verändern, dann kann es passieren,dass das Hauptproggramm
"falsch verzweigt", weil zwischen Setzen der Flags (z.B. dec r16) und
Auswerten der Flags (brne label) der Interrupt "zuschlagen" kann und
dem Hauptprogramm die Flags unterm Hintern ändern kann...

Deshalb wird in der ISR grundsätzlich das SREG gesichert und
anschließend wiederhergestellt.

Mit SEI und CLI braucht man in der ISR nix zu machen, während der ISR
sind weitere Interrupts sowiso gesperrt bis die ISR mittels reti
beendet wird. Danach wird erst zur nächsten ISR gesprungen, deren
Interrupt während der ISR auftrat.

...

von The Daz (Gast)


Lesenswert?

"Mit SEI und CLI braucht man in der ISR nix zu machen, während der ISR
sind weitere Interrupts sowiso gesperrt bis die ISR mittels reti
beendet wird."

Knapp daneben. RETI ist nichts anderes als SEI + RET. Man kann also
noch in der ISR den globalen interrupt enablen um interrupts in
interrupts zuzulassen (z.B UART-ISR waehrend Timer-ISR ausfuehren).
Dies macht im AVR-GCC den Unterschied zwischen einer SIGNAL und einer
INTERRUPT Routine aus.

von Hannes L. (hannes)


Lesenswert?

"Knapp daneben. RETI ist nichts anderes als SEI + RET. Man kann also
noch in der ISR den globalen interrupt enablen um interrupts in
interrupts zuzulassen (z.B UART-ISR waehrend Timer-ISR ausfuehren).
Dies macht im AVR-GCC den Unterschied zwischen einer SIGNAL und einer
INTERRUPT Routine aus."

Sicher kann man in der ISR den Interrupt für andere ISRs freigeben.
Dann sollte man aber schon sehr genau wissen was man tut. Sowas ist
aber nur in Ausnahmefällen nötig. Wenn man sich an die Regel hält, die
ISR (zeitlich) so kurz wie möglich zu halten, dann kann man meist
darauf verzichten.

Die Rede war übrigens von ASM und nicht von C.

...

von The Daz (Gast)


Lesenswert?

"Wenn man sich an die Regel hält, die ISR (zeitlich) so kurz wie
möglich zu halten, dann kann man meist darauf verzichten."

Full ack.

"Die Rede war übrigens von ASM und nicht von C".

Die INTERRUPT/SIGNAL Geschichte war nur als Ergaenzung/Beispiel
gedacht. Soll ja vorkommen, dass auch C-Progger dieses Forum kennen :)

von Helge W. (Gast)


Lesenswert?

Also... habs jetzt geknackt, auch wenn eure Hinweise nicht alle
sachdienlich waren trotzdem Danke.

Stein der Weißen ist wohl die richtige Reihenfolge beim initialisieren
des Interrupts ( der sonst schon vorher ausgelöst wird.. also SEI ganz
zum schluss )

PS: hatte schon nen Wutausbruch weil alles von diesem gottverdammten
C-Code verseucht ist. Programmiere nebenher auch mit Delpi, ich kann
mein lied von msdn singen...

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.