Interrupts im Interrupt ausschalten

OP #918322
Lesenswert?
• ▲
▼
Moin,

ich würde gerne, nachdem mein Timer0-Interrupt 250x ausgeführt wurde, 
diesen Interrupt kurz ausschalten, um die gesammelten Daten zu 
verarbeiten.

Doch leider klappt das so nicht:
1
ADC_counter++;
2
if (ADC_counter == 251 ) cli();
Geht so etwas denn gar nicht? Später möchte ich den Interrupt einfach 
wieder über sei() anschalten.


Vielen Dank für Eure Hilfe, Ozzy
#918325
Lesenswert?
• ▲
▼
Christoph O. wrote:
> ich würde gerne, nachdem mein Timer0-Interrupt 250x ausgeführt wurde,
> diesen Interrupt kurz ausschalten, um die gesammelten Daten zu
> verarbeiten.
>
> Doch leider klappt das so nicht:
>
1
> ADC_counter++;
2
> if (ADC_counter == 251 ) cli();
3
>
Wenn das innerhalb der ISR steht, kann das nicht funktionieren, da die 
Hardware erstens beim Sprung in den Interrupt-Vektor sowieso automatisch 
das I-Bit löscht (also ein cli() macht, weshalb Dein cli() gar keinen 
Effekt hat) und zweitens dieses Bit beim Rücksprung ins Hauptprogramm 
genauso automatisch wieder setzt (also ein sei() macht).

> Geht so etwas denn gar nicht? Später möchte ich den Interrupt einfach
> wieder über sei() anschalten.
Warum versuchst Du dann, die Bearbeitung aller Interrupts zu sperren 
(was so aus o.g. Gründen nicht geht) und sperrst den Interrupt nicht 
lokal? Dafür hat schließlich jeder Interrupt sein lokales Freigabebit.
#918336
Lesenswert?
• ▲
▼
lkmiller wrote:
>>wird nämlich mit bei der Rückkehr wieder eingeschaltet
> Und zwar implizit über das Restaurieren des SREGs (Bit7)
Das macht schon die Controller-Hardware selber (also selbst bei einer 
naked-ISR passiert das, obwohl dabei das SREG nicht extra gesichert 
wird). Selbst in Assembler (wo man das SREG "von Hand" sichern muss, 
wenn man es denn will) ist dem so...
(Firma: TravelRec.) Persönliche Seite #918951
Lesenswert?
• ▲
▼
Genau. Da kann der Anwender in der ISR restaurieren was er will, denn 
das RETI kommt immer nach der ISR. Interrupte, die nicht sein dürfen, 
sperrt man über die zuständigen Interrupt-Enable-Bits in den 
betreffenden I/O-Registern der peripheren Module und gibt sie erst 
wieder frei, wenn sie auch wirklich zuschlagen dürfen. Vorher sollte man 
ein eventuell schon aufgelaufenes Interrupt-Flag durch ein Schreiben 
einer logischen 1 löschen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren