mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupts im Interrupt ausschalten


Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht 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:
ADC_counter++;
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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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:
>
> ADC_counter++;
> if (ADC_counter == 251 ) cli();
> 
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.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst das Enable-Bit der Interrupt-Quelle ausschalten (Timer, ADC, 
oder was auch immer das ist), nicht das Interrupt-Enable vom Prozessor. 
Das ist im Interrupt-Handler nämlich ohnehin ausgeschaltet, wird nämlich 
mit bei der Rückkehr wieder eingeschaltet.

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wird nämlich mit bei der Rückkehr wieder eingeschaltet
Und zwar implizit über das Restaurieren des SREGs (Bit7)

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

vielen Dank für Eure Antworten - ein blöder Fehler von mir. Jetzt 
funktioniert es auch einwandfrei.

Vielen Dank noch einmal, Ozzy

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lkmiller wrote:
>>wird nämlich mit bei der Rückkehr wieder eingeschaltet
> Und zwar implizit über das Restaurieren des SREGs (Bit7)

Nö.
Das SREG im Interrupt hat immer das I-Bit gelöscht.
Erst das RETI setzt das I-Bit.


Peter

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

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.