mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Brown Out per Software ausschalten


Autor: Thilo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thilo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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
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...

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.