Hallo zusammen! Ich habe folgendes Problem: Nachdem ich meinen ATMEGA64 in den POWER_DOWN-Modus schlafen gelegt habe, möchte ich ihn per externem Interrupt wieder aufwecken. Orientiert habe ich mich an Atmels AN AVR240, 4 x 4 Keypad - Wake-up on Keypress, allerdings programmiere ich in C. Das Ganze funktioniert auch, solange ich beim Wechsel in den Schlafmodus keine Taste gedrückt halte. Kurz vor dem Schlafmodus aktiviere ich den externen Interrupt, der wird durch einen Tastendruck auf 0 V gezogen, der Interrupt kommt, ich deaktiviere wieder den externen Interrupt, und das Programm läuft normal. Nach einer Zeit x wird wieder der Schlafmodus initialisiert, alles prima. Nur wenn ich eine Taste gedrückt halte, während der Schlafmodus aktiviert wird, sprich der externe Interrupt dann schon auf 0 V liegt, klappt auch noch die ISR, aber danach springt der Proz nicht mehr an die stelle gleich nach dem Sleep Befehl, sondern wer weiß wohin. Der Watchdog macht dann einen Reset und alles beginnt von vorn. Hat das schon mal jemand beobachtet? Muss ich vorher die Register sichern? Und wenn ja, wie? Über einen Tipp wäre ich dankbar. Gruß, Michael
@ Michael Danz (micheagle) >Das Ganze funktioniert auch, solange ich beim Wechsel in den Schlafmodus >keine Taste gedrückt halte. Kurz vor dem Schlafmodus aktiviere ich den >externen Interrupt, der wird durch einen Tastendruck auf 0 V gezogen, Pull-Up eingeschaltet bzw. extern? >Nur wenn ich eine Taste gedrückt halte, während der Schlafmodus >aktiviert wird, sprich der externe Interrupt dann schon auf 0 V liegt, >klappt auch noch die ISR, Die müsste ja sofort wieder anspringen. > aber danach springt der Proz nicht mehr an >die stelle gleich nach dem Sleep Befehl, sondern wer weiß wohin. Der Quelltext? >Hat das schon mal jemand beobachtet? Nö. >Muss ich vorher die Register sichern? Und wenn ja, wie? Nö, du programmierst in C. MFG Falk
Falk Brunner wrote: > Pull-Up eingeschaltet bzw. extern? Ja, den habe ich aktiviert, auch schon mit diesen Einstellungen experimentiert. > >>Nur wenn ich eine Taste gedrückt halte, während der Schlafmodus >>aktiviert wird, sprich der externe Interrupt dann schon auf 0 V liegt, >>klappt auch noch die ISR, > > Die müsste ja sofort wieder anspringen. Das tut sie auch. Läuft sauber durch und spirngt sonstwo hin. Nur wo? > >> aber danach springt der Proz nicht mehr an >>die stelle gleich nach dem Sleep Befehl, sondern wer weiß wohin. Der > > Quelltext? der externe Interrupt: ISR (INT7_vect) { EIMSK &= ~( (1<<BIT7) );// Sperrung für externen Interrupt wdt_enable( WDTO_2S ); // Setzt int. Watchdog auf ca. 2 Sekunden PORTB = cam_1.portb_status; //da habe ich gesicherte LED-Werte wieder eingestellt } und der Übergang zum Schlafmodus: void security_sleep_modus ( void ) { if ( ( sleep_mode_counter >= 1000 ) && ( main_init == 1 ) ){ sleep_mode_counter = 0; //wird vom counter1 hochgezählt // set_sleep_mode (SLEEP_MODE_IDLE); // geht set_sleep_mode(SLEEP_MODE_PWR_DOWN); // geht nicht wdt_disable(); // Watchdog deaktivieren, damit FB nicht aus dem Schlafmodus gerissen wird delay_ms (15); led_ports_sichern_cam_1 ( ); // vor dem Ausschalten aller LEDs den LED Status sichern, damit nach dem Einschalten die LEDs reaktiviert werden können led_all_off ( ); // alle LEDs ausschalten (Strom sparen) EIMSK |= (1<<BIT7); // Freigabe für externe Interrupts (damit ein Tastendruck den MC wieder aufwecken kann!) sleep_mode(); } } > >>Hat das schon mal jemand beobachtet? > > Nö. Schade! > >>Muss ich vorher die Register sichern? Und wenn ja, wie? > > Nö, du programmierst in C. Aha. > > MFG > Falk Danke Micha
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.