Drehgeber Routine Peter Dannegger

Gast #5014181
Lesenswert?

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
}
Gast #5014200
Lesenswert?

Hallo,

ich verstehe nicht, warum man funktionierenden Code abändern muss...

Zu deiner Frage, frage Dich bitte was hier passiert.
Spiele also im Kopf oder auf dem Papier Computer:
1
 if (uc_enc_code == 0x02)        // Wenn 00000010 (2)...
2
    uc_enc_code = 0x03;          // dann 00000011 (3)
3
  
4
  if (uc_enc_code == 0x03)        // Wenn 00000011 (3)...
5
    uc_enc_code = 0x02;          // dann 00000010 (2)
Sind nach deiner Analyse diese Zeilen dann sinnvoll? Oder bewirken 
irgendetwas ?
Gast #5014221
Lesenswert?

Ou..., ich sehe es.
1
if (uc_enc_code == 0x02)      // Wenn 00000010 (2)...
2
  uc_enc_code = 0x03;        // dann 00000011 (3)
3
else if (uc_enc_code == 0x03)      // Wenn 00000011 (3)...
4
 uc_enc_code = 0x02;        // dann 00000010 (2)


Ich werde die Routine natürlich so lassen wie wie sie von Herrn 
Dannegger entwickelt wurde. Ich wollte nur verstehen wie das 
funktioniert. Ich glaube ich wäre nich auf diese Befehle gekommen:
1
if (ENC_CHA)            
2
  neu = 3;
3
if (ENC_CHB)
4
  neu ^= 1;

Ich arbeite mit der Arduino Umgebung. Diese hat leider keine Warnung 
ausgesprochen.

Vielen Dank.
Beitrag #5014239 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren