Ich habe mit AVR noch kaum Erfahrung, das ist erst mein zweites Projekt.
Für eine Spielerei (Gartendeko) möchte ich alle 60 Sekunden ein paar
Leds aufblitzen lassen. Die Batterien sollten möglichst eine
Gartensaison lang halten. Das funktioniert auch bereits mit dem
ATtiny13. Einen Teil der der 60-Sek.-Pause überbrücke ich per Watchdog,
was nochmal Strom spart, den Rest halt mit Wait.
Nun will ich aber noch die Blitzdauer, Wiederholung, etc. über 4-5
Dip-Schalter einstellen können. Dazu würde ich einen ATtiny2313 oder
ATtiny24 mit mehr I/Os nehmen. Die Pullups sind im Datenblatt mit 30-80k
angegeben. Das heißt, dass bei geschlossenen Schaltern und 4,5V
Betriebsspanung über jeden Pullup zusätzliche 56-150µA fließen.
Die andere Überlegung wäre einen externen Vielfach-Spannungteiler zu
bauen und den noch freien I/O des ATtiny13 als Analog-Eingang zu
konfigurieren. Durch den Spannungsteiler komme ich dann aber auf einen
zusätzlichen Strombedarf ähnlicher Höhe. Unendlich hochohmig kann ich
den ja auch nicht machen.
Wisst ihr eine bessere Lösung?
Dietmar S. schrieb:> Wisst ihr eine bessere Lösung?
Natürlich: Die Masseseite der DIP-Switches nicht direkt an Masse hängen,
sondern auch wieder an einen Pin. Dieser Pin sollte nur zum Abfragen des
Status der Switches auf Low gelegt werden (mindestens mit einenm Takt
"Vorlauf"), dann wieder auf "Input" (effektiv also High-Z). Und
natürlich sollte die Digital-Input-Schaltung für diesen Pin deaktiviert
werden (DIDRn), damit nicht wieder dieser eine Pin unerwünschten
Energieverbrauch verursacht.
Dietmar S. schrieb:> Das heißt, dass bei geschlossenen Schaltern und 4,5V> Betriebsspanung über jeden Pullup zusätzliche 56-150µA fließen.
Die Pull-Up Widerstände müssen ja nicht permanent aktiv sein, sondern
nur für den kurzen Moment, wo die ihre Einstellung erfasst. Im
Extremfall kan das einmalig beim Einschalten sein. Ansonsten halt in
gewissen Intervallen.
c-hater schrieb:> Natürlich: Die Masseseite der DIP-Switches nicht direkt an Masse hängen,> sondern auch wieder an einen Pin. Dieser Pin sollte nur zum Abfragen des> Status der Switches auf Low gelegt werden (mindestens mit einenm Takt> "Vorlauf"), dann wieder auf "Input" (effektiv also High-Z). Und> natürlich sollte die Digital-Input-Schaltung für diesen Pin deaktiviert> werden (DIDRn), damit nicht wieder dieser eine Pin unerwünschten> Energieverbrauch verursacht.
Hätte ich eigentlich auch drauf kommen können, das versuche ich mal.
Stefan ⛄ F. schrieb:> Die Pull-Up Widerstände müssen ja nicht permanent aktiv sein, sondern> nur für den kurzen Moment, wo die ihre Einstellung erfasst. Im> Extremfall kan das einmalig beim Einschalten sein. Ansonsten halt in> gewissen Intervallen.
Wenn ich die Pullup-Widerstände abschalte, dann kann ich die I/Os in
dieser Zeit aber nur als Ausgänge (Output Low) konfigurieren. Die sind
zwar low, trotzdem frage ich vorsichtshalber ob das keine Probleme gibt,
wenn die über die DIP-Schalter kurzgeschlossen sind.
Außerdem sollen laut folgendem Artikel I/Os als Ausgänge konfiguriert
mehr Strombedarf haben als Eingänge:
https://www.all-electronics.de/elektronik-entwicklung/ultra-low-power-design-mit-mikrocontrollern.html
Dietmar S. schrieb:> Wenn ich die Pullup-Widerstände abschalte, dann kann ich die I/Os in> dieser Zeit aber nur als Ausgänge (Output Low) konfigurieren. Die sind> zwar low, trotzdem frage ich vorsichtshalber ob das keine Probleme gibt,> wenn die über die DIP-Schalter kurzgeschlossen sind.
Das ist kein Problem.
> Außerdem sollen laut folgendem Artikel I/Os als Ausgänge konfiguriert> mehr Strombedarf haben als Eingänge
Das kenne ich anders. Die Pins nehmen nur Strom auf, wenn die
Signalpegel wechseln oder in der "verbotenen" Zone zwischen Low und High
herum dümpeln.
Stefan ⛄ F. schrieb:> Das ist kein Problem.
Da muss ich ihm Recht geben. Dasselbe Konzept ist natürlich "High-Side"
genauso anwendbar. Man muss dann halt nur ggf. die Eingangsbeschaltung
mehrerer Pins per DIDRn deaktivieren.
Sobald sich der Kram über mehrere Ports erstreckt, ist die
Low-Side-Variante die Vorzugslösung.
Dietmar S. schrieb:> Nun will ich aber noch die Blitzdauer, Wiederholung, etc. über 4-5> Dip-Schalter einstellen können.
Man könnte pro Bit je zwei DIL-Schalter einbauen und die als Umschalter
verdrahten. Natürlich kann man damit Unfug anstellen, nur 2 von 4
Stellungen sind erlaubt. Aber wer Strom sparen will muss Opfer bringen
;)
c-hater schrieb:> Da muss ich ihm Recht geben. Dasselbe Konzept ist natürlich "High-Side"> genauso anwendbar. Man muss dann halt nur ggf. die Eingangsbeschaltung> mehrerer Pins per DIDRn deaktivieren.
Vergessen: Und zum Abfragen wieder aktivieren...
Super, hab das eben mit dem ATtiny13 probiert, funktioniert einwandfrei.
Jetzt brauch ich mir nur noch einen AVR mit mehr Ports bestellen.
Mir ist noch die Idee gekommen einen LDR einzubauen, das spart am Tag
nochmal ordentlich Strom.
Dietmar S. schrieb:> Einen Teil der der 60-Sek.-Pause überbrücke ich per Watchdog,> was nochmal Strom spart, den Rest halt mit Wait.
Du kannst im Watchdog Interrupt eine Variable zählen, bis die gewünschte
Wartezeit vorbei ist.
Dietmar S. schrieb:> Das heißt, dass bei geschlossenen Schaltern und 4,5V> Betriebsspanung über jeden Pullup zusätzliche 56-150µA fließen.
Du kannst die Pullups zwischen den Abfragen einfach abschalten.
Es ist aber keine schlechte Idee, die Pins auf Output low zu setzen,
damit im Betrieb ein definierter Pegel anliegt. Im Power-Down zwischen
den Watchdog Interrupts sind die Eingänge aber eh abgeschaltet.
Dietmar S. schrieb:> Jetzt brauch ich mir nur noch einen AVR mit mehr Ports bestellen.
Charlieplexing könnte Pins einsparen.
Peter D. schrieb:> Es ist aber keine schlechte Idee, die Pins auf Output low zu setzen,
Alternativ könnte man auf allen betreffenden Pins die Pullup aktivieren.
Dann steckt es auch versehentliche Kurzschlüsse in den Schlafphasen,
oder Programmierfehler leicht weg.
Also so eine Art OpenCollektor Emulation
Dieses echte 40mA High ist wohl in keinem Fall nötig.
Peter D. schrieb:> Dietmar S. schrieb:>> Einen Teil der der 60-Sek.-Pause überbrücke ich per Watchdog,>> was nochmal Strom spart, den Rest halt mit Wait.>> Du kannst im Watchdog Interrupt eine Variable zählen, bis die gewünschte> Wartezeit vorbei ist.
Das habe ich nicht ganz verstanden, heißt das den Watchdog immer wieder
neu starten? Das hatte ich versucht, aber schnell aufgegeben, weil ich
nicht dachte dass das überhaupt geht.
Ich programmiere das Ganze in Bascom. Leider bin ich jetzt nicht mehr in
der Werkstatt und hab den Code nicht hier.
Dietmar S. schrieb:> Das habe ich nicht ganz verstanden
Der Watchdog läßt sich als ganz normaler Timerinterrupt verwenden,
einfach im Handler das WDTIE setzen.
"To stay in Interrupt and System Reset Mode, WDTIE must be set after
each interrupt."
Sorry, das mit der Variable im Interrupt hochzählen verstehe ich nicht.
Da muss ich mich wohl noch intensiver mit befassen.
Edit:
Ich habe gerade folgendes Beispiel gefunden und versuche mich dann
morgen daran:
https://www.roboternetz.de/community/threads/50982-Watchdog-Interrupt?p=506184&viewfull=1#post506184
Vielleicht habe ich das auch nicht richtig erklärt. Ich gehe in den
Powerdown Modus um Strom zu sparen, wenn die LEDs nicht blinken und
wecke den AVR über den Watchdog wieder auf. Der Watchdog lässt sich aber
nur ca. auf max. 2-10 Sekunden einstellen (je nach AVR). Der AVR soll
aber 60 Sekunden im Powerdown bleiben.
Mein derzeitiger Code aus dem Kopf (vereinfacht):
Peter D. schrieb:> Du kannst die Pullups zwischen den Abfragen einfach abschalten.
Warum soll man an der Konfiguration der Einzelpins rumwerkeln?
Wenn alle Pins, auch der Pin für die Masseseite der Schalter per Pull-Up
auf High gezogen werden, kann doch gar kein Strom fließen. Während der
Abfragen muss nur der Pin für die Masseseite der Schalter kurz auf Low
gelegt werden.
Wolfgang schrieb:> Warum soll man an der Konfiguration der Einzelpins rumwerkeln?
Man kann Pins eines Ports gemeinsam umschalten. Soviel Code ist das
nicht (LDI+OUT).
Wolfgang schrieb:> Wenn alle Pins, auch der Pin für die Masseseite der Schalter per Pull-Up> auf High gezogen werden, kann doch gar kein Strom fließen.
Das benötigt aber einen zusätzlichen Pin und die sind beim ATtiny13 eher
knapp.
Ich denke ich habe jetzt verstanden wie man den Watchdog per Interrupt
konfiguriert, nur scheint das in Bascom nicht zu funktionieren. ON Wdt
kennt Bascom nicht. Ich mach dazu am besten einen neuen Thread auf, wenn
ich bis dahin keine Lösung finde. Meine Eingangsfrage ist ja gelöst.
Vielen Dank an alle.
Dietmar S. schrieb:> Ich denke ich habe jetzt verstanden wie man den Watchdog per Interrupt> konfiguriert, nur scheint das in Bascom nicht zu funktionieren.
Kenne mich mit Bascom nicht aus...aber die Idee des WD ist eben doch
sehr simpel und sehr wirkungsvoll. Im Prinzip verhindert man rechtzeitig
den Einsprung in ein Unterprogramm, das als Rettungsanker dient. Wenn,
aus welchem Grund auch immer, "rechtzeitig" nicht kommt, dann ist etwas
ungewolltes passiert und das Unterprogramm kann Abhilfe schaffen...z.B.
durch einen harten Neustart des Programms. Hier benutzt du den
WD-Mechanismus quasi umgekehrt, da du das WD-Ereignis nicht verhinderst,
sondern nur die abgelaufene Zeit für eine Aktion nutzt. Wenn das
tatsächlich die optimale Stromsparstrategie ist, dann ist es ok.
Gruß Rainer
Rainer V. schrieb:> Kenne mich mit Bascom nicht aus...aber die Idee des WD ist eben doch> sehr simpel und sehr wirkungsvoll. Im Prinzip verhindert man rechtzeitig> den Einsprung in ein Unterprogramm, das als Rettungsanker dient. Wenn,> aus welchem Grund auch immer, "rechtzeitig" nicht kommt, dann ist etwas> ungewolltes passiert und das Unterprogramm kann Abhilfe schaffen...z.B.> durch einen harten Neustart des Programms. Hier benutzt du den> WD-Mechanismus quasi umgekehrt, da du das WD-Ereignis nicht verhinderst,> sondern nur die abgelaufene Zeit für eine Aktion nutzt. Wenn das> tatsächlich die optimale Stromsparstrategie ist, dann ist es ok.> Gruß Rainer
Sicher, der Watchdog ist für meine Anwendung eigentlich nicht
vorgesehen, aber der AVR unterstützt die Möglichkeit ja. Habe inzwischen
ein eigenes Thema dazu aufgemacht:
Beitrag "Bascom AVR - Watchdog per Interrupt"