Brown Out per Software ausschalten

Gast #587133
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
Gast #587160
>>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
Gast #587166
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
#587172
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...
Gast #587176
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.