www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu Interrupts


Autor: M. S. (sadmarvin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe eine ISR für INT0 in der mit dem Z-Pointer ein Wert aus dem 
Flash gelesen wird

lpm r16, Z

Je nachdem welchen Wert ein weiteres REgister enthält, wird der 
Z-Pointer in der Hauptschleife des Programms mit verschiedenen Werten 
geladen

  cpi   nextmuster, musteranzahl
  brne   vergleich
  ldi   nextmuster, 0
vergleich:
  cpi   nextmuster, 0
  brne   zweig0
  ldi   ZL, LOW(muster0*2)
  ldi   ZH, HIGH(muster0*2)
  ldi   nextbild, 0
zweig0:
  ...
  ...
zweig1:
  ...
  ...

  inc nextmuster


Ich habe mich nun gefragt was passiert, wenn INT0 genau zwischen

  ldi ZL,LOW(muster0*2)

und

  ldi ZH,HIGH(muster0*2)

oder zwischen

  ldi   ZH, HIGH(muster0*2)

und

  ldi   nextbild, 0


ausgelöst wird. Dann würde die ISR ja das richtige ZL verwenden, aber es 
könnte ja passieren, das ZH oder nextmuster nicht den richtigen Inhalt 
hat, oder?

Wenn ich jetzt vor den ldi Befehlen die Interrupts abschalte und gleich 
danach wieder ein,

vergleich:
  cpi   nextmuster, 0
  brne   zweig0
  cli
  ldi   ZL, LOW(muster0*2)
  ldi   ZH, HIGH(muster0*2)
  ldi   nextbild, 0
  sei
zweig0:

könnte das ja eigentlich nicht mehr passieren.

Ich habe aber noch zwei Timer (einer zum entprellen und einer zum 
Multiplexen von LEDs). Wenn jetzt genau dann ein TimerOverflow auftritt 
während die Interrupts gesperrt sind geht der Overflow ja verloren.
Zwischen cli und sei sind ja jeweils nur 3 ldi Befehle. Also sind die 
Interrupts nur für sehr kleine Zeit inaktiv. Könnte das trotzdem 
Probleme machen (z.B. Tastendruck "verpassen") machen.

Könnte man auch nur INT0 deaktivieren indem man in GIMSK INT0 auf 1 
setzt und dann halt wieder auf 0?

Bin noch Anfänger und etwas unsicher, ob man das so machen würde?

Grüße
Michael

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Wenn jetzt genau dann ein TimerOverflow auftritt
>während die Interrupts gesperrt sind geht der Overflow ja verloren.

Nein. Der wird nach SEI ausgeführt.

MfG Spess

Autor: Peter Roth (gelb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M. S. schrieb:

>   cli
>   ldi   ZL, LOW(muster0*2)
>   ldi   ZH, HIGH(muster0*2)
>   ldi   nextbild, 0
>   sei

> während die Interrupts gesperrt sind geht der Overflow ja verloren.

Da geht nix verloren. Der Controller merkt sich den Interrrupt, der wird 
nur eben 2 Takte später bearbeitet.

> Könnte man auch nur INT0 deaktivieren indem man in GIMSK INT0 auf 1
> setzt und dann halt wieder auf 0?

Macht mehr Aufwand.

Grüße, Peter

Autor: M. S. (sadmarvin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, also werden die Interrupts trotz CLI regestriert, der AVR "merkt" 
sich das irgendwie, und löst sie aus sobald Interrupts mit SEI wieder 
freigegeben sind?

EDIT:
da war ich wohl zu langsam ;)

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Achso, also werden die Interrupts trotz CLI regestriert, der AVR "merkt"
>sich das irgendwie, und löst sie aus sobald Interrupts mit SEI wieder
>freigegeben sind?

Ja. Jeder Interrupt hat ein eigenes Flag in dem das gespeichert wird.

MfG Spess

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.