L'interface parallele 8255A

I ) Introduction :

Le 8255 est un circuit programmable de 40 broches (voir figure 1) d'interface d'entrée/sortie parallèle qui a été conçu pour travailler avec les microprocesseurs  de  la  famille  INTEL.  Il  est  formé  par  trois  ports d'entrées/sorties, chaque port est de 8 bits qui peuvent être programmés en entrée ou en sortie avec trois modes différents (mode zéro, mode un et mode deux).

Remarque :

Le port C est divisé en deux port C haut et port C bas

Le schéma bloque du 8255A est donné par la figure suivante :

Le schéma bloc du 8255 montre bien qu'il est divisé en deux groupes :

Le registre de données (Data buffer Bus) assure la liaison entre le bus de données   extérieur   et   le   registre   de   controle   ainsi   que   les   ports d'entrées/sorties.

La sélection du 8255A se fait par l'intermédiaire de la pine CS (qui est en général fournie par une logique de décodage qui permet la sélection du 8255A : voir plus loin les exemples d'applications)

Le bus d'adresse du 8255A est formé essentiellement par deux pines (A0et A1) qui permettent de sélectionner les ports ainsi que le registre de contrôle comme le montre le tableau suivant :

Plus en détail l'adressage des différents ports en entrée sortie se fait selon la table de vérité suivante :

Le  8255  est  connecté  avec  le  système  à  base  de  microprocesseur comme le montre la figure suivante :

Interfaçage avec le bus et mode de fonctionnement du 8255A

II ) Programmation du 8255A :

On peut programmer le 8255A selon trois modes :

Le format ainsi que le choix des modes se fait à partir du mot de contrôle suivant :

II-1 ) Le mode 0 du 8255 :

En mode zéro les ports du 8255A peuvent être programmés en entrée ou en sortie : 8 bits pour le port A , 8 bits pour le port B et le port C est formé de deux quartes ( un quarte haut et un quarte bas ) , donc il y a 16 combinaisons possibles  :

Exemple si on veut configurer le port A en sortie , port B en entrée , portc haut entrée et port C bas sortie le mot de commande est 93H

Le programme :

MOV  AL,  39H       ; Mot de commande
MOV DX , adresse_registre_de_commande
OUT  DX,AL   ; envoi du mot vers le registre de commande  
Remarque :

II-1 ) Exemple d'application en mode 0 :

Exemple 1 :

On donne le schéma de la figure 1,

A/ on veut écrire un programme qui permet de faire clignoter les diodes Led . Jusqu'à l'appui sur SW0

B ) On veut écrire un programme qui affiche les chiffres de 0 à 15 sur les 7 segments.

C ) On veut écrire un programme qui permet de faire clignoter les diodes paires si on appuie sur SW0 et les diodes impaires si on appuie sur SW1

On suppose que les adresses des ports est comme suit :

Port A : 300H

Port B : 302H

Port C : 304H

Registre de commande : 306H

A /Pour faire clignoter les diodes led il faut envoyer une fois 0FH puis effectuer une temporisation puis envoyer 00H et effectuer une temporisation voici l'organigramme qui assure ce fonctionnement :

Le programme est le suivant :

Donnee SEGMENT
PortA  EQU   300H 
PortC  EQU   300H 
Reg_com  EQU   306H 
Mot_com EQU   91H 
Masque_SW0  EQU  01H 
Diode_allume   EQU  0FH 
Diode_etainte EQU   00H 
Donnee ENDS
Code SEGMENT
Assume CS :code , DS :donnee
Prog Proc
       MOV AX,donnee       ; pointer le data segment
       MOV DS,AX
       MOV AL,Mot_com        ; configurer  les ports en sorties
       OUT  Reg_com,AL
Debut: MOV AL,Diode_allume   ; D3D2D1D0 = FH led allumé
       OUT PortA,AL
       CALL Tempo         ; temporisation
       MOV AL,Diode_etainte    ; D3D2D1D0 = 0H led etainte
       OUT PortA,AL
       CALL Tempo            ; temporisation
       IN AL,PortC                 ; Lecture du portC
       AND AL,01H            ; verifier s'il a appui sur SW0
       CMP AL,01H 
       JNZ Debut
       MOV AX,4C00H 
       INT 21H
       Prog endp
Tempo: MOV CX,7FFFH        ; Effectuer une temporisation
Temp1: PUSh CX              ; avec deux boucles imbriqués
       MOV CX,7FFFH
Temp2: NOP 
       NOP 
       NOP 
       NOP
       LOOP Temp2
       POP CX 
       LOOP Temp1
       RET Code 
       ends 
End prog

