Você está na página 1de 43

MICROCHIP PICs

Travaux Pratiques
Objectifs : Ces TPs ont pour but d'illustrer le fonctionnement des PICs et de dcouvrir les outils de dveloppement proposs par Microchip pour programmer ce type de microcontrleur. On s'intresse ici au PIC 16F84, qui fait partie des PICs milieu de gamme de Microchip. On se familiarisera d'abord avec le jeu d'instructions assembleur du processeur pour ensuite aborder un langage de plus haut niveau grce au compilateur C de HI-TECH Software. L'nonc des TPs est situ dans la 2e partie du document aprs une prsentation des outils.

I) Prsentation de la carte
Le PIC 16F84 est ici intgr sur une carte d'application permettant la commande d'un afficheur 7 segments et de 5 LEDs. Un bouton poussoir est reli au bit 0 du port B (RB0) ce qui peut permettre de gnrer une interruption matrielle.
B

RA4

RA3

RA2

RA1

RA0
Logique ngative (0 = allum)

RB7 RB2
Logique positive (1 = allum)

connecteur

RJ 12
RB6 RB1
Logique ngative (RB0 = 0 si appui)

RB3 RB4

RB5 RB0

Le connecteur RJ12 sert relier la carte l'interface ICD2 qui permet ici la programmation du PIC et galement l'alimentation de la carte (jusqu' 200 mA). La programmation se fait suivant le protocole ICSP (In-Circuit Serial Programming) dfini par Microchip (voir datasheet DS30277d du fabricant)) : la broche /MCLR est maintenue 12 V pour faire entrer le PIC en mode programmation et les instructions sont transmises bit par bit de faon synchrone sur la broche RB7 du port B au rythme de l'horloge applique sur RB6. Le schma lectrique de la carte est donn dans l'annexe 1.

II) Environnement de travail


La chane d'outils utilise pour le dveloppement est MPLAB, fournie gratuitement par MICROCHIP. Il s'agit d'un IDE (Integrated Development Environment) qui intgre tous les outils ncessaires pour la mise au point d'un projet : diteur de fichier source compilateur + assembleur diteur de lien (permet d'obtenir le fichier excutable de sortie) dbuggeur (simulateur et/ou vrai dbuggeur si le circuit cible le permet) programmateur Un IDE offre l'avantage de pouvoir effectuer toutes ces oprations dans une mme fentre de travail et facilite grandement les interactions entre les modules (gestion et mise jour automatique des fichiers d'changes, excution d'un seul clic des modules permettant l'obtention du ficher excutable...) d'o un gain de productivit. MPLAB peut tre interconnect directement au PIC in situ sur sa carte d'application grce au module d'interface ICD2, reli d'un ct au port USB du PC et de l'autre au PIC via les 3 broches de contrle mentionnes plus haut. Cette interface permet la programmation des PICs mais surtout permet d'exploiter le module ICD (In Circuit Debugger) qui est intgr dans certains PICs. L'ICD, disponible sur les PICs haut de gamme, autorise un "vrai" debbugage en excutant le programme sur le PIC et en renvoyant le contenu des registres MPLAB via l'interface ICD2. On peut ainsi tester le programme ou seulement certaines parties, en mode pas pas, continu comme avec un simulateur mais avec l'intrt de contrler vritablement les sorties du PIC et d'tre en interaction avec le systme. Le PIC16F84 ne possde pas de module ICD et l'on se contentera donc d'une simulation pour valider les programmes de cette 1re partie de TPs d'initiation.. Le PIC16F877

dispose lui de l'ICD et l'on consultera le paragraphe "utilisation de l'interface ICD2" pour le dveloppement du projet qui suivra les TPs. Les activits de TP se droulent sous forme d'exercices dont les fichiers lire ou modifier sont enregistrs dans les sous rpertoires TP1, TP2 du rpertoire TPs_PIC accessible depuis la page WEB www.enseirb-matmeca.fr/~bedenes (onglet MICROCHIP). On commencera par effectuer une copie de ce rpertoire sur le compte UNIX.. Le descriptif ci-dessous est exploiter en fonction des diffrentes oprations mener dans les exercices.

III) Prsentation du logiciel MPLAB


Lancer le logiciel MPLAB IDE partir du lien situ sur le bureau. La fentre qui s'ouvre fait apparatre une interface avec l'utilisateur relativement classique :

En haut on observe une barre de menus droulants avec en dessous des icones permettant d'actionner les principales commandes (barre volutive en fonction de l'tape o l'on se trouve dans le projet). Dans l'espace de travail, 2 fentres sont ouvertes et vides au lancement du logiciel : "untitled workspace" qui correspond au gestionnaire de fichier, et "output" qui correspond la fentre d'informations pour l'utilisateur ds que celui-ci effectue une manipulation sur le fichier excutable de sortie.

1) Cration d'un projet


Un fichier source assembleur ( .asm ) ou C ( .c ) peut tre dit simplement avec la commande FILE > NEW. Il peut ensuite tre assembl ou compil individuellement dans le but d'obtenir un fichier excutable de sortie. On prfrera cependant l'intgrer un projet qui inclura ventuellement d'autres fichiers sources lier, de manire avoir une approche bien structure (projet dcoup en fonctions lmentaires, code relogeable) et exploiter au mieux les possibilits offerte par MPLAB notamment au niveau du debuggage. On va donc commencer par crer un projet. Cette opration peut tre effectue directement par PROJECT > NEW PROJECT, mais il est conseill de lancer l'assistant pour la cration de projet PROJECT > PROJECT WIZARD qui permet de configurer tous les paramtres qu'il faudra de toutes faons dfinir. choisir le composant cible dans la liste : 16F84A dfinir le logiciel qui devra "compiler" le(s) fichier(s) source(s) du projet :

MPASM pour un fichier en assembleur (.asm)

HI TECH pour un fichier en C (.c)

Indiquer le nom du projet exo et son emplacement (H:/TP_PICs/TP/) MPLAB va ainsi crer un fichier .mcp contenant les paramtres du projet. Il cre aussi un fichier .mcw qui permettra de sauvegarder l'espace de travail la fermeture du projet (fentres ouvertes, paramtres) pour pouvoir le restaurer l'identique la prochaine ouverture du projet.

