Hallo zusammen,
ich bin gerade dabei einen Würfel zu bauen, der Würfel ist nicht das
Thema, aber ich habe Schwierigkeiten den Sleep Modus zu steuern.
Der Sleep Modus, also die Powerdown Methode ist ok, das funktioniert,
nur wie bekommt der µC das mit, dass er wieder aufwacht?
hier mal ein Code Beispiel womit ich üben wollte:
"µC schaltet nach dem Sleep Mode eine LED an für 2 Sekunden..."
1 | #include <avr/io.h>
|
2 | #include <avr/sleep.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <util/delay.h>
|
5 |
|
6 |
|
7 | // Main programm
|
8 | int main (void)
|
9 | {
|
10 | // IO configure
|
11 | // PB4 is an input pin
|
12 | DDRB &=~ (1<<PB4);
|
13 |
|
14 | // Use the internal pullup resistor
|
15 | PORTB |= (1<<PB4);
|
16 |
|
17 | // activate the leds and bring up the PB0...PB3 to high!
|
18 | // this will looks like a led test :-)
|
19 | DDRB |= ((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
|
20 |
|
21 | // set the register PB0...PB3 to high level
|
22 | PORTB |= ((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
|
23 |
|
24 | // wait ~ 1 second before deactivate the leds
|
25 | _delay_ms(1000);
|
26 |
|
27 | // lights off
|
28 | PORTB &=~ ((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
|
29 |
|
30 | // Sleep enable
|
31 | MCUCR |= (1<<SE);
|
32 |
|
33 | // ADC deactivate
|
34 | ADCSRA &=~ (1<<ADEN);
|
35 |
|
36 | // Set the sleep mode "power down"
|
37 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
38 |
|
39 | // loop
|
40 | while(1)
|
41 | {
|
42 | // disable int0
|
43 | //GIMSK &= ~(1<<INT0);
|
44 |
|
45 | // configure external interrupt
|
46 | GIMSK |= (1 << PCINT4);
|
47 |
|
48 | // go to sleep
|
49 | sleep_mode();
|
50 |
|
51 | // LED for 2 seconds on
|
52 | PORTB |= (1 << PB3);
|
53 | _delay_ms(2000);
|
54 | PORTB &= ~(1 << PB3);
|
55 | }
|
56 | // int main return
|
57 | return 0;
|
58 | }
|
59 |
|
60 | ISR(INT0_vect)
|
61 | {
|
62 | // Sleep disable
|
63 | MCUCR &= ~(1<<SE);
|
64 |
|
65 | // ADC activate
|
66 | ADCSRA |= 1<<ADEN;
|
67 |
|
68 | // Sleep enable
|
69 | MCUCR |= (1<<SE);
|
70 |
|
71 | }
|
Noch habe ich nicht verstanden, wie ich dem AVR mitteile, dass bei einem
PIN Change PCINT4 er wieder aufwachen soll und an der Stelle
weitermachen soll wo er sich schlafen gelegt hat. Hier würde höchstens
die LED eingeschaltet werden für 2 Sekunden, aber das passiert nicht.
Ein Messgerät teilt mir mit, dass der µC überhaupt nicht reagiert.
Vielleicht eine Rechtfertigung:
Vieles ist aus einigen Büchern kopiert und aus anderen Codebeispielen.
Wahrscheinlich habe ich wieder zuviel gelesen und nichts verstanden.
Ich hoffe es erbarmt sich Jemand einmal kurz zu erläutern ?
Vielen Dank auch wenns nervt nur so Kleinigkeiten wie ein Sleep Mode
einem Newbie zu erläutern.
Grüße aus dem Münsterland.