Forum: Mikrocontroller und Digitale Elektronik XMEGA - Kann einzelnen Port Interrupt nicht deaktivieren


von Peder (Gast)


Lesenswert?

Hallo,

ich habe am Port J eines ATXmega128A1U zwei Interrupts aktiviert.
Beide Interrupts sind mit mittlerer Priorität wie folgt gesetzt:
1
PORTJ.INTCTRL |= PORT_INT0LVL_MED_gc
2
PORTJ.INTCTRL |= PORT_INT1LVL_MED_gc;

Die Interrupts selbst funktionieren wie erwartet und das 
INTCTRL-Register ist auch richtig gesetzt. Ich kann aber (innerhalb der 
ISR) nicht einen Interrupt allein deaktivieren, ohne dass der zwei 
dadurch auch deaktiviert wird.
In der ISR(PORTJ_INT0_vect) habe ich mehrere Dinge versucht, um nur 
der 0er Interrupt zu deaktivieren, aber jedes Mal wird der 1er mit 
deaktiviert:
1
PORTJ.INTCTRL = (PORTJ.INTCTRL & ~PORT_INT0LVL_gm);
1
PORTJ.INTCTRL = (PORTJ.INTCTRL & ~PORT_INT0LVL_gm) | PORT_INT1LVL_MED_gc;
1
PORTJ.INTCTRL  = (PORTJ.INTCTRL & ~PORT_INT0LVL_gm);
2
PORTJ.INTCTRL |= PORT_INT1LVL_MED_gc;

Erst in der Main-While-Schleife kann ich PORT_INT1LVL_MED_gc wieder 
erfolgreich "zuschalten".

Kann mir jemand dieses Verhalten erklären?


Danke

von Alexxx (Gast)


Lesenswert?

Falsch! INTCTRL ist nur für die Festlegung der beiden Level (für alle 
Pins)!
Die Pinselektion wird mit INT0MSK / INT1MSK gemacht!
Beachte: Hierbei ist ein Wert "1" -> Pin0, Wert "4" -> Pin3, ...!
ODER
verwende für INT0 und INT1 verschiedene Level, dann kannst du bequem im
PMIC global einen dieser Level deaktivieren.

von Alexxx (Gast)


Lesenswert?

Uups,

>> um nur der 0er Interrupt zu deaktivieren, aber jedes Mal wird der 1er mit
deaktiviert

Das kann nicht sein!
Und warum so umständlich?
PORTJ.INTCTRL  = PORT_INT0LVL_MED_gc; // nur Level 0
PORTJ.INTCTRL  = PORT_INT1LVL_MED_gc; // nur Level 1

Probiere das mal aus. Dein Fehler liegt irgendwo anders?

von Peder (Gast)


Lesenswert?

Ich verstehe es auch nicht, aber der Vorschlag den jeweils anderen 
Interrupt zu aktivieren, klingt nicht schlecht! Die Platine hab ich zu 
Hause. Das heißt, ich kann es erst heute Abend testen, aber ich berichte 
dann, wie es gelaufen ist.

Danke schon mal!

von Peder (Gast)


Lesenswert?

So,

ich hatte gestern Gelegenheit, meinen Code durchzuschauen. Und ich hatte 
tatsächlich an anderer Stelle den 0er Interrupt-Level falsch reaktivert. 
Der hätte eigentlich mit dem Register ver-odert werden sollen, ich habe 
aber das "|" unterschlagen. Dadurch wird dann natürlich auch der 1er 
Interrupt aus dem Register gelöscht.

Damit war diese Frage nicht besonders hilfreich, aber trotzdem danke! :)

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.