Datum:
Angehängte Dateien:Hallo, wie im Titel herauszulesen ist, habe ich einen Interrupt Problem. Meine vorgehensweise im Projekt war folgende: Vorerst habe ich in ISE (VHDL) meine Hardware programmiert, funkioniert auch super. Anschließend habe ich in XPS ein neues Projekt kreiert und eine neue IP erzeugt. Die erzeugte IP habe ich mit meinen in ISE entwickelten Code erweitert und habe so letztendlich die fertige IP in XPS importiert und hinzugefügt. Nach dem ganzen vergeben der Ports und Adressen und dem zusammenverknüpfen habe ich meine ersten Tests in der SDK-Umgebung in C ausgeführt. Nun will ich einen Interrupt von einem GPIO verwenden. Dafür habe ich in XPS ein GPIO mit Interrupt hinzugefügt (nur Input und 1 Signal(Width=1)). An diesem GPIO habe ich aus meiner importierten IP (von mir entwickelte IP) verbunden. Anscließend habe ich den Interrupt ausgang des GPIOs auf den einem Interrupt-Controller angeschlossen und letztendlich noch den Intr-Cnt. an dem Non-Ctritical-Intr.Eingang des PPCs (PPC 440). Soweit so gut, nun habe ich auf der SDK-Umgebung den Interrupt programmiert. Der Interrupt an sich funktioniert prima, doch warum auch immer wird die while-Schleife in der main nicht aufgerufen, sodass zyklisch ein Interrupt gemacht wird. Dies habe im Debug-Modus geprüft, indem ich einen Breakpoint auf die while-Schleife und eine weitere auf "IntrFlag = 1" gesetzt habe. Die Interrupt-Flag wird 1 gesetzt, doch die while schleife wird nie aufgerufen. Die Frage zu meinem Problem ist, warum wird die while-Schleife nicht ausgeführt nach dem Interrupt. hier der c-Code:
/ #include <stdio.h> #include "xparameters.h" #include "xil_cache.h" #include "xintc.h" #include "xintc_l.h" #include "xstatus.h" #include "xil_exception.h" #include "intc_header.h" #include "xbasic_types.h" #include "xgpio.h" #include "gpio_header.h" #include "xbasic_types.h" #include "gpio_header.h" #include "gpio_intr_header.h" #include "iic_header.h" #include "uartlite_header.h" #include "xsysace.h" #include "sysace_header.h" #include "xbasic_types.h" #include "xbram.h" #include "bram_header.h" #include "xexception_l.h" #include "xbasic_types.h" #include "xutil.h" #define INTC_DEVICE_ID XPAR_XPS_INTC_0_DEVICE_ID #define INTC_GPIO_INPUT_INTERRUPT_ID XPAR_INTC_0_GPIO_4_VEC_ID #define GPIO_INPUT_CHANNEL1 1 /********************* Function Prototypes *************************/ void GpioInputHandler(void *CallBackRef); /********************** Variable Definitions ************************/ XIntc InterruptController; /* The instance of the Interrupt Controller*/ XIntc Intc_GpioInput; /* The Instance of the Interrupt Controller Driver */ static XGpio xps_gpio_ND_Gpio; /* The Instance of the GPIO Driver */ volatile u32 IntrFlag; /* Interrupt Handler Flag */ int main(void) { Xil_ICacheEnable(); Xil_DCacheEnable(); print("---Entering main---\n\r"); XGpio_Initialize(&xps_gpio_ND_Gpio, GPIO_INPUT_DEVICE_ID); XIntc_Initialize(&InterruptController, INTC_DEVICE_ID); XIntc_Connect(&InterruptController, XPAR_XPS_INTC_0_XPS_GPIO_ND_IP2INTC_IRPT_INTR, (XInterruptHandler)GpioInputHandler, (void *) (&xps_gpio_ND_Gpio)); XGpio_InterruptEnable(&xps_gpio_ND_Gpio, GPIO_INPUT_CHANNEL1); XGpio_InterruptGlobalEnable(&xps_gpio_ND_Gpio); XIntc_Enable(&InterruptController, XPAR_XPS_INTC_0_XPS_GPIO_ND_IP2INTC_IRPT_INTR); XIntc_Start(&InterruptController, XIN_REAL_MODE); Xil_ExceptionInit(); Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XIntc_InterruptHandler, &InterruptController); Xil_ExceptionEnable(); int count = 0; x = 0; IntrFlag = 0; while (1) { if (IntrFlag !=(u32) 0) { IntrFlag = 0; xil_printf("INERRUPT IntrFlag wurde gesetzt!"); } } print("---Exiting main---\n\r"); Xil_DCacheDisable(); Xil_ICacheDisable(); return 0; } void GpioInputHandler(void *CallbackRef) { XGpio *GpioPtr = (XGpio *)CallbackRef; IntrFlag = 1; xil_printf("INERRUPT"); // Clear the Interrupt XGpio_InterruptClear(GpioPtr, GPIO_INPUT_CHANNEL1); } |
Die system.mhs und system.ucf file vom XPS-Projekt, wo die Portzuweisungen zu erkennen sind, sind im Anhang hinzugefügt. Würde mich über jede Hilfe sehr freuen. mfg Cihan
Datum:
keiner ne idee... :-(
Datum:
Angehängte Dateien:Das Entwicklungsboard sollte natürlich ML507 statt ML07 heißen und im C-Code fehlt das define für "GPIO_INPUT_DEVICE_ID"
#define GPIO_INPUT_DEVICE_ID XPAR_XPS_GPIO_ND_DEVICE_ID |
ist in meinem Programm allerdings drinne, habe es nur hier ausversehen gelöscht. die xparameters.h file habe ich vergessen anzuhängen. danke im voraus für die Hilfe
Datum:
Cihan schrieb: > Dies habe im Debug-Modus geprüft, > indem ich einen Breakpoint auf die while-Schleife und eine weitere auf > "IntrFlag = 1" gesetzt habe. Die Interrupt-Flag wird 1 gesetzt, doch die > while schleife wird nie aufgerufen. Kommt der Prozessor denn überhaupt in die while-Schleife (ohne Interrupt)? Duke
Datum:
der Interrupt wird bei mir durch ein internes Signal in der VDDL Struktur verbunden mit dem GPIO (mit Interrupt) erzeugt. wenn ich das Signal auf einem LOW-Level halte und im DEBUG-Modus mit F6 Schrit für Schritt durchgehe, wird die while-Schleife aufgerufen. doch wenn ich mit F8 das programm durchlaufen lasse (Interrupt signal immer noch auf LOW) und die while-Schleife mit einem Breakpoint versehe, kommt er nicht rauf.
Datum:
Hat keiner eine Idee, warum die while-Schleife nicht aufgerufen wird?
Datum:
Also Interrupt = 0 und Debug-F6, while geht und
Interrupt = 0 und Debug-F8, while geht nicht, richtig?
Das klingt für mich oberfaul. Das muß funktionieren, bevor Du mit dem
Interrupt experimentierst.
Laß doch mal in der main/while eine LED-togglen.
Duke