ATmega a rezistivní touchpad

touchpadV článku TFT displej s řadičem SSD1963 jsem popsal způsob ovládání TFT displeje procesorem ATmega162. Popsaný displej má rezistivní touchpad a v tomto článku popíšu, jak na displeji nakreslit tlačítka a s pomocí touchpadu dát programu informaci o jejich stisku.

Nakreslení tlačítka

Tlačítko bude barevný obdélník, ve kterém může být název tlačítka, případně nějaká veličina, kterou je možné po stisku tlačítka měnit rotačním kodérem.

tlačítkoNa displeji bude takových tlačítek několik a je potřeba alespoň 10x za sekundu překreslovat čísla, která jsou v nich. Nejjednodušší by bylo napsat funkci, která nakreslí tlačítko požadovanou barvou a v něm napíše číslo. Tuto funkci potom pouštět pořád dokola, pro všechny tlačítka. Kreslení celého tlačítka trvá dlouho a stisknuto je jenom někdy – takže je to ztráta času a navíc, displej při opakovaném překreslování bliká. Proto jsem se rozhodl naprogramovat dvě funkce. První nakreslí tlačítko. Provedení této funkce trvá delší dobu a je používána jenom tehdy, když je tlačítko stisknuto a je nutné změnit jeho barvu, nebo nápis v tlačítku.

Druhá funkce kreslí čísla v tlačítku. Funkce trvá krátkou dobu, takže při 16MHz je možné displej z obrázku v záhlaví článku překreslit alespoň 15x za sekundu. Při použití ATxmega128 a kmitočtu 32MHz lze překreslovat 20x a ještě zbyde spousta času na další práci procesoru.

Touchpad ovládaný obvodem XPT2046

Z datového listu obvodu XPT2046 je zřejmé, že po SPI sběrnici je potřeba poslat osmibitový řídící znak a obvod odpoví dvanáctibitovou hodnotou, kterou naměřil AD převodník.

XPT2046Maximální kmitočet komunikace, kterou zvládne XPT2046, je někde kolem 2,5MHz. To znamená, že když procesor běží na 16MHz a je potřeba přenést osm bitů na kmitočtu 2MHz po sběrnici SPI, tak procesor může 64 taktů dělat něco jiného. ATxmega běží na 32MHz, takže to je zbytečných 128 taktů čekání na každý bajt komunikace.

Je celkem jednoduché najít na internetu knihovnu funkcí, která prostřednictvím SPI kanálu čte data z AD převodníku obvodu a vrací souřadnice místa na displeji, které je stisknuto. Funkce, která má vrátit souřadnice stisknutého místa, komunikuje s obvodem XPT2046 takto:

  • odešle řídící znak 0xD0 pro připojení odporové vrstvy X na napájení
  • přijme data z AD převodníku, který je připojen na osu Y
  • odešle řídící znak 0x90 pro připojení odporové vrstvy Y na napájení
  • přijme data z AD převodníku, který je připojen na osu X

Všechny knihovny, které jsem našel, čekají na reakci SPI sběrnice několik set taktů procesoru pro každé čtení dat. Další ztrátou času je přepínání mezi osou X a osou Y. Po odeslání kódu 0x90 je potřeba několik µs počkat, než se ustálí napětí připojené na odporovou vrstvu Y.

XPT2046 ovládaný v přerušení

To se mi nelíbilo, proto jsem se rozhodl použít pro komunikaci s XPT2046 systém přerušení. Činnosti, které má procesor vykonávat pravidelně, několikrát za sekundu, je vhodné naprogramovat do funkce, kterou spouští přerušení časovače. V mém případě je časovač nastaven tak, aby program jeho přerušení byl spouštěn 1000x za sekundu. Ještě budu potřebovat, aby funkce přerušení časovače a přerušení SPI kanálu vykonávala pokaždé něco jiného, to bude zobrazovat proměnná Touch_Counter.

Program přerušení časovače:

Program přerušení od SPI kanálu:

Obvod XPT2046 dokáže na pinu /PENIRQ generovat impuls v okamžiku, kdy je stisknut touchpad. Tento impuls lze využít k zavolání přerušení v procesoru. To zatím nebudu používat, program ovládaný časovačem poběží periodicky a v proměnné Touch_X a Touch_Y budou stále aktuální údaje z AD převodníku XPT2046. V další části programu vyhodnotím, zda je stisknut touchpad a vypočítám průměrné hodnoty z osmi měření. Počítadlo měřených hodnot je proměnná Touch_Counter1.

Průměrné hodnoty jsou při výpočtu porovnávány s druhou a poslední naměřenou hodnotou. Pokud je rozdíl příliš velký, znamená to, že tlak na dotykovou plochu touchpadu je malý, nebo že se dotýkáme velkou plochou – bříškem prstu. V tom případě je mezi vrstvou X a Y velký a proměnlivý odpor, který způsobuje chybu měření.

Když je chyba měření malá, jsou naměřené hodnoty přepočítány na souřadnice displeje. Použité rovnice jsou jednoduché, nezohledňují posunutí, nebo pootočení dotykové vrstvy na panelu displeje. To by bylo možné korigovat s použitím maticového počtu, jak je popsáno např. zde. Pro ovládání tlačítek to nebude potřeba, program nemusí být tak moc přesný.

Následující kousek programu vyhodnotí, které tlačítko bylo stisknuto a podle toho nastaví proměnnou Setting_Value.

Na základě změny stavu proměnné Setting_Value se změní zabarvení tlačítek. Zároveň se podle proměnné Setting_Value řídí chod programu přerušení, které je generováno rotačním kodérem. Plochy, které jsou touchpadem detekovány jako tlačítka, jsou po obvodu alespoň o pět pixelů menší, aby nedocházelo k přehmatům.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *