vendredi 26 juillet 2013

msp430 launchpad, partie 9

interface avec clavier PS/2

Interfacer un clavier PS/2 avec un MCU est plus simple que d'interfacer un clavier USB et ça demande moins de ressources. Ces dernier jours j'ai donc expérimenter avec un mini-clavier connecté au launchpad. Le programme démo contient 3 parties qui s'exécutent l'une à la suite de l'autre.

  1. allumées les 3 LEDs du clavier en séquence.
  2. Contrôler les LEDs avec les touches dédiées.
  3. Clavier musical, mono tonal.
Les fichiers du projet CCS sont sur https://github.com/Picatout/ps2-kbd-on-msp430g2553

Clavier PS/2

Les claviers PS/2 utilisent une interface qui ressemble au I2C. Il y a 2 lignes, 1 clock et 1 data et les 2 lignes peuvent-être contrôlées soit par le clavier soit par le MCU. La communication est dans les 2 sens, le MCU pouvant envoyer des commandes au clavier. C'est le MCU qui contrôle les LEDs qui sont sur le clavier et non le clavier lui-même. J'ai mis à la fin de cette chronique plusieurs liens donnant l'information que j'ai utilisé pour la création de l'interface PS/2 - MSP430.

C'est le clavier qui fourni le signal clock (environ 12Khz) même lorsque c'est le MCU qui envoie une commande au clavier. Lorsque le MCU veut envoyer une commande il maintien la ligne clock à 0 volt pendant au moins 100µsec et ensuite prends le contrôle de la ligne data et la mais aussi à zéro volt. Il libère ensuite la ligne clock pour que le clavier en reprenne le contrôle. Le MCU change la valeur de la ligne data lorsque la ligne clock est à zéro et attend le prochain cycle pour le bit suivant. Le bit le moins significatif est envoyé en premier. Après les 8 bits un bit de parité impair est envoyé. Ensuite c'est le stop bit. I y a donc 11 bits par octet en incluant le start bit. A chaque octet envoyé au clavier le clavier répond par un octet de confirmation 0xFA ou un octet demandant le renvoie 0xFE s'il n'a pas réussi à lire correctement l'octet reçu.

Le clavier envoie au MCU des scancodes et non des caractères ASCII. Le programme doit donc convertir les codes clavier en caractères. Le caractère correspondant à un code particulier dépend de la configuration du clavier, QWERTY, AZERTY, etc. Le fichier QWERTY.H contient les tables pour la transcription des codes pour un clavier du même nom. Pour utiliser un clavier avec une configuration différente il faut créer un fichier avec les tables appropriées et remplacer les #include "qwerty.h" dans le code source.

Le code source est abondamment commenté, vous devriez donc être en mesure de comprendre en le lisant.

photo du montage

  • P1.0 signal clock interface PS/2
  • P1.1 signal data interface PS/2
  • P2.2 sortie audio pour démo 3

Contrôle des LEDs du clavier

Puisque sur un clavier de PC lorsqu'on presse les touches Ver. Maj., Ver. Num. et défil. la LED correspondante sur le clavier s'allume ou s'éteint ou pourrait-être porté à croire que c'est le clavier qui contrôle l'état des LEDs mais ce n'est pas le cas, c'est le PC hôte qui en est responsable.

Après avoir programmé le MCU avec le code du démo, à la réinitialisation le MCU envoie une commande 0xFF (Remise à zéro) au clavier. Cette commande à pour effet de faire exécuter la routine d'initialisation du clavier. Cette routine s'appelle BAT Basic Assurance Test. Au démarrage du BAT les 3 LEDS s'allument simultanément. Si le test passe avec succès le clavier renvoie au MCU le code 0xAA, s'il échoue il renvoie le code 0xFC. A la fin du test les 3 LEDs s'éteignent. Si le MCU reçoit le code 0xFC il allume la LED2 sur la carte launchpad et entre en mode LPM4. En fait chaque fois qu'il y a une erreur clavier le programme entre en mode LPM4 (arrêt d'exécution).

Si le BAT passe avec succès la LED2 du launcpad allume une demi seconde et ensuite le MCU entre dans une boucle while() à l'intérieur de laquelle il envoie à tout les quart de seconde une commande au clavier avec la fonction set_kbd_leds() qui est utilisée pour contrôler l'État des LEDs du clavier. Les 3 LEDs sont allumées en séquence, une à la fois. Il suffit d'enfoncer n'importe quelle touche pour passer au démo 2.

Fonctionnement des touches à bascules

Ce démo est une démonstration de la façon dont un PC contrôle les LEDs du clavier lorsqu'on utilise les touches à bascule Ver. Maj, Ver. Num. et Défil.. En pesant sur l'une de ces touches la LED correspondante bascule entre allumée/éteinte. Pour sortir de ce démo et passer au clavier musical il faut utiliser la touche ESC.

clavier musical

Le 3ième démo est un mini synthétiseur mono tonal (un seule note à la fois). Sur un clavier QWERTY comme celui-que j'ai utilisé la rangée qui débute avec la lettre A est utiliser pour générer les notes non altérées et la rangée au dessus pour les dièses. Le A est le DO4, le W est le DO#4, le S le RÉ4, le E le RÉ#4 et ainsi de suite jusqu'au P qui est le RÉ#5. Si la touche SHIFT du côté gauche est maintenue enfoncée les notes sont transposées à l'octave supérieur. La touche F1 est utiliser en bascule pour altérer le timbre des notes. Il y a aussi un effet vibrato contrôler par les flèches, Haut et bas pour la fréquence du vibrato, et les flèches gauche et droite pour modifier la profondeur du vibrato. Le vibrato est produit en modifiant directement la fréquence du DCO.

API de l'interface clavier PS/2

  • int init_ps2_kbd() initialisation des E/S et RAZ clavier.
  • void enable_keyboard_rx() active l'interruption sur KBD_CLK.
  • void disable_keyboard_rx() désactive l'interruption sur KBD_CLK. Lorsque cette interruption est désactivée le MCU ne lit plus les codes envoyés par le clavier.
  • int get_scancode() lit le prochain code qui est dans la file d'attente. Si la file est vide retourne 0. En fait plusieurs codes peuvent-être lus car parfois un message comprend plus d'un code. Par exemple lorsqu'une touche est relâchée le message commence par 0xF0 suivit du code de la touche. Le code retourné est une entier négatif s'il s'agit d'un relâchement de la touche et positif s'il s'agit d'une touche enfoncée. Il y a aussi un bit XT_BIT qui indique s'il s'agit d'un code étendu.
  • int get_key(int code) fait la conversion du code clavier au code ASCII correspondant. S'il n'y a pas de code ASCII correspondant retourne 0. Le XT_BIT et le REL_BIT sont conservés tel qu'ils sont dans le code passé en argument.
  • int kbd_send(char cmd) est utilisée pour envoyer une commande au clavier ainsi que les arguments de la commande. Un seul octet est envoyé à la fois. Si la commandes requiert des arguments kbd_send() est invoquée autant de fois que nécessaire.
  • int set_kbd_leds(unsigned int leds_state) est utilisée pour modifier l'état des LEDs du clavier. le bit 0 de leds_state correspond au LED Défil., le bit 1 à Ver. Maj. et le bit 2 à Ver. Num. La valeur 1 dans le bit allume le LED et active la fonction correspondante.

Liens

Aucun commentaire:

Publier un commentaire