Hallo zusammen.
Ich habe ein Problem mit dem Sleep-Mode.
Und zwar habe ich eine Funktion, die den AVR in den Sleep-Mode schickt
und durch einen Pin-Change Interrupt (Taster) wieder aufgeweckt werden
soll.
Erst wenn der Taster 2s lang gedrückt wurde soll er wieder in den
Normal-Betrieb übergehen.
Das funktioniert zwar auch, aber wenn ich den Taster nur einmal kurz
betätige steigt die Stromaufnahme derart an, dass die Spannung (CR2032)
zusammenbricht und der AVR einen Reset macht.
Kann mir einer sagen was da falsch läuft?
1 | void pwr_off(void){
|
2 | uint8_t end=0;
|
3 |
|
4 | do{
|
5 |
|
6 | PCMSK0 = (1<<PCINT0); /* Pin Change Interrupt for PB0*/
|
7 | PCICR |= (1<<PCIE0);
|
8 |
|
9 | lcd_clear();
|
10 | /* Say goodbye */
|
11 | lcd_text_p((char *)str_bye);
|
12 | wait_ms(1000);
|
13 | TCCR0B &= ~(1<<CS00); /* Stop Timer for PWM */
|
14 | LCD_off();
|
15 |
|
16 | asm("nop");
|
17 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
18 | sleep_mode();
|
19 |
|
20 |
|
21 | PCICR &= ~(1<<PCIE0);
|
22 | cli();
|
23 | _delay_ms(2000);
|
24 | if(!(KEY_PIN & (1<<KEY0))){
|
25 |
|
26 | LCD_on();
|
27 | lcd_init();
|
28 | lcd_text_p((char *)str_hello);
|
29 | end=1;
|
30 |
|
31 | }
|
32 | sei();
|
33 |
|
34 | }while(!end);
|
35 |
|
36 | }
|
Die ISR (ISR(PCINT0_vect)) ist vorhanden, aber leer.