Reset nach PowerDownMode und wecken mit INT0?

Gast #847657
Lesenswert?
• ▲
▼
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
#847684
Lesenswert?
• ▲
▼
@ 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
Gast #847690
Lesenswert?
• ▲
▼
.....


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
Gast #847694
Lesenswert?
• ▲
▼
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
Gast #847729
Lesenswert?
• ▲
▼
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
Gast #847756
Lesenswert?
• ▲
▼
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
Gast #847767
Lesenswert?
• ▲
▼
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
Persönliche Seite #847782
Lesenswert?
• ▲
▼
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
#847917
Lesenswert?
• ▲
▼
@ 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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.