Forum: Compiler & IDEs Endlosschleife nach Sleep


von Michael D. (micheagle)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von Michael D. (micheagle)


Lesenswert?

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
Noch kein Account? Hier anmelden.