Si des fichiers sources sont dj existants, on peut les indiquer ds maintenant

On ajoutera galement un fichier de commande ncessaire l'diteur de lien MPLINK qui dpend du composant cible. On choisira pour les TPs celui associ au 16F84 : C:\Program Files\Microchip\MPASM Suite\LKR\16f84.lkr. Ce fichier n'est cependant pas indispensable si il n'y a qu'un seul fichier source dans le projet et/ou que l'on ne souhaite pas gnrer de fichier objet (cf partie III-3). La lettre majuscule qui prcde le chemin du fichier ajout indique de quelle manire sera rfrenc le fichier : U (User reference) : le fichier sera rfrenc par un chemin relatif au rpertoire du projet S (System) : le fichier sera rfrenc par un chemin absolu A (Automatic) : laisse le choix MPLAB de choisir relatif ou absolu (si le fichier est dans le rpertoire du projet il choisira relatif) C (Copy) : dans les 3 modes ci-dessus, MPLAB ne fait que crer un lien sur le fichier source. Ce dernier mode effectue une copie du fichier dans le rpertoire du projet et un rfrencement relatif La dernire fentre rcapitule les principaux paramtres du projet

2) Affectation du registre de configuration


Tous les PICs possdent un registre de configuration situ dans un emplacement (adresse 0x2007) associ la mmoire programme. Ce registre est trs important puisqu'il dfinit notamment le type d'oscillateur qui sera utilis pour gnrer l'horloge. exemple : registre CONFIG du PIC 16F84

Le registre CONFIG est accessible de la mme faon que la mmoire en utilisant le protocole ICSP. On effectue en gnral sa programmation en mme temps que la mmoire programme. Le contenu qui sera charg dans ce registre peut tre dfini de 2 manires : dans le fichier source en utilisant une directive approprie __CONFIG (voir exemples du TP) directement partir du menu CONFIGURE de MPLAB

Cette fentre permet aussi de visualiser le paramtrage dfini par la directive __CONFIG du fichier source si la case "Configuration Bits set in code" est coche tel que ci-dessus

3) Compilation du projet
La compilation du projet a pour but d'obtenir, partir du ou des fichiers sources (.asm, .c) voire de fichiers objets (.o , .lib), un fichier de sortie (.hex , voir annexe 2 pour plus d'informations) correspondant au code excutable qui pourra ensuite tre implant en mmoire programme du PIC lors de la phase de programmation. D'autres fichiers de sortie sont galement disponibles dans le rpertoire du projet (mapping mmoire, donnes pour le dbuggage), comme on peut le voir sur la figure suivante qui reprsente toutes les tapes de la compilation :

MPLAB IDE utilise la chaine d'outils "MPASM suite" qui intgre les 3 modules : MPASM : logiciel d'assemblage qui permet partir d'un fichier source .asm en assembleur d'obtenir un fichier objet .o contenant le code excutable correspondant, non affect des adresses fixes en mmoire programme pour le moment (code relogeable) et dont les registres sont dsigns par des symboles (rfrences) qui n'ont pas encore d'adresse en mmoire RAM. MPLIB : logiciel pour crer une librairie d'objets c'est--dire une association de fichiers objets plus simple manipuler (un seul fichier dsigner) MPLINK : logiciel d'dition de liens pour relier tous les fichiers objets (voire des librairies) pour obtenir le fichier excutable .hex. Ce module a besoin pour cela d'un fichier de commande .lkr qui dfinit les sections ou le code peut tre allou en mmoire programme ainsi que l'emplacement des registres. Un fichier de commande type est propos pour chaque PIC (C:\Program Files\Microchip\MPASM Suite\LKR\16f84.lkr pour le PIC 16F84, voir annexe 3). Un compilateur C peut aussi tre utilis pour obtenir un fichier objet partir d'un fichier source en langage C (sur la figure MPLAB C18, mais pour nous ce sera HI-TECH PICC Lite).

La compilation du projet s'effectue simplement par la commande PROJECT > BUILD ALL (raccourci CTRL + F10) aprs avoir ventuellement modifi les options dans PROJECT > BUILD OPTIONS > PROJECT. Attention, les fichiers sources concerns sont ceux dfinis dans le projet et ne sont pas ncessairement ceux ouverts dans l'espace de travail !! La sauvegarde des fichiers modifis est par contre automatique chaque compilation. On notera que dans le cas d'un fichier source unique, MPASM peut directement fournir un fichier excutable .hex sans gnrer dans ce cas de fichier objet .o. Cette compilation particulire ("QUICKBUILD") est implicite lorsqu'on omet de spcifier dans le projet le fichier de commande .lkr pour l'diteur de lien MPLINK dont l'excution n'est pas ncessaire dans ce cas. Un QUICKBUILD peut aussi tre effectu partir de tout fichier source .asm sans avoir cr de projet (commande PROJECT > QUICKBUILD). Cette mthode n'est cependant utiliser que dans le cas de projets trs simples (TP1) ou pour tester rapidement une routine d'un programme car elle ne fait pas appel MPLINK qui gnre des fichiers bien utiles pour le dbuggage (.map, .cof voir annexe 4 pour plus d'informations)

4) Simulation
Quand le PIC cible ne possde pas de module de debuggage ICD ou que le PIC ne peut tre reli la station de dveloppement, le simulateur de MPLAB permet de faciliter la mise au point du programme grce une interface simple et convivial. Il faut commencer par activer le simulateur par DEBUGGER > SELECT TOOL > MPLAB SIM.

