Forum: Mikrocontroller und Digitale Elektronik Attiny 84 Sleep-WatchDog


von Flo S. (flos6323)


Lesenswert?

Hi,
ich möchte einen ATtiny84 energiesparend beutzen. Dafür benötige ich 
sowas wie ein Watchdog. Der soll den µC aber nicht nach einer bestimmten 
Zeit neustarten, sondern nur in den Sleep-Modus versetzen und den ADC 
abschalten.
Danach soll er über einen Taster wieder aufgeweckt werden und die ADCs 
sollen wieder eingeschaltet werden.
Gibt es irgendeine funktion für die Arduino IDE, die sowas kann?

Viele Grüße und schöne Vorweihnachtstage
Flo S

von Karl M. (Gast)


Lesenswert?

Was steht dem im Datenblatt des Attiny84?
Warum sollte man einen AVR µC unkontrolliert in den schlafi versetzen?
Das ist doch sinnfrei!

von Stefan F. (Gast)


Lesenswert?

Der Watchdog ist dazu ungeeignet. Dein Programm muss den µC in den Sleep 
Modus versetzen.

von Flo S. (flos6323)


Lesenswert?

Karl M. schrieb:
> Das ist doch sinnfrei!

Flo S. schrieb:
> ich möchte einen ATtiny84 energiesparend beutzen.
Da der µC nich dauerhaft laufen muss, möchte ich ihn in dieser Zeit 
deaktiviren.

von Karl M. (Gast)


Lesenswert?

Nach als Ergänzung,

dieser Watchdoc kann auch als Timer mit Interrupt konfiguriert werden.

Siehe:
S.45
http://ww1.microchip.com/downloads/en/DeviceDoc/doc8006.pdf

WDTCSR – Watchdog Timer Control and Status Register
WDIE: Watchdog Timeout Interrupt Enable

Somit kann man sich von hinten durch die Brust in's Knie schießen.

von Flo S. (flos6323)


Lesenswert?

Stefanus F. schrieb:
> Der Watchdog ist dazu ungeeignet. Dein Programm muss den µC in den Sleep
> Modus versetzen.

Desswegen meinte ich ja auch "sowas wie" einen watchdogtimer.
Wie kann ich denn sowas programmiren ?

von Stefan F. (Gast)


Lesenswert?

Flo S. schrieb:
> Stefanus F. schrieb:
>> Der Watchdog ist dazu ungeeignet. Dein Programm muss den µC in den Sleep
>> Modus versetzen.
>
> Desswegen meinte ich ja auch "sowas wie" einen watchdogtimer.
> Wie kann ich denn sowas programmiren ?

So wie man alles programmiert, was von Zeit abhängt.
Du kannst ja hiervon abgucken: 
http://stefanfrings.de/avr_hello_world/index.html

von Tim T. (Gast)


Lesenswert?

Also meine Kristallkugel sagt mir das du den Tiny nach einer gewissen 
Zeit ohne Interaktion schlafenlegen willst und dann irgendwann über nen 
Pin Interrupt aufwecken willst. Richtig?

Zu blöd das ich von der Arduino IDE keinen Schimmer hab, normal würde 
ich das über nen Zähler machen der im Timerirgendwas Überlauf Interrupt 
hochgezählt und abgefragt wird und bei jeder entsprechenden Aktion 
wieder auf 0 zurück gesetzt wird. Dann nur noch eine kurze 
Schlaffunktion die aus dem Timer aufgerufen wenn die Abfrage ergeben hat 
das eine entsprechender Wert erreicht wurde.

von Stefan F. (Gast)


Lesenswert?

So macht man das:
1
timer_t start=milliseconds();
2
3
for (;;) //for ever
4
{
5
    if (taste gedrückt) 
6
    {
7
        start=milliseconds();
8
        // auf den Tastendruck reagieren
9
    }
10
11
    timer_t now=milliseconds();
12
    if (now-start>10000) // 10 Sekunden nichts los
13
    {
14
        // Sleep Modus aktivieren
15
16
        // nach dem Aufwachen:
17
        start=milliseconds();
18
    }
19
}

Timer auf 0 setzen ist keine gute Idee, wenn man noch andere Dinge daran 
messen will.

von Flo S. (flos6323)


Lesenswert?

Tim T. schrieb:
> Also meine Kristallkugel sagt mir das du den Tiny nach einer gewissen
> Zeit ohne Interaktion schlafenlegen willst und dann irgendwann über nen
> Pin Interrupt aufwecken willst. Richtig?

Da hat die Kugel richtig gedacht.

von Flo S. (flos6323)


Lesenswert?

Stefanus F. schrieb:
> So macht man das:timer_t start=milliseconds();
>
> for (;;) //for ever
> {
>     if (taste gedrückt)
>     {
>         start=milliseconds();
>         // auf den Tastendruck reagieren
>     }
>
>     timer_t now=milliseconds();
>     if (now-start>10000) // 10 Sekunden nichts los
>     {
>         // Sleep Modus aktivieren
>
>         // nach dem Aufwachen:
>         start=milliseconds();
>     }
> }
>

Super!
Ich werden das morgen mal ausprobiren.

von HildeK (Gast)


Lesenswert?

@Flo S.
Dazu brauchst du doch den WD nicht.
Dein Prozessor soll einfach seine Aufgabe ausführen und wenn er fertig 
ist, schicke ihn in den Tiefschlaf.
Den Taster lässt du den INT0-Interrupt bedienen, um den μC wieder 
aufzuwecken. Du musst dazu eine IRQ-Routine, ggf. leer, installieren.
Er setzt dann die Bearbeitung nach dem Sleep-Befehl wieder fort.

von Thomas E. (thomase)


Lesenswert?

HildeK schrieb:
> Dein Prozessor soll einfach seine Aufgabe ausführen und wenn er fertig
> ist, schicke ihn in den Tiefschlaf.

Genau. So rum wird ein Schuh draus. Der Grundzustand ist Sleep und wenn 
etwas zu tun ist, wird er aufgeweckt, erledigt seinen Kram und legt sich 
wieder schlafen.

von M. K. (sylaina)


Lesenswert?

Flo S. schrieb:
> ich möchte einen ATtiny84 energiesparend beutzen. Dafür benötige ich
> sowas wie ein Watchdog. Der soll den µC aber nicht nach einer bestimmten
> Zeit neustarten, sondern nur in den Sleep-Modus versetzen und den ADC
> abschalten.

Man kann den Watchdog auch im Interrupt-Mode benutzen wie jeden anderen 
Timer auch.

Flo S. schrieb:
> Danach soll er über einen Taster wieder aufgeweckt werden und die ADCs
> sollen wieder eingeschaltet werden.

Die ADCs? Ein Attiny84 hat nur einen ADC mit mehreren gemultiplexten 
Eingängen. Willst du analoge Spannungen messen?

Flo S. schrieb:
> Gibt es irgendeine funktion für die Arduino IDE, die sowas kann?

Mit Sicherheit, leider kenne ich mich damit zu wenig aus.

Aber wie schon gesagt wurde: Warum den Attiny mit dem Watchdog schlafen 
legen? Einfach den Attiny seine Arbeit machen lassen und wenn er fertig 
ist legst du ihn schlafen. Der Taster bekommt einen Interrupt und weckt 
den Attiny wieder auf.
Was man natürlich machen kann ist, den Watchdogtimer als Taktquelle des 
Attinys benutzen. Das drückt den Energiebedarf insbesondere im Sleep 
enorm.

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.