Forum: Mikrocontroller und Digitale Elektronik Drehgeber Routine Peter Dannegger


von Marcel (Gast)


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
}

von Peter D. (peda)


Lesenswert?

Marcel schrieb:
> Könnt ihr mir sagen warum meine Version der ISR nicht funktioniert?

Weil Du den Code geändert hast, ohne zu wissen, warum.
Auch sollte der Compiler ne Warnung werfen (nutzloser Code), weil Du 
einen Vergleich machst und das Ergebnis wegwirfst.

von Karl M. (Gast)


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 ?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Das schwierigste bei PeDas Code ist es, die Copy&Paste Funktionen auf 
seinem Computer zu finden und sich dann für eine der drei 'enc_readX' 
Funktionen zu entscheiden.
Das Ganze ist übrigens auch deutlich kompakter als deine Variante.

: Bearbeitet durch User
von Marcel (Gast)


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 vom Autor gelöscht.
von Arduino (Gast)


Lesenswert?

IDE > Datei > Voreinstellungen > Compiler Warnungen ... "Alle"

Codefaltung und Zeilennummer kannste auch noch aktivieren.
Von allen anderen erstmal Finger weg.

von Peter D. (peda)


Lesenswert?

Das else if sollte auch gehen, wenn davor das != durch |= ersetzt wird.

von Marcel (Gast)


Lesenswert?

Klar, |= anstelle von !=.

Danke euch.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.