Servus zusammen, bei der Idee eine simple Weihnachtskarte mit einer fixen LED und 6 weiteren LED´s (jeweils 2 in einem Schaltkreis) wollte ich einen Attiny 13 als Steuerung benutzen. Die Idee war die Karte durch einen kleinen Schalter zu aktivieren und durch erneutes drücken wieder auszuschalten um den Attiny in den Sleepmode zu versetzen. Nach dem Test bekomme ich jetzt allerdings starr leuchtende LED´s ohne je etwas gedrückt zu haben, vielleicht kann mir ja jemand helfen den Fehler zu finden oder hat einen alternativen Vorschlag. Betrieben soll das ganze mit einer 3V Batterie ohne Vorwiderstände werden. Danke euch schonmal.
1 | #include <avr/io.h> |
2 | #include <avr/sleep.h> |
3 | #include <avr/interrupt.h> |
4 | #include <util/delay.h> |
5 | |
6 | #define F_CPU 1200000L //1,2MHz
|
7 | |
8 | #define LED_DDR DDRB
|
9 | #define LED_PORT PORTB
|
10 | |
11 | #define LED_PIN PB4 //LED: Leuchtet immer
|
12 | #define LED_GRP1_PIN PB2 //LED-Gruppe 1: blinkt
|
13 | #define LED_GRP2_PIN PB1 //LED-Gruppe 2: blinkt
|
14 | #define LED_GRP3_PIN PB0 //LED-Gruppe 3: blinkt
|
15 | #define BUTTON_INPUT_PIN PB3 //Taster
|
16 | |
17 | void init_io() { |
18 | //Set all pins of LED port as output
|
19 | LED_DDR |= (1 << LED_PIN); |
20 | LED_DDR |= (1 << LED_GRP1_PIN ); |
21 | LED_DDR |= (1 << LED_GRP2_PIN ); |
22 | LED_DDR |= (1 << LED_GRP3_PIN ); |
23 | LED_DDR &= ~(1 << BUTTON_INPUT_PIN); |
24 | }
|
25 | |
26 | void init_interrupt() { |
27 | MCUCR &= ~0x3; |
28 | sei(); |
29 | }
|
30 | |
31 | void free_external_interrupt() { |
32 | //GICR |= (1 << INT0);
|
33 | }
|
34 | |
35 | void lock_external_interrupt() { |
36 | //GICR &= ~(1 << INT0);
|
37 | }
|
38 | |
39 | void power_down() { |
40 | set_sleep_mode(SLEEP_MODE_PWR_DOWN); |
41 | sleep_mode(); |
42 | }
|
43 | |
44 | // Empty interrupt routine
|
45 | ISR(INT0_vect) { |
46 | }
|
47 | |
48 | int main(void) { |
49 | init_io(); |
50 | init_interrupt(); |
51 | |
52 | //Turn on the single LED
|
53 | LED_PORT |= (1 << LED_PIN); |
54 | |
55 | //Turn on LED group and wait for one second
|
56 | while (1) { |
57 | free_external_interrupt(); |
58 | power_down(); |
59 | lock_external_interrupt(); |
60 | |
61 | |
62 | LED_PORT |= (1 << LED_GRP1_PIN); |
63 | _delay_ms(1000); |
64 | LED_PORT &= ~(1 << LED_GRP1_PIN); |
65 | |
66 | LED_PORT |= (1 << LED_GRP2_PIN); |
67 | _delay_ms(1000); |
68 | LED_PORT &= ~(1 << LED_GRP2_PIN); |
69 | |
70 | LED_PORT |= (1 << LED_GRP3_PIN); |
71 | _delay_ms(1000); |
72 | LED_PORT &= ~(1 << LED_GRP3_PIN); |
73 | }
|
74 | |
75 | return 1; |
76 | }
|