Přičítání/odečítání půlky bytu :
přičtení/odečtení 1 k dolní polovině :
- Vezmeš celý byte
- uděláš si kopii
- v původním bytu uděláš masku F0h
- ke kopii přičteš/odečteš 1
- v kopii uděláš masku 0Fh
- do původního přidáš pomocí or kopii
přičtení/odečtení 1 k horní polovině :
- Vezmeš celý byte
- uděláš si kopii
- v původním bytu uděláš masku 0Fh
- ke kopii přičteš/odečteš 10h
- v kopii uděláš masku F0h
- do původního přidáš pomocí or kopii
Rotační kodér :
Používám externí přerušení, ale není to nutné. Pokud použiješ přerušení, musíš vyřešit zákmity na úrovni HW (viz.dále). Způsobů je hned několik :
A) Vystačíš si s detekcí jenom jedné hrany - v případě mechanických kodérů je to postačující, protože tyto kodéry (alespoň ty od firmy ALPS, které používám mají v každé poloze aretaci - cvakají). Pro tyto kodéry ostatní způsoby načítání impulzů nejsou vhodné, protože mezi cvaknutími proběhne celý cyklus.
- detekuješ náběžnou (nebo sestupnou) hranu. V případě použití přerušení (INT0 nebo INT1) ho nastavíš tak, aby mcu reagoval na jednu z hran, tím máš detekci hrany vyřešenou. Externí přerušení u MCU s architekturou 8051 myslím reaguje na sestupnou hranu nebo na hladinu log. 0 - musíš nastavit reakci na sestupnou hranu.
- V okamžiku detekce hrany (nebo v přerušení) zkontroluješ stav druhého pinu a podle jeho hodnoty se rozhodneš, jestli budeš přičítat nebo odečítat.
Další způsoby jsou vhodné pro rotační kodéry magnetické (třeba rotační kodér vytvořený použitím motoru z CD/DVD mechaniky) nebo pro rotační kodéry s optickým snímáním.
B) Detekce obou hran - pokud detekuješ obě hrany, pak v okamžiku detekce hrany musíš zjistit stav obou pinů. Pokud jsou oba v log. 0 nebo oba v log. 1 - přičteš, pokud ne, odečteš (případně přehodíš přičítání a odečítání). Prakticky tím zdvojnásobíš počet impulzů na otáčku.
C) Detekce obou hran na obou signálech - Tady je to prakticky dvojitý postup z bodu B) s tím, že -
po detekci hrany na signálu 1 platí:
pokud signál 1=signál 2, přičteš, jinak odečteš
po detekci hrany na signálu 2 platí:
pokud signál 1=signál 2, odečteš, jinak přičteš
Tímto postupem dostaneš čtyřnásobný počet impulzů na otáčku.
Tady máš ještě odkaz na ošetření zákmitů pro kodér : http://forum.mcontrollers.com/t/osetreni-zakmitu-tlacitka-na-ext-preruseni/2818/1
Hodnoty součástek jsou 68-100 Ohmů pro R a 10n pro kondíky. V tom příspěvku se schématem je chybně uvedených 100n a to je moc. Jinak používám mcu AVR a zapínám interní pull-up rezistory a protože 8051 interní rezistory pravděpodobně nemá, tak musíš ještě přímo ze vstupního pinu na VCC dát odpor tak 20-50 kOhmů. Stejně jako AVRka mají interní pull-up 20-50 kOhmů.
A ještě jedna poznámka :
Kdyby ses náhodou pustil do využití motoru z CD/DVD mechaniky, tak chci upozornit, že tyto mechaniky mají 3 signály - jsou tam 3 HALovy sondy.