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