mikrocontroller.net

Forum: Compiler & IDEs Sleepmode per INT0 Frage


Autor: Marcel H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebes Forum :-),

ich bin Anfänger und suche gerade eher nach einer Idee, folgendes habe 
ich vor:

Ich würde gern meinen Merga32 über den INT0 in den Tiefschlaf schicken.
Das ganze soll so ablaufen das der Mega sein Hauptprogramm abarbeitet 
solang ich auf INT0 high habe und sobald low anligt soll er schlafen 
gehn bis wieder high ansteht.

Wie könnte ich das denn angehen?

Liebe Grüße
Marcel

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Sleep Mode

MfG
Falk

P S Du wist das mit dem Pegel umdrehen müssen. High = Schlafen, LOW 
aufwachen.

Autor: Marcel H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke hab ich gelesen aber ich komm nicht ganz klar damit das der Pegel 
ja permanent ist und nicht nur ein Impuls.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da würd ich gar keinen Interrupt nehmen sondern alles in der 
Hauptschleife erledigen. Dadurch schickst du den µC auch erst dann 
schlafen wenn es wirklich nichts mehr zu tun gibt.

> damit das der Pegel
> ja permanent ist und nicht nur ein Impuls.

Die Impulsauswertunt ist dann auch kein Problem mehr.
In den Tiefschlaf gehts erst dann, wenn auf 2 aufeinanderfolgenden 
Durchläufen durch die Hauptschleife ein 1-0 Übergang erkannt wird
   ...

   prevLevel = 1;
   while( 1 )  {
     ....

     thisLevel = ... Status vom INT0

     if( !thisLevel && prevLevel )  // 1 -> 0  Wechsel?
       sleep

     prevLevel = thisLevel;
  }

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marcel H. schrieb:

> Ich würde gern meinen Merga32 über den INT0 in den Tiefschlaf schicken.
> Das ganze soll so ablaufen das der Mega sein Hauptprogramm abarbeitet
> solang ich auf INT0 high habe und sobald low anligt soll er schlafen
> gehn bis wieder high ansteht.

Geht nicht, muß genau umgekehrt sein.

Hier ein funktionierendes Beispiel:

Beitrag "Re: attiny13 aufwecken aus power down modus"


Ein funktionierendes Entprellen ist in jedem Fall erstmal die 
Grundvoraussetztung für ein funktionierendes Sleep!


Peter

Autor: Marcel H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Geht nicht, muß genau umgekehrt sein.

Ok, was wären denn meine Möglichkeiten ich bin da offen :-)

Autor: Marcel H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich melde mich mal wieder kurz.
Habe einiges versucht aber so richtig will es nicht, ich wollte einen 
einfach Drehschalter benutzen, muß ich diesen auch immer entprellen?

Autor: Miraculix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ich wollte einen einfach Drehschalter benutzen,
> muß ich diesen auch immer entprellen?

Ja!

Mechnische Kontakte prellen nun mal, leider..... und die heutigen
µPs sind schnell. (Selbst bei Ur-Ur-Alt µPs wie beim RCA1802 (kennt den 
noch jemand?) mussten schon Maßnahmen zur Entprellung getroffen werden.)

Autor: Marcel H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Würde es denn nicht auch ein einfaches delay von ein paar ms tuen?
Ich hab nix zeitkritisches vor.
Ich will einfach nur den Mega praktisch ausschalten aber er soll eben 
die Werte im Ram micht vergessen.
Man kann es sich wie nen einfach an/aus Schalter vorstellen mehr ist es 
garnicht.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marcel H. schrieb:
> Würde es denn nicht auch ein einfaches delay von ein paar ms tuen?

Die Frage ist, will man wirklich bei jedem neuen Projekt mit einer 
speziellen Entprellungslösung Zeit vergeuden?

Oder nimmt man lieber ne universelle erprobte Lösung, die wenig 
Ressourcen benötigt und wenig Seiteneffekte hat und pappt sie einfach 
rein und gut is.


Klar kann man jede Aufgabe auf viele verschiedene Arten lösen.

