03-11-2014, 12:07
Ja mam "własną" metodę na czytanie enkodera, robię to w przerwaniu co około 7kHz (tak akurat się dzieli 16MHz/256/8), tam sprawdzam tylko podstawowe wejścia/wyjścia - przyciski, enkoder, ptt, coś tam jeszcze, bo musi być to szybkie.
Natomiast wszystkie potencjalnie czas-żerne rzeczy robię w pętli w "main" czyli przede wszystkim obsługa LCD.
Wszystkie wejścia są podciągnięte, i mają 10nF kondensatory.
Robiłem test, i po przekręceniu enkoderem kilkanaście razy szybko w lewo a potem dokładnie tyle samo w prawo, licznik enkodera pokazywał zero, i tak powinno być.
Ale jak popatrzyłem na kod z biblioteki arduino:
To może ta metoda j.w. jest ciut lepsza. Musiałbym sprawdzić co szybciej się wykonuje.
Pozdrawiam
Natomiast wszystkie potencjalnie czas-żerne rzeczy robię w pętli w "main" czyli przede wszystkim obsługa LCD.
Wszystkie wejścia są podciągnięte, i mają 10nF kondensatory.
Robiłem test, i po przekręceniu enkoderem kilkanaście razy szybko w lewo a potem dokładnie tyle samo w prawo, licznik enkodera pokazywał zero, i tak powinno być.
Kod:
//rozdzielczość x4, czyli na ząbek 4 "kroki", co bywa kłopotliwe, bo zadaniem ząbka jest "stabilizacja" enkodera w konkretnej pozycji. W innym miejscu to dziele /4
A = get_input(ENC_A);
B = get_input(ENC_B);
if (A!=pA){
if (A==B) enc_ticks++;
else
enc_ticks--;
pA = A;
}
if (B!=pB) {
if (A==B) enc_ticks--;
else
enc_ticks++;
pB = B;
}Ale jak popatrzyłem na kod z biblioteki arduino:
Kod:
uint8_t s = state & 3;
if (get_input(ENC_A)) s |= 4;
if (get_input(ENC_B)) s |= 8;
switch (s) {
case 0: case 5: case 10: case 15:
break;
case 1: case 7: case 8: case 14:
enc_ticks--; break;
case 2: case 4: case 11: case 13:
enc_ticks++; break;
case 3: case 12:
enc_ticks -= 2; break;
default:
enc_ticks += 2; break;
}
state = (s >> 2);
}To może ta metoda j.w. jest ciut lepsza. Musiałbym sprawdzić co szybciej się wykonuje.
Pozdrawiam

