ATmega32: Alle Interrupts anhalten

OP #3376966
Lesenswert?

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
Lesenswert?

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 #3376980
Lesenswert?

> 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
Lesenswert?

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 #3377101
Lesenswert?

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

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