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
Was steht dem im Datenblatt des Attiny84? Warum sollte man einen AVR µC unkontrolliert in den schlafi versetzen? Das ist doch sinnfrei!
Der Watchdog ist dazu ungeeignet. Dein Programm muss den µC in den Sleep Modus versetzen.
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.
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.
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 ?
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
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.
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.
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.
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.
@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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.