Forum: Compiler & IDEs Attiny 44 BORF Flag auswerten


von Simon (Gast)


Lesenswert?

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);
    }

    ...
    ...
    ...
}

von Krapao (Gast)


Lesenswert?

Beitrag "Re: Resetabfrage beim Tiny26, MCUSR-Register" und die 
anschliessende Diskussion

von Simon (Gast)


Lesenswert?

also auf Deutsch: Das BORF ist nicht auswertwillig.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Simon (Gast)


Lesenswert?

@ 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
Noch kein Account? Hier anmelden.