Forum: Mikrocontroller und Digitale Elektronik µC aus dem Sleepmode


von Elektrolyt (Gast)


Lesenswert?

Hallo lieben Mitleser,

also mein Vorhaben ist ein wenig kompliziert zu erklären, dennoch möchte 
ich es kurz versuchen zu schildern und nach Ratschläge und Hilfe 
fragen...
Ich habe ein Mega8 (5V betrieben) und sobald die 5V ausfallen wird auf 
ein Akku umgeschaltet und dieser als Puffer benutzt. Nun möchte ich, 
dass abgefragt wird, ob die 5V wieder da sind oder nicht. Dies wollte 
ich mit dem ADC realisieren. Wenn die 5V für eine Zeit lang weg bleibt, 
soll der µC in den PowerDown übergehen.
Sobald die 5V wieder anliegen, soll der µC aufwachen. Und genau hier ist 
mein Problem. Zum wecken brauche ich ja ein Interrupt. Wo kann ich mir 
dieses "Wecksignal" herholen? Kann ich die 5V-Leitung einfach an mein 
INT0 hängen? Reicht das "anlegen" der 5V an den INT0 aus, um den µC zu 
wecken?
Oder gibt es da vielleicht eine andere Möglichkeit???
Ich habe hier einiges über solche Sachen gelesen, aber bin nicht 
wirklich auf eine elegante Lösung stoßen. Vielleicht kann mir da jemand 
weiter helfen...

Bedanke mich recht herzlich und wünsche einen schönen (rest)Abend...
Elko

von Kachel - Heinz (Gast)


Lesenswert?

Tja, Elektrolyt, nun hast Du einen Streit über Umgangsformen 
angezettelt. Da siehst Du mal, was Schreibfehler so alles bewirken 
können... ;-)

Zum Thema:
Tabelle 14 auf Seite 33 des Mega8-Datenblattes zeigt die Quellen, die 
den Mega8 aus den entsprechenden Sleep-Modi aufwecken können. Da Du den 
Power-Down oder Power-Save benutzen willst, kommt eigentlich nur der 
externe Low-Level-Interrupt in Frage. Den kannst Du dann mit GND bzw. 
einem Low-Level (wie der Name schon sagt) auslösen und nicht mit +5V 
(das wäre High-Level). Da wird das direkte Anschließen der Spannung also 
nix werden. Allerdings kannst Du das Signal mit einem NPN-Transistor und 
einem Basis-Widerstand umkehren, dann funktioniert das mit dem 
Interrupt. Zum Erkennen des Spannungsausfalls brauchst Du auch keinen 
ADC, das kannst Du auch über den Pinzustand ermitteln. Einfach in 
regelmäßigen Abständen pollen, oder auch den Interrupt für steigende 
Flanke benutzen (wird aber etwas komplexer, da das derselbe Int ist, der 
auch zum Wecken genutzt werden soll).

KH

von Matthias L. (matze88)


Lesenswert?

pRoF: ich fordere hiermit ebenfalls eine Sperrung für Gäste zum Posten
Patrick Weinberger: Don't feed the troll

Elektrolyt:
5 V über RC-Glied an einen PinChange Interrupt, sodass der Interrupt 
auch erst triggert, wenn die 5 V wieder stabil anliegen. 100 kOhm und 
100 nF bieten sich an, dann dürftest du nach rund 100 ms nen Interrupt 
bekommen.
Den Pin Change Interrupt aktivierst du im Programm gleichzeitig mit dem 
Sleep Mode, nach dem Aufwachen wird er sofort wieder deaktiviert. Wie 
erkennst du denn zur Zeit die Abwesenheit der Hauptspeisung? Das kann 
man sicherlich direkt verbinden und mit 1 IO-Pin abhandeln.

cu
Matze

von Kachel - Heinz (Gast)


Lesenswert?

Sehr gute Idee. Der Mega8 hat aber leider keinen Pin-Change-Interrupt...

Du fütterst aber glaube auch die Trolle.
Trolle müssen im mikroconTROLLer-Forum aber sein... ;-)

KH

von Falk B. (falk)


Lesenswert?

Siehe Sleep Mode und

http://www.mikrocontroller.net/articles/Speicher#EEPROM_Schreibzugriffe_minimieren

Für das Aufwecken aus dem Power Down brauchst du einen Inverter, z. 
74HC04.

MFG
Falk

von Kachel - Heinz (Gast)


Lesenswert?

> Für das Aufwecken aus dem Power Down brauchst du einen Inverter, z.
> 74HC04

Oder eben einen (bereits erwähnten) Transistor... ;-)

KH

von Falk B. (falk)


Lesenswert?