Fentres de visualisation
Pour visualiser le contenu des registres SFR : VIEW > SPECIAL FUNCTION REGISTERS ou de tout le contenu de la RAM : VIEW > FILE REGISTERS Pour visualiser le contenu d'un registre quelconque du programme : VIEW > WATCH puis choisir les registres observer dans la liste (+ Add Symbol) On peut aussi observer la pile systme VIEW > HARDWARE STACK Le droulement du programme peut s'observer sur le fichier source mais aussi sur le fichier assembl (code machine + assembleur) que l'on peut faire apparatre avec VIEW > DISASSEMBLY LISTING ou sous forme plus brute avec VIEW > PROGRAM MEMORY. L'utilisation de la fentre STOPWATCH (DEBUGGER > STOPWATCH) permet d'observer la dure effective de l'excution (vrifier la frquence de l'horloge).

Excution
Il faut d'abord compiler le projet. Une flche verte doit apparatre sur le fichier source au niveau de la 1re instruction.

Il suffit ensuite de lancer la simulation par les diffrentes commandes du menu DEBUGGER ou plus directement avec les icnes de raccourci (voir illustration dans la partie utilisation de l'ICD2) ou touches de fonction: Reset (F6) : Run (F9) : Animate : Step into (F7) : Step over (F8) : Step out : initialise le PC 0, on peut aussi simuler un RESET matriel (idem + RAZ des timers) ou simplement remettre 0 le chien de garde excution continue (stop par F5) idem mais au ralenti pour voir voluer les registres excution pas pas excution continue puis stoppe la fin du prochain sous-programme (ou fonction en C) excution continue puis stoppe la fin du sous-programme en cours (ou fonction en C)

10

On peut poser des points d'arrt (breakpoints) pour excuter des blocs d'instructions. Pour cela pointer sur le dbut de la ligne de programme avec la souris et double-cliquer sur la touche de droite. Pour annuler le point d'arrt recommencer la mme opration ou supprimer tous les points d'arrt l'aide du menu droulant disponible avec un clic droit. Simulation d'vnements extrieurs Il est possible de simuler l'activation d'une des broches d'entres du PIC avec la commande DEBUGGER > STIMULUS > NEW WORKBOOK. Choisir l'onglet "async" pour activer une entre l'aide de la souris indpendamment du droulement du programme. Dfinir la broche dans la colonne "Pin / SFR" ainsi que l'action effectuer dans la colonne "Action".

Un clic dans la colonne "Fire" effectue l'action correspondante immdiatement (l'affichage des registres n'est cependant mis jour qu'aprs l'excution de la prochaine instruction). On peut ainsi simuler l'appui sur le bouton poussoir reli RB0 dans le TP1 par exemple. On peut aussi modifier tout moment le contenu d'un registre en changeant sa valeur dans la fentre "Special Function Registers" ou "WATCH". En conclusion, l'utilisation du simulateur est de faon gnrale assez intuitive (naviguer dans le menu DEBUGGER et consulter l'aide HELP > TOPICS > DEBUGGERS > MPLAB SIM pour dcouvrir les autres fonctionnalits).

11

5) Programmation avec le module ICD2


L'opration de programmation consiste transfrer le fichier excutable .hex dans la mmoire programmme (FLASH) ainsi que la programmation du registre CONFIG voire de la mmoire EEPROM si le PIC en dispose. L'opration s'effectue selon le protocole ICSP avec un transfert de donnes srie (bit par bit sur la broche PGD), synchrone (au rythme de l'horloge applique sur la broche PGC) et squentiel (les emplacements mmoires sont remplis les uns la suite des autres depuis l'adresse 0). L'interface ICD2 permet une programmation trs rapide grce sa liaison USB avec le PC, selon le schma suivant :
Auparavant, le boitier ICD2 doit tre raccord, d'une part au PC via le bus USB et d'autre part l'application comportant le microcontrleur programmer, en respectant l'ordre suivant :

On slectionne ensuite l'outil de dbuggage via l'interface ICD2 avec DEBBUGER >

Remarque : on a la possibilit d'alimenter la carte d'application par l'intermdiaire du boitier ICD2 (bloc d'alimentation reli la prise jack) mais la tension fournie via le connecteur RJ12 sera impose 5 V pour un courant max de 200 mA. C'est cette technique qui a t retenue pour alimenter la carte de TP de manire optimiser son cot et sa compacit. Dans tous les cas, il faut appliquer une source d'alimentation (sur l'ICD2 ou la carte d'application) idem celle du PIC car les lignes PGC et PGD de l'interface sont en sortie "collecteur ouvert" et ncessite donc un "pull-up" pour fixer le niveau logique haut.

12

Pour information, le schma de raccordement du module ICD2 avec la carte d'application est donn ci-dessous ainsi que le brochage du connecteur RJ12 qui est utilis.

pour le PIC 16F84 : PGC = RB6 PGD = RB7


B

Etablir la connexion avec le module ICD2 : PROGRAMMER > SELECT PROGRAMMER > MPLAB ICD2 Les diffrentes tapes de la connexion sont visualises dans la fentre "output" :

13

Ce type d'erreur plusieurs origines possibles : - soit le cble USB n'est pas connect sur le bon port, c'est--dire celui choisi lors de l'installation du pilote (dpend de la salle mais en principe c'est le connecteur du haut) - soit l'interface ICD2 n'tait pas encore relie au moment du lancement de MPLAB et il suffit dans ce cas de fermer et relancer celui-ci. - soit le module ICD2 est HS !

Une fois la connexion tablie programmer le circuit avec l'icne

par exemple

Remarque : il n'y a pas de bouton de RESET sur la carte, la remise 0 pouvant tre commande via l'ICD2 depuis MPLAB :

rinitialise l'ICD2 dsactive le RESET (/MCLR=1) active le RESET (/MCLR=0)

Il est noter qu'une fois le PIC programm, l'ICD2 maintien le RESET activ (par dfaut) et PGC=PGD=0. Pour utiliser le PIC il faut donc dsactiver le RESET, et si l'on souhaite pouvoir contrler RB6 et RB7 (c'est--dire PGC et PGD) il faut aussi rinitialiser l'ICD2 pour mettre ces sorties de l'interface en haute impdance. En cas de doute sur le fonctionnement de la carte, on pourra charger et excuter le fichier dEMo.hex situ dans le rpertoire de projet (utiliser FILE>Import dEMo.hex pour permettre la programmation sans crer de projet)

14

6) Debuggage avec le module ICD Si l'on utilise un PIC avec module de dbuggage intgr (ICD) on a tout intrt privilgier ce mode plutt que la simulation pour tester le programme. L'avantage du dbugger est que le programme tourne rellement sur le PIC qui est de plus reli au systme via ses entres/sorties. On obtient ainsi un test beaucoup plus raliste si ce n'est que toutes les ressources du PIC ne sont pas disponibles dans ce mode (cf doc du PIC). Pour un debuggage encore plus efficace, il existe des mulateurs (MPLAB ICE 2000, REAL ICE) qui se branche la place du PIC et qui excute le programme de la mme faon tout en renvoyant des informations MPLAB (utilisent en gnral un processeur plus puissant) pour un cot relativement plus lev. L'utilisation de l'ICD ncessite une interface matrielle avec le PC telle que le module ICD2. MPLAB permettra ensuite de rcuprer le contenu des registres pour les visualiser et de contrler le droulement du programme sur le PIC avec les mmes outils qu'en simulation. On choisit le module ICD2 dans la liste des interfaces proposes pour le dbuggage avec DEBUGGER > SELECT TOOL > MPLAB ICD2. On accde ainsi aux mmes commandes que celles vues en simulation, avec notamment les icnes permettant de contrler l'excution du programme :

