Hilfe beim Sleep Mode

Gast #546165
Lesenswert?
• ▲
▼
Hallo,

ich hab ein Problem beim Sleep_Mode beim Atmega88. So wie ich ihn im 
Moment programmiert habe, funktioniert er zwar einwandfrei, jedoch nicht 
wie gewünscht. Zur Zeit geht der Controller direkt nach dem Einschalten 
in den Sleep-Mode. Durch einen Low_Level Interrupt wird er daraus wieder 
aufgeweckt. Das Ein- und Ausschalten funktioniert über einen externen 
Taster also ohne Probleme.

Nun möchte ich den Controller aber erst Schalfen schicken, wenn der 
Taster ca. 5 Sekunden lang gedrückt wurde. Jedoch weiß ich nicht so 
richtig, wie ich das anstellen soll. Kann mir da jemand nen guten Tip 
geben? Hier mal die Routine zum Sleep_Mode...


int main(void)
{
start:

init_avr();
init_varis();

sleep_mode_init();
_SEI;
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_mode();  //in sleepmodus gehen
while(!(PIND & (1 << PIND3)))
{
;
}

Port_Init();
wakeup = 0;

while(1)
{

if((!(PIND & (1 << PIND3))) &&  wakeup == 0)
  {
  while(!(PIND & (1 << PIND3)))
  {
        ;
  }
  wakeup = 1;

  goto start;
  }
}
Gast #546219
Lesenswert?
• ▲
▼
Naja, ich gebe zu, mich jetzt nicht intensiv mit deinem Code 
auseinadnergesetzt zu haben. Aber "ca. 5 Sekunden" schreit für mich nach 
einem Timer.
Der wird periodisch alle x Millisekunden aufgerufen und schaut nach, ob 
Taster gedrückt ist. Wenn das n mal nacheinander der Fall war, gibts 
grünes Licht für pennen oder aufwachen. Nebenbei hast du auch eine 
Tastenentprellung für kleinen Geld dabei.

Ich hab mir mal was halbwegs generisches für den Timer gebastelt, da 
kann man callback Funktionen einhängen und wieder austragen, die ISR 
ruft die dann nach einer gewissen Periode auf.

Hier mal die ISR, sollte als Anregung reichen. Rest gerne auf Verlangen.

ISR(TIMER1_COMPA_vect) {
        uint8_t i;

        ticks++;
        for(i=0;i<MAX_CALLBACKS;i++) {
                if(  callback[i].timer_cb!=NULL && 
(callback[i].last+callback[i].period==ticks) ) {
                        callback[i].last=ticks;
                        callback[i].timer_cb();
                }
        }
}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.