trochu jsem si hrál s rotačním enkodérem. Předělával jsem ho z jednobodového na kvadratický. Vyšel mi docela zajímavě jednoduchý kód. Vycházel jsem z toho, že nesleduji stavy jako takové, ale víc pracuji s rozdílem (XOR).
Používám dvě proměnné OLD a NEW, celkem logicky OLD je stav z předchozího čtení, NEW je aktuální stav.
Tabulka ukazuje obsah proměnné OLD a k tomu XOR pro směr CW a CCW
Kód: Vybrat vše
; ___
;__| |____ PORTA,2
; ___
;____| |__ PORTA,1
; --> CW <-- CCW
OLD |X CW |X CCW
A2|A1|X2|X1|X2|X1
0 0| 1 0| 0 1
1 0| 0 1| 1 0
1 1| 1 0| 0 1
0 1| 0 1| 1 0
0 0| 1 0| 0 1
1 0| 0 1| 1 0
1 1| 1 0| 0 1
0 1| 0 1| 1 0
A vlastní program mi vyšel na 9 instrukcí ale dělal jsem to na PICu a tomu tady nikdo nerozumí, tak dám jen opis:
Kód: Vybrat vše
Přečti nový stav do NEW
W = NEW xor OLD
pokud W = 0, potom konec
pokud bit OLD,1 = 1, potom W = W xor b"11"
pokud bit OLD,2 = 1, potom W = W xor b"11"
pokud bit W.2 = 1, potom CW, jinak CCW
OLD = NEW