Aber erwarte nicht, daß andere es für Dich tun, nur weil Dir die 
vorgeschlagene funktionierende Lösung nicht gefällt.
Du mußt es schon selber tun und dann auch selber prüfen.


Peter

Autor: Marcel H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versteh schon was du sagen willst aber es geht nicht drum obs mir 
gefällt oder nicht, ich wollte es nur so einfach wie möglich halten.
Ich bin dir sehr dankbar für deinen Vorschlag.
Mit dem entprellen habe ich jetzt auch nicht das große Problem, Lösungen 
gibt es ja genug, mir geht es viel mehr um das grundsätliche Aufwecken 
und Schlafenlegen.
Ich weiß noch immer nicht wie man dies angehen könnte.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Marcel H. (Gast)

>gibt es ja genug, mir geht es viel mehr um das grundsätliche Aufwecken
>und Schlafenlegen.
>Ich weiß noch immer nicht wie man dies angehen könnte.

Weil du eine Schlafmütze bist und den schönen Hinweis auf den Artikel 
Sleep Mode ignoriert hast!

Autor: Marcel H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
g nein hab ich nicht den hab ich in gedruckter Form vor mir, nur raff 
ich nicht die Sache mit dem Dauersignal zu verarbeiten...ich bin einfach 
zu blöd

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Marcel H. (Gast)

>ich nicht die Sache mit dem Dauersignal zu verarbeiten...ich bin einfach
>zu blöd

Wo ist denn das große Problem?

Lad mal das Beispiel aus dem Artikel auf deinen AVR und probiers aus.
Wie bereits gesagt muss man sich darauf einigen, dass das Aufwecken mit 
LOW passiert, geht nun mal nicht anders. Wenn der AVR wieder wach ist, 
nudelt der solange in der Hauptschleife, bis INT0 wieder auf High geht. 
Knackpunkt ist lediglich, dass man halt beim Aufwachen den INTo erstmal 
ausschalten muss, sonst gibt es Dauerinterrupts. Ist auch schon im 
Beispiel drin! Etwa so.

// Endlose Hauptschleife
 
    while(1) {

        if (PIND & (1<<PD2)) {  // INT0 ist wieder HIGH
            GICR |= (1 << INT0);            // externen Interrupt freigeben
 
            set_sleep_mode(SLEEP_MODE_PWR_DOWN);
            sleep_mode();                   // in den Schlafmodus wechseln
 
            // hier wachen wir wieder auf
            GICR &= ~(1 << INT0);           // externen Interrupt sperren
                                            // WICHTIG! falls der externe LOW Puls an INT0
            long_delay(20);                 // Entprellung
        }
 
        // irgendeinen Unsinn machen

        PORTD |= (1 << PD5);            // LED für eine Sekunde anschalten
        long_delay(1000);
        PORTD &= ~(1 << PD5);
        long_delay(1000);
    }
}

Das Entprellen passiert hier quasi durch das Aufwachen, denn das wird 
wie ein Power-On Reset verzögert. Siehe Abschnitt Morgenmuffel. Hier 
sollte man per AVR Fuses einen hohen Wert einstellen, 28ms sind 
nicht falsch. Wenn man mit dem interen RC-Oszillator arbeitet, bei dem 
solche langen Wartezeiten nicht einstellbar sind, muss man halt im 
Programm warten.

MfG
Falk

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marcel H. schrieb:
> g nein hab ich nicht den hab ich in gedruckter Form vor mir, nur raff
> ich nicht die Sache mit dem Dauersignal zu verarbeiten...ich bin einfach
> zu blöd

Was ist ein "Dauersignal"?

Anstatt Dein Problem kunstvoll zu umschreiben, stell einfach mal den 
Code rein, den Du ausprobierst und schreib als Kommentar rein, was er 
machen soll, was Du erwartest und was falsch passiert.
Als Dateianhang natürlich!

Oder probier das Beispiel aus und frage konkret dazu, wo es es klemmt.
Der Code ist doch nicht groß, läuft ja sogar aufm ATtiny13, da sollte 
Dein ATmega32 nur drüber lachen.


Es macht wenig Sinn, immer nur um den heißen Brei zu reden.


Peter

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.