mega32 sleep int2 - aufwecken klappt nicht!?

OP #2877251
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
}

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.