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.