B ) Programme qui affiche les chiffres de 0 à 15 sur le 7 segment : L'organigramme du programme est donné par la figure suivante :

Le programme qui réalise cette opération :

Donnee SEGMENT
PortA EQU  300H 
PortB EQU  302H 
Reg_com EQU 306H 
Mot_com EQU 91H 
Masque_SW0 EQU  01H 
Diode_allume  EQU  0FH 
Diode_eteinte EQU  00H 
Donnee ENDS
Code SEGMENT
Assume CS :code , DS :donnee
Prog Proc
MOV AX,donnee       ; pointer le data segment
MOV DS,AX
MOV AL,Mot_com       ; configurer  les ports (A :S ) 
OUT  Reg_com,AL
XOR BX,BX
DEBUT: MOV AX,BX
AAA                 ; séparer les unités et les dizaines
OR AL,AH
OUT portB,al
CALL Tempo         ; effectuer une temporisation
INC BX
CMP BX,15          ; voir si BX = 15
JNZ DEBUT 
MOV AX,4C00H 
INT 21H
Prog endp
Tempo : MOV CX,7FFFH           ; Effectuer une temporisation
Temp1: PUSh CX              ; avec deux boucles imbriqués
MOV CX,7FFFH
Temp2: NOP NOP NOP NOP
LOOP Temp2
POP CX LOOP Temp1
RET 
Code ends 
End prog

C ) L'organigramme du programme est donné par la figure suivante :

Remarque :

Le battement signifie qu'on allume la diode puis on l'éteint une seule fois car dans notre cas il faut toujours lire les switches car l'utilisateur peut changer l'état des switches à tout moment.

Le programme de l'application est le suivant :

Donnee SEGMENT
PortA  EQU 300H 
PortC  EQU 302H 
Reg_com EQU 306H 
Mot_com EQU 91H 
Masque_SW0 EQU  01H 
Diode_allume  EQU  0FH 
Diode_etainte EQU 00H 
Donnee ENDS
Code SEGMENT
Assume CS :code , DS :donnee
Prog Proc
MOV AX,donnee          ; pointer le data segment
MOV DS,AX
MOV AL,Mot_com        ; configurer  les ports en sorties
OUT  Reg_com,AL
DEBUT: IN AL,PortC
AND AL,03H
CMP AL,01
JZ Diode_paire          ; si SW=1 alors battement paire
CMP AL,02
JZ Diode_impaire       ; si SW=1 alors battement impaire
JMP DEBUT
Diode_paire : MOV AL,05H          ; Battement des diodes paire
OUT PortA,AL
CALL Tempo                ; Temporisation
MOV AL,00H
OUT PortA,AL
CALL Tempo         ; Temporisation
JMP DEBUT
Diode_impaire : MOV AL,0AH         ; Battement des diodes impaire
OUT PortA,AL
CALL Tempo             ; Temporisation
MOV AL,00H
OUT PortA,AL
CALL Tempo                ; Temporisation
JMP DEBUT 
MOV AX,4C00H 
INT 21H
Prog endp
Tempo : MOV CX,7FFFH         ; Effectuer une temporisation
Temp1: PUSh CX           ; avec deux boucles imbriqués
MOV CX,7FFFH
Temp2: NOP 
NOP 
NOP 
NOP
LOOP Temp2
POP CX 
LOOP Temp1
RET 
Code ends 
End prog
Exemples 2 :

On donne le schéma de la figure suivante :

On suppose que les adresses des ports est donner comme suit :

Port A : 300H

Port B : 302H

Port C : 304H

Registre de commande : 306

Donner l'organigramme ainsi que le programme qui permet de générer le signal suivant :

L'organigramme qui permet de générer le signal précédant est comme suit :

Donnee SEGMENT
PortA EQU  300H 
Reg_com EQU 306H 
Mot_com EQU 91H 
Donnee ENDS
Code SEGMENT
Assume CS :code , DS :donnee
Prog Proc
MOV AX,donnee        ; pointer le data segment
MOV DS,AX
MOV AL,Mot_com      ; configurer  les ports en sorties
OUT  Reg_com,AL
DEBUT1: XOR AL,AL
DEBUT2:OUT PORTA,AL
CALL Tempo          ; Si on augmente la temporisation 
INC AL         ; on augmente la pente du signal 
CMP AL,0FFH         ; et bien sur la période T
JNZ DEBUT2
JMP DEBUT1
Prog endp
Tempo : MOV CX,7FFFH     ; Effectuer une temporisation
Temp1: PUSh CX         ; avec deux boucles imbriqués
MOV CX,7FFFH
Temp2: NOP 
NOP 
NOP 
NOP
LOOP Temp2
POP CX 
LOOP Temp1
RET 
Code ends 
End prog
Exemple 3 :

