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;
}
}
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.