Hallo zusammen, ich weiß es gibt schon ein paar Theards bezüglich Attiny und Sleep-Funktionen. Aber ich stehe bisschen auf dem Schlauch und weiß mit meinen Code nicht weiter. Ich will mein µC einfach in Sleep versetzen und aufwecken wenn INT0 auf Low geht, Led kurz aufblinken und wieder in Sleep gehen. Nichts davon funktioniert, weder das aufblinken, noch der Stromspareffekt, da ich ständig ca. 0,7 mA messe. Wo ist mein Fehler, ein einfacher Interrupt ohne sleep funktionerte ? Das MIC in "DDRB &=~(1<<MIC);" ist PB1
1 | void initPorts(void) //Port initialisieren |
2 | {
|
3 | //Outputs
|
4 | DDRB |= (1<<LED1); //LED1 |
5 | DDRB |= (1<<LED2); //LED2 |
6 | DDRB |= (1<<RES0); //Reserve |
7 | DDRB |= (1<<RES1); //Reserve |
8 | |
9 | //Inputs
|
10 | DDRB &=~(1<<MIC); //externer Interrupt |
11 | |
12 | //interne Pull-Up-Widerstände einschalten
|
13 | //PORTB |= (1<<MIC); //externer Interrupt
|
14 | |
15 | //Ports initialisieren, auf low setzten
|
16 | LED1_OFF(); |
17 | LED2_OFF(); |
18 | |
19 | }
|
20 | |
21 | void initSleep() |
22 | {
|
23 | MCUCR |= (1<<SE) | (1<<SM1); //Sleep enable, Power Down |
24 | }
|
25 | |
26 | |
27 | void initInterrupt() //Port Interrupt initialisieren |
28 | {
|
29 | MCUCR |= (1<<ISC01) | (1<<ISC00); //steigene Flanke von INT0 als Auslöser |
30 | GIMSK |= (1<<INT0); //externen Interrupt einschalten |
31 | sei(); //alle Intterupts erlauben |
32 | }
|
33 | |
34 | |
35 | |
36 | //----------------------------------------------------------------------
|
37 | int main (void) |
38 | {
|
39 | initPorts(); //Ports initalisieren |
40 | initSleep(); //Sleep-Einstellungen |
41 | initInterrupt(); //Interrupts einschalten |
42 | |
43 | //int t_aus = 5; //Ausschalten in Minuten
|
44 | |
45 | //Hauptschleife
|
46 | while(true) |
47 | {
|
48 | GIMSK |= (1 << INT0); //externen Interrupt freigeben |
49 | sleep_mode(); //in den Schlafmodus wechseln |
50 | GIMSK &= ~(1 << INT0); //externen Interrupt vorerst sperren |
51 | |
52 | _delay_ms(100); |
53 | LED1_ON(); |
54 | LED2_ON(); |
55 | _delay_ms(100); |
56 | LED1_OFF(); |
57 | LED2_OFF(); |
58 | |
59 | }
|
60 | }
|
61 | |
62 | ISR (INT0_vect) //Port-Interruptvektor |
63 | {
|
64 | |
65 | }
|