Forum: Mikrocontroller und Digitale Elektronik Kein funktionisfähiger Power-Down-Mode beim ATMEGA2561...


von Martin (Gast)


Lesenswert?

Hallo Leute!

Ich verwende gerade den neuen ATMEGA2561.
Der funktioniert echt super.
Das neue Programm läuft einwandfrei.

Nun geht es ans Optimieren.
Aus diesem Grund möchte ich den Power-Down-Modus aktivieren.

Bei dem alten AT90S2313 war der Power-Down-Modus kein Problem.
Beim ATMEGA2561 heißt das Register SMCR.
Bit 3 SM2
Bit 2 SM1
Bit 1 SM0
Bit 0 SE

SM2=0, SM1=1, SM0=0 : Power-Down

Ich versuchte den Power-Down-Modus folgendermaßen zu aktivieren:
SMCRW=0x01; // SE-Bit setzen.
SMCRW=0x05; // Power-MODE einschalten.

Obwohl ich diese beiden Befehle im Main ganz oben stehen habe, um zu
sehen, ob der Power-Down wirklich aktiv ist, läuft mir der Prozessor
immer wieder drüber und springt nicht in den Power-Down-Modus. Dies
erkenne ich dadurch, dass das Programm startet, als ob nichts wäre.
Ginge der Prozessor in den Power-Down-Modus, so könnten auch die
nachfolgenden Programmzeilen nicht ausgeführt werden.

Könnt ihr mir bitte helfen.

Ich bin schon am verzweifeln. Vielleicht habe ich bei der
Power-Down-Initialisierung etwas Wichtiges übersehen oder etwas falsch
verstanden.

Ich danke euch jetzt schon für eure Hilfe.

Tschüss
Martin

Schönen Abend.

von Michael W. (mictronics) Benutzerseite


Lesenswert?

Wie im Datenblatt schon steht:

Das SE Bit muss gesetz sein, zusätzlich der gewünschte Modus, und
danach muss eine "sleep" Instruction ausgeführt werden.

Wenn dann so:
SMCRW=0x01; // SE-Bit setzen.
SMCRW=0x05; // Power-MODE einschalten.
asm volatile ("sleep");

von Martin (Gast)


Lesenswert?

Hallo Michael!

Danke für die Antwort.
Ich interpretierte die "sleep" Instruction als das Schreiben der
SM0-2 Bits.

Jetzt funktionierts.

Tschüss
Martin

von Martin (Gast)


Lesenswert?

Hallo alle zuammen!

Da ich das letzte Problem gelöst habe, bin ich nun dabei, auf
verschiedene Reset-Sources zu reagieren.

Eigentlich eine einfache Sache:
// Reset Source checking
rflag=MCUSR;  // Einlesen des Registers
MCUSR=0x00;   // Löschen der Reset-Sources

if (rflag&0x01!=0)
   {
   // Power-on Reset
   // Place your code here
   pfe++;
   }
 if ((rflag&0x02)!=0)
   {
   // External Reset
   // Place your code here
   efe++;
   }
 if ((rflag&0x04)!=0)
   {
   // Brown-Out Reset
   // Place your code here
   bfe++;;
   }
 if ((rflag&0x08)!=0)
   {
   // Watchdog Reset
   // Place your code here
   wfe++;
   }
 if ((rflag&0x10)!=0)
   {
   // JTAG Reset
   // Place your code here
   jfe++;
   }

Danach lasse ich rflag auf Leds ausgeben, damit ich erkennen
kann welcher Reset-Source am Werk war.

Schaltet man ein, dann ist das Power-On-Flag aktiv.
Drückt man die Reset-Taste, dann ist der External-Reset aktiv.
Auch der Brown-Out funktioniert.

Zusätzlich habe ich den Watchdog eingeschaltet, der mir alle 0,5S
den Prozessor neu startet, wenn ich den WD-Timer nicht resete.
In meinem Versuch resete ich ihn nicht, damit ich erkennen kann, ob der
Reset-Source des Watchdogs korrekt funktioniert.

Leider sind nach einem WD-Reset alle Reset Sources-Flags auf 0.
Keine Ahnung warum. Es wird jedenfalls in keine If-Verzweigung
verzweigt, die ich oben dargestellt habe.
Zusätzlich habe ich schon versucht den Watchdog erst nach dem Auslesen
des "MCUSR" zu initialisieren. Leider bringt auch das keinen Erfolg.
Der Watchdog startet aber neu, weil zu Beginn die Leds kurz flackern.

Kann es sein, dass es mit dem Startup.asm-File, welches bei Codevision
dabei ist etwas zu tun hat?

Hat jemand schon Erfahrungen in diesem Bereich gesammelt oder kann mir
helfen?

Danke schonmal für eure interessanten Antworten.

Tschüss
Martin

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.