mardi 27 décembre 2016

interface pour clavier PS/2

J'utilise régulièrement un clavier dans mes projets et comme j'utilise une variété de MCU je dois réécrire l'interface pour le clavier. J'ai donc décidé de régler ce problème une fois pour toute en créant un module d'interface clavier que je vais inséré dans tous mes projets qui utilisent un clavier. Je sauverai ainsi du temps et de l'espace de code sur le MCU principal du projet. Ce module d'interface est très économique puisqu'il utilise un petit MCU en format DIP-8 soit le PIC12F1572. Le montage est très simple.

  • 1 MCU PIC12F1572
  • 2 condensateurs céramique 100nF/16v
  • 2 résistances 15Kohm 1/4watt.
  • 1 connecteur MINI-DIN 6 broches pour le clavier. On peut aussi utiliser un connecteur USB type A
Le code source est disponible sur https://github.com/Picatout/ps2_rs232

fonctionnement

Le PIC12F1572 reçoit les codes du clavier et fait la conversion en code ASCII qu'il envoie à l'hôte via le périphérique EUSART configuré en mode asynchrone. l'envoie se fait à 9600BAUD sans parité. Ce module d'interface n’accapare donc qu'un seule broche sur le MCU principal ainsi qu'un périphérique USART pour la réception. Le code à écrire sur l'hôte est des plus simple puisqu'il s'agit simplement de recevoir les codes ASCII et lest ranger dans une file d'attente FIFO pour les besoins de l'application. Les touches d'altérations SHIFT,CTRL,ALT,CAPS,NUM sont traitées par le PIC12F1572. Les relâchement de touches sont ignorés.

quelques notes sur l'utilisation des claviers

Les claviers que j'utilise sont des claviers d'ordinateurs personnels soit de type PS/2 ou USB. Les claviers USB adoptent automatiquement l'interface PS/2 lorsque les lignes DAT+ et DAT- sont connectées à des résistances pullup. Dans ce cas DAT+ devient le signal CLOCK et DAT- devient le signal DATA.

diagramme connection interne d'un adapteur USB-A vers MINI-DIN-6.

Même si les claviers indique une alimentation de 5VDC ceux que j'ai essayés fonctionnent très bien à 3VDC. Ce n'est pas vraiment étonnant puisque le MCU qui se trouve dans le clavier est certainement en technologie CMOS, à moins qu'il s'agisse d'un très vieux clavier.

L'interface PS/2 est une interface synchrone, c'est à dire qu'il y a un signal clock et un signal data. L'hôte doit lire le bit lorsque le signal clock est à zéro volt. C'est le clavier qui contrôle le signal clock. Bien qu'il s'agisse d'une interface synchrone elle peut-être utilisée en mode asynchrone car le signal data a le mêm format qu'un signal RS-232. C'est à dire qu'il y a un start bit à 0 suivit de 8 bits de data, d'un bit de parité impaire et d'un stop bit. Tout les claviers que j'ai essayé transmettait à 12,500 BAUD (une valeur non standard). Cependant si le clavier est utilisé en mode asynchrone l'hôte ne peut lui envoyer des commandes. Car il faut savoir que l'interface PS/2 est à double sens. L'hôte peut prendre le contrôle de l'interface en bloquant la ligne clock à 0 pour une durée minimum de 100µsec. L'interface décrite ici utilise l'interface PS/2 complète, c'est à dire que le PIC12F1572 envoie des commandes au clavier, soit pour le réinitialiser soit pour contrôler les LEDs du clavier.

Autre paramètre à considérer, l'interface fonctionne en mode drain ouvert d'où l'utilisation des 2 résistances pullup. Ceci est intéressant car même si le clavier est alimenter à 5 volt et que le MCU est alimenté à 3 volt il n'y a pas de risque d'endommager le MCU. Le seul courant qui passe vers le MCU hôte passe à travers des résistances pullup qui sont de 15Kohm. Supposons que les deux entrées du MCU sont configurées en entrées. Le courant passe du 5volt à travers la résistance de 15Kohm et à travers la diode de protection d'entré du MCU vers le 3volt. Le courant qui va circulé dans cette diode est donc de (5-3)/15000=133µA. Aucun risque d'endommager la diode de protection.

Les broches du PIC12F1572 sont configurables on mode drain ouvert ce qui rend encore plus sécuritaire l'interface entre le MCU et le clavier. On peut donc alimenter le clavier et les 2 résistances en +5VDC et le MCU en +3VDC sans que ça pose problème.

codes ASCII et supplémentaire

La table ASCII standard est limitée à 128 codes. Il n'y a pas de provision pour les touches spéciales du claviers tel que les touches de fonctions, les flèches, etc. Le firmware du PIC12F1572 convertis ces codes en une série de valeurs comprises entre 128 et 255. Pour connaître la liste de ces touches consulter la page github du projet.

mise à jour 8 janvier 2017

Suite à l'intégration de cette interface dans un projet j'ai apporté des modifications au circuit et au logiciel. Sous MS-DOS lorsque la combinaison de touches <CTRL>+ <ALT>+<DEL> était enfoncée l'ordinateur redémarrait. J'ai ajouté une fonctionnalité à cette interface pour que cette même combinaison résulte en l'envoie d'une impulsion négative de 100µsec sur la broche RA5 du MCU et j'ai nommé ce signal ~REBOOT.

De cette façon l'hôte qui utilise cette interface pourra utilisé ce signal à sa guise. J'ai aussi ajoutée une résistance de 470 ohm entre le condensateur C1 et l'entrée RA3 du PIC12F1572. À la jonction de C1 et de la résistance R3 j'ai ajouté l'étiqette globale ~HRST. Ce signal permet à l'hôte de réinitialiser ce circuit.

Comme j'ai fais ces modifications après coup j'ai du ajouter un connecteur ICSP pour reprogrammer le PIC12F1572. Je l'ai indiqué sur la nouvelle version de la schématique car cet imprévu m'a rappelé qu'il est toujours utile d'inclure un tel connecteur dans un montage. On ne sais jamais quand on aura à faire une reprogrammation en circuit.

J'ai aussi indiqué sur la schématique les 2 options possibles pour le type de connecteur clavier à utiliser.

Nouvelle schématique

Aucun commentaire:

Enregistrer un commentaire