AT89S52 příkaz INC, DEC a rotační kodér

Přičítání/odečítání půlky bytu :

přičtení/odečtení 1 k dolní polovině :

  1. Vezmeš celý byte
  2. uděláš si kopii
  3. v původním bytu uděláš masku F0h
  4. ke kopii přičteš/odečteš 1
  5. v kopii uděláš masku 0Fh
  6. do původního přidáš pomocí or kopii

přičtení/odečtení 1 k horní polovině :

  1. Vezmeš celý byte
  2. uděláš si kopii
  3. v původním bytu uděláš masku 0Fh
  4. ke kopii přičteš/odečteš 10h
  5. v kopii uděláš masku F0h
  6. 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.

  1. 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.
  2. 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 : https://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.