Forum: Mikrocontroller und Digitale Elektronik Attiny84A Sleep Modes


von Werz (Gast)


Lesenswert?

HAllo!

Ich verwende den Attiny84A
http://www.atmel.com/images/doc8183.pdf

für folgende Applikation:

Eine Batteriespannung 1,5V wird kontinuierlich gemessen (ADC)
Die BAtteriespannung wird zusätzlich mit einem Taster an einen 
AD-Eingang geschalten, um einen Tastendruck zu erkennen.
2 PWM-Ausgänge werden zum Schalten von Lasten verwendet; es gibt 5 
verschiedene PWM-Stufen (DutyCycles), die mit einem Tastendruck zyklisch 
verändert werden. Dieses Umschalten woll immer möglich sein.
Der µC wird mit 5V versorgt und wird über die SPI-Schnittstelle mit 
debugWire programmiert.

Zusätzlich werden beide Timer verwendet, einer für die PWM und einer für 
interne allgemeine Verzögerungen.

Nun will ich die Leistungsaufnahme so weit wie möglich verringern und 
bin dabei im Datenblatt auf die Sleep Modes gestoßen. Welcher Sleep Mode 
wäre für diese Applikation am besten geeignet? Ich dachte an den IDLE 
MOde, aber ist in diesem Sleep Mode die PWM aktiv (die PWM Stufen sollen 
kontinuierlich laufen!)?

Weiters könnte ich im PRR Register PRUSI und somit die USI deaktivieren. 
Kann ich dann noch über die SPI Schnittstelle programmieren?

Vielen Dank,
lG

von Ingo (Gast)


Lesenswert?

Werz schrieb:
> aber ist in diesem Sleep Mode die PWM aktiv
So wie es aussieht, sollte das gehen da das alles in Hardware abläuft 
und diese dazu nicht abgeschaltet wird.
Aber ich würde es einfach mal ausprobieren!

von Werz (Gast)


Lesenswert?

Hallo!

Das würde bedeuten, ich kann den IDLE MODE die ganze Zeit laufen lassen, 
ohne den µC zu "wecken"?

von Peter K. (Gast)


Lesenswert?

Werz schrieb:
> Die BAtteriespannung wird zusätzlich mit einem Taster an einen
> AD-Eingang geschalten, um einen Tastendruck zu erkennen.

warum per ADC einen Tastendruck erkennen?

Werz schrieb:
> Weiters könnte ich im PRR Register PRUSI und somit die USI deaktivieren.
> Kann ich dann noch über die SPI Schnittstelle programmieren?

Nein Spi ist dann deaktiviert, aber debugWire ist nicht SPI.

Werz schrieb:
> Ich dachte an den IDLE
> MOde, aber ist in diesem Sleep Mode die PWM aktiv (die PWM Stufen sollen
> kontinuierlich laufen!)?

Ja die IOs und die internen Timer sind alle aktiv, es ist nur die cpu 
und der flashspeicher deaktiviert. Alle Interrupts können die CPU 
aufwecken.
Wenn der ADC aktiviert ist wird, beim Eintritt in den IDLE Modus eine 
ADC-Conversion ausgelöst.

von Werz (Gast)


Lesenswert?

Peter Kremsner schrieb:
> Nein Spi ist dann deaktiviert, aber debugWire ist nicht SPI.

HAllo; OK, ich hatte vorher SPI und ISP verwechselt. Also kann ich mit 
dem deaktivieren des USI noch programmieren?

Peter Kremsner schrieb:
> warum per ADC einen Tastendruck erkennen?

Wäre vermutlich eleganter gegangen, habe ich aber so gleöst...

Peter Kremsner schrieb:
> Ja die IOs und die internen Timer sind alle aktiv, es ist nur die cpu
> und der flashspeicher deaktiviert. Alle Interrupts können die CPU
> aufwecken.
> Wenn der ADC aktiviert ist wird, beim Eintritt in den IDLE Modus eine
> ADC-Conversion ausgelöst.

heißt das nun folgendes: ich kann den IDLE Mode aktivierne und die PWM 
stufen laufen weiter. Wenn aber der Taster gedrückt wird, muss der µC 
aufgeweckt werden?

Danke, lG

von Ingo (Gast)


Lesenswert?

Werz schrieb:
> heißt das nun folgendes: ich kann den IDLE Mode aktivierne und die PWM
> stufen laufen weiter. Wenn aber der Taster gedrückt wird, muss der µC
> aufgeweckt werden?
Die Frage ist doch, was machst du mit deinen ADC Werten?
Die PWMs laufen grundsätzlich weiter. Aber du müsstest erstmal genauer 
beschreiben wie das Gerät funktioniert, nicht nur was es misst und was 
ein Tastendruck bewirkt. Wo brauchst du denn die Werte von ADC?



