Forum: Mikrocontroller und Digitale Elektronik AVR Pullups und stromsparendes Design


von Dietmar S. (Gast)


Lesenswert?

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?

von c-hater (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.
von Dietmar S. (Gast)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von Bauform B. (bauformb)


Lesenswert?

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 
;)

von c-hater (Gast)


Lesenswert?

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...

von Bauform B. (bauformb)


Lesenswert?

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

von Dietmar S. (Gast)


Lesenswert?

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.

von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

Man könnte natürlich auch einen ESP8266 nehmen, und den in DEEP-SLEEP 
schicken.

von Peter D. (peda)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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.

von Dietmar S. (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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."

von Dietmar S. (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Dietmar S. (Gast)


Lesenswert?

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.

von Rainer V. (a_zip)


Lesenswert?

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

von Dietmar S. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.