Hallo,
Ich möchte mein Projekt (ATMega 16 + Beschaltung) in den "Schlaf"
versetzen, da ich die Schaltung mit einer Batterie versorgen möchte.
Folgendes soll geschehen:
Wenn ich 60 Sekunden 'nichts' tue ... also keine Taster drücke (das
bekomme ich alles hin mit Tastern und so), dann soll der Controller
schlafen. Laut Tutorial habe ich die Wahl zwischen verschiedenen Arten
... also Power-Down, Standby und so weiter ... Welche Art würdet ihr mir
raten ?
Da ist nun von einem Aufweck - Interrup die Rede ... wie Realisiere ich
soetwas ?
Aus dem Datenblatt wird ersichtlich, dass ich bestimmte Pins am
Controller beschalten muss ?! IN0 - IN2 ...
Geht es nicht auch so, dass der Controller wieder aufgeweckt wird, wenn
man irgendeinen Taster betätig, sprich eine Aktion ausführt ?
Möchte IN0 - IN2 nicht unnötig beschalten.
Danke Timo
Je nachdem, welchen Sleep-Mode Du benutzt, bleibt Dir keine andere Wahl,
als das Aufwecken mit einem externen Interrupt zu realisieren. Je mehr
Komponenten des Controllers abgeschaltet werden, um Strom zu sparen,
desto weniger Möglichkeiten zum Aufwecken gibt es. Aus dem
Power-Down-Modus, in dem auch der Hauptoszillator deaktiviert ist, geht
das nur über einen Level(!)-Interrupt, da für die Flankendetektierung
der CPU-Takt benötigt würde. Behelfen kann man sich z.B., indem man alle
Taster, die den µC aufwecken sollen, über ein UND-Gatter an einen der
externen Interrupt-Pins legt und den Interrupt vor dem Schlafenlegen als
Level-Interrupt freigibt. Das wäre die stromsparendste Lösung.
johnny.m wrote:
> der CPU-Takt benötigt würde. Behelfen kann man sich z.B., indem man alle> Taster, die den µC aufwecken sollen, über ein UND-Gatter an einen der> externen Interrupt-Pins legt und den Interrupt vor dem Schlafenlegen als> Level-Interrupt freigibt. Das wäre die stromsparendste Lösung.
Dann doch lieber ein ODER Gatter oder ? ;)
Grüße
Björn
Hallo!
Kommt drauf an wieviel Ansprech zeit du zulassen wills! Ich hab mir
schon mal so beholfen dass ich den Controller alle 50ms per Timer
interrupt hab wecken lassen, die Tasten abgefragt hab und in dann wieder
hab einschlafen lassen.
Die paar µs die der dafür braucht fallen meist nicht ins Gewicht!
MfG Owz
@Björn:
> Dann doch lieber ein ODER Gatter oder ? ;)
Nö. Taster werden bei den AVRs aufgrund der integrierten Pull-Ups
eigentlich sinnvollerweise immer Low-aktiv angeschlossen. Wenn man die
Taster an ein UND-Gatter hängt und ein Taster gedrückt wird, so dass die
UND-Bedingung nicht mehr erfüllt ist, dann gibt das Gatter am Ausgang
einen Low-Pegel aus. Und das ist genau das, was der Interrupt-Eingang
braucht...
wenn mein Pic schläft wie wecke ich Ihn wieder auf ohne Flanke am INT
sondern anch einer bestimmten Zeit.
ich führe einfach nur
Sleep();
aus
aber wie zähle ich jetzt mit ? wenn der Timer aus ist=
Ich verwende einen externen Quarz für den Pic, wenn ich den Timer1
verwende möchte kann ich diesen quarz nicht mehr verwenden weil sich der
Pic im schlaf befindet. Muss ich jetzt nochmal einen Quarz verwenden und
an das RC1 Pin hängen für den Timer1?
ich habe bei einem mega168 den internen 32 khz oszi aktiviert und lass
ihn darüber wieder aufwachen. Dann wird quasi alles schlafen gelegt, nur
der timer2 läuft weiter.
Da laut Datenblatt im SLEEP_MODE_PWR_SAVE der Timer2 weiterläuft setzt
man einfach den nächsten Weckwert und der Prozessor wird zum Zeitpunkt
wieder aufgeweckt. Interrupt ausführen und dann im Main direkt zurück in
den sleep.
So z.B.
1
/* weckt den Prozessor alle x ms auf und generiert einen kurzen Impuls auf Ausgang PB0
2
* hier wird mit einem Transistor ein Trafo sekundärseitig angetrieben