Accueil | Page d'électronique


Le module de lecture 8 bits simplifié

Grâce à ce module, une fois connecté à votre ordinateur, vous pourrez lire 8 bits le plus implement possible. Le port parallèle dispose de 5 bits de lecture. Dans le cadre de ce montage, nous voudrons en lire 8. Pour cela, nous utiliserons 4 des entrées du port, pour lire en deux étapes les 8 bits à lire.

Ce procédé se nomme le multiplexage, et nous utiliserons le 74LS157. Celui-ci agit à la manière d'un aiguilleur. En gros, il a comme entrées 8 bits, et selon l'état de sa broche d'aiguillage - SELECT - il transfère soit les 4 bits de poids fort ou de poids faible sur ses sorties. Ces 4 bits sont alors disponibles pour que le port parallèle puisse les lire.

Autant vous avertir d'avance, ce circuit comporte un défaut majeur. En effet, à la lecture d'une valeur très changeante (oscillation entre les valeurs 01111111 et 10000000 en binaire), une erreur de lecture se produit. L'explication est très simple: la première lecture des 4 bits composant l'octet s'effectue normalement. Mais lorsque vient le temps de lire les 4 autres bits, la valeur à lire a déjà changé et la lecture retourne une valeur qui, une fois mise en commun avec la valeur de la première lecture, engendre une erreur. L'effet est d'autant plus remarquable lorsque le quartet (4 bits) de poids faible oscille entre deux valeurs très différentes, comme dans l'exemple précédent, où le quartet variait entre 1111 et 0000.

Évidemment, nous ne nous laisserons pas vaincre aussi facilement. Le prochain montage apportera, à l'aide d'une "mémoire temporaire", la solution à notre problème (Flip Flop, ou bascule bistable 74LS273).

Donc, pour lire 8 bits, nous devrons contrôler le multiplexeur 74LS157 de façon à lire en deux temps chacun des deux quartets (4 bits) qui composent l'octet (8 bits).

Jetons maintenant un coup d'oeil à la fiche technique du 74LS157.

Sur le shéma de branchement ci-haut, on constate bien les 8 entrées (inputs) A1 à A4 et B1 à B4, et les 4 sorties (output) Y1 à Y4. En vérité, il y a 4 aiguilleurs, possédant chacun deux entrées et une seule sortie. Évidemment, il y a les deux broches d'alimentation, mais aussi la broche d'aiguillage SELECT, et enfin, la broche STROBE. Si cette broche est reliée au +5 volts de l'alimentation, toutes les sorties seront toujours à 0, peu importe l'état des autres entrées, comme on peut le voir sur la table suivante:

Table de fonctionnement du 74LS157

Entrées
Sortie Y
Strobe
Select
A B
1
X
X X
0
0
0
0 X
0
0
0
1 X
1
0
1
X 0
0
0
1
X 1
1
X = Pas d'importance (0 ou 1)

Ce que l'on peut constater sur cette table c'est que lorsque SELECT est relié à la masse, donc à un état bas (low), ce sont les "A" qui sont transférés sur les sorties Y, et lorsque SELECT est relié à la borne positive (+5v) de l'alimentation, donc à un état élevé, ce sont les "B" qui sont copiés sur les "Y".

Lorsque vient le temps de brancher le multiplexeur à votre PC, on doit d'abord analyser les broches qui sont disponibles pour le faire, sur le port parallèle. Nous avons besoin de 4 broches de lecture. Le port parallèle en comporte 5. Pour simplifier le plus possible le traitement par l'ordinateur, nous prendrons soin de placer les 4 bits de sortie du multiplexeur sur les 4 bits de poids faible qui sont lus par l'ordinateur. En effet, la dernière broche, le bit 7, est inversée. Par conséquent, si on l'utilisait, on devrait soit utiliser un inverseur du genre 74LS04 ou inverser le bit avec le logiciel, ce qui ralentirait le processus de lecture. Toutefois, il est possible de le faire, et c'est pourquoi j'ai inclus l'option dans le codage du logiciel dont nous aurons besoin.

Les interrupteurs sont câblés de manière à ce que quand l'interrupteur est ouvert (coupé), une résistance ramène la tension dans le fil à la masse. Mais lorsque l'interrupteur est fermé, le voltage positif vient faire remonter la tension appliquée au décodeur à un niveau qu'il interprétera comme étant un "1".


' Ensemble de fonctions pour "discuter" avec le port parallèle le plus
' simplement possible.
' Par Nicolas Marchildon
' Web: http://www.geocities.com/WestHollywood/Village/4509/
' E-Mail: nicolas@marchildon.net
'
' AVEC UN PENTIUM 133MHz
' On peut atteindre un vitesse d'échantillonnage de 15000 lectures/seconde!
' En C++, 20 fois plus rapide, 300000 lectures/seconde...
'
DECLARE FUNCTION ConvDecBin$ (nb1%)
DECLARE FUNCTION ParaInMulti% (TypeLect%)
DECLARE FUNCTION InverserBit% (Attribut%, Bit%)
DECLARE SUB ParaOut (Endroit%, Valeur%, TypeLect%)
DECLARE FUNCTION ParaIn% (TypeLect%)
DIM Ecran(640) AS INTEGER

ON TIMER(1) GOSUB Temps
TIMER ON

