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. GEL24b 17/05/2016 Exercice 5 : programme assembleur pas à pas (4 points) Le programme suivant est contenu à partir de l’adresse 0 de la mémoire programme du PIC 16F877A : MOVLW 0x11 MOVWF 0x20 ADDLW 0xEF BTFSS STATUS,C CLRF 0X20 MOVF 0x20,W ADDWF 0x20,F GOTO 0X7 Remplissez un tableau qui donnera, pour chaque instruction du programme, les valeurs de : - Registre de travail W - Bit C du registre STATUS - Bit Z du registre STATUS - Octet contenu dans la mémoire de donnée à l’adresse 0x20 - Program counter PC Exercice 6 : langage C (3 points) Voici le code source en C d’un programme : #include <p16f877A.h> #define input 0xFF #define output 0 char a = 0; char on = 0b00000001; char off = 0x00; void main(void) { TRISA = input; TRISB = output; while(1) { a = PORTA if (a & 0x10) PORTB = on ; else PORTB = off ; } } Traduire ce code en langage assembleur. 2/9 GEL24b 17/05/2016 3/9 GEL24b 17/05/2016 4/9 GEL24b 17/05/2016 5/9 GEL24b 17/05/2016 6/9 GEL24b 17/05/2016 7/9 GEL24b 17/05/2016 8/9 GEL24b 17/05/2016 9/9