mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Brown-out ?


Autor: Michael Block (salty)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Block (salty)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Michael Block (salty)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Block (salty)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Block (salty)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.