Forum: Mikrocontroller und Digitale Elektronik Brown Out per Software ausschalten


von Thilo (Gast)


Lesenswert?

Hallo,

ich arbeite hier mit einem ATmega164P.
Dieser besitzt die Funktion den Brown-out per Software
auszuschalten. Dazu müssen 2 Bit im MCUCR Register in einer bestimmten
Reihenfolge gesetzt werden (Datenblatt mega164p Seite 48).
Leider funktioniert das Ganze bei mir nicht so richtig.
Hat das hier schon mal jemand gemacht und könnte die Sequenz posten?
Und wenn nicht könntet ihr euch den Abschnitt im Datenblatt mal 
anschauen
und mir einen Vorschlag machen wie man das richtig macht.

Grüße

Thilo

von Volker (Gast)


Lesenswert?

>>Leider funktioniert das Ganze bei mir nicht so richtig.

Hört sich so an, als ob es halb funktioniert, als was geht und was 
nicht?

Könntest ja mal deinen Code posten, so ist es nur ein Ratespiel ob
C, Assembler, Basecom...

Gruß Volker

von Thilo (Gast)


Lesenswert?

Es funktiniert gar nicht.
Nach dem Setzten der Bits ergibt sich keine Änderung bei der 
Stromaufnahme
Also ich arbeite in C mit der GNU-Toolchain.

Der Code sieht bis jetzt folgendermaßen aus:

    MCUCR |= (1<<BODS) | (1<<BODSE);            //BOD Disable During 
Sleep
    MCUCR |= (1<<BODS);
    MCUCR &= ~(1<<BODSE);

Grüße

von Johannes M. (johnny-m)


Lesenswert?

Du weißt hoffentlich, dass Du innerhalb von drei Takten nach der Sequenz 
den sleep-Befehl ausführen musst? Wenn nicht, wird das BODS wieder 
zurückgesetzt. Außerdem weiß ich nicht, ob der Compiler aus der Sequenz 
oben tatsächlich etwas macht, bei dem zwischen dem setzen von BODS und 
BODSE und dem löschen von BODSE höchstens 4 Taktzyklen vergehen, da der 
Compiler den "|="- und den "&="-Zugriff nicht zusammenfassen darf. Da 
BODS aber sowieso erneut gesetzt wird, kannst Du das
1
MCUCR |= (1<<BODS);
auch weglassen, da das in der letzten Zeile prinzipiell mit drinsteckt 
("&=" ist schließlich eine Read-Modify-Write-Operation und MCUCR ist 
nicht im Bitadressierbaren Bereich).

Und danach muss direkt der sleep-Befehl ausgeführt werden...

von Volker (Gast)


Lesenswert?

Habs mir gerade mal im Datenblatt angesehen und komme zum gleichen
Ergebnis wie Johannes.
Also entweder Timingprobleme oder der sleep Befehl kommt zu spät.

Kannst ja mal im List-File nachsehen, wie der Compiler das ganze 
übersetzt und die Takte zählen.

Gruß Volker

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.