Hallo AVR-Begeisterte,
ich bin Anfänger und wollte mich heute den Interrupts und dem Sleep
Modus zuwenden.
Das ist mein Code:
1 | #define F_CPU 8000000L
|
2 |
|
3 | #include <stdlib.h>
|
4 | #include <avr/io.h>
|
5 | #include <util/delay.h>
|
6 | #include <avr/interrupt.h>
|
7 | #include <avr/sleep.h>
|
8 |
|
9 | ISR(INT0_vect) {
|
10 | sleep_disable();
|
11 | }
|
12 |
|
13 | int main(void)
|
14 | {
|
15 | //interrupts deaktivieren
|
16 | cli();
|
17 |
|
18 | //DDRs setzen
|
19 | DDRB = 0x00;
|
20 | DDRD = 0xFF;
|
21 |
|
22 | //interrupts aktivieren
|
23 | sei();
|
24 |
|
25 | while(1)
|
26 | {
|
27 |
|
28 | // binaeres hochzaehlen
|
29 | PORTD++;
|
30 | _delay_ms(10);
|
31 |
|
32 | // wenn PB2 low, Sleep Modus aktivieren
|
33 | if( !(PINB & (1 << PB1)) )
|
34 | {
|
35 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
36 | sleep_mode();
|
37 | }
|
38 | }
|
39 | }
|
Im Normalfall blinken die LEDs am Port D. Sobald ich den Taster an PB1
drücke, stoppt das Blinken und die CPU fährt in den Power Down Modus.
Solbald ein H-Signal an PD6 (AIN0; Pin 12) anliegt, möchte ich, dass die
CPU wieder hochfährt und das Blinken an alter Stelle fortsetzt. Und
genau an dieser Stelle hänge ich fest, die CPU möchte einfach nicht
weiter zählen.
Weiß jemand Rat? Was mache ich falsch?
(Ich weiß allerdings nicht, ob es auch möglich ist einen x-beliebigen
Taster als Interrupt zu verwenden (?).)
Vielen Dank schon im Voraus.
Schönen (restlichen) Feiertag noch.
Grüße
mateit