Il faut tout d'abord tablir la connexion avec le boitier ICD2 en cliquant par exemple sur l'icne ci-dessus "Connexion avec l'ICD2", la procdure tant la mme que pour la programmation. Une fois la connexion tablie, il faut programmer le PIC (icne "Program Target Device") aprs avoir compil le projet. A noter que cette opration est ncessaire mme si la programmation a dj t faite directement par le menu PROGRAMMER (cf section 5) car le dbuggage ncessite une routine supplmentaire que MPLAB charge en mmoire programme ainsi que l'activation du bit "DEBUG" du registre CONFIG.
15

On se reportera la section "4) Simulation" pour connatre les diffrentes possibilits de droulement du programme et l'observation des registres.

16

ANNEXES

17

18

ANNEXE 1 : schma de la carte

19

ANNEXE 2 : format INTEL HEX

20

ANNEXE 3 : fichier de commande 16f84.lkr

ANNEXE 4 : limitations lies un "quickbuild"

21

22

TPs

23

24

TP 1
Objectifs Dcouverte de MPLAB Manipulation des instructions des PICs et gestion des entres / sorties

I) Programme BP
1) Ouvrir le fichier BP.asm dans le rpertoire TP1 : Observer le rle des quelques directives d'assemblage utilises. (le fichier p16F84.inc issu du rpertoire C:\Program Files\Microchip\MPASM Suite\ est fourni en annexe TP1-2) Complter le fichier pour afficher le chiffre "1" lorsqu'on appui sur le bouton poussoir et "0" au repos. On n'oubliera pas de dfinir l'argument de la directive CONFIG__ 2) Crer un projet TP1.mcp avec comme fichier source BP.asm puis effectuer sa compilation. Dans ce 1er TP on effectuera un "QUICKBUILD" sans utiliser l'diteur de lien (cf section III-3). Observer tous les fichiers crs dans le rpertoire TP1 (on pourra se reporter l'annexe TP1-3 pour identifier les fichiers), ouvrir les fichiers BP.lst , TP1.hex, et identifier leur contenu. Le format INTEL HEX32 (format par dfaut de MPLAB mais le HEX8 pourrait suffire) du fichier .hex ainsi que la liste des diffrents fichiers gnrs par MPLAB sont donns en annexe 2 et TP1-3. 3) Programmer le PIC sur la carte d'application et tester le programme. 4) Simuler le programme (mme si celui-ci fonctionne !) : On visualisera le contenu des registres SFR. On simulera l'appui sur le poussoir comme indiqu dans la partie III-4.

25

II) Programme CHENILLARD 1


1) Ouvrir le fichier chen1.asm du rpertoire TP1 (voir copie en annexe TP1-1). Observer les diffrentes parties de ce fichier et identifier le rle des directives d'assemblage utilises. Analyser le sous-programme de temporisation "tempo" et calculer sa dure d'excution. 2) Ecrire le programme principal pour qu'il fasse allumer l'une aprs l'autre une LED de gauche droite puis de droite gaucheetc sur la carte d'application. La dure d'allumage d'une LED sera calibre par l'appel au sous-programme "tempo". 3) Ajouter ce nouveau fichier source au projet TP1 et supprimer le lien sur le fichier BP.asm. Compiler, programmer, tester. Pour bien comprendre le fonctionnement de la pile on simulera le programme en observant sont droulement dans la fentre "desassembly listing" (on neutralisera la temporisation, trop longue simuler, en mettant provisoirement le bloc de cette routine en commentaire).

III) Programme MAXIMUM


On cherche maintenant crer un programme permettant de rechercher le nombre le plus lev dans une liste de 10 nombres. 1) Crer un nouveau fichier max.asm. Dfinir une zone de variables contenant les lments : MAX de 1 octet TAB de 10 octets 2) Ecrire le programme permettant de placer dans la variable MAX le nombre le plus lev de la liste dont le 1er lment est point par TAB (on recopiera les parties utiles du programme chen1.asm pour gagner du temps). On utilisera pour cela un pointeur (registre FSR) pour scruter la liste en effectuant un adressage indirect. 3) La carte d'application ne possdant pas d'unit d'affichage permettant d'indiquer clairement la valeur de MAX, on effectuera le test de ce programme uniquement en simulation (une compilation directe sans dfinir de projet pourra suffire). On remplira au pralable la liste des 10 valeurs la main dans la fentre FILE REGISTERS (on verra dans le TP2 une possibilit de dclarer des variables initialises).

26

ANNEXE TP1-1 : fichier chen1.asm


LIST p=16F84 #include <p16F84.inc> __CONFIG ; Dfinition de processeur ; Dfinitions de variables

_CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

; '__CONFIG' prcise les paramtres encods dans le processeur au moment de ; sa programmation. Les dfinitions sont dans le fichier include. ; Voici les valeurs et leurs dfinitions : ; ; ; ; ; ; ; ; ; ; _CP_ON _CP_OFF _PWRTE_ON _PWRTE_OFF _WDT_ON _WDT_OFF _LP_OSC _XT_OSC _HS_OSC _RC_OSC Code protection ON : impossible de relire Code protection OFF Timer reset sur power on en service Timer reset hors-service Watch-dog en service Watch-dog hors service Oscillateur quartz basse vitesse Oscillateur quartz moyenne vitesse Oscillateur quartz grande vitesse Oscillateur rseau RC

