Forum: Mikrocontroller und Digitale Elektronik Frage zu Interrupts


von M. S. (sadmarvin)


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

von Spess53 (Gast)


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

von Peter R. (gelb)


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

von M. S. (sadmarvin)


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 ;)

von Spess53 (Gast)


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

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.