mercredi 19 mars 2014

PICvision, module snes-paddle

Les contrôleurs SNES sont intéressant pour 2 raisons, ils sont économiques et facile à trouver et deuxièmement ils sont simple à interfacer.

Le connecteur SNES a 7 broches mais n'en utilise que 5.

  1. Vdd, positif de l'alimention, fonctionne aussi bien à 5volt qu'à 3,3volt
  2. clock, sert à lire le contrôleur, bit par bit.
  3. latch, lit l'état des boutons et met le résultat dans le registre à décalage
  4. data, sortie des bits de lecture.
  5. pas de connection
  6. pas de connection
  7. gnd, 0 volt de l'alimentation.
La broche 1 est à l'extrémitée plate du connecteur.

schématiquement l'électronique du contrôleur ressemble à ceci:

Le contrôleur a 12 boutons et pour faire la lecture de ces boutons on procède comme suit.

  1. Envoie d'une impulsion sur la ligne LATCH
  2. Lecture du premier bit (bouton B) sur la ligne DATA
  3. Répéter 15 fois
    1. Envoie d'une impulsion sur la ligne CLOCK
    2. Lecture du bit sur la ligne DATA
Les lignes CLOCK et LATCH sont des sorties digitales sur le MCU et sont gardée à zéro volt. L'impulsion LATCH mets cette ligne à Vdd pour 250nsec. Cette impulsion a pour effet de lire l'état des boutons dans le registre à décalage. On obtient un instantané de l'état des boutons dans le registre après cette impulsion. Un bouton enfoncé correspond à 1 bit à zéro. Le bit du bouton B est disponible dès le latch. Il y a 12 boutons met le registre a 16 bits. Les 4 derniers bits sont toujours à 1. Après avoir lu le bit du bouton B on envoie 15 impulsions sur la ligne CLOCK pour lire les 15 bits restants. les bits sont décalés vers la sortie à la transition montante de l'impulsion clock.

snes-paddle.c

C'est très simple comme code. Il n'y a qu'une fonction dans l'interface application:

unsigned read_paddle(int paddleId)
paddleId identifie le contrôleur dont on veut faire la lecture PADDLE1 ou PADDLE2. read_paddle() utilise les fonctions latch() qui envoie l'impulsion sur la ligne LATCH et la fonction bit_shift() qui envoie l'impulsion sur la ligne CLOCK pour décaler vers la sortie DATA le bit suivant.

Les 2 contrôleurs sont lus en même temps puisque les lignes CLOCK et LATCH sont communes aux 2 contrôleurs. La ligne DATA du PADDLE1 est lue sur l'entrée digitale RA0 et la ligne PADDLE2 est lue sur l'entrée digitale RA1. Les variables p1 et p2 contiennent le résultat de la lecture respectivement pour chacun des contrôleurs. La valeur de l'argument paddleId détermine laquelle de p1 ou p2 la fonction retourne. Le masque 0xfff est appliqué pour ne retourner que les 12 premiers bits. La valeur des bits est inversée de sorte qu'un bouton enfoncé a son bit à 1. Les constantes pour sélectionner les différents bits dans l'entier sont définis dans le fichier snes-paddle.h. En fait j'ai emprunté ces définitions au projet hackvision.

Pour plus d'information sur les contrôleurs NES et SNES vous pouvez lire le document NES-controller-Hydra-Ch6All-v1.0.pdf en anglais qui se trouve dans le répertoire docs du dépôt github.

Aucun commentaire:

Enregistrer un commentaire