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.
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");
Hallo Michael! Danke für die Antwort. Ich interpretierte die "sleep" Instruction als das Schreiben der SM0-2 Bits. Jetzt funktionierts. Tschüss Martin
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.