PS/2 interface a PIC

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
MartinOV
Příspěvky: 112
Registrován: 01 dub 2010, 02:00

PS/2 interface a PIC

#1 Příspěvek 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?
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

Uživatelský avatar
forbidden
Příspěvky: 8808
Registrován: 14 úno 2005, 01:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#2 Příspěvek 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?

Uživatelský avatar
misoj286
Příspěvky: 6
Registrován: 11 kvě 2010, 02:00

#3 Příspěvek 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.

Uživatelský avatar
GeorgeB
Příspěvky: 1187
Registrován: 21 lis 2005, 01:00
Bydliště: Pardubice
Kontaktovat uživatele:

#4 Příspěvek od GeorgeB »

Program v C pro AVR je v aplikační poznámce od Atmelu http://www.atmel.com/dyn/resources/prod ... oc1235.pdf

Uživatelský avatar
MartinOV
Příspěvky: 112
Registrován: 01 dub 2010, 02:00

#5 Příspěvek 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ě. :)

Uživatelský avatar
kovikk
Příspěvky: 35
Registrován: 10 dub 2008, 02:00

#6 Příspěvek 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...

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“