Forum: Mikrocontroller und Digitale Elektronik Hilfe beim Sleep Mode


von Toni (Gast)


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;
  }
}

von ozo (Gast)


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();
                }
        }
}

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.