Hallo lieben Member, stehe wieder einmal vor einem problem, habe meinen mega8 in den power-down sleep modus versetzt, allerdings habe ich jetzt das problem, dass er durch einen lowsignal am int0 die Routine anspringt, diese auch ausführt, allerdings legt er sich danach wieder schlafen. Was mache ich bloss falsch? Habe das datenblatt zu den themen 5 mal gelesen, allerdings finde ich meinen fehler nicht... Kann es sein, dass nach einem int0 interrupt der controller einen reset durchführt? das würde die sache nämlich erklären... im moment scheint es mir so, als würde der mega8 nach dem ausführen der Int0-Routine entweder einen reset durchführt oder aber wieder zum selben "schalf"-befehl zurückkehrt und pennt :-( würde mich über jeden kleinen denkstubser sehr freuen... Schönen Sonntag und MFG Elko
den interrupt schaltest du aber aus? ansonsten ist es eher unmöglich, allgemein dein problem zu lösen. mit code können dir mehr leute helfen..
@ Elektrolyt (Gast) >Kann es sein, dass nach einem int0 interrupt der controller einen reset >durchführt? Nein. >zurückkehrt und pennt :-( Oder er rennt in einer Endloschleife, weil du einen Programmierfehler gemacht hast. >würde mich über jeden kleinen denkstubser sehr freuen... Interrupt MFG Falk
..... SIGNAL (SIG_UART_RECV) { uart_puts("*RxIN*"); string[tmp1] = UDR; if (tmp1==9) { uart_puts("10 mal RX-INT ausgeführt"); } tmp1++; uart_puts("*RxOUT*"); } SIGNAL (SIG_INTERRUPT0) { cli(); sleep_disable(); GICR = 0x00; MCUCR = 0x00; uart_puts("###INTERRUPT0###"); } int main (void) { uart_init(); for(int i=0;i<=9;i++) string[i]='\0'; while (1) { GICR = 0x40; //INT0 MCUCR = 0xA0; //Sleepmode PWDWN INT0 DDRD = 0x00; //int0 etc eingänge PORTD = 0xff; //int0 etc pullups an set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sei(); uart_puts("***ICH GEH PENNEN***"); sleep_cpu(); sleep_disable(); while(1) { tmp3=0; uart_puts("***WACH UND IN LOOP***"); if (blabla) break; }; uart_puts("*NIX ZU TUN IN MAIN*"); }; return 0; } so in etwa lautet mein quelltext... bissl wüst aber ist halt noch eine baustelle
hey danke falk, ich habe 2 endlosschleifen :-) aber stehe im moment sehr aufm schlauch... habe den quelltext oben auch mal kurz zusammengefriemelt (sind paar sachen sicherlich zu viel drin) hoffe du siehst meinen fehler?/meine fehler? ich sehe nämlich nur noch interrupts gerade :-/ mfg Elko
das hatte ich auch schon nach dem sleep und aufwecken durch int0, wird die isr von int0 abgearbeitet ... und jetzt kommts: der µc macht danach einen reset jetzt muß vor dem initialiesieren der variablen festgestellt werden, woher der reset kam!! ich frage einfach die port-richtung einen ports ab wo ein pin auf ausgang steht. ist es auf ausgang kommt er er aus dem power-down, dh variablen nicht neu initialisieren und zum main lopp springen ...... da gibt es bestimmt auch ein bit zwischen r0 und r15 aber ich habe es noch nicht gefunden gruß pico
danke für die antwort... Es muss doch eine "elegantere" möglichkeit geben, dass nach dem wecken mit dem int0 kein reset ausgeführ wird, sondern der nächste befehl nach dem schlafen gehen abgearbeitet wird??? Ich weiss einfach nicht wie... das mit dem port ist zwar eine lösung aber ich habe portpin mangel, da will ich nicht einfach ein pin dafür verschwenden. geht das nicht irgendwie durch bits setzen/löschen o.ä.??? danke für jede hilfreiche antwort... mfg Elko
du brauchts keinen pp verschwenden, nimm einfach einen der sowieso auf ausgang steht! es geht nur darum festzustellen ob er (der µc) schon einmal drch durch reset gelaufen ist!!!! ist das der fall kommt er aus den power-down! würde dir ein asm quelle helfen? pico
Wie wärs mit power-save mode? Da dürfte das Problem nicht auftreten...
das frißt bei einer bat anwendung ordentlich leistung! pico
GICR = 0x40; //INT0 MCUCR = 0xA0; //Sleepmode PWDWN INT0 DDRD = 0x00; //int0 etc eingänge PORTD = 0xff; //int0 etc pullups an ist mir zu mühsam aufzudröseln, welches Bit jetzt gesetzt ist und welches nicht. Beim Beispiel Suppentimer auf der Seite [[Pollin Funk-AVR-Evaluationsboard]] wird Sleep SLEEP_MODE_PWR_DOWN und Aufwecken per INT0 benutzt. Beispiel AVR ist ebenfalls ein ATmega8, also ziemlich direkt übertragbar. Taktrate im Beispiel ist 12 MHz, das spielt eine Rolle, wenn du das Beispiel direkt benutzen willst, weil dort auch der Timer0 benutzt wird, um den Suppentimer schlafen zu schicken. Bei anderen Taktraten ist der Prescaler und der Reloadwert neu zu berechen. Wie steht im Beispiel Uhr
... es ist kein problem wenn der c prog mal auf asm höhren würde! ..... pico
so ihr sorglos bügelfrei prog's das reicht jetzt no comment for ever pico
@ Elektrolyt (Gast) >schlauch... habe den quelltext oben auch mal kurz zusammengefriemelt >(sind paar sachen sicherlich zu viel drin) hoffe du siehst meinen >fehler?/meine fehler? puts() in einem Interupt? Eher nicht. cli() in einem Interrupt? Eher nicht. Hör auf zu friemeln, mach es gleich richtig. MFG Falk
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.