Forum: Compiler & IDEs XMega wacht nicht mehr auf


von Tobi (Gast)


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?

von Christoph B. (christophbudelmann) Benutzerseite


Lesenswert?

Tobi schrieb:
> Weiß jemand woran es liegen könnte?

Setze die Sleep-Anweisung mal in deine while-Schleife.

von Tobi (Gast)


Lesenswert?

Das hab ich gerade probiert. Keine Änderung des Verhaltens.

von Christoph B. (christophbudelmann) Benutzerseite


Lesenswert?

Tobi schrieb:
> Das hab ich gerade probiert. Keine Änderung des Verhaltens.

Und aus der Interrupt-Routine hast du die Anweisungen gelöscht?

von Tobi (Gast)


Lesenswert?

Daran wars gelegen.

Gelöscht hab ich jetzt das enable und cpu am ende des Interrupts. Ich 
dachte das ist notwendig, damit er nach dem Interrupt wieder schlafen 
geht.

Vielen Dank Christoph!

von Dennis (Gast)


Lesenswert?

Hast du die Interruptebenen freigeschalten?

// Interrupts freigeben
PMIC.CTRL |= PMIC_HILVLEN_bm;
PMIC.CTRL |= PMIC_MEDLVLEN_bm;
PMIC.CTRL |= PMIC_LOLVLEN_bm;

von Christoph B. (christophbudelmann) Benutzerseite


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.

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.