Ingo

von Werz (Gast)


Lesenswert?

Also der ADC wird von eime Timer getriggert, eine Wandlung findet ca. 
alle 15ms statt. Der wert wird dann in einer(globalen) Variable 
gespeichert.

Diese Variable wird in der Main kontinuierlich abgefragt. Wenn der 
Taster gedrückt wird (1,5V liegt an), unterscheidet sich der ADC Wert 
vom ADC Wert, wenn der Taster nicht gedrückt wird (in diesem Fall werden 
5 V gemessen). Wenn also der taster gedrückt wird, erkenne ich dies 
durch einen viel geringeren Wert der Variable.

LG

von Werz (Gast)


Lesenswert?

Hmmm, kann mir diesbezüglich keiner weiterhelfen?

von Cyblord -. (cyblord)


Lesenswert?

Werz schrieb:
> Also der ADC wird von eime Timer getriggert, eine Wandlung findet ca.
> alle 15ms statt. Der wert wird dann in einer(globalen) Variable
> gespeichert.
ok


> Diese Variable wird in der Main kontinuierlich abgefragt.
Dein Problem: In einem Sleep Mode wird die Main nicht ausgeführt.
D.h. die läuft nur vom Interrupt an, bis zum nächsten einschlafen.

> Wenn der
> Taster gedrückt wird (1,5V liegt an), unterscheidet sich der ADC Wert
> vom ADC Wert, wenn der Taster nicht gedrückt wird (in diesem Fall werden
> 5 V gemessen). Wenn also der taster gedrückt wird, erkenne ich dies
> durch einen viel geringeren Wert der Variable.

Was glaubst du wozu man digitale Eingänge hat? Einen Taster fragt man 
Digital ab. Deine Ausrede "hab ich halt so gelöst" ist absolut nicht 
ausreichend um so einen vollendeten Quatsch zu erklären.

> Hmmm, kann mir diesbezüglich keiner weiterhelfen?
Keine Ahnung was dein Problem ist.

: Bearbeitet durch User
von Werz (Gast)


Lesenswert?

cyblord ---- schrieb:
> Einen Taster fragt man
> Digital ab

Ja ist mir klar, war meine erste Entwicklung :) in Zukunft werde ich es 
auch anders machen...

cyblord ---- schrieb:
> Dein Problem: In einem Sleep Mode wird die Main nicht ausgeführt.
> D.h. die läuft nur vom Interrupt an, bis zum nächsten einschlafen.

D.h. ein Sleep mode wäre in meinem Fall gar nicht sinnvoll/möglich?
Was genau meinst du mit "bis zum nächsten einschlafen"?

cyblord ---- schrieb:
> Keine Ahnung was dein Problem ist

Ich wollte nur nach einer Möglichkeit suchen, die Batterielebensdauer zu 
verlängern, sprich den Stromverbrauch zu senken...

von Peter II (Gast)


Lesenswert?

Werz schrieb:
> Ja ist mir klar, war meine erste Entwicklung :) in Zukunft werde ich es
> auch anders machen...

warum kannst du den Port nicht einfach Digital nutzen? Wie ist denn der 
Taster genau angeschlossen?

von Cyblord -. (cyblord)


Lesenswert?

Werz schrieb:
> D.h. ein Sleep mode wäre in meinem Fall gar nicht sinnvoll/möglich?
> Was genau meinst du mit "bis zum nächsten einschlafen"?
Na was meine ich damit? Der Controller wird in einen Sleep-Mode versetzt 
(= schläft ein) und kann daraus wieder erwachen, durch ein Ereigniss 
(Interrupt). Soweit die Terminologie.

Dir scheint irgendwie nicht klar zu sein, was ein Sleep-Mode ist. Das 
normale Programm läuft dort auf jeden Fall nicht weiter. Darum musst du 
ab und zu aufwachen sonst passiert nichts. Lediglich einige Periphier, 
Timer, ADC usw. können (je nach SleepMode) weiter laufen und Interrupts 
fürs aufwachen erzeugen. Da gibts ne Tabelle im Datenblatt für.

>
> cyblord ---- schrieb:
>> Keine Ahnung was dein Problem ist
>
> Ich wollte nur nach einer Möglichkeit suchen, die Batterielebensdauer zu
> verlängern, sprich den Stromverbrauch zu senken...
Das ist klar.

Das macht man in der Regel so, dass man den Controller eben in einen 
Sleep-Mode versetzt und entweder in regelmäßigen Abständen oder per 
Ereignis aufwachen lässt. Dann tut er was und schläft dann wieder ein.
In den Schlafphasen braucht er dann wenig Strom.

