mikrocontroller.net

Forum: Compiler & IDEs Endlosschleife nach Sleep


Autor: Michael Danz (micheagle)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Danz (micheagle)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.