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




' 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