Académique Documents
Professionnel Documents
Culture Documents
Interfaces d’Entrées/Sorties
1
Contenu:
2
Introduction
Un “Système à processeur” (exple: PC) possède l’architecture suivante:
Processeur BUS
Processeur
(80 Mhz)
Introduction
Les microcontrôleurs (µc): Des SOCs à usage général
Processeur BUS
Entrées /Sorties
Ces périphériques sont ajoutés
Timer(s)
Parallèles
Périphériques selon l’application ciblée:
Convertisseur(s) Communication additionnels On trouve:
A/N & N/A série Périph. Ethernet pour les
applications réseaux.
Périph. CAN pour les application
Ces périphériques qui se Automobiles.
trouvent pratiquement dans Périph PWM pour les application
tous µc en nombres de commande de moteurs.
différents.
Introduction
La programmation d’un système embarqué :
Bus de contrôle
Bus d’adresses
Bus de données
Les mémoires
CS
AN-1
Une mémoire est caractérisée par : AN-2
. Mémoire
• N lignes d’adresses: AN-1 AN-2 …..A0 .
A0
• M lignes de données DM-1DM-2……D0
Adresse Contenu
A2 A1 A0 D3 D2 D1 D0
Cette mémoire contient: 1 1 1 (07) 1 1 0 1
1 1 0 (06) 1 0 0 1
A2
• 23 = 8 mots occupant 8 adresses : [0..7]. 1 0 1 (05) 0 1 0 0
A1
A0 1 0 0 (04) 1 1 0 0
• Chaque mot (adresse) ayant une taille
0 1 1 (03) 0 0 0 0
de 4 bits.
0 1 0 (02) 1 0 0 0
0 0 1 (01) 0 1 1 0
0 0 0 (00) 1 1 1 0
D3D2D1D0
Les mémoires
Pour une écriture de la donnée 1111dans la mémoire du mot ayant l’adresse 06 = 110:
Microprocesseur
RD
READ Circuit d’interface
WR E/S
WRITE
Registre 2N-1
AN-1
AN-1 ……..
..
. Registre 1
. A0
A0 Registre 0
DM DM-1… D0
DM-1 …………… D0
Bus de données
Interfaces d’Entrées/Sorties (2) : Connexion externe
RD
b7 b6 b5 b4 b3 b2 b1 b0
WR
Registre i
AN-1
.. b7 b6 b5 b4 b3 b2 b1 b0
A0 Registre i-1
DM-1 …………… D0
Circuit d’interface
E/S (Interne) Interface E/S vu de l’extérieur
Interfaces d’Entrées/Sorties (3) : Sortie
Un registre de l’interface d’E/S peut être utilisé en SORTIE pour une communication du
µp vers l’extérieur Écriture dans le registre
La valeur de chacun des bits de la donnée écrite dans le registre est transformée:
• en un niveau de tension(V+ = 5V) au niveau du pin si le bit = ‘1’.
Circuit d’interface
E/S 5V
μP
RD
READ
WR
WRITE
0V
AN-1 ‘1’
b b b b b b
‘0’
b b
AN-1 .. 7 6 5 4 3 2 1 0
.
1 0 1 1 0 0 1 0 Registre E/S
. A0
A0
D7 D6… ..D0
D7 …. …………… D0
Bus de données
16
Interfaces d’Entrées/Sorties (4) : Entrée
Un registre de l’interface d’E/S peut être utilisé en ENTREE (communication de l’extérieur vers le µp):
L’application d’un niveau de tension quelconque sur les pins du connecteur se traduit par:
• Apparition d’un ‘ 0 ’ au niveau du bit si on applique au pin une tension de 0V.
• Apparition d’un ‘ 1 ’ au niveau du bit si on applique au pin une tension de +5V.
Circuit d’interface
E/S 0V
μP
RD
READ
WR
WRITE
AN-1 +5V
b b b b b b b b
AN-1 .. 7 6 5 4 3 2 1 0
. ‘0‘ ‘1‘
0 X X X X X X 1 . A0 Registre E/S
A0
D7 D6… ..D0
D7 …. …………… D0
Bus de données
Interfaces d’Entrées/Sorties (5) : Programmation en ‘C’
*Reg_name = valeur;
Variable = *Reg_name ;
Exemple1: Un PC dispose d’un circuit d’interface E/S parallèle ‘8255’ contenant un registre 8 bits
(Port A) occupant l’ adresse 300 Hexa et connecté à 8 Diodes Leds (voir figure).
Ces Leds s’allument quand on leur applique V=+5V et s’éteignent quand on leur applique V = 0V.
Écrire un programme en ‘C’ qui permet de faire clignoter continuellement les 8 Leds.
(ne pas tenir compte de la configuration des pins du port)
8255
PA7 Led7
.
μP RD PA6
.
READ PA5 .
WR .
PA4
WRITE .
PA3
.
A1 PA2 .
A1
.
A0 PA1
.
A0
PA0 Led0
D7 D6… ..D0
D7 …. …………… D0
Bus de données
Application commande Leds (2) : solution
0 0 0 0 0 0 1 0
0 0
= 00 Hexa
Application commande Leds (3) : solution
Le programme en ‘C’ :
// Répéter continuellement
While (1)
{
8255
// Allumer les Leds 1
PA7 Led7
.
*PortA = 0x0FF; μP RD 1
PA6
.
READ 1
PA5 .
// Éteindre les Leds WR .
1
PA4
.
*portA = 0x00; WRITE
1
PA3 .
} A1 .
A1 1
PA2
.
A0 1
PA1
.
A0
1
PA0 Led0
D7 D6… ..D0
D7 …. …………… D0
Remarque: 0x est utilisé en ‘C’ pour Bus de données
Indiquer les nombres hexadécimaux.
Application commande Leds (4) : solution
Le programme en ‘C’ :
// Répéter continuellement
While (1)
{
8255
// Allumer les Leds PA7 1 Led7
*PortA = 0x0FF; .
μP RD PA6 1 .
READ PA5 1 .
// Éteindre les Leds WR .
*portA = 0x00;
PA4 1
WRITE .
PA3 1 .
} A1 PA2 1 .
A1
.
A0 PA1 1 .
A0
PA0
1 Led0
D7 D6… ..D0
D7 …. …………… D0
Remarque: 0x est utilisé en ‘C’ pour Bus de données
Indiquer les nombres hexadécimaux.
Application commande Leds (5) : solution
// Répéter continuellement
While (1)
{
// Allumer les Leds
*PortA = 0x0FF; 8255
0
PA7 1 Led7
.
// Éteindre les Leds μP RD 0
PA6 1 .
*portA = 0x00; READ 0
PA5 1 .
WR .
} 0
PA4 1
WRITE .
0
PA3 1 .
A1 1 .
A1 0
PA2
.
A0 0
PA1 1 .
A0
0
PA0
1 Led0
D7 D6… ..D0
D7 …. …………… D0
Remarque: 0x est utilisé en ‘C’ pour Bus de données
Indiquer les nombres hexadécimaux.
Application commande Leds (6) : solution
// Répéter continuellement
While (1)
{
8255
// Allumer les Leds PA7 0 Led7
*PortA = 0x0FF; 0 .
μP RD PA6
.
// Éteindre les Leds READ PA5 0 .
WR .
*portA = 0x00; PA4 0
WRITE .
PA3 0 .
} A1
A1 PA2 0 .
.
A0 PA1 0 .
A0
PA0
0 Led0
D7 D6… ..D0
D7 …. …………… D0
Remarque: 0x est utilisé en ‘C’ pour Bus de données
Indiquer les nombres hexadécimaux.
Application Afficheur ‘7’ segments (1)
Exemple2: Un PC dispose d’un circuit d’interface E/S parallèle ‘8255’ contenant un registre 8 bits
(noté port C) occupant l’ adresses 30E Hexa et connecté à un afficheur 7 segments (voir figure).
Chacun des segments s’allume quand on lui applique +5V et s’éteint quand on lui applique 0V.
De telle sorte à pouvoir afficher n’importe quel nombre entre 0 et 9.
Écrire un programme en ‘C’ qui permet d’afficher ‘3’. (ne pas tenir compte de la configuration)
8255
PC7 a a
b
μP RD PC6
READ PC5 c f b
WR
PC4 d g
WRITE PC3 e e c
A1 PC2
A1 f
A0 PC1
g d h
A0
PC0
h
D7 D6… ..D0
D7 …. …………… D0
Bus de données
Application Afficheur ‘7’ segments (2) : solution
PC7 a a
PC6 b Mettre à ‘1’ les segments
devant être allumés
PC5 c f b
PC4 d g
PC3 e e c Afficher ‘3’ PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
Allumer les (a) (b) (c) (d) (e) (f) (g) (h)
PC2 f d h Segments: 1 1 1 1 0 0 1 0
PC1 g
a, b, c, d et g F 2
= F2 Hexa
PC0
h
Application Afficheur ‘7’ segments (3) : solution
D7 …. …………… D0
Application Afficheur ‘7’ segments (4) : solution
D7 …. …………… D0
Application Boutons Poussoir + Leds (1)
Exemple3: Un PC dispose d’un circuit d’interface E/S parallèle ‘8255’ contenant deux registres 8
bits: Port A occupant l’ adresse 0x300 et le Port C occupant l’adresse 0x30E
Le port A à 2 Diodes Leds et le port C à deux boutons poussoir (voir figure).
Écrire un programme en ‘C’ qui permet de Tester l’état des deux boutons poussoirs BP0
et BP1 et: - allumer la Led0 si le bouton BP0 est appuyé.
- allumer la Led1 si le bouton BP1 est appuyé.
- éteindre les 2 Leds sinon.
(ne pas tenir compte de la configuration des pins du port)
8255
PA7
μP RD …
Configurer
l’interface 8255
Led1 Led0
Allumer Allumer Éteindre PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
Led 0 Led 1 Leds Allumer Led0 0 1 = 01 H
Allumer Led1 1 0 = 02 H
Éteindre Leds 0 0 = 00 H
31
Damergi Emir - INSAT 2013/14
Application Boutons Poussoir + Leds (2): solution
Le programme en ‘C’:
// Déclaration des pointeurs
#define PortA (uint8_t*) 0x300;
#define PortC (uint8_t*) 0x30E;
Lire Port C
(30Eh)
Uint8_t etat_bouton; // variable 8 bits
// Test et traitement
Port C = 02 h
switch (etat_bouton)
{
case 0x01: *portA = 0x01;
Port A (300h) Port A (300h) Port A (300h) case 0x02: *portA = 0x02);
= 01 h = 02 h = 00 h default : *portA = 0x00);
}
32
Damergi Emir - INSAT 2013/14
Application Boutons Poussoir + Leds (3): Poblème lecture d’un bit
Port C = 01 h Sinon
?
Port C = 02 h
Ceci n’est pas vrai car les autres
entrées du port C peuvent prendre des
valeurs aléatoires inconnues
PC7
PC6
etat_bouton: à tester
PC5 ?
PC4
donnée b7 b6 b5 b4 b3 b2 b1 b0
PC3
Bits à masquer Bits à
AND garder
PC2
PC1 BP1
variable 0 0 0 0 0 0 1 1 = 03h
PC0
BP0
Résultat 0 0 0 0 0 0 b1 b0
33
Damergi Emir - INSAT 2013/14
Application Boutons Poussoir + Leds (4): Solution corrigée
La solution est de forcer les valeurs des bits non utilisés à ‘0’
On parle d’opération de masquage
etat_bouton: à tester
// Lire État des Boutons Poussoir
(Port C)
donnée b7 b6 b5 b4 b3 b2 b1 b0
etat_bouton = *PortC AND 0x03;
Bits à masquer Bits à
AND garder
variable 0 0 0 0 0 0 1 1 = 03h
Résultat 0 0 0 0 0 0 b1 b0
34
Damergi Emir - INSAT 2013/14
Application Boutons Poussoir + Leds (1)
Exemple3: Le port A à 2 Diodes Leds et le port C à deux
Le programme en ‘C’:
boutons poussoir // Déclaration des pointeurs
Tester l’état des deux boutons poussoirs BP0 et BP1 et: #define PortA (uint8_t*) 0x300;
#define PortC (uint8_t*) 0x30E;
- allumer la Led0 si le bouton BP0 est appuyé. Uint8_t etat_bouton; // variable 8 bits
PC0
D7 D6… ..D0 BP0
D7 …. …………… D0 35
Bus de données Damergi Emir - INSAT 2018/19
Application Boutons Poussoir + Leds (5): Poblème Imposer valeurs de bits
36
Embedded Training
Application Boutons Poussoir + Leds (6): Solution = masquage logique
modifier)
Masquage logique
37
Damergi Emir - INSAT 2018/19