Zdravím v tento sváteční den.
Testuju interface počítačové klávesnice PS/2 a mám problém co se týče implementace do PICu.
Prostudoval jsem různé zdroje (zejm. http://www.computer-engineering.org/) ohledně způsobu příjmu dat.
Napsal jsem jednoduchý program, který v přerušení obsluhuje příjem bajtu z klávesnice. V hlavní smyčce se potom přijatý bajt odesílá na UART (přitom se upraví z binární podoby do ASCII, ať můžu zobrazovat data na terminálu).
Pokud by došlo k chybě při přenosu mezi klávesnicí a procesorem, je program vybaven detekcí chyby. Když vznikne chyba, program odešle do terminálu Err, chybu vynuluje a jede dál.
Takhle by to mělo podle kódu fungovat. Jenže program funguje zcela náhodně, odesílá si data, jaká chce a už vůbec to nejsou data z klávesnice. Občas se to i sekne (jen to odešle Err a nějaké nesmysly) a pak pomůže jen reset.
Já už nevím, kde mám hledat chybu. Program jsem prošel instrukci za instrukcí...
Na závěr ještě připojím dotaz, že klávesnice sama o sobě neposílá to, co by měla. V příloze jsou dva scany z osciloskopu. Jeden je při stisku klávesy G. Tento kód neodpovídá ani po negaci žádné z tabulek znakových sad na http://www.computer-engineering.org/ps2 ... odes2.html. Druhý je kód, který klávesnice vyšle, dojde-li k puštění klávesy. Tento kód odpovídá, ale pouze po jeho negaci. Nevím, co si o tom mám myslet. Kde mám chybu?
PS/2 interface a PIC
Moderátor: Moderátoři
PS/2 interface a PIC
- Přílohy
-
- knihovna_PS2.asm
- (4.72 KiB) Staženo 125 x
-
- stop_kod.jpg
- Kód pouštění klávesy - podle tabulky má být F0h
- (15.55 KiB) Staženo 99 x
-
- G.jpg
- Kód klávesy G, podle tabulky má být 34h, ale ani po negaci dat na obrázku 34h nedostanu ani náhodou.
- (16.02 KiB) Staženo 108 x
Program v C pro AVR je v aplikační poznámce od Atmelu http://www.atmel.com/dyn/resources/prod ... oc1235.pdf
V tom článku píšou, že tu klávesnici je dobré inicializovat, ale není to nutnost, protože se po zapnutí inicializuje sama.
Chyba byla v převodu z hexa do ASCII, kdy jsem chtěl zamaskovat horní nibble před dekódováním číslice na ASCII. Má tam být andlw a já tam mám addlw. Proto to odesílalo nesmysly. Nakonec jsem to vyřešil tak, že jsem udělal jen jednosměrný "most" mezi PS/2 a RS-232. V terminálu si pak přímo zobrazuji hexa kódy kláves.
Ještě jsem musel přidat čekací smyčku 12us po sestupné hraně clock, aby se ustálila data. Bez čekací smyčky to fungovalo pouze s jednou klávesnicí, s čekáním to teď funguje se všemi klávesnicemi co mám doma.
Misoj286, díky za připomenutí, ve chvíli, kdy jsem čuměl na osciloskop mi nedošlo, že klávesnice to posílá opačně.![Smile :)](./images/smilies/icon_smile.gif)
Chyba byla v převodu z hexa do ASCII, kdy jsem chtěl zamaskovat horní nibble před dekódováním číslice na ASCII. Má tam být andlw a já tam mám addlw. Proto to odesílalo nesmysly. Nakonec jsem to vyřešil tak, že jsem udělal jen jednosměrný "most" mezi PS/2 a RS-232. V terminálu si pak přímo zobrazuji hexa kódy kláves.
Ještě jsem musel přidat čekací smyčku 12us po sestupné hraně clock, aby se ustálila data. Bez čekací smyčky to fungovalo pouze s jednou klávesnicí, s čekáním to teď funguje se všemi klávesnicemi co mám doma.
Misoj286, díky za připomenutí, ve chvíli, kdy jsem čuměl na osciloskop mi nedošlo, že klávesnice to posílá opačně.
![Smile :)](./images/smilies/icon_smile.gif)