Accueil | Page d'électronique


Le module de lecture 8 bits

Ceci constitue la suite du palpitant dossier d'acquisition de données. Dans le premier article, nous avons élaboré un circuit pour lire 8 bits sur le port parallèle d'un ordinateur. Dans ce second article, le grand défaut du premier module de lecture sera corrigé. Le défaut provenait du fait que d'une lecture à l'autre, à l'intérieur d'un même octet, les valeurs lues ne correspondaient pas nécessairement au même octet. Enfin, il est important de noter que ce module sera la base du troisième article, qui traite de la conception d'un oscilloscope. La lecture du présent article s'avère donc TRÈS importante.

Le problème peut être résolu facilement par l'utilisation d'une mémoire tampon, qui retiendra un octet tant que les deux lectures de 4 bits n'ont pas été faites. Ensuite, le tampon absorbe un nouvel octet pour une nouvelle suite de deux lectures de 4 bits. Le tampon dont il est question est en fait un 74LS273 (je crois que le 74LS373 fait aussi l'affaire). En anglais, on le nomme "Octal "D" Flip-Flop with Clear". Son shéma de branchement est présenté à droite.

Ce que nous dit la fiche technique de Texas Instruments (disponible sur internet), est qu'il s'agit d'un ensemble de 8 bascules bistables, activées avec un front montant. Cela signifie que le contenu des entrées "D" est transféré aux sorties "Q" lorsque le signal appliqué à la broche "Clock" (CLK) passe de 0 à 1. Par conséquent, lorsque "clock" est à 0, 1, ou passe de 1 à 0, rien ne se passe. Enfin, ce composant est certifié de fonctionner à des fréquences variant entre 0 et 30 MHz (sur "clock", ce qui devrait suffire très amplement à nos besoins.

Sur la table de fonctionnement ci-après, ce qui a été dit plus tôt est ici observable. Selon la première ligne du tableau, si on applique un "0" à la broche "Clear" (CLR - le souligné désigne une logique négative), les sorties "Q" sont toutes mises à "0". Les deux prochaines lignes montrent que c'est le front montant (transition de 0 à 1) de "clock" qui actionne le transfert des données présentées sur "D" vers les sorties "Q". Après cela, les données peuvent changer, mais elles ne seront pas pris en compte, même si "clock" reste à "1", ou revient à "0", comme le montre la fin du tableau.

Table de fonctionnement du 74LS273

Entrées
Sortie
Q
Clear
Clock
D
0
X
X
0
1
1
1
1
0
0
1
0
X
Q0
X = Pas d'importance (0 ou 1)
Q0 = État précédent

Le circuit est ici représenté le plus simplement possible, pour pouvoir bien remarquer son fonctionnement. Les données à lire sont présentées sur les broches "D" du tampon 74LS273. Au moment approprié, celui-ci transfère ces données sur les broches "Q" pour que le 74LS157 puisse les multiplexer.

Un petit éclaircissement à propos des données à lire: L'octet traité par le circuit peut provenir de diverses sources. Dans le prochain article, il s'agira d'un convertisseur Analogique-Digital. Pour l'application présente, cependant, je conseille fortement l'utilisation d'un DIP switch. Cela simplifiera énormément le déboggage du circuit, si une erreur était survenue à sa réalisation. Un DIP switch est en fait une série d'interrupteurs (ici ce sera 8 interrupteurs). Les interrupteurs sont câblés de manière à ce que quand l'interrupteur est ouvert (à "OFF"), une résistance ramène la tension dans le fil à la masse, ce qui fera lire un "zéro". Mais lorsque l'interrupteur est fermé, le voltage positif vient faire remonter la tension appliquée au tampon, à un niveau qu'il interprétera comme étant un "1". Cela est représenté sur le petit shéma, à gauche.

