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!
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
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 ...
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.
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.
"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
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.