www.mikrocontroller.net

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


Autor: Helge W. (Gast)
Datum:
Angehängte Dateien:

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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Helge W. (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: The Daz (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: The Daz (Gast)
Datum:

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

Autor: Helge W. (Gast)
Datum:

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

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.