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.
Beitrag #6652790 wurde von einem Moderator gelöscht.
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...
Bauform B. schrieb: > Man könnte pro Bit je zwei DIL-Schalter einbauen und die als Umschalter > verdrahten. Eigentlich wollte ich diese genialen Umschalter vorstellen: https://de.farnell.com/wurth-elektronik/450301014042/schiebeschalter-mini-on-on/dp/2134452 Die gibt's auch von anderen Herstellern SM0320102 von NKK NK236H von Apem CL-SA-12C-22 von Nidec Copal Electronics MSS-102559-14A-D von CUI Devices
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.
Man könnte natürlich auch einen ESP8266 nehmen, und den in DEEP-SLEEP schicken.
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):
1 | $Regfile="ATtiny13A.DAT" |
2 | $Crystal=1200000 |
3 | 'Config Watchdog = 8192 |
4 | Config Watchdog = 2048 |
5 | |
6 | DDRB= &B11111111 |
7 | PORTB=&B11100000 |
8 | |
9 | DIM Pause as Byte |
10 | DIM Runden as Byte |
11 | DIM Ein as Byte |
12 | DIM EinW as Byte |
13 | DIM Aus as Byte |
14 | |
15 | Pause=50 '10 |
16 | Runden=20 '20 |
17 | Ein=8 '8 |
18 | EinW=24 '24 |
19 | Aus=8 '8 |
20 | |
21 | Wait Pause |
22 | |
23 | 'Weiße LED |
24 | PortB.3=1 |
25 | Waitms EinW |
26 | PortB.3=0 |
27 | Waitms Aus |
28 | |
29 | 'Rote LEDs |
30 | While Runden>0 |
31 | PortB.0=1 |
32 | Waitms Ein |
33 | PortB.0=0 |
34 | Waitms Aus |
35 | PortB.1=1 |
36 | Waitms Ein |
37 | PortB.1=0 |
38 | Waitms Aus |
39 | PortB.2=1 |
40 | Waitms Ein |
41 | PortB.2=0 |
42 | Waitms Aus |
43 | Decr Runden |
44 | Wend
|
45 | |
46 | Start Watchdog |
47 | Powerdown
|
48 | End
|
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"
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.