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
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
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
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
@ 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
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.
>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
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
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.
@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
>>>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