hele ten váš pan učitel je asi pěknej blbec protože tohle vám měl vysvětlit
jak se to dělá a o co de. Je to holt těžký když má titul mgr. z university
pro modelky a má v hlavě sračky že.
se ti to pokusim vysvětlim metodou "for dummies"
takže když má procesor tak ty jeho piny sou sdružený do bran obvykle po 8 pinech
značený Px.0 až Px.7, kde x je brána třeba A nebo B - viz obrázek níže
každý pin se dá nastavit jako vstupní nebo výstupní nebo jiný stav (třeba stav
vysoké impendace). na to abys mohl vytvořit klávesnici která má 16 kláves
si vyčleníš jeden celý port třeba A který má 8 pinů. port rozdělíš na pul
po 4 pinech a první 4 piny použiješ jako přijímače a druhý 4 piny jako vysílače
to jestli je pin vysílač (rozuměj výstupní) nebo přijímač (rozuměj vstupní)
se nastavuje v registrech procesoru algoritmem a lze to měnit. když nastavíš pin
jako výstupní tak se přepne do modu otevřený kolektor a může přijímat proud
a můžeš k němu připojit diodu (anodou) a ona svítí - viz obrázek níže.
K diodě se obvykle přidává odpor podle typu diody 270-390 ohmu (i když stav
pinu "open collector" neboli výstupní to nevyžaduje). pokud je takto port
nastavený tak když ho čteš v assembleru tak vždy přečteš nulu (u některých procesorů
to jde změnit). když na pin připojíš přímo kablík GND neboli zem tak se nic nestane
a když tam připojíš +5 tak dojde ke zkratu a procesor ti vyhoří :))))
Druhá možnost je že přepneš stav pinu do vstupní a pak tento pin může detekovat
nějaký binární vstup. Jinými slovy když k němu připojíš drátek GND tak pak
můžeš v assembleru na daném pinu přečíst hodnotu 0 a když drátek odpojíš tak
hodnotu 1. u některých procesorů je nutné si stav 1 vynutit přidáním externího
rezistotu tzv. pull-up rezistor připojený na +5 a má třeba 1.2kOhmu.
procesor vzorkuje vstupy i výstupu v určitých časových intervalech. časový interval
je daný frekvencí taktování procesoru (krystal, RC dekáda, externí čas. zdroj)
pokud na pinu který je vstupní je po určitou minimální dobu připojen signál
(rozuměj drátek GND) tak procesor přečte hodnotu 0 po dobu, kdy tam byl
signál připojen.
Takže na obrázku dole jsou vstupní piny PA0..3 a výstupní PA4..7.
Takže piny PA4..7 jsou vysílače a PA0..3 jsou přijímače signálu.
Na obrázku dolejsou klávesy označené jako 01 .. 16 zelenou barvou
Algoritmus pro obsluhu klávesnice se dělá takto:
1/ všechny piny PA0..7 nastav jako vstupní (přijímač) t.j. piny budou mít hodnotu 1
2/ pin PA.7 nastav jako výstupní (vysílač) - bude mít hodnotu 0
3/ jestliže je na pinu PA.0 hodnota nula pak byla zmáčknuta klávesa 01
4/ jestliže je na pinu PA.1 hodnota nula pak byla zmáčknuta klávesa 02
5/ jestliže je na pinu PA.2 hodnota nula pak byla zmáčknuta klávesa 03
6/ jestliže je na pinu PA.3 hodnota nula pak byla zmáčknuta klávesa 04
7/ pin PA.7 nastav jako vstupní (přijímač) t.j. pin bude mít hodnotu 1
8/ pin PA.6 nastav jako výstupní (vysílač) - bude mít hodnotu 0
9/ jestliže je na pinu PA.0 hodnota nula pak byla zmáčknuta klávesa 05
10/ jestliže je na pinu PA.1 hodnota nula pak byla zmáčknuta klávesa 06
11/ jestliže je na pinu PA.2 hodnota nula pak byla zmáčknuta klávesa 07
12/ jestliže je na pinu PA.3 hodnota nula pak byla zmáčknuta klávesa 08
13/ pin PA.6 nastav jako vstupní (přijímač) t.j. pin bude mít hodnotu 1
14/ pin PA.5 nastav jako výstupní (vysílač) - bude mít hodnotu 0
15/ jestliže je na pinu PA.0 hodnota nula pak byla zmáčknuta klávesa 09
16/ jestliže je na pinu PA.1 hodnota nula pak byla zmáčknuta klávesa 10
17/ jestliže je na pinu PA.2 hodnota nula pak byla zmáčknuta klávesa 11
18/ jestliže je na pinu PA.3 hodnota nula pak byla zmáčknuta klávesa 12
19/ pin PA.5 nastav jako vstupní (přijímač) t.j. pin bude mít hodnotu 1
20/ pin PA.4 nastav jako výstupní (vysílač) - bude mít hodnotu 0
21/ jestliže je na pinu PA.0 hodnota nula pak byla zmáčknuta klávesa 13
22/ jestliže je na pinu PA.1 hodnota nula pak byla zmáčknuta klávesa 14
23/ jestliže je na pinu PA.2 hodnota nula pak byla zmáčknuta klávesa 15
24/ jestliže je na pinu PA.3 hodnota nula pak byla zmáčknuta klávesa 16
25/ pin PA.4 nastav jako vstupní (přijímač) t.j. pin bude mít hodnotu 1
26/ všechny piny PA0..7 nastav jako vstupní (přijímač) t.j. piny budou mít hodnotu 1
na obrázku dole ta červená čára vysílá signál z pinu PA.7 na pin PA.0 když
je stisknutá klávesa 0. Tenhle algoritmus ti zajistí, že bude detekován
stisk jedné jediné klávesy. musíš ho spustit alespoň 6-10x za sekundu
protože stisk klávesy trvá obvykle 20ms.
v případě, že chceš detekovat stisk více kláves, pak musíš použít dva 8 mi bitové
registry (pojmenujme je např. A a B) nebo 16 bitů v paměti RAM (což se používá
častěji a označme tuto část paměti taky AB) kam se bude hodnota stisknutých kláves
ukládat a změna v těchto registrech se dělá instrukcí OR vzhledem k poslední hodnotě,
což je logické.
tento mechanismus má jednu velkou nevýhodu a to že ti muže detekovat stisk
klávesy vícenásobně, což je hloupé. protože body 2..26 proběhnou třeba za 25 nanosekund
a stisk klávesy trvá 0.2 sek tak by se ti takhle načetla hromada stejnejch znaků
záleží na tom jak máš naprogramovanej zbytek kodu.
taky stisk klávesy nebejvá ideální a tak trochu to mezi těma kontaktama jiskří
a takže z pohledu procesoru to vypadá že se klávesa spíná a zase rozepíná
takže aby si tomu zamezil, tak si musíš doprogramovat
část, která detekuje ze klávesa, která již byla zmáčknuta byla také uvolněna
ale až za jistý min. časový interval
jinými slovy k novému nastavení bitu 1 v registru AB dojde jen tehdy, pokud
momentálně má hodnotu nula jinak se nic nestane a tohle se děje jen v určitém
časovém intervalu. můžeš si taky doprogramovat bit, který ti určí, že došlo
ke změně stisku kláves. metod existuje hromada.
přesun přečteného znaku z registru AB k dalšímu zpracování se dělá v určitých
časových intervalech. takže jak vidíš, čtení klávesnice a zápis přečtené
zmáčknuté klávesy se může dělat aj 100x za sekundu ale čtení registu AB,
kam se uložila stisknutá klávesa (nebo víc stisknutých kláves) se může
číst jen 10x za sekundu. Klávesnice by se neměla dávat jako zdroj přerušení
protože když procesor např. vysílá data po sběrnici a má k tomu
jen omezené časové okno, tak přerušení od klávesnice by toto okno mohlo
narušit, takže procesor čte stav klávesnice ale nikoliv opačně. Jako řídící prvek
klávesnice můžeš udělat i malý procesor z řady ATtiny a připojit ho na hlavní
procesor přes sběrnici SPI apod.