Forum: Mikrocontroller und Digitale Elektronik AVR32UC3 Programm freezt nach GPIO Interrupt


von Momentum (Gast)


Lesenswert?

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

von Georg G. (df2au)


Lesenswert?

Muss die ISR Funktion nicht irgendwie das Attribut "Interrupt" bekommen, 
damit im Prolog Status und Flags gesichert werden und dann im Epilog 
restauriert werden?

von Momentum (Gast)


Lesenswert?

Hey,

schonmal Danke für deine Antwort. Meinst du damit, dass ich vor die ISR 
noch das hier setzen muss?:
1
 __attribute__((__interrupt__))

Genau das steht bei mir nämlich noch vor der Funktion, nur habe ich es 
anscheinend vergessen oben anzugeben...

von Georg G. (df2au)


Lesenswert?

Genau das meinte ich

von Momentum (Gast)


Lesenswert?

Okay, schade - das heißt dass der Fehler immer noch gefunden werden 
möchte :)

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.