Forum: Mikrocontroller und Digitale Elektronik mega32 sleep int2 - aufwecken klappt nicht!?


von Daniel R. (anut_peach)


Lesenswert?

hallo,
ich spiel jetzt schon eine kleine ewigkeit mit dem sleepmode rum, aber 
ich krieg es einfach nicht hin, das ich ihn mithilfe des externen 
interrupts wieder aufwecken kann.
solange ich auf die taste drucke (int2) wird der timercounter immer 
wieder resetted und der heartbeat toggelt fleißig vor sich in. höre ich 
auf auf die taste zu drücken, geht er offensichtlich in den sleepmode 
und der heartbeat stoppt.
nun kann ich ihn leider durch den interrupt nicht mehr aufwecken, oder 
zumindest kommt der heartbeat nicht mehr...
lt. datenblatt sollte der int2 auch per flanke aufwecken können.
vielleicht sitze ich jetzt schon zu lange davor und schaue über den 
fehler drüber!?
ich hab schon alle sleep-threads hier durchforstet(und das sind viele), 
aber ich kriegs nicht hin....
kann mir vielleicht jemand helfen?
danke.

1
#include <mega32.h>
2
#include <delay.h>
3
#include <stdio.h>
4
5
PORTB=0x00;
6
DDRB=0b11111011;   // PB2 = int2 = input, der rest output  (wird gegen vcc geschaltet)
7
8
// Timer/Counter 1 initialization
9
    // Clock source: System Clock
10
    // Clock value: 16khz - RD
11
    // Mode: Normal top=FFFFh
12
    // OC1A output: Discon.
13
    // OC1B output: Discon.
14
    // Noise Canceler: Off
15
    // Input Capture on Falling Edge
16
    // Timer1 Overflow Interrupt: Off
17
    // Input Capture Interrupt: Off
18
    // Compare A Match Interrupt: On
19
    // Compare B Match Interrupt: Off  
20
    
21
    TCCR1A=0x00;    
22
    TCCR1B=0x05;    // prescaler: clk/1024    => 15625khz   = 64us/clk
23
    TCNT1H=0x00;
24
    TCNT1L=0x00;
25
    ICR1H=0x00;
26
    ICR1L=0x00;
27
    OCR1AH=0xF4;   // ffffh      =65535 => 4,19424s
28
    OCR1AL=0x24;   // f424h      =62500 => 4s
29
    OCR1BH=0x00;
30
    OCR1BL=0x00;
31
32
    // External Interrupt(s) initialization
33
    // INT0: Off
34
    // INT1: Off
35
    // INT2: On
36
    // INT2 Mode: Falling Edge
37
    GICR|=0x20;     // int2  enabled
38
    MCUCR=0xA0;     // A für deepsleep
39
    MCUCSR=0x00;    // 0 für falling edge on int2
40
    GIFR=0x20;      
41
42
    // Timer(s)/Counter(s) Interrupt(s) initialization
43
    TIMSK=0x10;
44
45
// Global enable interrupts
46
   #asm("sei") 
47
48
49
interrupt [TIM1_COMPA] void timer1_compa_isr(void)         // kommt alle 4s       // wenn sich 4 sek. nix tut, sollte hier der saft wieder abgedreht werden!?
50
{   
51
    if(timeCounter == 1)   //wenn der interrupt kommt dann sind 2x4 sek vergangen, und kann abgeschaltet werden.
52
    {
53
        #asm ("sleep");
54
    }
55
             
56
    // Heartbeat
57
    if(PORTB.0 != 0)
58
          {
59
           PORTB.0 = 0;
60
          }         
61
          else {PORTB.0 = 1;}; 
62
                                  
63
    timeCounter++;       
64
          
65
    // werte wieder löschen (rücksetzen)
66
    TCNT1H=0x00;
67
    TCNT1L=0x00;        
68
}
69
70
interrupt [EXT_INT2] void ext_int2_isr(void)    //button    // flanke    // tastenprellen abfangen!    //PD2!=int0   PB2=int2 
71
{
72
    #asm("cli");   // quick and dirty entprellen...
73
    delay_ms(15);   
74
    #asm("sei");
75
       
76
    timeCounter = 0;  
77
        
78
    // zum testen eine led togglen   
79
    if(PORTB.1 != 0)
80
          {
81
           PORTB.1 = 0;
82
          }         
83
          else {PORTB.1 = 1;};
84
}

von MWS (Gast)


Lesenswert?

In 'ner ISR sind Interrupts automatisch disabled, um aus Sleep 
aufzuwachen muss aber ein Interrupt ausgelöst werden können. Ein sleep 
in der ISR sorgt demnach für ewigen Schlaf.

von Daniel r. (Gast)


Lesenswert?

Vielen dank für diese beiden Infos. Damit hab ich schonmal viel gelernt. 
Werd ich dann morgen gleich mal testen, aber das klingt schonmal nach 
des übels Ursache.

von Daniel R. (anut_peach)


Lesenswert?

ja, hat geholfen.
danke.

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.