Hallo,
ich habe hier eine Routine von der Seite "www.mikrokontroller.net" in verwendung und musste leider feststellen, dass es manchmal noch zu prellern kommt. Habe meinen entsprechenden Timer auf 1ms CompareMatch gestellt.
Ist das normal? Encoder solch eine schlechte Qualität? Kann ich noch was anderes/besser machen?
Würde mich mal über Ratschläge freuen.
P.S
Habe erstmal keinen C zwischen den "Phasen" geschaltet.
CodeBox C
ich habe hier eine Routine von der Seite "www.mikrokontroller.net" in verwendung und musste leider feststellen, dass es manchmal noch zu prellern kommt. Habe meinen entsprechenden Timer auf 1ms CompareMatch gestellt.
Ist das normal? Encoder solch eine schlechte Qualität? Kann ich noch was anderes/besser machen?
Würde mich mal über Ratschläge freuen.
P.S
Habe erstmal keinen C zwischen den "Phasen" geschaltet.
CodeBox C
// Dekodertabelle für wackeligen Rastpunkt // halbe Auflösung const int8_t table[16] PROGMEM = {0,0,-1,0,0,0,0,1,1,0,0,0,0,-1,0,0}; // Dekodertabelle für normale Drehgeber // volle Auflösung //const int8_t table[16] PROGMEM = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0}; int8_t encode_read( void ) // Encoder auslesen { int8_t val; // atomarer Variablenzugriff cli(); val = enc_delta; enc_delta = val & 1; sei(); return val >>1; } ISR(TIMER0_COMPA_vect) // 1ms fuer manuelle Eingabe { static int8_t last=0; // alten Wert speichern last = (last << 2) & 0x0F; if (PHASE_A) last |=2; if (PHASE_B) last |=1; enc_delta += pgm_read_byte(&table[last]); }