Drehgeber Routine Peter Dannegger

Gast #5014181
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
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 ?
(Firma: matzetronics)
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.
Gast
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.
Gast
IDE > Datei > Voreinstellungen > Compiler Warnungen ... "Alle"

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.