Der Rest hängt von der Anwendung ab. DU musst doch festlegen, in welchen 
Phasen du welche Peripherie brauchst (= welcher Sleepmode möglich ist) 
und wann und wie der Controller wieder aufwachen soll. Was er dann tun 
muss und wann er wieder einschlafen kann. Das wissen wir alles nicht das 
musst DU dir ausdenken.

Einfach den SleepMode einschalten und sonst bleibt alles beim Alten, 
reicht natürlich nicht.

Wenn man also nun eine Batteriespannung messen will. Dann muss das nicht 
sehr oft passieren. Also könnte man den tiefsten SleepMode (ka wie der 
grade heißt) nehmen. Daraus kann man z.B. durch den Watchdog aufwachen. 
Also stellt man den WD auf 8 Sekunden und schläft ein. Nach 8 Sek. weckt 
der WD den Controller auf, der Controller misst die Batt. Spannung, tut 
was oder auch nicht und schläft dann wieder ein, aber nicht ohne vorher 
den WD wieder scharf zu schalten.
Damit schläft der Controller die allermeiste Zeit extrem tief und 
braucht sehr wenig Strom.

: Bearbeitet durch User
von Bastler (Gast)


Lesenswert?

In der main()-loop kannst du per SLEEP den Tiny in IDLE schicken. Danach 
wartet der auf ein HW-Ereignis, d.h. einen Interrupt, und macht dann 
nach dem SLEEP weiter. Die ISR könnte dann ein Flag gesetzt haben ( an 
volatile denken), das in der main-loop ausgewertet wird. Ist alles 
erledigt geht wieder in SLEEP, bis zum nächsten Int.
Wie das ganze dann genau geschrieben sein muß, hängt wesentlich von 
deiner Programmierumgebung ab.

von Werz (Gast)


Lesenswert?

Peter II schrieb:
> warum kannst du den Port nicht einfach Digital nutzen? Wie ist denn der
> Taster genau angeschlossen?

Die Spannung, die durch den taster an den µC eingang gelegt wird, ist 
die Batteriespannung mit 1,5V. Der µC ist aber mit 5V versorgt und würde 
die 1,5V vermutlich nicht als High erkennen...

Danke cyblord, deine ausführliche Erkläörung hat mir sehr geholfen! Ich 
kann mir nun überlegen, wann und ob bei mir ein Sleep Mode sinnvoll ist 
;)

Danke, lG

von Cyblord -. (cyblord)


Lesenswert?

Werz schrieb:

> Die Spannung, die durch den taster an den µC eingang gelegt wird, ist
> die Batteriespannung mit 1,5V.
Aber warum ist das so? Wenn du doch sowieso 5V hast?

> Der µC ist aber mit 5V versorgt und würde
> die 1,5V vermutlich nicht als High erkennen...
Eigentlich schließt man einen Taster gar nicht so an, sondern zwischen 
PortPin und GND. Damit kannst du die internen PullUp-Widerstände nutzen 
und musst dir um die Spannung keine Sorgen machen.
Ein gedrückter Taster erzeugt also dann logisch 0.

Das würde ich in jedem Fall optimieren. Das ist Murks so wie es ist.

von Werz (Gast)


Lesenswert?

Alles klar, danke für den Hinweis...

Was ich nun noch versuchen werde, ist, den ADC-Komparator und USI zu 
disablen. Mal schaun, ob das vom Strom her noch was bringt.

von Peter K. (Gast)


Lesenswert?

Zum sleepMode, wenn du deinen Taster sozusagen sowieso per ADC auslest 
und du ihn nur kurz drücken möchtest um einen Tastendruck zu erkennen 
dann siehst sowieso anders aus.
Du kannst deinen Controler in den IDLE-Mode versetzen, es wird eine 
ADC-Umwandlung gestartet wenn die fertig ist dann erwacht der Controler 
automatisch du wertest deinen Taster aus schaltest zum Channel mit der 
Batterie und schläfst wieder bis der ADC einen wert hat. Das ganze kann 
in der main oder in der ADC-ISR passieren, ist beides nicht so 
zeitkritisch, zudem erwacht dein Controler ja auch immer wenn sich einer 
der beiden PWM-Counter meldet, soweit von denen die Interupts aktiviert 
sind.

Also am ende der Main schleife in den IDLE-Mode gehen, wenn ein Interupt 
kommt (sleep bit löschen) wird nach der ISR die main aufgerufen und am 
ende derer wird wieder geschlafen.
Da dein Taster auch am ADC hat, wirst du ohnehin nicht lange schlafen 
können, am geschicktesten wäre es den Taster an ein externes Interupt zu 
hängen, dann kannst du auch mal 6-Sekunden schlafen, sofern die 
PWMCounter kein Interupt produzieren und dann einfach den ADC kurz 
laufen lassen, die Baterriespannung ist ohnehin träge, drückt jemand den 
Taster passiert das auch sehr schnell weil ja dann ein extra Interrupt 
den Tiny aufweckt.

