Stránka 1 z 1

PS/2 interface a PIC

Napsal: 28 říj 2011, 15:16
od MartinOV
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?

Napsal: 28 říj 2011, 16:11
od forbidden
Příliš ti asi neporadím, ale mám dojem, že se klávesnice nejdřív musí nějak inicializovat. Až pak bude normálně posílat znaky. Máš v programu tu inicializaci?

Napsal: 28 říj 2011, 16:35
od misoj286
Klávesnica posiela bity znaku od najnižšieho po najvyšší. Podľa obrázku ti poslala bity 0001011000, pričom na začiatku je start bit a na konci paritný bit. Potom zostane po zmene poradia bitov 00110100 čiže 34h.

Napsal: 28 říj 2011, 16:40
od GeorgeB
Program v C pro AVR je v aplikační poznámce od Atmelu http://www.atmel.com/dyn/resources/prod ... oc1235.pdf

Napsal: 29 říj 2011, 14:02
od MartinOV
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ě. :)

Napsal: 29 říj 2011, 17:07
od kovikk
Najdi si knihu "Komunikace mikrokontroléru s okolím" 1. díl. Je to tam popsaný a je tam i asm program pro PIC, ale nezkoušel jsem to...