Forum: Mikrocontroller und Digitale Elektronik ATmega32: Alle Interrupts anhalten


von Walter T. (nicolas)


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

von c-hater (Gast)


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.

von afromann (Gast)


Lesenswert?

Ich kann dir zwar keine komplette Funktion liefern aber es sollte mit 
den Befehlen SEI (alle Interrupts freigeben) und CLI (alle Interrupts 
deaktivieren) funktionieren.

von g457 (Gast)


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>.

von Walter T. (nicolas)


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]

: Bearbeitet durch User
von Bastler (Gast)


Lesenswert?

>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!

von Michael (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.