Liebe Kollegen!
Ich versuche (inzwischen verzweifelt) eine ISR zu machen. Der Microblaze
soll in die ISR springen wenn einer der DIP Schalter betätigt wird.
Leider kann ich machen was ich will er springt nicht.
Wenn ich die ISR forciere (XIntc_Out32(X...) dann geht es.
H I L F E ! ! !
Die "xparameters.h" wird sehr hilfreich sein. Eigentlich sollte man vor
dem
XGpio_InterruptEnable(&Sw,
XPAR_DIP_SWITCHES_8BIT_IP2INTC_IRPT_MASK);
ein "XGpio_InterruptGlobalEnable" machen.
Ausserdem bei:
XIntc_RegisterHandler(XPAR_XPS_INTC_0_BASEADDR,
XPAR_DIP_SWITCHES_8BIT_DEVICE_ID,
(XInterruptHandler)InterruptHandler,
(void *)0);
ich glaube das is die falsche DEVICE_ID, bin aber nich 100% sicher.
Alles steht in die "xparameters.h"
Gruss
Valentin
Ich hab die Befehlsfolge aus einem Tutorial. Ich dachte mir vielleicht
wird es einfacher ohne InterruptController. Leider geht immer noch
nichts.
H E L P ! ! ! !
/* Global Enable I n t e r r u p t s Gpio Pushbuttons (GIE Re g s i t e
r ) */
XGpio Inter ruptGlobalEnable (&GpioInput ) ;
89
/* Enable I n t e r r u p t s f o r Channel 1 IER Re g s i t e r */
91 XGpio Inter ruptEnable (&GpioInput , 0 x00000001 ) ;
Das kenne ich schon. Ich hab den Part mit Exception.... durch ein
enable_interrupt austetauscht. Das Programm bleibt aber im Exception
Table hängen.
Immerhin bin ich mit Deiner Anleitung weiter. Bis jetzt bin ich über die
while(1) nicht hinausgekommen (kein Interrupt).
Fällt Dir vielleicht sonst was ein?
LG
Monika
also ein fehler kann ich nicht mehr entdecken hast du mal die register
während des programmablaufs ausgelesen ob überhaupt ein interrupt
ausgelöst wird?
Jetzt geht gar nichts mehr. Die XMD schreibt
Error: Debug Memory Access Check Failed
Keine Ahnung. Ich werde morgen noch einmal versuchen den Interrupt zu
machen. Vielleicht habe ich dann mehr Glück
Natürlich versuche ich dann auch den XIntc_Connect...
DANKE!!!
Vielleicht "lesen" wir uns ja morgen wieder!
So haben wir das mit meinem Kollege damals im Labor gemacht:
GPIO Initialisierung
GPIO Interrupt enable
INTC Initialisierung
Interrupt verbinden
Interrupt in INTC enable
int main(void){
...
XGpio_Initialize(&BUTTONS, XPAR_PUSH_BUTTONS_5BIT_DEVICE_ID);
...
//von Buttons erzeugte Interrupts enablen
XGpio_InterruptGlobalEnable(&BUTTONS);
XGpio_InterruptEnable(&BUTTONS, XGPIO_IR_CH1_MASK);
...
//Interrupt-Controller init.
XIntc_Initialize(&intc, XPAR_XPS_INTC_0_DEVICE_ID);
//Ausgang des Interrupt-Controllers zum Prozessor enablen
XIntc_Start(&intc, XIN_REAL_MODE);
//Button-ISR bekannt geben
XIntc_Connect(&intc,XPAR_XPS_INTC_0_PUSH_BUTTONS_5BIT_IP2INTC_IRPT_INTR,
(XInterruptHandler)Buttons_ISR, NULL);
//Button-Interruptquelle enablen
XIntc_Enable(&intc,
XPAR_XPS_INTC_0_PUSH_BUTTONS_5BIT_IP2INTC_IRPT_INTR);
...
microblaze_enable_interrupts();
...
}// end of main
void ISR(){
...
//Interrupt-Status zurücksetzen
XGpio_InterruptClear(&BUTTONS, XGPIO_IR_CH1_MASK);
...
}
Du muss natürlich die MAKROs aus deinem xparameters.h verwenden.
Hoffentlich hilft dir das weiter
Gruss,
Valentin
echte Hardware
Design via Impact in den FPGA gespielt und mit SDK debuged.
Ich habe einen Breakpoint in der ISR und die Leds sollten was anderes
anzeigen.
am besten du hängst die mhs datei nochmal an ansonsten müsste man mal
das entsprechende register des IntC auslesen und per UART ans Hterm
ausgeben um zu gucken ob der interrupt überhaupt da ankommt
Hmm. Wie wäre es denn mal mit simulieren?
Da kann man gucken, ob die Interrupt-Leitung wackelt, wo der program
counter steht und welcher Befehl als nächstes dran ist. Am besten ohne
D- und I-Cache.
Nebenbei bekommt man noch einen Eindruck, wie langsam auf Interrupts
reagiert wird...
Duke
also für mich sieht das programm und die mhs gut aus
denke belibt nur noch simulieren oder halt per uart die registerwerte
ausgeben und gucken ob das stimmt mehr fällt mir auch nicht mehr ein
Hi,
versuch mal ohne die folgende Zeile:
XGpio_SetDataDirection(&GpioInput, 1, 0xF);
Im Datenblatt steht das die Register per Default als Eingang
initialisiert sind. Du schreibt da ein 4 Bit Wert in einem 32Bit breit
Register.
Gruss,
Valentin
Hi,
hast du das Interrupt Controller selber eingebaut? Normaleweise kannst
du das direkt beim Projekterstellung machen, so sollten solche Probleme
nicht auftretten.
Kriegst du Warnings bei der Synthese? Falls ein Pins nicht verbunden ist
kommt normaleweise ein Warning.
Hast du auch ein Linker Script, wo werden Interrupt ausgelagert?
Hi,
hab das Linker Script erzeugt. Jetzt kann ich das Programm nicht mehr
debugen. Unter Thread steht (Suspended: Signal 'SIGTRAP' received.
Description: Trace/breakpoint trap.)
Hab aber keine Breakpoints mehr drinnen.
Falls das linker script interessant ist => als Beilage
in deinem UCF datei verwendest du:
fpga_0_Push_Buttons_5Bit_GPIO_IO_pin
in deinem MHS datei aber:
Push_Buttons_5Bit_GPIO_IO_I_pin
es gibt keine Verbindung zwischen UCF und MHS.
Solche Fehler kannst du vermeiden, in dem du ein neues Projekt
erstellst. Dann kannst du direkt die Interrupts eingeben und EDK
verbindet alles für dich. So bist du sicher das die HW Seite in Ordnung
ist. Dann kannst du die SW debuggen.
Ich persönlich würde die mir ein Projekt direkt im EDK erzeugen, da
sonst bei jede Synthese die "hw" Verzeichnis im SDK überschrieben werden
soll.
Für diese Test reicht auch ein kleine Anwendung im EDK.
Gruss
Hi,
Ich hab die ISE noch mal laufen lassen und alle Bez. kontrolliert.
Die Buttons rühren sich immer noch nicht.
Ich werde die EDK noch einmal machen. Vielleicht hilft das etwas.
Der Interrupt funktioniert!!!!!!
Ich hab alles noch einmal gemacht und genau wie Ihr gesagt habt die
Interrupts bleich beim BSB eingestellt. JUHU!!!
D A N K E für Eure Geduld.
Dickes Bussi
Monika