Forum: Mikrocontroller und Digitale Elektronik Frage zum CLI befehl


von Peter (Gast)


Lesenswert?

Hallo,

hab mal eine Anfängerfrage zum CLI.

Angenommen man hat zwei Timer (Timer1 + Timer0) in einem
Programm. Timer1 ist für die Zeit zuständig und Timer0
für die Entprellung von Tasten.
In der ISR von Timer0 wird immer die Befehlsfolge
cli
mov  temp1, key_press
clr  key_press
sei

aufgerufen. Wird durch CLI nicht auch der Timer1 angehalten,
der dadurch immer mehr Abweichung (ppm fehlen) erhält?

Peter

von holger (Gast)


Lesenswert?

>In der ISR von Timer0 wird immer die Befehlsfolge
>cli
>mov  temp1, key_press
>clr  key_press
>sei
>
>aufgerufen.

Dann mach die mal ganz schnell weg, denn die haben dort
nichts zu suchen. CLI hält keine Timer an.

von holger (Gast)


Lesenswert?

>Dann mach die mal ganz schnell weg,

Damit waren nur cli und sei gemeint;)

von g457 (Gast)


Lesenswert?

> Wird durch CLI nicht auch der Timer1 angehalten,
> der dadurch immer mehr Abweichung (ppm fehlen) erhält?

Jein. Der Timer wird nicht 'angehalten', sondern seine 
Unterbrechungsanfragen werden nicht bearbeitet. Wenn Du also die 
Interruptbehandlung so lange sperrst, dass der andere Teilnehmer eine 
Anfrage verpasst, dann summiert sich bei ihm ein Fehler. Die Behandlung 
der Anfrage wird ggf. natürlich auch etwas verzögert, das kann Jitter 
zur Folge haben.

Bei diversen Architekturen (z.B. AVR) ist die Behandlung weiterer 
Unterbrechungsanfragen während der der Ausführung einer solchen übrigens 
automatisch deaktiviert (sofern man sie nicht wieder zulässt). Bei 
anderen (z.B. diverse ARM) kann nur ein Interrupt mit höherer Priorität 
(oder ein nicht-maskierbarer welcher) unterbrechen.

Wie üblich lohnt es sich also, das zugehörige Datenplatt zu lesen ;-)

HTH

von (prx) A. K. (prx)


Lesenswert?

Innerhalb einer ISR sind SEI/CLI meist unangebracht. Diese Befehle 
werden ausserhalb davon verwendet, um eine Befehlssequenz gegen einen 
Interrupt mittendrin abzusichern.

: Bearbeitet durch User
von Peter (Gast)


Lesenswert?

Sorry, mein Fehler.

Die Reihenfolge

cli
mov  temp1, key_press
clr  key_press
sei

ist nicht in der ISR sondern im main (wo es hingehört).

Wird durch das anhalten des Interrputs der Timer1 nicht
genau um die Anzahl der Takte in Verzögerung gebracht und
kann sich das nicht erheblich aufaddieren, so dass die
Einstellungen des Timer1 der im CTC läuft nicht mehr passen?

Peter

von (prx) A. K. (prx)


Lesenswert?

Peter schrieb:
> Wird durch das anhalten des Interrputs der Timer1 nicht
> genau um die Anzahl der Takte in Verzögerung gebracht

Nein.

von Klaus (Gast)


Lesenswert?

Peter schrieb:
> Wird durch das anhalten des Interrputs der Timer1 nicht
> genau um die Anzahl der Takte in Verzögerung gebracht und
> kann sich das nicht erheblich aufaddieren, so dass die
> Einstellungen des Timer1 der im CTC läuft nicht mehr passen

Wenn der Befehl CLI den Timer anhalten würde, tut er aber nicht. Ein 
Interrupt ist kein Timer, wie schon der Name sagt.

MfG Klaus

von Axel S. (a-za-z0-9)


Lesenswert?

A. K. schrieb:
> Peter schrieb:
>> Wird durch das anhalten des Interrputs der Timer1 nicht
>> genau um die Anzahl der Takte in Verzögerung gebracht
>
> Nein.

Korrekt.

Verzögert wird allerdings die Ausführung der ISR. Wenn der Timer den 
Interrupt zwischem dem CLI und dem SEI auslöst, dann geht der Interrupt 
nicht verloren sondern wird verzögert (nach dem SEI) bearbeitet.

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.