;********************************************************************* ; ASSIGNATIONS * ;********************************************************************* TRISA_VAL TRISB_VAL INIT_PORTA INIT_PORTB EQU EQU EQU EQU H'XX' H'XX' H'XX' H'XX' ; ; ; ; Valeur Valeur Valeur Valeur charger dans registre charger dans registre initiale charger dans initiale charger dans TRISA TRISB registre PORTA registre PORTB

;********************************************************************* ; DEFINE * ;********************************************************************* #DEFINE BOUTON PORTB,0 ; bouton-poussoir

;********************************************************************* ; MACRO * ;********************************************************************* BANK0 bcf endm BANK1 bsf endm macro STATUS , RP0 ; dfini une macro "BANK0" ; passer banque0 ; fin de la macro

macro STATUS , RP0

; passer banque1

;********************************************************************* ; DECLARATIONS DE VARIABLES * ;********************************************************************* CBLOCK 0x00C VAR : 1 TABLEAU : 10 cmpt1 : 1 ; dbut de la zone de variables (pour exemple) ; ; ; ; dclare une variable "VAR" de 1 octet (adresse 0x00C) rserve une zone mmoire de 10 octets (0x00D - 0x017) (TABLEAU est le 1er lment) compteur de boucles 1

27

cmpt2 : 1 cmpt3 : 1 ENDC

; compteur de boucles 2 ; compteur de boucles 3 ; Fin de la zone

;********************************************************************** ; DEMARRAGE SUR RESET * ;********************************************************************** org 0x000 reset goto start ; fixe l'adresse d'implantation en mmoire programme ; de l'instruction qui suit

;********************************************************************* ; INITIALISATIONS * ;********************************************************************* init BANK1 movlw TRISA_VAL movwf TRISA movlw TRISB_VAL movwf TRISB BANK0 movlw INIT_PORTA movwf PORTA movlw INIT_PORTB movwf PORTB return ;********************************************************************* ; SOUS-PROGRAMME DE TEMPORISATION * ;********************************************************************* tempo movlw 2 movwf cmpt3 boucle3 clrf cmpt2 boucle2 clrf cmpt1 boucle1 nop decfsz cmpt1 , f goto boucle1 decfsz cmpt2 , f goto boucle2 decfsz cmpt3 , f goto boucle3 return ;********************************************************************* ; PROGRAMME PRINCIPAL * ;********************************************************************* start call init END ; directive fin de programme

28

ANNEXE TP1-2 : fichier p16F84.inc


LIST ; P16F84.INC Standard Header File, Version 2.00 Inc. NOLIST

Microchip Technology,

; This header file defines configurations, registers, and other useful bits of ; information for the PIC16F84 microcontroller. These names are taken to match ; the data sheets as closely as possible. ; Note that the processor must be selected before this file is ; included. The processor may be selected the following ways: ; ; ; ; ; 1. Command line switch: C:\ MPASM MYFILE.ASM /PIC16F84 2. LIST directive in the source file LIST P=PIC16F84 3. Processor Type entry in the MPASM full-screen interface

;========================================================================== ; ; Revision History ; ;========================================================================== ;Rev: ;2.00 ;1.01 ;1.00 Date: Reason:

07/24/96 Renamed to reflect the name change to PIC16F84. 05/17/96 Corrected BADRAM map 10/31/95 Initial Release

;========================================================================== ; ; Verify Processor ; ;========================================================================== IFNDEF __16F84 MESSG "Processor-header file mismatch. processor." ENDIF

Verify selected

;========================================================================== ; ; Register Definitions ; ;========================================================================== W F EQU EQU H'0000' H'0001'

29

;----- Register Files-----------------------------------------------------INDF TMR0 PCL STATUS FSR PORTA PORTB EEDATA EEADR PCLATH INTCON OPTION_REG TRISA TRISB EECON1 EECON2 EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU H'0000' H'0001' H'0002' H'0003' H'0004' H'0005' H'0006' H'0008' H'0009' H'000A' H'000B' H'0081' H'0085' H'0086' H'0088' H'0089'

;----- STATUS Bits -------------------------------------------------------IRP RP1 RP0 NOT_TO NOT_PD Z DC C EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- INTCON Bits -------------------------------------------------------GIE EEIE T0IE INTE RBIE T0IF INTF RBIF EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- OPTION Bits -------------------------------------------------------NOT_RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- EECON1 Bits -------------------------------------------------------EEIF WRERR WREN WR RD EQU EQU EQU EQU EQU H'0004' H'0003' H'0002' H'0001' H'0000'

30

;========================================================================== ; ; RAM Definition ; ;========================================================================== __MAXRAM H'CF' __BADRAM H'07', H'50'-H'7F', H'87' ;========================================================================== ; ; Configuration Bits ; ;========================================================================== _CP_ON _CP_OFF _PWRTE_ON _PWRTE_OFF _WDT_ON _WDT_OFF _LP_OSC _XT_OSC _HS_OSC _RC_OSC LIST EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU H'000F' H'3FFF' H'3FF7' H'3FFF' H'3FFF' H'3FFB' H'3FFC' H'3FFD' H'3FFE' H'3FFF'

31

ANNEXE TP1-3 : fichiers manipuls par MPLAB

32

TP 2
Objectifs Gestion du timer Programmation avec interruption Utilisation du mode SLEEP, rveil par WATCHDOG Utilisation de fichiers sources multiples avec code objet relogeable

I) Programme CHENILLARD2 (tempo avec timer)


Pour avoir une information sur le temps qui s'coule, il est plus simple et prcis d'utiliser un timer plutt qu'une boucle logicielle. Le TIMER0 du PIC peut fonctionner en en compteur d'vnement ou bien en timer classique incrment par les fronts d'horloge du PIC aprs division par 4 + prescaler (cf poly description des PICs) 1) Recopier dans le rpertoire TP2 le fichier chen1.asm de TP1 en le renommant chen2.asm. Modifier le sous-programme de temporisation pour que celle-ci soit calibre par le timer0. On remarquera qu'il faudra faire dborder le timer plusieurs fois pour obtenir la mme dure, mme en rglant le prescaler sur le rapport de division le plus lev (256). On utilisera donc un compteur de dbordement en introduisant une variable cmpt qu'on incrmentera (ou dcrmentera si plus simple) chaque dbordement repr par le flag T0IF. On n'oubliera pas de complter le sous-programme d'initialisation pour configurer convenablement le timer. 2) Crer dans le rpertoire TP2 le projet TP2.mcp et lui associer le fichier source chen2.asm. Tester le fonctionnement sur la carte et dbugger avec MPSIM si ncessaire.

