Falk Brunner schrieb:
> Dein Programm ist etwas kryptisch. Vor allem ein cli() nach dem
> et_sleep_mode(SLEEP_MODE_PWR_SAVE); sieht gefährlich aus. Und auch deine
> Verwendung von sleep_enable, sleep_cpu etc. sieht chaotisch aus. Mach es
> wie im Artikel Sleep Mode, und alles ist paletti.
Ich habe mich hierbei aber genau an die Anweisung in der sleep.h
gehalten, die macht das wie folgt:
<http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html>
1 | #include <avr/interrupt.h>
|
2 | #include <avr/sleep.h>
|
3 |
|
4 | ...
|
5 | set_sleep_mode(<mode>);
|
6 | cli();
|
7 | if (some_condition)
|
8 | {
|
9 | sleep_enable();
|
10 | sei();
|
11 | sleep_cpu();
|
12 | sleep_disable();
|
13 | }
|
14 | sei();
|
Peter Dannegger schrieb:
> Beschreib dochmal, wie das Programm ablaufen soll (Programmablaufplan),
> insbesondere diese ganze Rum-Flag-serei.
Ja da hast du Recht, etwas verwirrend ist das schon für einen
Außenstehenden.
1 | /**
|
2 | * Ort wo bitweise die Flags gespeichert werden - schneller Zugriff, da unter 0x1F!
|
3 | */
|
4 | #define FLAG1_LOC GPIOR0
|
5 |
|
6 | /**
|
7 | * Wird gesetzt, wenn ein Impuls gekommen ist
|
8 | */
|
9 | #define FLAG_IMPULS 2
|
10 |
|
11 | /**
|
12 | * Nach Entprellroutine - Taster1 (Weiter) gedrueckt
|
13 | */
|
14 | #define FLAG_S1_PRESSED 3
|
15 |
|
16 | /**
|
17 | * Nach Entprellroutine - Taster2 (Bestaetigung) gedrueckt
|
18 | */
|
19 | #define FLAG_S2_PRESSED 7
|
PS: Die Entprellroutine habe ich weitesgehend von dir übernommen :-).
Mit einer Ausnahme, dass ich diese nur aktiviere, wenn wirklich eine
Taste gedrückt wurde.
1 | ISR(TIMER2_COMP_vect )
|
2 | {
|
3 | static uint8_t ct0, ct1,rpt, counter;
|
4 | uint8_t i;
|
5 |
|
6 | OCR2A = TCNT2 + 2; //20ms
|
7 | i = key_state ^ ( (~PINE) & FLAG_CODE_TASTER); // key changed ?
|
8 | ct0 = ~( ct0 & i ); // reset or count ct0
|
9 | ct1 = ct0 ^ (ct1 & i); // reset or count ct1
|
10 | i &= ct0 & ct1; // count until roll over ?
|
11 | key_state ^= i; // then toggle debounced state
|
12 | FLAG1_LOC |= key_state & i; // 0->1: key press detect
|
13 |
|
14 | if( (key_state & (1<<FLAG_S1_PRESSED) ) == 0 ) // check repeat function
|
15 | {
|
16 | rpt = 40; // start delay
|
17 | }
|
18 |
|
19 |
|
20 | if(++counter == 5)
|
21 | {
|
22 | if( (PINE & (1<<FLAG_S1_PRESSED) ) ) //Ist Taster1 nicht gedrückt
|
23 | {
|
24 | TIMSK2 &= ~(1<<OCIE2A); //Stoppe Overflow
|
25 | counter = 0;
|
26 | }
|
27 |
|
28 | else
|
29 | {
|
30 | OCR2A = TCNT2 + 51; //200ms
|
31 | }
|
32 | }
|
33 | if( --rpt == 0 )
|
34 | {
|
35 | FLAG1_LOC |= (1<<FLAG_S1_LONG);
|
36 | TIMSK2 &= ~(1<<OCIE2A); //Stoppe Overflow
|
37 | }
|
38 | }
|
Vielen Dank für eure schnellen Antworten :-)
Grüße Marcel