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 | }
|