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?
Tobi schrieb: > Weiß jemand woran es liegen könnte? Setze die Sleep-Anweisung mal in deine while-Schleife.
Tobi schrieb: > Das hab ich gerade probiert. Keine Änderung des Verhaltens. Und aus der Interrupt-Routine hast du die Anweisungen gelöscht?
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!
Hast du die Interruptebenen freigeschalten? // Interrupts freigeben PMIC.CTRL |= PMIC_HILVLEN_bm; PMIC.CTRL |= PMIC_MEDLVLEN_bm; PMIC.CTRL |= PMIC_LOLVLEN_bm;
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.