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 :
- Groupe A : formé par le port A et le port C haut.
- Groupe B : formé par le port B et le port C bas.
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 :
- Mode 0 : Entrée/sortie de base.
- Mode 1 : Entrée sortie échantillonnée.
- Mode 2 : Bus bidirectionnel.
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 commandeRemarque :
- Les sorties sont mémorisées dans des bascules D.
- Les entrées ne sont pas mémorisées.
- Sur un RESET, tous les ports sont positionnés en mode entrées et il faut les reprogrammer, si nécessaire.
- Les bascules du port C peuvent être mises à 1 ou à 0 individuellement, lorsque le bit 7 du mot de commande est égal à 0 . Le mot de commande devient alors :
- Pour mettre à 1 le PC3 par exemple le mot de commande est : 00000111
- Pour mettre à 0 le PC3 par exemple le mot de commande est : 00000110
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 progB ) 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 progC ) 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 progExemples 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 progExemple 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 endpExemple 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 PROGII-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 :
- IBF = 1 par STB au niveau 0
- IBF = 0 par le front montant d'un RD (read) INTR : (Interrupt Request) : Au niveau haut : demande d'interruption vers le microprocesseur :
- INTR = 1 par STB=1, IBF=1 et INTE=1
- INTR =0 par le front descendant d'un RD (read)
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 :
- 1er solution : utilisation des adresses paires : c'est-à-dire que les pines A1 et A2 du microprocesseur seront connecté respectivement au pine A0 et A1 du 8255. Le schéma de la solution est donné comme suit :
Donc les adresses des ports :
- 2eme solution : utilisation des adresses paires et impaires
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