von Werz (Gast)


Lesenswert?

Also dads Prinzip habe ich jetzt verstanden, vielen Dank auch an Peter 
für deine Hilfe.

Habe jetzt noch einmal nachgedacht, ob ein Sleep Modus für meine 
Anwendung interessant wäre und bin zum Ergebnis gekommen, dass dies 
nicht der Fall ist. Die Hardware kann in diesem Entwicklungsstadium 
leider nicht mehr geändert werden und mit dem Taster am ADC muss der ADC 
ständig laufen, um einen Tastendruck zu erkennen (d.h. der ADC läuft im 
Dauerbetrieb). D.h. es wird ständig in der Endlos-Mainschleife der 
ausgelesene ADC-Wert (Variable) angesehen und je nach Wert 
(Unterschreitet bei Tastendruck einen Grenzwert) wird ein Tastendruck 
erkannt oder nicht. Da der ADC dauernd läuft (es muss ein Tastendruck zu 
beliebiger Zeit erkannt werden) wird ständig ein Interrupt ausgelöst, 
der den µC wecken würde. Im Endeffekt würde er dann  nur für ganz kurze 
Zeiten schlafen.

In meinem Fall, wo zur Zeit keine HW-Änderungen mehr möglich sind, wäre 
natürlich eure vorgeschlagene Lösung besser (Taster an digitalen IO-> 
Interrupt; somit könnte bei jedem Tastendruck der µC geweckt werden). 
Die Messung der Batteriespannung könnte dann mit sehr geringer 
Abtastrate erfolgen, sodass der µC solange schläft, bis der Taster 
gedrückt wird. Aber wie gesagt, mit der aktuellen HW-Version hätte ein 
Sleep Modus keinen sinn...

Vielen Dank für eure Hilfe!

von Werz (Gast)


Lesenswert?

Hätte sonst noch jemand eine Idee, wie ich noch Strom sparen könnte?

LG

von chris (Gast)


Lesenswert?

Werz schrieb:
> mit dem Taster am ADC muss der ADC
> ständig laufen, um einen Tastendruck zu erkennen (d.h. der ADC läuft im
> Dauerbetrieb)

nö muss er nicht.
Es reicht völlig aus, alle 10-20ms den Taster abzufragen. D.h. du lässt 
den µC von nem Timerinterrupt wecken, misst kurz mit dem ADC und 
schläfst weiter, wenn nichts zu tun ist.
Dann bist du 99% der Zeit im Sleep-Modus

von spess53 (Gast)


Lesenswert?

Hi

>In meinem Fall, wo zur Zeit keine HW-Änderungen mehr möglich sind, wäre
>natürlich eure vorgeschlagene Lösung besser (Taster an digitalen IO->
>Interrupt; somit könnte bei jedem Tastendruck der µC geweckt werden).

Beim ATTiny84A ist jeder ADC-Pin auch ein digitaler Pin mit Interrupt. 
Wo ist das Hardware-Problem?

MfG Spess

von hm (Gast)


Lesenswert?

Für die Zukunft:
(Leider weiss ich nicht wie sich das bei Atmel nennt, bei PIC's wäre das 
passende Stichwort):
Interrupt-On-Change

Löst einen Interrupt aus, sobald eine Flanke erkannt wird. Damit lässt 
sich der Controller auch aus dem Sleep Modus holen. Haben Atmel 
Controller garantiert auch.

von spess53 (Gast)


Lesenswert?

Hi

Bei AVRs nennt sich das Pin Change Interrupt. Und das kann der ATTiny84A 
an jedem Portpin.

MfG Spess

von Peter D. (peda)


Lesenswert?

Werz schrieb:
> die PWM Stufen sollen
> kontinuierlich laufen!

Dann geht nur Idle, also etwa 50% Stromverbrauch.

von Peter K. (Gast)


Lesenswert?

spess53 schrieb:
> Beim ATTiny84A ist jeder ADC-Pin auch ein digitaler Pin mit Interrupt.
> Wo ist das Hardware-Problem?

Er hat gesagt der Taster hängt den Eingang auf 1.5V das ist laut 
Datenblatt bei 5V Versorgungsspannung die oberste Grenze für ein 
logisches 0, der Bereich für eine sichere logische 1 beginnt erst ab ca 
3V, also kann er den Pin nicht als digital IO verwenden.

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.