Kein WakeUp nach PowerDown beim atmega88 (INT0)

Gast #2150991
Lesenswert?

Hallo,

mein uController lässt sich nicht mehr aufwecken. Eigentlich sollt er 
bei einem Level-Change am INT0 aufwachen, tut er bei mir jedoch nicht.

Hat jemand eine Idee wo das Problem liegen könnte? In der Simulation 
klappt alles wie es soll.



IDE: AVRStudio 5
Clock: internal 8Mhz
Vdd: 3V


Gruß Marco

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/sleep.h>
4

5

6
ISR(INT0_vect)
7
{
8
  LED_BLUE_TOGGLE
9
}
10

11

12
int main (void)
13
{
14
  sei();  
15

16
  EICRA |= 0x01;    // Interrupt at LevelChange
17
  EIMSK |= 0x01;    // Enable INT0
18

19
  LED_YELLOW_OFF
20

21
  while(1)
22
  {
23
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
24
    sleep_mode();
25
    
26
    LED_YELLOW_ON
27
  }
28

29
   return 0;
30
}
Gast #2151041
Lesenswert?

Das hängt davon ab, in welchen Sleep-Mode die Funktion sleep_mode() 
geht.
Der einzige Sleep-Mode, der jede Flanke am INT<x>-Eingang (ISCX1=0, 
ISCX0=1) erkennt, ist Idle. Alle anderen (ADC Noise Reduction, Power 
Down, Power Save und Standby) können nur Interrupts bei Low-Level 
(ISCX1=0, ISCX0=0)
Im Handbuch (Version 07/2010) findet sich auf Seite 38 eine Tabelle mit 
den Eigenschaften der Sleep-Modes. Siehe dort dazu Anmerkung 3.
Gast #2151214
Lesenswert?

Danke Philipp, danke Falk

im IDLE-Modus wacht der uC bei einem LevelChange auf,
im PowerDown-Modus nur bei einem Low-Level.

Im Datenblatt steht als Anmerkung "For INT1 and INT0, only level 
interrupt."
War aus meiner Sicht nicht unbedingt eindeutig.

Vergleichbare Microchip-Controller machen das besser, hier funktioniert 
meiner Meinung nach ein Level-Change Interrupt im tiefsten Schlaf.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren