Forum: Mikrocontroller und Digitale Elektronik Xmega Interrupt Input Sense


von Gad Z. (gad)


Lesenswert?

Hallo,
habe einen Xmega und versuche 2 externe Interrupts auf einem Port 
auszulösen.
In der Simulation vom AVR-Studio werden auch beide ausgelöst.
Aber der Input-Sense geht nur bei Pin2.
Beide Inputs (Pin1 / Pin2) an PortD sind als Eingänge mit Raising Edge 
configuriert.
Aber nur Pin2 reagiert richtig. Pin1 löst bei jeder Flanke einen 
Interrupt aus.

Ist das ein Problem im Code oder im Xmega oder liegt es nur an der 
Simulation vom AVR-Studio?

Hier die configuration:

.equ  PIN0    =  1<<0
.equ  PIN1    =  1<<1
.equ  PIN2    =  1<<2
.equ  PIN3    =  1<<3
.equ  PIN4    =  1<<4
.equ  PIN5    =  1<<5
.equ  PIN6    =  1<<6
.equ  PIN7    =  1<<7

;Configure Input Interrupt Rpm
ldi  r16,    PORT_ISC_RISING_gc
sts  PORTD_PIN1CTRL,  r16

ldi  r16,    PIN1
sts  PORTD_INT0MASK,  r16

;Configure Input Interrupt Speed
ldi  r16,    PORT_ISC_RISING_gc
sts  PORTD_PIN2CTRL,  r16

ldi  r16,    PIN2
sts  PORTD_INT1MASK,  r16

;Configure Interrupt Level
ldi  r16,    PORT_INT0LVL_MED_gc + PORT_INT1LVL_MED_gc
sts  PORTD_INTCTRL,  r16

von Hagen R. (hagen)


Lesenswert?

Datenblatt -> Alternate Pin Functions -> Table X-Y -> Spalte INTERRUPT 
-> Wert SYNC oder ASYNC. Alle Pin2 der Ports können als einzige ASYNC 
Interrupts. Steht dann im Manual bei den Ports auch noch mal genauer. 
Dein beobachtetes Verhalten ist also normal. Ansonsten AVR1313 Kapitel 
2.4.2 Asynchronous Sensing.

Gruß Hagen

von Gad Z. (gad)


Lesenswert?

Hallo Hagen, danke für die Antwort.
ich weiß das nur Pin2 von jedem Port asynchron einen Interrupt auslösen 
kann.
Aber laut AVR1313 Kapitel 2.4.1 "Configuration of Port Interrupts" kann 
jeder Pin jedes Ports einen synchronen Interrupt auslösen mit den Input 
Sense Configurationen Both Edges, Falling Edge, Raising Edge und Low 
Level.
Wozu hat sonst jeder Pin das Register PINnCTRL mit den Sense-Bits 
ISC[2:0]?

Die Frage ist also, wo stelle ich ein das ich einen synchronen Input 
Sense Interrupt möchte?

von Hagen R. (hagen)


Lesenswert?

Naja, eben im Sense Control Register, zB. PORTA.PIN0CTRL mit 
PORT_ISC_??? Bitmaske. Synchron sind eben nur PORT_ISC_BOTH_EDGES_gc, 
PORT_ISC_RISING_EDGES_gc und PORT_ISC_FALLING_EDGES_gc da diese einen 
Takt benötigen, also synchron zum Takt ausgewertet werden müssen. 
Asynchron ist  PORT_ISC_LEVEL_gc und kommt ohne Takt aus und geht immer 
nur bei PIN2 eines Ports. PORT_ISC_INPUT_DISABLE_gc ist ein Spezielfall 
der die digitale Eingangslogik komplett deaktiviert, zb. bei Analogen 
Eingängen sinnvoll um Einstrahlungen der MCU zu verringern usw.

Bei vielen Pins am gleichen Port die man über .PINxCTRL konfigurieren 
möchte gibt es noch eine "Gruppen-Konfigurations-Möglichkeit" bei der 
man dann mehrere PINs in einem Rutsch auf gleiche Werte konfigurieren 
kann.

Ich habe allerdings damit noch nicht praktisch gearbeitet. Ich weiß aber 
das zb. beim Timer Input Capture + Event System auch einige 
Ungereimtheiten mit dem Input Sense existieren (meiner Meinung nach). 
Dort ignorierte das Event System die Einstellungen und verhielt sich 
immer so als ob man auf beide Flanken triggerte. Das könnte aber auch 
mein Fehler gewesen sein, sei es fehlendes Begriffsvermögen, was ich am 
Anfang beim XMega öfters verspürte ;) Die Dokus gehen halt nur sehr 
oberflächlich auf die interne Arbeitsweise der Cores ein.

Gruß Hagen

von Hagen R. (hagen)


Lesenswert?

letzendlich hätte man im C-Header für PIN2 eine andere Struktur 
deklarieren müssen. So hat man es sich _einfach_ gemacht und benutzt 
alle möglichen Bitmasken für alle PINs was ansich nicht ganz korrekt 
ist.

Wie gesagt, Low Level ist nur bei Asynchronen Pins = Pin2 eines Ports, 
sinnvoll.

Gruß Hagen

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.