Forum: Mikrocontroller und Digitale Elektronik Brown-out ?


von Michael B. (salty)


Lesenswert?

Hallo allerseits,

ich suche eine Möglichkeit um bei Spannungsausfall noch schnell einige
Daten in das EEPROM eines ATMega16 zu schreiben.

Der Brown-out-Detektor ist dafür wohl nicht nutzbar.

Hat vielleicht jemand eine Idee wie man so etwas realisieren kann?
Wenn möglich nicht mit zusätzlicher Hardware.

Ich bin für jeden Tip(p) dankbar!

Ach ja: Ich programmiere in "C".

Grüße!

von peter dannegger (Gast)


Lesenswert?

Ganz ohne Zusatzhardware:

Nimm nen AVR, der seine interne Bandgap messen kann mit VCC als
Referenz.
Und wenn VCC unter 4,5V geht, dann die Daten sichern.


Peter

von Michael B. (salty)


Lesenswert?

Hallo Peter,

danke für Deine schnelle Antwort!

Als erstes muss ich mich korrigieren: Ich meinte in meinem vorherigen
Posting ATMega88 und nicht 16!

Zu dem "Bandgap": Nie gehört! Wenn ich nachher wieder zu Hause bin
werde ich mal das Datenblatt zu Hilfe nehmen müssen.

Bs dann ...

von Michael B. (salty)


Lesenswert?

Hallo Peter,

ich habe mich mal im Internet nach Deinem Schlagwort "Bandgap"
umgesehen.

Mal davon abgesehen dass mir gerade aufgefallen ist, dass ich im
flaschen Forum bin (weil hier keine Fragen rein sollen) möchte ich doch
das Thema erst einmal hinten anstellen da mir die Thematik im Moment
noch etwas zu hoch ist (bin noch recht frisch auf dem AVR).

Wenn ich irgendwo Codeschnipsel finde wage ich noch einmal daran.

Gruß,
Michael.

von Benedikt (Gast)


Lesenswert?

Ich habe das ganze relativ einfach gelöst:
Die Spannung vor dem 5V Regler wird mit einer Diode entkoppelt und mit
2200uF gepuffert. Die Spannung vor der Diode wird geteilt, so dass die
Spannung im Ruhezustand bei 3V oder höher liegt.
Fällt die Spannung, erkennt der uC diese als Low und ein Interrupt wird
erzeugt, in dem die Werte gespeichert werden. Genauer geht es mit dem
Comparator.
Um ganz sicher zu gehen, lasse ich den uC sich in der Interruptroutine
aufhängen, weshalb er per Watchdog neu gestartet wird.
Brown Out habe ich auf 2,x V eingestellt.

von Peter D. (peda)


Lesenswert?

"ich habe mich mal im Internet nach Deinem Schlagwort "Bandgap"
umgesehen."


Schau doch einfach mal ins Datenblatt (UBG = 1,1V).

D.h. bei VCC = 4,5V liest Du dann 1,1V/4,5V*1024=250, also bei größer
250 wirds Zeit den EEPROM anzuschmeißen.


Peter

von Fabian (Gast)


Lesenswert?

Man sollte die BG Spannung aber mit bekannter Eingangsspannung
überprüfen! Nominell soll sie ja 1,15V betragen, aber bei meinen Tests
mit Tiny26'ern lag sie meist bei ca 1,25V
Sollte man bei seinen Berechnungen mit einbeziehen, bevor man den
"falschen" ADC wert als Threshold nimmt und das Ding ständig
auslöst.

Gruß
Fabian

von Michael B. (salty)


Lesenswert?

Hallo ihr drei,

kann ich so vorgehen oder habe ich etwas vergessen?:

Hardware:
- Kondensator (100nF?) an AREF gegen Masse?

Im Init:
- AVCC als Referenz wählen (ADMUX: REFS0 auf 1, REFS1 auf 0)
- VBG als Input benutzen (ADMUX: MUX3,2,1 auf 1, MUX0 auf 0)
- Prescaler 128 einschalten (ADCSRA: ADPS2,1,0 auf 1)
- AD-Wandler einschalten (ADSCRA: ADEN auf 1)
- Messung starten (ADSCRA: ADSC auf 1) (muss das in die ISR)

In einer ISR:
- Wenn ADSC in ADCSRA != 0 ist, dann Ergebnis auslesen (erst ADCL, dann
ADCH)
- Bei entsprechendem Ergebnis Daten in das EEPROM schreiben und den AVR
in eine Endloschleife fahren (evtl. eine LED einschalten)

Gruß,
Michael

von TravelRec. (Gast)


Lesenswert?

Der Analog-Komparator bietet sich geradezu dazu an. Auch er kann mit dem
einen Eingang intern mit der Referenzspannungsquelle verbunden werden,
der andere Eingang kommt über einen Spannungsteiler an die
Betriebsspannung. Beim Unterschreiten der Komparatorschwelle kann man
einen Interrupt auslösen lassen, der das Abspeichern übernimmt. Ein
größerer Elko 1000-2200µF in der Betriebsspannungsleitung liefert die
notwendige Leistung, bevor das Licht dann ganz ausgeht.

von Michael B. (salty)


Lesenswert?

Hallo,

ich habe die Vorgehensweise aus meinem vorherigm Posting mal
ausprobiert: Als Wert liefert mir der AD-Wandler 180 zurück.
Bei VCC an AREF mit 4,9V errechne ich Ubg von etwa 0,8V. Das kann doch
nicht sein, oder?

Der Code für meinen Mega88:

int read_vcc(void) {
     int ergebnis = 0;
     ADMUX = _BV(REFS0);                // VCC als Referenz an AREF
     ADMUX = _BV(MUX3) | _BV(MUX2) | _BV(MUX1);      // Ubg messen
     ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) | // Prescaler 128
              (1<<ADEN) |                            // ADC ein
              (1<<ADCS);                             // messen!
     ergebnis = ADCL;
     ergebnis += (ADCH << 8);
     return ergebnis;
}

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.