Examinons maintenant la séquence exacte d'une lecture. Supposons au départ que STROBE est à un niveau bas (0 volts). D'abord, le logiciel met la broche STROBE du port parallèle à un état élevé (+5 volts). Pour cela, le bit 0 du registre de commande (Adresse de base + 2) doit être mis à 0, et non pas 1, car la broche est inversée par le port parallèle. Les deux circuits intégrés, c'est-à-dire le multiplexeur 74LS157 et le tampon 74LS273 sont affectés par ce changement. Le 74LS157 est alors en train d'aiguiller le quartet (4 bits) de poids faible (B1 à B4) sur ses sorties (Y1 à Y4). De plus, le 74LS273 vient de recevoir un front montant, ce qui a pour effet de transférer les données sur ses sorties (1Q à 8Q). Par conséquent, une nouvelle valeur vient d'être prise en compte par le circuit. Le logiciel s'apprête donc à lire le quartet de poids faible d'une nouvelle valeur.

Une fois que le premier quartet a été lu, le logiciel doit ramener la broche STROBE du port parallèle à un état bas, donc mettre le bit 0 du registre de commande (Adresse de base + 2) à 1 (rappelez-vous de l'inversion). Ceci a pour unique effet de changer l'aiguillage du 74LS157 pour que le logiciel puisse lire le quartet de poids fort. Puisqu'un front descendant a été appliqué à la broche STROBE, le 74LS273 ne transfère pas de nouvelle valeur. Le quartet lu est donc assurément le complément du premier quartet qui avait été lu, en ce sens que les deux quartets, une fois remis ensemble, donneront bien l'octet qui avait été tranféré par le tampon 74LS273, et non le quartet d'un premier octet, et le second quartet d'un octet différent. C'est d'ailleurs le rôle principal du tampon 74LS273, comme mentionné en début d'article.

Le logiciel qui accompagne ce circuit est très simple de fonctionnement. Une fonction "ParaIn" ou "ParaInMulti" est chargée de lire un octet sur le port parallèle. C'est donc cette fonction qui se charge de contrôler le circuit comme on vient de le voir. Le programme principal, de son côté, se contentera d'afficher constamment une lecture à l'écran, ou lorsque l'utilisateur lui en fait la demande. Ceci permettra de vérifier chaque lecture, en prenant le temps qu'il faut. Enfin, une petite fonction "ConvDecBin" permet de visualiser l'état de chacun de 8 bits, mais le fonctionnement de cette fonction ne sera pas expliqué ici.

J'ai écrit deux versions du logiciel. L'une en Quick Basic 4.5 (peut fonctionner avec QBASIC qui vient avec DOS), l'autre, beaucoup plus rapide, en Borland Turbo C++, version 3.0 pour DOS. Vous pouvez les visionner dans cette même page, ou les télécharger par ces liens:

Version pour Quick Basic 4.5: Mod8bits.bas.zip

Version pour Borland Turbo C++ 3.0 pour DOS: Mod8Bits.c.zip

Voici le programme pour Quick Basic 4.5.



' Par Nicolas Marchildon
' Web: http://www.geocities.com/WestHollywood/Village/4509/
' E-Mail: nicolas@marchildon.net
'
DECLARE FUNCTION ConvDecBin$ (nb1%)
DECLARE FUNCTION ParaInMulti% (TypeLect%)
DECLARE FUNCTION InverserBit% (Attribut%, Bit%)
DIM Valeur AS INTEGER

CLS
COLOR 15
PRINT "PROGRAMME POUR LIRE 8 BITS SUR LE PORT PARALLÈLE"
COLOR 7
PRINT "Avec le module de lecture 8 bits"
PRINT "Par Nicolas Marchildon, juin 1998"
PRINT "http://www.geocities.com/WestHollywood/Village/4509/"
PRINT
PRINT "Pour lire une valeur, appuyez sur une touche; pour quitter, appuyez sur 'q'."
PRINT
PRINT "                       Décimal   Hexadécimal    Binaire"
PRINT "Lectures constantes:"
PRINT "Lecture demandée:"
PRINT

'PRINT "-------------------------------------------"
'PRINT "Table de convertion hexadécimal --> binaire"
'PRINT
'PRINT "          0  0000     8  1000"
'PRINT "          1  0001     9  1001"
'PRINT "          2  0010     A  1010"
'PRINT "          3  0011     B  1011"
'PRINT "          4  0100     C  1100"
'PRINT "          5  0101     D  1101"
'PRINT "          6  0110     E  1110"
'PRINT "          7  0111     F  1111"

COLOR 15
DO
  Clavier$ = INKEY$
  Valeur = ParaInMulti(0)
  LOCATE 9, 25
  PRINT Valeur
  LOCATE 9, 38
  PRINT HEX$(Valeur)
  LOCATE 9, 49
  PRINT ConvDecBin(Valeur)
 
  IF Clavier$ <> "" THEN
    LOCATE 10, 25
    PRINT Valeur
    LOCATE 10, 38
    PRINT HEX$(Valeur)
    LOCATE 10, 49
    PRINT ConvDecBin(Valeur)
  END IF

LOOP UNTIL UCASE$(Clavier$) = "Q"

COLOR 7
END

FUNCTION ConvDecBin$ (nb1%)
  DIM Bit$(20)
  FOR e = 1 TO 20: Bit$(e) = "": NEXT e
  Ancien = nb1%
  d = 0
  DO
    d = d + 1
    Nouv = Ancien / 2
    'PRINT Nouv
    IF Nouv > INT(Nouv) THEN Bit$(d) = "1" ELSE Bit$(d) = "0"
    'PRINT INT(Nouv)
    Nouv = INT(Nouv)
    'PRINT bit$(D)
    Ancien = Nouv
    'FOR e = 1 TO 20: PRINT bit$(e); : NEXT: PRINT
  LOOP UNTIL Nouv = 0
  FOR e = 8 TO 1 STEP -1
    IF Bit$(e) = "" THEN Bit$(e) = "0"
    Temp$ = Temp$ + Bit$(e)
    IF e = 5 THEN Temp$ = Temp$ + " "
  NEXT e
  ConvDecBin$ = Temp$
END FUNCTION

FUNCTION ParaInMulti% (TypeLect%)
  '
  ' LECTURE DE 8 BITS EN MULTIPLEXAGE, version "Module de Lecture 8 bits".
  '
  ' Le multiplexage se fait avec un multiplexeur, le 74 LS 157. La broche
  ' STROBE du port parallèle contrôle le sélecteur du 74 LS 157, et la broche
  ' d'horloge du 74LS273.
  '
  ' Ce code lit les 4 bits de poids FAIBLE, libérant ainsi le dernier,
  ' le MSB, pour d'autres choses. (XLLLLXXX, où L = Lu, et X = pas lu)
  '
  ' Lecture du quartet de poids faible -=-=-=-=-=-=-=-=-=-
  '   Mise de la broche STROBE à 1 (pin #1, bit #0)
  '    -Le bit 0 est forcé à 0, et non pas 1, car il est inversé lorsqu'il sort.
  '    -Je ne change que le bit que je veux changer, sans toucher aux autres,
  '     alors je lis ce qu'il y avait déjà pour y inclure ce que je veux.
  OUT &H37A, (INP(&H37A) AND NOT &H1)  ' XXXXXXXX devient XXXXXXX0
  '                                    ' où X = bits qui étaient déjà là.
  ' Lecture: On applique le masque 0xxxx000 et on décale de 3 vers la droite
  '          (le "/8" représente le décalage, donné par 2 exposant 3.)
  Faible% = (INP(&H379) AND &HFF78) / 8
  ' LOCATE 1, 1: PRINT "Faible:"; ConvDecBin(Faible%); "            "
  '
  ' Lecture du nibble de poids fort -=-=-=-=-=-=-=-=-=-
  '   On met la broche STROBE à 0
  OUT &H37A, (INP(&H37A) OR &H1) ' Le bit 0 est forcé à 1, et non pas 0.
  '
  ' Lecture: On applique le masque 0xxxx000 et on décale de 1 vers la gauche
  '          (le "*2" représente le décalage, donné par 2 exposant 1.)
  Fort% = (INP(&H379) AND &HFF78) * 2
  ' LOCATE 2, 1: PRINT "Fort:"; ConvDecBin(Fort%); "                 "
  '
  ' -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  ' Mise en commun
  ParaInMulti = Faible% + Fort%
  '
END FUNCTION

Enfin, le programme en Borland C++ v3.0 pour DOS.

EN Construction..........


Accueil | Page d'électronique

Cette page a été entièrement crée et est gérée par Nicolas Marchildon