II) Programme CHENILLARD3 (tempo avec timer dclenchant une interruption)


L'utilisation du timer pour temporiser apporte une prcision et une simplicit au niveau de l'criture du code. Mais le processeur est mal exploit puisqu'il ne fait qu'attendre le dbordement du timer (scrutation de T0IF) sans pouvoir effectuer d'autre tche. Le timer0 tant capable de dclencher une interruption du processeur, il sera donc prfrable d'utiliser ce procd pour n'occuper le processeur qu'au moment du dbordement du timer.

33

1) Supprimer le fichier source chen2.asm du projet TP2.mcp et le remplacer par le fichier chen3.asm dj dans le rpertoire. Complter le sous-programme d'initialisation pour autoriser la source d'IT timer0. 2) Complter la routine d'interruption de manire dcaler la LED allume tous les n dbordements du timer (n dfinir afin d'obtenir la bonne temporisation). Le programme principal pourra ainsi continuer se drouler entre chaque dbordement du timer. Pour matrialiser visuellement ce pseudo-paralllisme on fera excuter dans le programme principal la routine principale du programme BP.asm du TP1 qu'on recopiera. 3) Tester le programme sur la carte en vrifiant que le symbole affich volue bien lorsqu'on appui sur le poussoir, sans perturber le dfilement rgulier du chenillard. Dbugger avec le simulateur si ncessaire en neutralisant le prescaler pour courter l'intervalle de temps entre dbordements (mettre PSA=0 " la main" durant la simulation aprs l'excution de la routine d'initialisation)

III) Programme CHENILLARD4 (tempo avec le "chien de garde")


Une dernire faon d'obtenir une temporisation, plus marginale, consiste utiliser un autre timer interne du PIC : le watchdog timer WDT. Ce timer est particulier puisqu'il rinitialise le PIC lorsqu'il dborde. Ceci permet de rinitialiser l'application lorsque le programme reste en attente pendant une dure anormale (cf poly PICs). Le dbordement du chien de garde permet aussi un rveil du PIC lorsque celui-ci est en mode veille command par l'instruction SLEEP. Cette possibilit peut tre exploite, si le PIC n'a rien d'autre faire que d'attendre, pour obtenir une temporisation tout en minimisant la consommation lectrique. Le principe est simple : aprs le dcalage d'une LED on placera le PIC en mode SLEEP. Le rveil du PIC sera ici provoqu par le dbordement du chien de garde ou plutt par celui du prescaler qui est utilis ici en post-diviseur (cf poly PICs). on choisira une dure de dbordement de l'ordre de 0,5 s en prenant comme rfrence 18 ms pour la priode de dbordement du WDT.

34

1) Ouvrir le fichier chen2.asm dj crit et le sauvegarder sous le nom chen4.asm. On l'associera au projet TP2.mcp la place de chen3.asm. Supprimer le sous-programme de temporisation et remplacer l'appel CALL tempo par l'instruction SLEEP. Modifier la routine d'initialisation pour affecter le prescaler au WDT avec le bon rapport de division. Ne pas oublier d'activer le WDT avec la directive __CONFIG. 2) Vrifier le bon fonctionnement du programme. En cas de dysfonctionnement, le programme utilisant le WDT est galement simulable : il faut dfinir la dure de dbordement du chien de garde en incluant le post-scaler avec DEBUG > SETTINGS dans l'onglet Break options.

IV) Programme CHENILLARD 5


On va dans cette partie rcrire le programme CHENILLARD2 en le fractionnant en plusieurs parties indpendantes de manire dcouper le programme raliser en plusieurs sous-programmes (fonctions) lmentaires, indpendantes, que l'on pourra dans un cas plus gnral crire et valider plus simplement qu'en considrant le projet dans son intgralit. 1) Associer au projet TP2.mcp les fichiers sources chen5.asm et tempo.asm prsents dans le rpertoire. On fera appel ici l'diteur de lien MPLINK pour la compilation en ajoutant le fichier de commande C:\logiciel\pic\MPLAB7_6\MPASM Suite\LKR\16f84.lkr. A la compilation, MPASM va maintenant gnrer des fichiers objets associs aux fichiers sources, que va relier MPLINK pour obtenir le fichier excutable. Pour dcouper un projet en plusieurs fichiers sources, on peut aussi inclure tous les fichiers dans un fichier principal grce la directive "include" (ici on pourrait inclure le fichier tempo.asm dans le fichier chen5.asm). L'intrt principal d'utiliser un diteur de lien est qu'il permet de relier des fichiers objets qui reprsentent le code excutable des fichiers sources associs, qui peut : ne pas tre allou en mmoire programme (on parle alors de "code relogeable") manipuler des registres et drouter le programme vers une tiquette sans spcifier leur adresse absolue. Ces tiquettes ou registres sont simplement reprsents par un symbole qui pourra tre exploit par d'autres fichiers lis (on parle alors de "rfrences croises") On peut ainsi dcouper un projet en modules (fichiers objets) aussi indpendants que possible, qui pourront ventuellement tre utiliss dans d'autres projets. Pour obtenir un code relogeable, on n'utilise plus la directive org mais code qui permet de dfinir une section de code. De mme, on peut dfinir des sections de donnes initialises (directive idata) ou non
35

