Vous êtes sur la page 1sur 2

Correction de l’examen d’architecture des ordinateurs

Partie 3
ENSIMAG 1A
19 mai 2006

Partie 3 : le microcontrôleur PIC (6 points)


Dans cet exercice, nous allons utiliser le micro-controleur PIC16F84A que vous avez manipulé dans
les premiers TP du 2e semestre. On suppose qu’un clavier est connecté au port B du PIC et un afficheur
7 segments au port A.

Exercice 1
Soit le programme ci-dessous :

L0
OPTION_REG EQU 1
bsf STATUS, RP0 L2
STATUS EQU 3
clrw movwf S1
TRISA EQU 5
movwf TRISA movf STATUS, W
TRISB EQU 6
movlw 0x0F movwf S2
PORTA EQU 5
movwf TRISB
PORTB EQU 6
clrw movf V, W
INTCON EQU 0xB
movwf OPTION_REG movwf PORTA
RP0 EQU 5
movlw 0x88 clrf V
V EQU 0x10
movwf INTCON
S1 EQU 0x11
bcf STATUS, RP0 movf S2, W
S2 EQU 0x12
clrw movwf STATUS
movwf PORTB movf S1, W
ORG 0
bcf INTCON, 0
goto L0
clrf V retfie
ORG 4
L1
goto L2
incf V, F end
ORG 0x30
goto L1

Question 1 (0,5 pt) A quelle adresse mémoire correspond l’étiquette L0 ?


La directive ORG 0x30 force l’alignement de l’étiquette L0 à l’adresse 0x30 (48 en décimal).

Question 2 (1 pt) Dans quels sens (i.e. entrée ou sortie) sont configurés les bits des ports A et B ?
Vous devez préciser la configuration de chaque bit des deux ports.
Les 5 bits du port A sont configurés en sortie, ainsi que les 4 bits de poids fort de B, et les 4 bits de
poids faible de B sont configurés en entrée (c’était inversé par rapport au TP).

Question 3 (1 pt) Expliquez en quelques lignes ce que fait le programme donné.


Le programme incrémente en boucle infinie un compteur modulo 256. Lorsque le PIC reçoit une
interruption clavier (quand on appuie sur une touche), le traitant d’interruption affiche la valeur courante
du compteur sur le 7 segments et remet le compteur à 0.

1
Exercice 2
Question (1,5 pt) Le contenu mémoire suivant correspond à un programme PIC sous forme hexadéci-
male et symbolique. Complétez les cases marquées par des points d’interrogation et expliquez en quelques
lignes ce que fait le programme.

Mot mémoire Valeur en hexadécimale Instruction sous forme symbolique


1 0x0190 CLRF 0x10
2 0x0811 MOVF 0x11, W
3 0x3800 IORLW 0
4 0x1903 BTFSC 0x3, 0x2
5 0x280A GOTO 0x0A (c’est à dire au mot mémoire 11)
6 0x1003 BCF 0x3, 0
7 0x0C91 RRF 0x11, F
8 0x1803 BTFSC 0x3, 0
9 0x0A90 INCF 0x10, F
10 0x2801 GOTO 0x1
11 0x0000 NOP

Le programme compte le nombre de bits à 1 de l’octet à l’adresse 0x11 et stocke le résultat à l’adresse
0x10.

Question (1,5 pts) Après avoir consulté la section 2.5 de la documentation PIC donnée en annexe,
expliquez ce que fait le programme ci-dessous. On suppose que la zone mémoire pointée par Src contient
24 octets initialisés à des valeurs appropriées.
STATUS EQU 3 Debut
C EQU 0 movf Ix, F
Z EQU 2 btfsc STATUS, Z
Proc
FSR EQU 4 goto Fin
movfw Val
INDF EQU 0 movf Src, W
iorlw 0
Cpt EQU 0x10 movwf FSR
btfsc STATUS, Z
Val EQU 0x11 movf INDF, W
goto FinProc
Src EQU 0x12 movwf Val
bcf STATUS, C
Dst EQU 0x13 clrf Cpt
rrf Val, F
Ix EQU 0x14 call Proc
btfsc STATUS, C
movf Dst, W
incf Cpt, F
ORG 0 movwf FSR
goto Proc
movf Cpt, W
Init movwf INDF
FinProc
movlw 0x20 incf Src, F
return
movwf Src incf Dst, F
movlw 0x40 decf Ix, F
end
movwf Dst goto Debut
movlw 0x18 Fin
movwf Ix goto Fin

Le pointeur Src désigne une zone mémoire de 24 octets remplie de valeurs quelconques. Le programme
parcours cette zone et, pour chaque octet, compte le nombre de bits à 1 de cet octet, et stocke le résultat
dans la zone mémoire pointée par Dst.

Question (0,5 pt) La zone mémoire pointée par Dst doit faire 24 octets pour stocker le résultat du
calcul. Comment pourrait-on optimiser ce calcul pour n’avoir besoin que de 9 octets dans la zone Dst ?
On ne vous demande pas de coder cette optimisation mais juste d’en expliquer le principe.
Il suffit de n’utiliser que 3 bits pour coder le nombre de bits à 1 (modulo 8), et de compacter ces
valeurs.