Forum: Compiler & IDEs Sleep Mode Power Down und INT0 funktioniert nicht


von INT0 (Gast)


Lesenswert?

Ich habe am PD2 (INT0) des ATmega32 (16MHz ext. Quarz) ein IR Empfänger. 
Das empfangen funktioniert auch alles problemlos. Wenn ich aber in den 
Sleep gehe und irgend etwas höheres als IDLE eingestellt habe (wollte 
eigentlich POWER DOWN), dann wacht mein µC nicht mehr auf. Woran kann 
das liegen?
1
...
2
  TCCR0 = 1<<CS02;      // Teiler 256
3
  TIMSK = 1<<TOIE0;      // Timer Interrupt freigeben
4
  GIMSK = (1 << INT0);      // externen Interrupt freigeben, bei anderen µC "GICR"
5
  //MCUCR = (1 << ISC00)|(1 << ISC01);  // steigende Flanke löst ext. Interrupt aus
6
  MCUCR = (1 << ISC01);          // fallende Flanke löst ext. Interrupt aus
7
...
8
...
9
  sei();          // ISR aktivieren
10
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
11
  sleep_mode();             // in den Schlafmodus wechseln
12
  // hier wieder aufwachen bei ext. Interrupt
13
  GIMSK &= ~(1 << INT0);    // externen Interrupt sperren, durch Timer werden jetzt alle 14 Bits eingelesen
14
  while(1)          
15
  {  
16
...
17
...
18
    GIMSK = (1 << INT0);    // externen Interrupt freigeben, damit wieder aufgewacht werden kann
19
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
20
    sleep_mode(); 
21
    // hier wieder aufwachen bei ext. Interrupt
22
    GIMSK &= ~(1 << INT0);    // externen Interrupt sperren, durch Timer werden jetzt alle 14 Bits eingelesen
23
  }
24
...
25
...
26
ISR(INT0_vect) {
27
  // 3 Takte warten, dass Oszillator einschwingen kann
28
  //__asm volatile ("nop");
29
  //__asm volatile ("nop");
30
  //__asm volatile ("nop");
31
  DDRD|=(1<<PD6);
32
  PORTD^=(1<<PD6);
33
}

von Gast (Gast)


Lesenswert?

Nix steigende oder fallende Flanke! Zum Aufwachen aus dem Power Down 
Schlafmodus musst Du den INT0 auf _Pegel_triggerung konfigurieren. Denn 
im Power Down hat der Controller keinen Takt, und ohne diesen kann er 
keine Flanke detektieren.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Alternativ: Upgrade auf einen ATmega324P, der kann auch edge triggered
aufwachen, da die Flankenerkennung dort asynchron implementiert ist.

von INT0 (Gast)


Lesenswert?

thx, hatt ich so nicht gelesen und auch nicht richtig nachgedacht ;)

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.