Hallo, ich versuche gerade zu verstehen wie die Routine für den Drehgeber von Peter Dannegger funktioniert. Könnt ihr mir sagen warum meine Version der ISR nicht funktioniert?
1 | ISR (TIMER0_COMPA_vect) // 1ms for manual movement |
2 | {
|
3 | //int8_t neu;
|
4 | int8_t uc_enc_code; |
5 | int8_t diff; |
6 | |
7 | //neu = 0;
|
8 | uc_enc_code = 0x00; // Variable fuer den Code mit 0 initialisieren |
9 | |
10 | //if (ENC_CHA)
|
11 | //neu = 3;
|
12 | if (ENC_CHA) // High an Channel A? |
13 | uc_enc_code = 1; // Bit 0 setzen -> 00000001 |
14 | |
15 | //if (ENC_CHB)
|
16 | //neu ^= 1; // convert gray to binary
|
17 | if (ENC_CHB) // High an Channel B? |
18 | uc_enc_code != 2; // Bit 1 setzen -> 0000001X |
19 | |
20 | if (uc_enc_code == 0x02) // Wenn 00000010 (2)... |
21 | uc_enc_code = 0x03; // dann 00000011 (3) |
22 | |
23 | if (uc_enc_code == 0x03) // Wenn 00000011 (3)... |
24 | uc_enc_code = 0x02; // dann 00000010 (2) |
25 | |
26 | //diff = last - neu; // difference last - neu
|
27 | diff = uc_enc_code_old - uc_enc_code; |
28 | |
29 | if (diff & 1) // bit 0 = value (1) |
30 | {
|
31 | //last = neu; // store neu as next last
|
32 | uc_enc_code_old = uc_enc_code; // Neuen Code merken |
33 | enc_delta += (diff & 2) - 1; // bit 1 = direction (+/-) |
34 | }
|
35 | }
|