Forum: FPGA, VHDL & Co. XGPIO_Interrupt_Clear


von olpo (Gast)


Lesenswert?

Hallo,

ich möchte auch meinem Xilinx FPGA-Board einen Druckknopf als 
Interrupt-Auslöser verwenden.

Soweit klappt das auch; allerdings nur für genau einen Interrupt.
Also, ich drücke, und es kommt die gewünschte Ausgabe "Gott, bist du 
schön".
Ein weiterer Druck auf den Knopf bleibt aber folgenlos.

Ich dachte, XGPIO_Interrupt_clear(..) würde das Ende des Interrupt 
anzeigen, scheint aber ohne Einfluss zu sein. Mit oder ohne 
XGPIO_Interrupt_Clear(..) kann ich den Interrupt nur einmal aufrufen.
1
void print_west(){
2
   xil_printf("west\n\r");
3
   XGpio_InterruptClear( &gpio_PUSH_0, XGPIO_IR_MASK);
4
    }

Wie kann ich den Interrupt beliebig häufig aufrufen?

von (prx) A. K. (prx)


Lesenswert?

Unabhängig davon: Dass Taster als Interrupt-Quellen aufgrund ihres 
Prellens etwas problematisch sind, das ist dir bekannt?

von olpo (Gast)


Lesenswert?

Daß es problematisch ist weiß und verstehe ich nicht.
Aber ich habe schon gehört, daß Polling schöner wäre.

Aber dann bräuchte ich wieder Threads, die miteinander kommunizieren, 
oder?

Ich probiere es erstmal mit den Interrupts. Wenn ich/wir eine Lösung 
finden...

von hans (Gast)


Lesenswert?

lies doch das interruptregister aus und guck ob er gelöscht wurde oder 
nicht

von olpo (Gast)


Lesenswert?

1.) Wie lese ich das Interruptregister?
2.) Ist das den grundsätzlich richtig, XGPIO_Interrupt_Clear() zu 
verwenden, um die Interrupt-Routine korrekt zu beenden?

von hans (Gast)


Lesenswert?

XGpio_DiscreteRead(&IntC,1); damit kann man register auslesen soweit ich 
weiss den offset musst du aus dem interruptcontroller data sheet suchen 
und dann kannst es per uart ausgeben und gucken welche interrupts aktiv 
sind

im datasheet wird ist sicher auch beschrieben welches register du 
ansprechen musst um interrupts zu bestätigen ich weiss nicht mehr genau 
wie das ging ist etwas her

von olpo (Gast)


Lesenswert?

kann es sein, daß ich auch den Interrupt-Controller säubern muss?

von hans (Gast)


Lesenswert?

Du musst aufjedenfall das Interrupt Acknolegde Register "säubern" soweit 
mir bekannt

von olpo (Gast)


Lesenswert?

Es will noch nicht so ganz...

1
void print_west(){
2
3
     xil_printf("west\n\r");
4
5
     XGpio_InterruptClear( &gpio_PUSH_0, XGPIO_IR_MASK);
6
     XIntc_Acknowledge( &InterruptController, XPAR_INTC_0_GPIO_0_VEC_ID);
7
      }

von olpo (Gast)


Lesenswert?

Ich habe jetzt das GPIO-Register ausgelesen.
Tatsächlich bleibt der Interrupt immer gesetzt.
XGPIO_Clear() bewirkt nichts.

Ich habe auch versucht manuell mit XGPIO_DiscreteWrite( &gpio, channel 
1, Data 0) das Register zu säubern. Komischerweise kann ich auch nichts 
reinschreiben.

Ich kann keinen Fehler erkennen.

Hier mal meine system.mhs
1
PORT Push_Button0_GPIO_IO_pin = Push_Button0_GPIO_IO, DIR = IO
2
 
3
BEGIN xps_gpio
4
 PARAMETER INSTANCE = Push_Button_0
5
 PARAMETER HW_VER = 2.00.a
6
 PARAMETER C_INTERRUPT_PRESENT = 1
7
 PARAMETER C_BASEADDR = 0x00040000
8
 PARAMETER C_HIGHADDR = 0x000401FF
9
 PARAMETER C_GPIO_WIDTH = 1
10
 PARAMETER C_IS_DUAL = 0
11
 BUS_INTERFACE SPLB = mb_plb
12
 PORT GPIO_IO = Push_Button0_GPIO_IO
13
 PORT IP2INTC_Irpt = Push_Button0_IP2INTC_Irpt
14
END

von hans (Gast)


Lesenswert?

initialisierst du den IntC irgendwo ich kannmiche rinnern das ich damals 
in konfigurieren udn starten musste

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.