Pour commander un afficheur LCD 16*2 ( 16 caractères , 2 lignes ) on propose le schéma du montage suivant :

Un LCD est formé essentiellement par un bus de donnée de 8 bits et un bus de commande et contrôle formé par trois pines(E, Rd/Rw, RS) :

E : entrée de validation un front descendant sur cette pine provoque la validation de la donnée ou de la commande.

RS : elle permet de distinguer les commandes et les données. RS = 0 le bus D0-D7 accepte des commandes RS = 1 le bus D0-D7 accepte des données

Enfin Rd/Rw : c'est pour donner l'ordre de lecture ou écriture sur LCD. Parmis les commandes on trouve :

Exemple de programme qui affiche le message ‘bonjour iset n' sur LCD

Avant de commencer le programme il faut déterminer les mots qu'il faut envoyer au portB pour valider une donnée ou valider une commande d'où le tableau suivant :

On suppose que les adresses des ports est donner comme suit :

Port A : 300H

Port B : 302H

Port C : 304H

Registre de commande : 306H

Le programme est comme suit :

Donnee SEGMENT 
Message db ‘bonjour iset n'
PortB EQU  302H 
PortC EQU  304H 
Reg_com  EQU  306H 
Mot_com  EQU   80H 
Donnee ENDS
Code SEGMENT
Assume CS :code , DS :donnee
Prog Proc
MOV AX,donnee                 ; pointer le data segment
MOV DS,AX
MOV AL,Mot_com               ; configurer  les ports en sorties
OUT  Reg_com,AL
LEA SI,message                 ; Pointe le message à afficher 
MOV CX,14           ; on 14 caractère à afficher 
CALL Init_LCD     ; initialisation de l'LCD
DEBUT :        
MOV AL,[SI]                         ; programme principal 
OUT PortC,AL     ; envoie de la donnée 
CALL Vali_donnée         ; validation de la donnée
INC SI
LOOP DEBUT
Init_LCD :  MOV AL,01   ; effacer LCD
OUT PortC,AL
CALL Vali_commande      ; Validation de l'effacement
MOV AL,0EH                       ; effectuer un Home pour LCD
OUT PortC,AL
CALL Vali_commande      ; Valide le HOME
MOV AL,06                           ; Ecriture vers la droite
OUT PortC,AL
CALL Vali_commande      ; valide le mode d'écriture.
RET
Vali_commande :
MOV AL,04                  ; Sous programme validation
OUT PortB,AL                      ; de la commande
MOV AL,00
OUT PortB,AL
RET         
Vali_donnée : 
MOV AL,05                        ; Sous programme validation
OUT PortB,AL                      ; de la donnée
MOV AL,01
OUT PortB,AL
RET         
MOV AX,4C00H 
INT 21H
Prog endp
Exemple 4 : Commande d'un moteur Pas à Pas

On donne le schéma de la figure suivante :

Les différentes phases sont les suivantes (en mode avancement par un pas):

Les différentes phases sont les suivantes (en mode avancement par demi pas):

La  commande  des  phases  du  moteur  pas  à  pas  bipolaire  a  aimant permanent est donnée par le tableau suivant :

D'où le programme par exemple qui fait tourner le moteur pas à pas de 90° : On suppose que les adresses des ports est donner comme suit :

Port A : 300H

Port B : 302H

Port C : 304H

Registre de commande : 306H

1 pas = 0.9°

A+ est connecté avec PA0

B+ est connecté avec PA1

A- est connecté avec PA2

B- est connecté avec PA3

Le programme est comme suit :

Donnee SEGMENT
Phase db 03H, 06H, 0CH, 09H, 03H, 06H, 0CH, 09H 
PortA   EQU   300H
Reg_com EQU   306H 
Mot_com EQU   80H 
Donnee ENDS
Code SEGMENT
Assume CS : code, DS :donnee
Prog Proc
MOV AX,donnee                 ; pointer le data segment
MOV DS,AX
MOV AL,Mot_com               ; configurer  les ports en sorties
OUT  Reg_com, AL
MOV CX, 100                       ; 100 * 0.9° = 90°
DEBUT1 :   LEA SI, phase          ; Pointer sur le tableau des phases
DEBUT2 :   MOV AL,[SI]
OUT portA, AL                     ; Envoie des différentes phases
INC SI      
CMP SI,7
JNZ DEBUT2
LOOP DEBUT1
MOV AX, 4C00H                 ; Retour au DOS INT 21H
Prog endp
Code ENDS 
END PROG

