Ich verwende die Universelle Tastenabfrage von Peter Dannegger und das Drehgeberbeispiel. Habe in meiner Programm jedoch ein seltsames verhalten. Wenn der AVR gestartet wird, dürfte der Drehgeber bereits ausgelesen werden, obwohl ich in dem Programm zuerst auf eine tastenabfrage reagiere bevor der Drehgeberteil aktiviert wird. Drehe ich nämlich am Geber und wechsle dann mittels Taster ind die Schleife wird hier bereits der geänderte Wert des Drehgebers ausgegeben. Woran liegt das?
1 | int main(void) |
2 | {
|
3 | int32_t val = 0; |
4 | ioinit(); |
5 | eeprom_var(); |
6 | encode_init(); |
7 | |
8 | sei(); // Interrupts aktivieren |
9 | |
10 | for(;;) |
11 | {
|
12 | LEDS_PORT = _DP; |
13 | |
14 | if(get_key_short(ENC_TASTER)) |
15 | {
|
16 | timer = 1; |
17 | while(ende != 1) |
18 | {
|
19 | val += encode_read(); |
20 | |
21 | if(nSelect == 0) // Haupt-Menü |
22 | {
|
23 | if (val > 3) val = 3; |
24 | if (val < 0) val = 0; |
25 | }
|
26 | |
27 | if(nSelect == 1) // Floppy-ID Menü |
28 | {
|
29 | if (val > 5) val = 5; |
30 | if (val < 4) val = 4; |
31 | }
|
32 | |
33 | if(nSelect == 2) // Kernal-Menü |
34 | {
|
35 | if (val > 9) val = 9; |
36 | if (val < 6) val = 6; |
37 | }
|
38 | |
39 | if(nSelect == 3) // Schreibschutz-Menü |
40 | {
|
41 | if (val > 11) val = 11; |
42 | if (val < 10) val = 10; |
43 | }
|
44 | |
45 | switch(val) |
46 | {
|
47 | // Hauptmenü
|
48 | case 0: |
49 | LEDS_PORT = _I | marker; // I (00110000) -> ID |
50 | if(get_key_short(ENC_TASTER)) |
51 | {
|
52 | val = 4; |
53 | nSelect = 1; |
54 | }
|
55 | break; |
56 | |
57 | .......
|