www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Xmega Interrupt Input Sense


Autor: Gad Zinkler (gad)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hagen Re (hagen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gad Zinkler (gad)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Hagen Re (hagen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hagen Re (hagen)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.