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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.