@ Kachel - Heinz (Gast)

>Oder eben einen (bereits erwähnten) Transistor... ;-)

Kaum. In einer Ultra Low Power Anwendung sind Bipolartransistoren nciht 
wirklich das Mittel der Wahl. MOSFETs only.

MFg
Falk

von Matthias L. (matze88)


Lesenswert?

Oha, ihr habt recht. Ich entschuldige mich mal damit, dass ich 5 Minuten 
nach Abschicken des Beitrags bereits eingeschlafen im Bett lag?


Trotzdem müsste mein Code doch mit den externen Interrupts lösbar sein - 
"ISC11=0 ISC10=1 - Any logical change on INT1 generates an Interrupt 
request". Oder auch ISC11=1 und ISC10=1 für rising edge. (Seite 66 
Datenblatt) Spart aufgrund des RC-Gliedes dann den Transistor oder 
Inverter. Oder vertu ich mich schon wieder? Nebenbei, gut das es keiner 
gemerkt hat, ich hab während des Einschlafens noch dran gedacht, dass 
ich das RC Glied falsch berechnet habe :-) Es wären bei 100 k und 100 nF 
eher 5-10 ms bis der µC High statt Low sieht.

von Katapulski (Gast)


Lesenswert?

>Oder eben einen (bereits erwähnten) Transistor... ;-)

>Kaum.

Es gibt Leute. die müssen Recht haben, sonst kommen si nicht in den 
Sleep-Modus. ;-)

gez. Katapulski

von Kachel - Heinz (Gast)


Lesenswert?

Naja, die 5V, die der Transistor belasten würde, kommen ja nicht aus dem 
Akku, sondern höchstwahrscheinlich aus einem Netzteil. Und da verriecht 
sich ein Basis-Widerstand von mehreren 10k. Natürlich ist ein CMOS-IC 
besser, ich würde aber den CD4093 bevorzugen, den habe ich nämlich 
liegen.

@Katadingsda: Sei doch nicht immer so spitz...

KH

von Andreas K. (a-k)


Lesenswert?

Man kann natürlich den Analog Comparator dafür verwenden. Nachteil ist 
aber, dass der für seine interne Referenz hässlich viel Strom benötigt.

Wenn der Controller sich mit dem Aufwachen etwas Zeit lassen darf und 
nicht auf Quarz läuft sondern vorzugsweise mit internem RC-Osz, dann 
gibt es eine stromsparendere Variante: Alle Sekunde mal aufwachen, ADC 
oder Comparator einschalten, warten bis die interne Referenz stabil ist, 
nachmessen, ADC/AC abschalten und wieder einschlafen. Denn dann muss nur 
der Watchdog-Timer als Wecker-Interrupt laufen. Der effektive 
Stromverbrauch entspricht dabei dem Powerdown-Modus plus Watchdog, denn 
die aktive Zeit ist insgesamt praktisch vernachlässigbar.

Mit Quarz muss man nachrechnen ob sich das lohnt, denn dann ist die 
Aufweckzeit nicht vernachlässigbar.

von Falk B. (falk)


Lesenswert?

@Matthias Larisch (matze88)

>Trotzdem müsste mein Code doch mit den externen Interrupts lösbar sein -
>"ISC11=0 ISC10=1 - Any logical change on INT1 generates an Interrupt
>request". Oder auch ISC11=1 und ISC10=1 für rising edge. (Seite 66

Ja dann lies mal was über den Sleep Mode. Aus dem Power Down kann 
der AVR nur per LOW LEVEL Interrupt geweckt werden.

>Datenblatt) Spart aufgrund des RC-Gliedes dann den Transistor oder
>Inverter. Oder vertu ich mich schon wieder?

Ja.

MFG
Falk

von Matthias L. (matze88)


Lesenswert?

>
>>Trotzdem müsste mein Code doch mit den externen Interrupts lösbar sein -
>>"ISC11=0 ISC10=1 - Any logical change on INT1 generates an Interrupt
>>request". Oder auch ISC11=1 und ISC10=1 für rising edge. (Seite 66
>
> Ja dann lies mal was über den Sleep Mode. Aus dem Power Down kann
> der AVR nur per LOW LEVEL Interrupt geweckt werden.

Oh ja, stimmt :-((( Tut mir leid, das hatte ich total vergessen. Da hab 
ich mich eh schon gewundert, warum es mit dem PinChange Interrupt 
(sofern vorhanden) geht, aber die "richtigen" Interrupts nur auf Low 
Level zum Aufwecken taugen.



Naja, das Problem sollte ja durch deine Lösung mit dem Inverter schon 
gut gelöst sein :-)


Matze

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.