Moin,
ich habe erst vor kurzer zeit mit µC-Programmierung angefangen, von
daher bitte ich jetzt schon für mögliche "Anfängerfehler" bzw. -fragen
um Verständnis :-)
Leider scheitere ich momentan noch an der Implementierung einer ISR, die
immer dann aufgerufen werden soll, wenn sich der Zustand eines GPIO Pins
ändert (also high->low oder umgekehrt). Diese Änderung kann ich mit
einem Schalter beeinflussen und weiß demnach, wann die ISR aufgerufen
werden sollte.
Aus Debuggründen (und zur besseren Übersichtlichkeit) habe ich den Code
auf ein "Minimum" reduziert, der jedoch immernoch nicht das tut, was ich
erwarten würde.
Die ISR wird nur einmal aufgerufen, da die rote LED eingeschaltet wird.
Jedoch scheint der µC die Routine nicht wieder zu verlassen, da das
Blinken der grünen LED, welches in der main integriert ist, aufhört.
Sämtliche weitere Änderungen des GPIO Pins werden auch nicht mehr
berücksichtigt...
Vielleicht hat ja jemand eine Idee. Hier erstmal der wie gesagt recht
minimalistische Code:
Main:
1 | int main (void)
|
2 | {
|
3 | // ======== INITIALIZING ========
|
4 | INIT_LEDS(); // Setup the Pins for the LEDs
|
5 |
|
6 | Disable_global_interrupt();
|
7 | INTC_init_interrupts();
|
8 | INTC_register_interrupt(&gpio_int_handler, AVR32_GPIO_IRQ_0 + (AVR32_PIN_PB11/8), AVR32_INTC_INT0);
|
9 | gpio_enable_pin_interrupt(AVR32_PIN_PB11, GPIO_PIN_CHANGE);
|
10 | Enable_global_interrupt();
|
11 |
|
12 | while(1) // Main loop
|
13 | {
|
14 | for (int i=0;i<20000;i++)
|
15 | {
|
16 | if (i==0)
|
17 | LED_toggle_green();
|
18 | else if (i == 10000)
|
19 | LED_toggle_green();
|
20 | }
|
21 | }
|
22 | }
|
ISR:
1 | static void gpio_int_handler(void)
|
2 | {
|
3 | LED_toggle_red();
|
4 | gpio_clear_pin_interrupt_flag(AVR32_PIN_PB11);
|
5 | }
|
Grüße
Momentum