RC2014: Assemblage et test de la carte Digital I/O

Dans le dernier article de la série RC2014 nous testions pour la toute première fois cet ordinateur Z80 en basic.

Ayant lu la documentation du Basic (voir lien ci-dessus), j'ai eu la joie d'y trouver en page 10 les instructions  OUT() et INP() permettant de faire des appels I/O. Je me suis donc dit que ce serait le moment idéal pour assembler et tester le module Digital I/O pour RC2014 (rc2014.co.uk). 

Module Digital IO

Le module Digital I/O propose 8 bits de sorties (des LEDs) et 8 bits d'entrées.

module Digital I/O pour RC2014

Ce module peut être utilisé comme interface homme-machine mais elle permet surtout d'apprendre comment interfacer de l'électronique avec le Z80.

Ce module utilise les bits A0 et A1 du bus d'adresse pour identifier l'adresse/port utilisée par le module. De sorte, il est possible d'utiliser les entrées et les sorties sur les adresses/port 0x00, 0x01, 0x02 et 0x03.

C'est pour cela qu'il y a des cavaliers Input Port (port d'entrée, a droite) et Output port (port de sortie, à gauche). Ces valeurs peuvent être interprétées comme l'adresse/port à utiliser (rien n'empêche d'utiliser deux adresses différentes pour l'entrée et la sortie mais cela va singulièrement compliquer la compréhension du système).
Il est possible de placer jusqu'à 4 modules Digital I/O sur le RC2014.

Sur le bus I/O du Z80, l'opération d'écriture (/WR) et lecture (/RD) sont distinctes et mutuellement exclusives. 

Lors d'une lecture (/RD): c'est la partie droite du module qui est activée pour lire l'état des boutons.

Lors d'une écriture (/WR): c'est la partie gauche du module qui est activé pour modifier l'état des LEDs.

Note d'assemblage

  • Les deux cavaliers à côté des diodes sont en place (ils raccordent les deux adresses A0 et A1) sur le démultiplexeur juste à droite. Nous y reviendrons plus tard.
  • Input Port configuré sur l'adresse/port 0x00
  • Output port configuré sur l'adresse/port 0x00

J'ai pris la liberté de replier les LEDs sur le dessus supérieur de la carte. C'est pour qu'elles soient plus facilement visibles (sur 360°).

C'est du binaire!

Pour pouvoir commander les LEDs et lire les boutons, il faut pouvoir comprendre le codage binaire. Si vous connaissez déjà alors cela sera limpide... sinon voici quelques informations complémentaires.

L'opération d'écriture ou de lecture permet d'échanger un octet (un Byte) avec la carte. Un octet est composé de 8 bits... "8 lignes" pouvant avoir soit la valeur 0 (0 volts) ou 1 (5 volts). 

C'est pour cela qu'il y a 8 LEDs car chaque bit contrôle une LED. Il y a aussi 8 boutons, un bouton pour fixer la valeur de chacun des 8 bits.

Comme l'indique le graphique ci-dessus, on voit que 8 bits (un octet) permet aussi d'encoder une valeur entière entre 0 et 255.

Il y a une corrélation étroite entre la valeur numérique envoyée sur le port I/O du module et les LEDs qui seront allumée.

Si vous avez besoin d'en apprendre plus sur le codage/décodage binaire, vous pouvez consulter les deux liens suivants (attention à la PUB, ça pique les yeux!):

Etat initial / Mise sous tension

A la mise sous tension, toutes les sorties du module digital I/O est à 1.
Toutes les LEDs sont donc allumées des la mise sous tension.

A noter que le signal RESET n'est pas exploité par la carte (donc pas de réinitialisation des sorties qui restent dans le même état).

Commander les LEDs

Pour activer des LEDs, il suffit de composer la valeur numérique correspondant au bits (LEDs) à activer.


Puisque nous savons que le module est configuré sur l'adresse/port 0x00 (0 en décimal), il faudra saisir l'instruction Basic suivante pour allumer les LEDs 0, 2, 4, 5.

OUT 0, 53 

Pour tout allumer OUT 0, 255  et pour tout éteindre OUT 0, 0  .

Lecture des boutons

Il est également possible de lire l'état des boutons en utilisant la fonction INP( port ) depuis Basic. Cela provoque une opération de lecture (/RD) sur le bus IO à l'adresse/port indiqué. La fonction INP( port ) retourne un entier entre 0 et 255, valeur en relation directe avec les boutons pressés au moment de la lecture.

Dans l'exemple ci-dessous, si les boutons 7 et 0 sont pressés au moment de la lecture alors la valeur retournée par INP(0) est de 129 .


L'instruction Basic ci-dessous effectue la lecture sur l'adresse/port 0 .

print inp( 0 )

Voici la capture de ce que produit Basic.


C'est bien d'avoir la valeur 129 mais comment savoir quel bouton a été pressé ?

Cela se fait à l'aide d'un test. Pour tester le bouton 7 il faut réaliser le test (val and 128) = 128 .

La capture suivante présente un programme Basic élémentaire testant les possibilités pour les 8 boutons (bits 7 à bit 0). Il y a d'autres façon plus élégantes de réaliser ces tests.


A noter que la valeur 128 peut également être obtenue par l'opération 2^7 qui correspond à 2 exposant 7 (ou 2^numéro_du_bouton avec le numéro_du_bouton=7 )

La suite

Dans le prochain article, nous inspecterons le schéma du module Digital I/O pour comprendre comment il fonctionne.

Aucun commentaire