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!
Hallo! Das würde bedeuten, ich kann den IDLE MODE die ganze Zeit laufen lassen, ohne den µC zu "wecken"?
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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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.
Hi Bei AVRs nennt sich das Pin Change Interrupt. Und das kann der ATTiny84A an jedem Portpin. MfG Spess
Werz schrieb: > die PWM Stufen sollen > kontinuierlich laufen! Dann geht nur Idle, also etwa 50% Stromverbrauch.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.