(directive udata). Toutes ces sections seront alloues en mmoire l'dition de lien partir du fichier .lkr. Les registres ou tiquettes exportes devront tre dsignes par la directive global aprs leur dclaration. Elles seront utilisables dans d'autres fichiers sources en les dclarant par la directive extern. 2) Ouvrir les 2 fichiers sources et observer les diffrentes sections et la procdure utilise pour croiser l'tiquette "tempo". 3) Effectuer une recopie du programme principal du TP1 et compiler le projet. Observer le fichier de mapping TP2.map gnr par MPLINK et reprer o sont logs en mmoire les diffrentes sections du programme, ainsi que les variables des sections de donnes. Ouvrir galement la fentre Program Memory (VIEW > PROGRAM MEMORY) qui indique ce qui sera implant dans la mmoire du PIC partir du fichier .hex de sortie. On remarquera que MPLINK a cre 2 sections : donnes_init_i o se trouve les valeurs initiales des variables de la section donnes_init (l'instruction RETLW x retourne x dans le registre W), ainsi qu'une section .cinit qui est une table de correspondance ("Look Up Table") entre l'adresse de dbut des sections de valeurs initiales (ici il n'y en a qu'une qui est donnes_init_i ) et l'adresse de dbut de la section des variables correspondantes (ici donnes_init) ainsi que le nombre de variables de la section. Il est en effet ncessaire de stocker les valeurs initiales en mmoire morte (ici en mmoire programme) puisque la mmoire RAM est par dfinition volatile. Si l'on excute le programme tel quel (par simulation) il ne sera pas oprationnel car pour initialiser les variables (ici cmpt3) il faut ajouter un programme d'initialisation qui exploite la table .cinit pour effectuer une recopie de donnes_init_i dans donnes_init. Ce programme d'initialisation est gnr automatiquement par tout compilateur C. Avec MPASM, c'est l'utilisateur de l'ajouter. Un exemple de ce type de fichier est fourni avec MPLAB. 4) Ajouter au projet le fichier source : C:\logiciel\pic\MPLAB7_6\MPASM Suite\Example\IDASM16.asm. Ouvrir le fichier, reprer le point d'entre copy_init_data qui correspond au dbut du sous-programme qui effectue la recopie. Effectuer un appel (CALL) sur cette tiquette au dbut du programme principal dans chen5.asm en n'oubliant pas la directive extern.

5) Vrifier que l'initialisation de cmpt3 s'effectue correctement en simulation et tester le programme sur la carte. Pourquoi la temporisation n'a-t-elle plus la bonne dure partir du 2e appel au sous programme-tempo ?

36

TP 3
Objectifs Programmation en langage C Utilisation de la mmoire EEPROM

I) Exemple
1) Ouvrir les fichier test.c et tempo.c dans le rpertoire TP3 (voir copie en annexe TP3-1). Ce fichier est l'quivalent en langage C des fichiers chen5.asm et tempo.asm du TP2 (+ changement de sens quand on appuie sur le bouton poussoir). Observer la structure de ce programme, notamment les directives de compilation. (le fichier d'enttes pic1684.h introduit par pic.h est fourni en annexe TP3-2) 2) Crer le projet TP3.mcp en choisissant le langage HI-TECH Universal ToolSuite et lui associer les 2 fichiers sources en C. On remarquera qu'il n'est pas possible de spcifier de fichier de commande .lkr car le compilateur C possde son propre diteur de lien HLINK qui impose l'adresse des 3 types de sections : text psect (code), data psect (donnes initialises) et bss psect (donnes non initialises). Compiler et observer les 2 fichiers .lst gnrs par le compilateur C ainsi que le fichier .map.

II) Programme MESSAGE


On va ici crire un programme permettant l'affichage d'un message de n caractres squentiellement sur l'afficheur 7 segments. On souhaite pouvoir acclrer la vitesse d'affichage chaque appui sur le poussoir. La temporisation de dfilement sera mmorise dans l'EEPROM de donne du PIC 16F84; ainsi l'affichage reprendra une mme cadence aprs une coupure de l'alimentation (l'intrt est bien sr ici de voir comment contrler logiciellement la mmoire EEPROM du PIC !) Le message sera stock dans l'EEPROM au moment de la programmation grce la directive __EEPROM_DATA (DATA 1, DATA 2,.., DATA 8) qui permet de programmer des octets 8 par 8.

37

On codera les caractres afficher par l'octet : abcdefg0 pouvoir charger directement cette valeur dans le port B.

de manire

La temporisation sera obtenue partir du dbordement du timer0 qui gnrera une interruption. L'appui sur le poussoir gnrera galement une interruption qui modifiera alors le rapport de division du prescaler stock lui aussi dans l'EEPROM. La fonction main sera donc rduite l'appel de la fonction init. (on pourra y ajouter le programme chenillard test.c pour visualiser le fonctionnement par interruption) Les rebonds du bouton poussoir seront neutraliss par une boucle de temporisation de l'ordre de 10 ms). Le programme est crire dans le fichier mes.c prform.

38

ANNEXE TP3-1 : fichier test.c + tempo.c


fichier test.c
#include <pic.h> // inclut des macros + pic1684.h // directive pour programmer le registre CONFIG

__CONFIG (HS&WDTDIS&PWRTEN); char led=0xfe; extern tempo (void); init (void) { TRISA = 0x00; PORTA = 0xff; TRISB = 0x01; PORTB = 0x00; OPTION = 0x00; } main (void) { init (); while (1) { while (led != 0xef && INTF != 1) { led = led << 1 | 0x01; PORTA = led; tempo (); } INTF = 0; while (led != 0xfe && INTF != 1) { led = led >>1 | Ox80; PORTA = led; tempo (); } INTF = 0; } }

// la fonction extern est dfini dans un autre fichier

/* /*

ILLUSTRATIONS valeur = eeprom_read(ADRESSE);

*/ permet de lire l'EEPROM avec 0x00 =< ADRESSE <= 0x3F

*/

/* /* /* /* /*

eeprom_write (0x00,tempo); asm("sleep"); #asm SLEEP #endasm

permet d'crire dans l'EEPROM */ permet d'introduire une instruction assembleur */ */ */ */

on peut aussi crire toute une routine en assembleur

39

/* void interrupt bouton (void) { INTF=0; } */

routine d'interruption (le nom n'a pas d'importance) le contexte est sauvegard mais il faut rinitialiser le flag de la source d'IT

fichier tempo.c
#include <pic.h>

tempo (void) { long i; for (i=1; i<=10000 ; i++); }

40

ANNEXE TP3-2 : fichier pic1684.h

#ifndef _HTC_H_ #warning Header file pic1684.h included directly. Use #include <htc.h> instead. #endif /* * * * * * * * * */

