ATmega32: Alle Interrupts anhalten

OP #3376966
Guten Morgen,
ich habe gerade den Anwendungsfall, daß ich bei einer Routine alle 
Interrupts anhalten will und nachher wieder starten. Da ich weiß, daß 
bei mir nur Timer-Interrupts aktiv sind, sieht das Ganze dann auch sehr 
einfach aus:
1
  // Alle nicht hier definierten Interrupts abschalten
2
  static void edm_haltotherinterrupts(uint8_t doit) {
3
    static uint8_t savetimsk = 0;
4
    if (doit) {
5
      // disable
6
      savetimsk = TIMSK;
7
      TIMSK = 0;
8
      } else { // restore
9
      TIMSK = savetimsk;
10
    }
11
  }
Aber wie sähe so eine Funktion allgemein aus, damit wirklich alles 
angehalten wird?
Klar, ich müßte noch ACIE in ADCSRA sichern und löschen (bei meinem 
Anwendungsfall brauche ich das noch). Und für SPI und I2C wird es auch 
noch Interrupts geben.

Also die Frage: Gibt es irgendwo eine Übersicht über alle 
Interruptquellen und wie man sie ein- und abschalten kann?

Viele Grüße
Nicolas
Gast #3376968
Nicolas S. schrieb:

> Also die Frage: Gibt es irgendwo eine Übersicht über alle
> Interruptquellen und wie man sie ein- und abschalten kann?

Im jeweiligen Datenblatt gibt es eine Liste der Interruptvektoren und im 
gleichen Datenblatt steht auch wie man die Interrupts jeweils aktiviert 
und deaktiviert.
Gast #3376975
Ich kann dir zwar keine komplette Funktion liefern aber es sollte mit 
den Befehlen SEI (alle Interrupts freigeben) und CLI (alle Interrupts 
deaktivieren) funktionieren.
Gast #3376980
> Aber wie sähe so eine Funktion allgemein aus, damit wirklich alles
> angehalten wird?

wie schon geschrubt wurde cli()/sei(). Oder - der verbesserten 
Lesbarkeit und Flexibilität wegen - die entsprechenden Makros aus 
<util/atomic.h>.
OP #3376992
g457 schrieb:
> cli()/sei()

Da liegt wohl ein Mißverständnis vor: Ich will alle Interrupts bis auf 
einen deaktivieren, um diesem Interrupt absolut sicheres Timing 
einzuräumen.

c-hater schrieb:
> Im jeweiligen Datenblatt gibt es eine Liste der Interruptvektoren

Stimmt. Damit habe ich schon einmal eine Unübersicht. Ich könnte in der 
"Register Summary" alle Register durchgehen, in welchem wohl ein 
Interrupt-Enable angesiedelt ist. Sobald ich alle 21 Interrupt Vektoren 
gefunden habe kann ich die Suche im Datenblatt abbrechen. Jetzt suche 
ich noch eine Übersicht.

[EDIT: Tippfehler]
Gast #3377008
>aber wie sähe so eine Funktion im Allgemeinen aus...
So, daß du alle Infragekommenden INT's vorher eingeschaltet haben mußt.
Sie sollten dir also bekannt sein!
Gast #3377101
Nicolas S. schrieb:
> Da liegt wohl ein Mißverständnis vor: Ich will alle Interrupts bis auf
> einen deaktivieren, um diesem Interrupt absolut sicheres Timing
> einzuräumen.

Ein Interrupt hat IMHO nie ein absolut sicheres Timing. Es kommt immer 
drauf an, welcher Befehl gerade ausgeführt wird.

Wenn du alle anderen Interrupts selektiv über die zugehörigen Interrupt 
Enable Bits sperren möchtest, mußt du i.a. vorher ein Backup anlegen und 
dir überlegen, wie du das Widerfreigeben steuern kannst.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.