Examen GEL24b : partie microcontrôleur
Durée 2h ; feuille A4 manuscrite et calculatrice autorisées
Le barème est donné à titre indicatif
Exercice 1 : jeu d’instruction du PIC 16F877A (4 points)
A l’aide des documents donnés en annexe :
a) Quelle est la taille d’une instruction en mémoire ?
b) Donner le code (en binaire et en hexadécimal) des instructions suivantes :
CLRW,
GOTO 0x5
MOVLW 0xFF
BSF PORTB,3
ADDWF PORTB,F
Rappel : Le registre PORTB est à l’adresse 0x6
c) Expliquez les instructions : DECFSZ, BTFSC, ANDLW et donner un exemple d’utilisation pour
chacune de ces instructions.
d) L’instruction « MOVF REG,F » prend le contenu du registre REG le replace dans ce même registre
REG. Quel est le rôle de cette instruction à priori inutile ?
Exercice 2 : architecture du PIC 16F877A (3 points)
A partir des documents donnés en annexe :
a) Quelles sont les trois types de mémoire disponible sur le microcontrôleur PIC 16F877A ? Donnez les
tailles de ces mémoires.
b) Quelle est la profondeur de la pile (c’est-à-dire sa taille) ? Expliquer le rôle de cette pile.
c) Donnez la taille du bus de données et du bus programme.
d) La figure 1-2 montre que trois bits du registre de statut proviennent de l’unité arithmétique et
logique. Donner le nom d’au moins deux de ces trois bits, ainsi que leur rôle.
Exercice 3 : utilisation du TIMER0 (2 points)
Pour une application, on a besoin d’effectuer une action périodiquement (toutes les 65,5 ms). Pour cela, on
choisit d’utiliser le timer0 du PIC 16F877A. Le microcontrôleur est cadencé à 4 MHz.
a) Décrire quels sont les registres que vous allez utiliser pour la configuration du timer0. Quelles
valeurs allez-vous mettre dans ces registres afin de respecter la période de 65,5 ms ?
b) Quel bit vous informera sur le débordement du timer0 (c.à.d. la période de 65,5 ms est écoulée) ?
Exercice 4 : interruptions (4 points)
On souhaite réaliser un programme embarqué sur PIC 16F877A qui :
- Incrémente une variable (située à l’adresse 0x20) lorsqu’il y a un front descendant sur la ligne 0
du port B (RB0).
- Réinitialise cette variable (c.à.d. la remet à zéro) si le timer0 déborde.
On choisit d’utiliser les interruptions pour traiter les 2 évènements (détection de front descendant et
débordement du timer).
a) Décrire comment fonctionne une interruption. Quel est l’intérêt principal d’utiliser un traitement
par interruption ?
b) Quel(s) registre(s) utiliserez-vous pour configurer les interruptions ?
c) Proposer l’algorigramme permettant de répondre au besoin.
d) Donner le code assembleur de ce programme.