Header file for the Microchip PIC 16CR83 chip PIC 16F83 chip PIC 16C84 chip PIC 16F84 chip PIC 16F84A chip PIC 16CR84 chip Midrange Microcontrollers

static static static static static static static static static static static static static static static static

volatile volatile volatile volatile volatile volatile volatile volatile volatile

unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned

char char char char char char char char char char char

RTCC @ TMR0 @ PCL @ STATUS FSR @ PORTA @ PORTB @ EEDATA EEADR @ PCLATH INTCON

0x01; 0x01; 0x02; @ 0x04; 0x05; 0x06; @ 0x09; @ @

0x03;

0x08; 0x0A; 0x0B; @ @ @ @ @ 0x81; 0x85; 0x86; 0x88; 0x89;

unsigned char bank1 OPTION volatile unsigned char bank1 TRISA volatile unsigned char bank1 TRISB volatile unsigned char bank1 EECON1 volatile unsigned char bank1 EECON2

/* STATUS bits */ static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit /* static static static static static /* static static static static static static PORTA bits volatile bit volatile bit volatile bit volatile bit volatile bit PORTB bits volatile bit volatile bit volatile bit volatile bit volatile bit volatile bit

RP0 TO PD ZERO DC CARRY */ RA4 RA3 RA2 RA1 RA0 */ RB7 RB6 RB5 RB4 RB3 RB2

@ @ @ @ @ @

(unsigned)&STATUS*8+5; (unsigned)&STATUS*8+4; (unsigned)&STATUS*8+3; (unsigned)&STATUS*8+2; (unsigned)&STATUS*8+1; (unsigned)&STATUS*8+0;

@ @ @ @ @

(unsigned)&PORTA*8+4; (unsigned)&PORTA*8+3; (unsigned)&PORTA*8+2; (unsigned)&PORTA*8+1; (unsigned)&PORTA*8+0;

@ @ @ @ @ @

(unsigned)&PORTB*8+7; (unsigned)&PORTB*8+6; (unsigned)&PORTB*8+5; (unsigned)&PORTB*8+4; (unsigned)&PORTB*8+3; (unsigned)&PORTB*8+2;

41

static volatile bit static volatile bit static volatile bit /* INTCON bits */ static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit /* OPTION static bank1 static bank1 static bank1 static bank1 static bank1 static bank1 static bank1 static bank1 /* static static static static static /* static static static static static static static static bits bit bit bit bit bit bit bit bit

RB1 RB0 INT

@ (unsigned)&PORTB*8+1; @ (unsigned)&PORTB*8+0; @ (unsigned)&PORTB*8+0;

GIE EEIE T0IE INTE RBIE T0IF INTF RBIF

@ @ @ @ @ @ @ @

(unsigned)&INTCON*8+7; (unsigned)&INTCON*8+6; (unsigned)&INTCON*8+5; (unsigned)&INTCON*8+4; (unsigned)&INTCON*8+3; (unsigned)&INTCON*8+2; (unsigned)&INTCON*8+1; (unsigned)&INTCON*8+0;

*/ RBPU @ INTEDG T0CS @ T0SE @ PSA @ PS2 @ PS1 @ PS0 @

(unsigned)&OPTION*8+7; @ (unsigned)&OPTION*8+6; (unsigned)&OPTION*8+5; (unsigned)&OPTION*8+4; (unsigned)&OPTION*8+3; (unsigned)&OPTION*8+2; (unsigned)&OPTION*8+1; (unsigned)&OPTION*8+0;

TRISA bits volatile bank1 volatile bank1 volatile bank1 volatile bank1 volatile bank1 TRISB bits volatile bank1 volatile bank1 volatile bank1 volatile bank1 volatile bank1 volatile bank1 volatile bank1 volatile bank1

*/ bit bit bit bit bit */ bit bit bit bit bit bit bit bit

TRISA4 TRISA3 TRISA2 TRISA1 TRISA0

@ @ @ @ @

(unsigned)&TRISA*8+4; (unsigned)&TRISA*8+3; (unsigned)&TRISA*8+2; (unsigned)&TRISA*8+1; (unsigned)&TRISA*8+0;

TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0

@ @ @ @ @ @ @ @

(unsigned)&TRISB*8+7; (unsigned)&TRISB*8+6; (unsigned)&TRISB*8+5; (unsigned)&TRISB*8+4; (unsigned)&TRISB*8+3; (unsigned)&TRISB*8+2; (unsigned)&TRISB*8+1; (unsigned)&TRISB*8+0;

/* EECON1 bits */ static volatile bank1 static volatile bank1 static volatile bank1 static volatile bank1 static volatile bank1

bit bit bit bit bit

EEIF WRERR WREN WR RD

@ @ @ @ @

(unsigned)&EECON1*8+4; (unsigned)&EECON1*8+3; (unsigned)&EECON1*8+2; (unsigned)&EECON1*8+1; (unsigned)&EECON1*8+0;

#define CONFIG_ADDR

0x2007

/*osc configurations*/ #define RC 0x3FFF #define HS 0x3FFE #define XT 0x3FFD #define LP 0x3FFC /*watchdog*/ #define WDTEN #define WDTDIS

// // // //

resistor/capacitor high speed crystal/resonator crystal/resonator low power crystal/resonator

0x3FFF 0x3FFB

// enable watchdog timer // disable watchdog timer

42

/*power up timer*/ #if defined (_16C84) #define PWRTEN #define PWRTDIS #else #define PWRTDIS #define PWRTEN #endif

0x3FFF 0x3FF7 0x3FFF 0x3FF7

/* enable power up timer*/ /* disable power up timer */ /* disable power up timer */ /* enable power up timer */

#if defined (_16CR83) || defined(_16CR84) #define DP 0x3F7F // data code is protected #define PROTECT 0x008F // program code is protected // alternative definition #define DATPROT 0x3F7F // use DP #define DATUNPROT 0x3FFF // use UNPROTECT #elif defined (_16C84) #define PROTECT 0x3FEF // program code is protected #elif defined (_16F83) || defined(_16F84) || defined(_16F84A) #define PROTECT 0x000F // program code is protected #endif #define UNPROTECT 0x3FFF // do not protect the code

43

Você também pode gostar