Guten Abend zusammen, ich arbeite zur Zeit an einer Fernbedienung mit einem 2,4GHz Transceiver. Funktioniert soweit alles wunderbar. Als "Sahnebhäubchen möchte ich nun eine "Batterie leer" Erkennung realisieren. Also was tun? Brown out detection in den Fuse-bits auf 2,7V einstellen und das BORF bit im MCUSR Register auswerten. Laut Datenblatt sollte dies ja bei einer BOD auf "1" gesetzt werden und nach einem Power-on Reset wieder auf "0" gesetzt werden. Das Bit frage ich dann bei jedem Programmstart ab. Programm läuft > BOD > irgendwann erholt sich die Batterie > MCU startet das Programm, wertet das BORF-Bit aus und bleibt in einer while hängen > Led leuchtet und signalisiert "battery low". Mein Problem ist das das Bit immer als "1" gelesen wird, obwohl kein Broun Out eingetreten ist. Hab die Spannungsversorgung mehrmals getrennt, doch das Bit wird immer als "1" gelesen. Jemand ne Idee warum das so ist? bzw. was ich falsch mache? Hier mal ein ausschnitt aus dem Code: int main(void) { while (bit_is_set (MCUSR, BORF)) { DDRB |= (1<<led_red); PORTB |= (1<<led_red); } ... ... ... }
Simon schrieb: > Programm läuft > BOD > irgendwann erholt sich die Batterie > MCU startet > das Programm, wertet das BORF-Bit aus und bleibt in einer while hängen > > Led leuchtet und signalisiert "battery low". Woraufhin die LED sofort wieder der Batterie den Garaus macht und die BORF zuschlägt. So hat das wenig Sinn. Battery Low will man im Allgemeinen wissen, solange mit der Batterie noch eine gewisse Mindestdauer bestreitbar ist.
Simon schrieb: > also auf Deutsch: Das BORF ist nicht auswertwillig. Zumindest hat es keinen Sinn, das als "Batterie leer"-Erkennung auszuwerten. Wenn ein brown-out auch auf anderem Wege eintreten kann (kurzzeitiger Spannungseinbruch, der von außen induziert wird) und man eine sinnvolle Strategie hat, wie man mit den dann nicht mehr vertrauenswürdigen SRAM-Daten umgeht, dann kann man sich Gedanken um die Auswertung des BORF machen. Für eine "Batterie leer"-Erkennung sollte man einfach in regelmäßigen Abständen mit dem ADC die eigene Betriebsspannung messen. Das geht über inverse Messung (Bandgap-Referenz messen, aber Vcc als Referenz des ADC benutzen). Nur dann kann man rechtzeitig vorher eine Warnung an den Nutzer ausgeben. Die meisten dieser Warnungen haben nämlich ein großes Problem: sie brauchen zusätzlichen Strom und verkürzen damit die Restlebensdauer der Batterie noch weiter. Wenn sowohl PORF als auch BORF gesetzt sind (natürlich, obwohl man sie nach dem Abfragen ordnungsgemäß gelöscht hat), dann hat man einen so langsamen Spannungsanstieg, dass nach der power-on-Erkennung sich sofort eine brown-out-Phase anschließt.
@ Jörg Wunsch Danke. Toller Vorschlag. Hab mir das gerade mal im Datenblatt angeschaud und werd es bei gelegenheit mal ausprobieren.
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.