www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe beim Sleep Mode


Autor: Toni (Gast)
Datum:

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

Autor: ozo (Gast)
Datum:

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

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.