CLS
SCREEN 9
Largeur = 640
FOR ligne = 0 TO 255
  LINE (0, ligne)-(Largeur, ligne), 1
NEXT ligne

DO
  a$ = INKEY$
  IF a$ = "-" THEN Largeur = Largeur - 1
  'FOR t = 1 TO 0: NEXT t
  Posi = Posi + 1
  IF Posi > Largeur THEN
    Posi = 0
    NbEcrans = NbEcrans + 1
  END IF
  PSET (Posi, Ecran(Posi)), 1
  Ecran(Posi) = ParaInMulti(0)
  CALL ParaOut(0, Ecran(Posi), 0)
  PSET (Posi, Ecran(Posi)), 15
  ' IF Ancien <> Lecture THEN BEEP
  Ancien = Lecture
LOOP UNTIL INKEY$ = " "
END

Temps:
LOCATE 1, 1
PRINT NbEcrans * Largeur + Posi
NbEcrans = 0
RETURN

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 InverserBit% (Attribut%, Bit%)
  ' Ceci est plutôt compliqué à comprendre, mais je ne l'ai pas pris
  ' dans un livre, c'est moi-même qui l'ai élaboré... à la sueur de mon
  ' cerveau!   Conséquence: Distribuez gratuitement quand-même!
  InverserBit% = (Attribut% AND NOT Bit%) OR (Bit% AND (NOT (Attribut% AND Bit%)))
END FUNCTION

FUNCTION ParaIn% (TypeLect%)
  '
  ' Lecture de 5 bits sur le port parallèle
  ' Les bits que l'on lit sont les 5 plus haut (en poids)
  ' Le bit 7 est à inverser
  ' Le tout est décalé de 3 positions vers Bit 0 ( le "/ 8")
  '
  SELECT CASE TypeLect%
    CASE 0
      ' Le hardware est inexistant pour inverser le bit 7
      '
      ParaIn% = (InverserBit(INP(&H379), &H80) AND &HFFF8) / 8
      '                                         AND NOT &H0007
    CASE 1
      ' Avec hardware pour inverser le bit 7
      '
      ParaIn% = (INP(&H379) AND &HFFF8) / 8
      '
  END SELECT
END FUNCTION

FUNCTION ParaInMulti% (TypeLect%)
  '
  ' LECTURE DE 8 BITS EN MULTIPLEXAGE
  '
  ' 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.
  '
  ' La Lecture
  '
  ' Il y a plusieurs façons de lire 8 bits en 2 temps (4 bits à la fois)
  '  A) Pas de hardware pour inverser les pins qui en ont besoin
  '  B) Des 74LS04 sont présents pour assurer la logique positive (cette
  '     option permet de libérer le CPU de ces opérations --> Rapidité)
  ' De plus, on peut soit lire les 4 bits de poids faible, car il y en a cinq
  ' en tout, ou les 4 bits de poids fort. Ceci revient à déterminer si l'on
  ' laisse le LSB ou le MSB de la lecture disponible pour d'autres usages.
  '
  SELECT CASE TypeLect%
    CASE 0 ' -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  '       (Peu importe le Hardware, car Low nibble lu.)
  ' Ici, puisqu'on utilise pas le dernier bit (7) qui doit être inversé, le
  ' code qui suit peu être utilisé avec ou sans hardware pour ce bit.
  ' Ce code est pour les 4 bits de poids FAIBLE, libérant ainsi le dernier,
  ' le MSB, pour d'autres choses.
  '
  ' Lecture du nibble 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)
  '
  ' 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%); "                 "
  '
  CASE 1 ' -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  '     (Hardware disponible, high nibble)
  ' Le code est à venir...
  '
  CASE 2 ' -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  '     (Hardware non disponible, high nibble)
  ' Le code est à venir...
  '
  END SELECT
  ' -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  ' Mise en commun
  ParaInMulti = Faible% + Fort%
  '
END FUNCTION

SUB ParaOut (Endroit%, Valeur%, TypeLect%)
  SELECT CASE Endroit%
    CASE 0
      ' Envoyer la valeur sur le port de données (Adresse de base + 0)
      OUT &H378, Valeur%
    CASE 2
      ' Envoyer la valeur sur le port de commande
      ' Seuls les 4 premiers bits sont reconnus, les autres doivent être
      ' mis à 0.
      ' ATTENTION!! CECI PEUT INTERFÉRER AVEC LA FONCTION "ParaInMulti" !!!
      Valeur% = Valeur% AND &HF
      '
      ' Sortie
      SELECT CASE TypeLect%
        CASE 0
          ' Le hardware est inexistant
          ' On doit inverser les bits 0, 1, et 3.
          OUT &H37A, InverserBit(Valeur%, &HB)
        CASE 1
          ' Le hardware est présent
          OUT &H37A, Valeur%
        CASE ELSE
          PRINT
          PRINT "Erreur. Valeur"; TypeLect%; "non reconnue comme TypeLect% dans ParaOut"
          END
      END SELECT
    CASE ELSE
      PRINT
      PRINT "Appel de fonction invalide à la fontion ParaOut."
      PRINT "La valeur"; Endroit%; "a été envoyée comme paramètre de port."
      PRINT "Fin du programme"
      END
   END SELECT
END SUB


Accueil | Page d'électronique

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