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
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
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.