II-2 ) Le Mode 1  du 8255A :

En mode 1 , les ports A et B sont utilisés en entrée ou en sortie gérées par les accès du portC .

Mode 1  : en entrée  :

En entrée les ports A et B sont configurés en entrée alors que le PC0, PC1 et Pc2 assure le handshake pour B et PC3, PC4 et Pc5 pour le A (PC6 et PC7 peuvent être programmés en entrée ou en sortie). STB : (Strobe input) : Au niveau bas , charge les données dans le verrou d'entrée . IBF :  (Input  Buffer  Full) :  Au  niveau  haut  les  données  ont  été verrouillées :

Remarque :

Le signal INTE est contrôlé par  le mot de commande du portC (PC4 pour le Port A et PC2 pour le Port B)

Le handshak en entrée est résumé par cette figure :

Au départ la périphérie charge les données dans les verrous d'entrée du 8255 (STB=0) puis le 8255 répond au périphérique par : chargement fait (IBF=1). Enfin le 8255 peut interrompre le fonctionnement du microprocesseur pour lui signaler qu'il a des données à prendre (INTR=1)

La figure suivante illustre ce mode de fonctionnement pour les portA et portB avec leur mot de commande respectif.

Remarque :

On ne trouve plus dans ce cas l'organisation symétrique du portc (c,a,d portc haut et portc bas)

Le chronogramme de fonctionnement dans ce mode est donné par la figure suivante :

Mode 1 : en sortie :

OBF :   (Output   Buffer   Full) :   Devient   égale   à   0   quand   le microprocesseur a écrit des données dans le port, et elle revient à 1 sur le front montant de WR et à 0 sur ACK à zéro.

 ACK : (Acknowledge Input) : = 0 signifie que les données ont été acquises.

INTR :  (Interrupt  Request) :  =1  demande  d'interruption  vers  le microprocesseur :

*    Mise à 1 par ACK, avec OBF=1 et INTE=1

*    Mise à zéro par le front descendant de WR

Donc on peut schématisé le transfert par la figure suivante :

La figure suivante illustre ce mode de fonctionnement pour les portA et portB  avec leur mot de commande respectif.

Le chronogramme de fonctionnement dans ce mode est donné par la figure suivante :

Remarque :

Le port A ainsi que le Port B peuvent être mis en entrée ou en sortie individuellement dans le mode 1 : c'est le mode mixte

II-3 ) Le Mode 2 du 8255A :

             Le  mode  2  ne  s'applique  qu'au  port  A.  il  permet  de  crée  un  bus bidirectionnel sur le port A sur 8 bits, 5 bits du portC sont utilisés pour le statut et le contrôle du portA (permette un handshak similaire au mode 1).

Commande du Bus bidirectionnel :

*    INTR : ( Interrupt Request : E/S) : Demande d'interruption ( au niveau haut).

*    OBF : (Output Buffer Full : S) :

i.  Niveau bas : le buffer de sortie est autorisé à émettre la donnée.

ii.  Niveau haut : le buffer de sortie est au 3eme état

*    STB : (Strobe Input : E) : Niveau bas : les données sont chargées dans le verrou.

*    IBF : (Input Buffer Full : E) : Haut : les données ont été chargées.

*    INTE 1 : (Interrupt 1 : S) : Le flip-flop associé à OBF est contrôlé par PC6.

*    INTE 2 : (Interrupt 2 : E) : Le flip-flop associé à IBF, contrôlé par

PC4.

III ) Connections du 8255 avec le microprocesseur 8086 :

Pour connecter une interface de 8 bits (le 8255A) avec un bus de données de 16 bits (Le 8086) il faut prendre des précautions en effet on a vu dans  le  paragraphe  « organisation  physique  de  la  mémoire »  qu'avec  le microprocesseur 8086 si on  accède à une adresse paire les données serons transmises sur le bus de données D0-D7 mais si on accède à une adresse impaire les données seront transmises sur D8-D15, Or avec la mémoire on veut que le Bank 0 est connecte au signal BHE et le bank1 est lié avec A0 ( pine d'adresse). Dans le cas du 8255 on a le même problème qu'il faut résoudre lorsque on veut connecter cette interface avec un microprocesseur  8086.on prenons en considération le tableau suivant :

Donc les adresses des ports :

On utilise les adresses paires et impaires mais à ce moment il faut mettre deux buffer bidirectionnels tels que le 8286 ou encore 74245. Le schéma est donné alors comme suit :

Donc les adresses des ports :

interface parallèle microprocesseur 8255 memoire programmation formation cours architecture INTEL

Révisé le :11-11-2017 www.technologuepro.com Facebook Twitter RSS