XMega wacht nicht mehr auf

Gast #2325708
Lesenswert?

Hallo Leute,

ich habe ein Problem mit dem Sleep mode meines XMega(128A1). Er soll auf 
den Interrupt des RTC reagieren und damit eine LED blinken lassen. Wenn 
ich das ohne den Sleep Mode mach, dann blinkt die LED anstandslos. Aber 
eigentlich soll er zwischen den Interrupts in einen Sleep Mode gehen. 
Und hier hakt es. der Interrupt wird genau einmal ausgeführt. Im Debug 
mode mit AVR Studio ändert der Zustand der LED sich zwar auch, aber nur, 
wenn den Programmablauf unterbreche und dann weiterlaufen lasse.

Mein Code sieht momentan so aus:

[code]
int main (void)
{
//Initialisierungen

  sei();              //enable the global interrupt flag

  sleep_enable();          //enable the sleep state
  sleep_cpu();                //enter the sleep state
//hier hab ich auch statt sleep_enable() und sleep_cpu() sleep_mode() 
versucht. Keine Änderung

  while (1);            //infinite loop

  return 0;
}
[\code]

Der Interrupt:
[code]
ISR(RTC_OVF_vect)
{
  uint8_t interrupt_flag = 0x00;    //interrupt flag to store the global 
interrupt flag

  sleep_disable();          //disable the sleep state

  if ((SREG & CPU_I_bm) != 0x00) {  //if the global interrupt is set
    cli();            //disable the global interrupt
    interrupt_flag = 0xFF;    //set the flag
  }

  led_toggle (LED_BLINKING);    //toggle the leds

  if (interrupt_flag != 0x00) {    //if the flag is set
    sei();            //enable the global interrupt
  }

  sleep_enable();          //enable the sleep state
  sleep_cpu();          //enter sleep state
}
[\code]

Eigentlich wollte ich extended Standby verwenden, aber das hier 
funktioniert nicht mal mit idle.

Weiß jemand woran es liegen könnte?
Persönliche Seite #2325837
Lesenswert?

Tobi schrieb:
> Vielen Dank Christoph!

Keine Ursache.

Das Problem ist folgendes: Aus dem Sleep holt der Interrupt den 
Controller wieder raus. Wenn du aber während des Interrupts noch wieder 
in den Schlafmodus geht, welcher Interrupt soll ihn dann wieder wecken? 
Der RTC jedenfalls nicht, der wurde ja noch nicht mal beendet.

Mit der while-Schleife geht der Controller nun in den Sleep, wacht auf 
und arbeitet danach den Interrupt ab, macht eine Runde in der 
while-Schleife und legt sich wieder hin.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren