La programmation des PIC en C( le temp d'horloge).pdf

download La programmation des PIC en C( le temp d'horloge).pdf

of 19

Transcript of La programmation des PIC en C( le temp d'horloge).pdf

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    1/19

    La programmation des PIC en C

    La gestion du temps

    Ralisation : HOLLARD Herv.http://electronique-facile.comDate : 26 aot 2004Rvision : 1.2

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    2/19

    La programmation des PIC en CLa gestion du temps

    Page 2/19

    Sommaire

    Sommaire ............................................................................................................................ 2

    Introduction .......................................................................................................................... 3Structure de ce document .................................................................................................... 4Le matriel ncessaire ......................................................................................................... 4La platine d'essai ................................................................................................................. 4But atteindre ..................................................................................................................... 5L'instruction "delay" .............................................................................................................. 5Le "nop();" ............................................................................................................................ 7La boucle ............................................................................................................................. 8Le timer .............................................................................................................................. 11Rcapitulatif ....................................................................................................................... 16Le chien de garde .............................................................................................................. 17

    Conclusion ......................................................................................................................... 19

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    3/19

    La programmation des PIC en CLa gestion du temps

    Page 3/19

    Introduction

    Les microcontrleurs PIC de la socit Microchip sont depuis quelques annes dans le "hitparade" des meilleures ventes. Ceci est en partie d leur prix trs bas, leur simplicit deprogrammation, les outils de dveloppement que l'on trouve sur le NET.

    Aujourd'hui, dvelopper une application avec un PIC n'a rien d'extraordinaire, et tous les outilsncessaires sont disponibles gratuitement. Voici l'ensemble des matriels qui me semblent lesmieux adapts.

    Ensemble de dveloppement (diteur, compilateur, simulateur) :MPLAB de MICROCHIP http://www.microchip.com

    Logiciel de programmation des composants:IC-PROG de Bonny Gijzen http://www.ic-prog.com

    Programmateur de composants:PROPIC2 d'Octavio Noguera voir notre site http://electronique-facile.com

    Pour la programmation en assembleur, beaucoup de routines sont dj crites, des didacticielstrs complets et gratuits sont disponibles comme par exemple les cours de BIGONOFFdont le siteest l'adresse suivante http://abcelectronique.com/bigonoff.

    Les fonctions que nous demandons de raliser nos PIC sont de plus en plus complexes, lesprogrammes pour les raliser demandent de plus en plus de mmoires. L'utilisateur est ainsi la

    recherche de langages "volus" pouvant simplifier la tche de programmation.

    Depuis l'ouverture du site http://electronique-facile.com, le nombre de questions sur laprogrammation des PIC en C est en constante augmentation. Il est vrai que rien n'est aujourd'huidisponible en franais.

    Mon exprience dans le domaine de la programmation en C due en partie mon mtierd'enseignant, et ma passion pour les PIC, m'a naturellement amen l'criture de cedidacticiel. Celui-ci se veut accessible tous ceux qui possdent une petite exprienceinformatique et lectronique (utilisation de Windows, connaissances minimales sur les notions

    suivantes : la tension, le courant, les rsistances, les LEDs, les quartz, l'criture sous forme binaireet hexadcimale.).

    Ce quatrime fascicule vous permettra de raliser n'importe quelle application, sera la fin de"l'apprentissage indispensable". Tous ce qui suivra vous permettra uniquement de programmerplus rapidement et de faon plus structure.

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    4/19

    La programmation des PIC en CLa gestion du temps

    Page 4/19

    Structure de ce document

    Ce document est compos de chapitres. Chaque chapitre dpend des prcdents. Si vousn'avez pas de notion de programmation, vous devez raliser chaque page pour progresserrapidement.

    Le type gras sert faire ressortir les termes importants.

    Vous trouverez la dfinition de chaque terme nouveauen bas de la pageo apparat pour lapremire fois ce terme. Le terme est alors en i tal ique.

    La couleur bleueest utilise pour vous indiquer que ce texteest taperexactement sous cetteforme.

    La couleur rougeindique des commandes informatiques utiliser.

    Le matriel ncessaire

    Les deux logiciels utiliss lors du premier fascicule.

    Un programmateur de PIC comprenant un logiciel et une carte de programmation. Voustrouverez tout ceci sur notre site.

    Un PIC 16F84, un quartz de 4MHz, deux condensateurs de 22pF, 4 leds rouges, 4 rsistancesde 470 ohms, 4 interrupteurs, 4 rsistances de 10 Kohms. Une platine d'essai sous 5 volts.

    La platine d'essai

    Pour tester les programmes proposs, il est possible :-utiliser le simulateur comme prsent dans le premier manuel;-programmer un composant et tester physiquement la ralisation;-utiliser un mulateur.

    Nous utiliserons dans ce didacticiel, le test physique.Il est ainsi ncessaire de raliser sur une platinede type LAB, par exemple, le montage ci-contre.

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    5/19

    La programmation des PIC en CLa gestion du temps

    Page 5/19

    But atteindre

    Ce didacticiel vous permettra de grer le temps avec un PIC. Nous verrons 3 niveaux degestion.

    Le premier niveau nous permettra de consommer du temps grce l'instruction nop et aux

    boucles. Le deuxime niveau nous obligera comprendre de faon dtaille comment fonctionne la

    partie matrielle du PIC destine la gestion du temps afin de crer des temporisationsprcises.

    Le troisime niveau nous montrera comment grer le temps tout en effectuant d'autresoprations.

    Pour atteindre ces buts, nous utiliserons comme dans les autres didacticiels la platine d'essai dela page 4.

    Avant tout a, afin de rapidement mettre en pratique des temporisations, nous allons crire unpetit programme, qui nous permettra d'utiliser une instruction trs apprciable : l'instruction "delay".

    L'instruction "delay"

    Il serait intressant d'avoir des instructions qui nous permettraient de consommer du temps.Nous allons crer les instructions suivantes:

    delay_10us(temps); temporisation de dure : temps * 10 microsecondesdelay_ms(temps); temporisation de dure : temps * 1 millisecondedelay_10ms(temps); temporisation de dure : temps * 10 millisecondes

    avec temps : entier entre 1 et 255.

    Nous allons crire un fichier contenant 3 fonctions correspondantes aux 3 instructionsprcdentes. Il suffira de dclarer le nom de ce fichier en dbut de programme pour pouvoir utiliserces 3 instructions.

    Ne cherchez pas encore comprendre comment est construit ce fichier. Le but de ce chapitreest de pouvoir utiliser rapidement des temporisations sans connaissances sur lefonctionnement du PIC, sur les fonctions.

    En allant plus loin dans ce fascicule, vous pourrez comprendre le corps des 3 procdures; leurforme vous sera accessible avec le prochain didacticiel.

    1 -Cration du fichier contenant le code des instructions

    Nous allons crer un fichier dans lequel nous allons mettre le code correspondant la rsolutiondes 3 nouvelles instructions.

    Dans MPLAB, cliquez sur New du menu File. Tapez le texte suivant dans la nouvellefentre cre.

    /*delay_10us (char) : delay en multiple de 10 us pour un quartz de 4 MHzdelay_ms (char) : delay en ms pour un quartz de 4 MHzdelay_10ms (char) : delay en multiple de 10 ms pour un quartz de 4 MHz

    *///--------------------------delay en multiple de 10 us. Quartz de 4 MHz -----------------

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    6/19

    La programmation des PIC en CLa gestion du temps

    Page 6/19

    void delay_10us (char usecs){while (-- usecs > 0)

    {clrwdt(); // only if necessary, nop(); a la placenop();

    nop();nop();nop();}

    }

    //--------------------------delay en multiple de ms. Quartz de 4 MHz -----------------

    void delay_ms (char millisec){OPTION = 2; // prescaler divide by 8do

    {TMR0 = 0;clrwdt(); // only if necessarywhile (TMR0 < 125); // 125us * 8 =1000us}

    while (-- millisec > 0);}

    //-----------------delay en multiple de 10ms. Quartz de 4 MHz, erreur 0.16 %--------------

    void delay_10ms (char n)

    {char i;OPTION = 7; //prescaler to 256do

    {clrwdt(); // only if necessaryi =TMR0 +39; // 256us * 39 =10 mswhile (i != TMR0);}

    while (--n > 0);}

    Sauvegarder ce fichier grce la commande File>Save As

    Fermer ce fichier.

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    7/19

    La programmation des PIC en CLa gestion du temps

    Page 7/19

    2 - Cration du programme

    Nous allons maintenant crire un programme qui nous permettra de faire clignoter la led1 avecune priode de 2 secondes (1seconde allume et une seconde teinte).

    Tapez le texte suivant dans le fichier clignotement.C

    // Attention de respecter les majuscules et minuscules

    // ------------------------------Dclaration de fichier externes--------------#include "delay.c" // dclaration du fichier contenant les temporisations

    //---------------------------------E/S-----------------------------------------------char sortie @ PORTB;bit led1 @ RB0;//------------------------------Variables generales-------------------------------char etat_inters;char a;

    //-------------------------------Fonction principale------------------------------void main(void){

    sortie = 0; // Initialisation des pattes du microcontrleurTRISB = 0b11110000;

    for (;;) // La suite du programme s'effectue en boucle{led1=!led1;delay_10ms(100);}

    }

    Essayez ce programme avec la platine d'essai

    L'intrt de cette mthode est de pouvoir utiliser une instruction simple pour effectuer unetemporisation. L'inconvnient est le manque de prcision de la temporisation, ainsi quel'impossibilit de raliser une opration pendant la temporisation.

    Le "nop();"

    Il existe une instruction pour les PIC qui consomme 4 priodes d'oscillation du quartz. Pour notreplatine d'essai avec un quartz de 4Mhz, cette instruction consomme donc 1s.

    En C, il suffit d'crire nop ();

    Ex : temporisation de 3snop();nop();nop();

    Cette mthode est la plus simple mettre en uvre. Elle convient p arfaitement pour des petitestemporisations ( moins de 10s).

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    8/19

    La programmation des PIC en CLa gestion du temps

    Page 8/19

    La boucle

    Pour raliser une temporisation un peu plus longue, le plus simple est de raliser une itrationavec rien, un ou plusieurs "nop();" comme corps de la boucle. C'est cette mthode qui a t

    utilise pour la cration de l'instruction "delay_10us( );"

    Attention : la boucle elle-mme prend du temps se raliser. Il y a ainsi trois tapes pour utilisercette mthode:

    1 - criture d'une boucle simple ; 2 - recherche du temps mis par cette boucle ; 3rglage final de la boucle.

    Nous allons chercher raliser une boucle d'une dure approximative de 1ms. Pour cela, nousallons raliser les 3 tapes prcdentes.

    1 - Ecriture d'une boucle simple

    La boucle la plus simple crire en C est :for (temps=0;temps

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    9/19

    La programmation des PIC en CLa gestion du temps

    Page 9/19

    2 - Recherche du temps mis par cette boucle

    Vrifier que l'horloge est de 4 Mhz(voir fascicule 1)

    Ouvrez la fentreDebugger>Stopwatch

    La ligne "Instruction Cycles" nous informe sur le nombre de cycle instruction1.La ligne "Time (usecs) nous informe sur l'coulement du temps en micro-seconde.La colonne Total simulated nous informe sur le nombre de cycles d'instruction et le temps pass

    depuis le dbut du programme.La colonne Stopwatch nous informe sur le nombre de cycles d'instruction et le temps pass depuis

    la dernire action sur le bouton "Zero"

    Cliquez sur l'icne "Build", puis sur l'icne "Reset".

    Faites un Run to cursorsur la boucle " for (temps=0;temps

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    10/19

    La programmation des PIC en CLa gestion du temps

    Page 10/19

    // Attention de respecter les majuscules et minuscules//---------------------------------E/S et variables generales---------------------char sortie @ PORTB;unsigned temps : 16;//-------------------------------Fonction principale------------------------------void main(void)

    {sortie = 0; // Initialisation des pattes du microcontroleurTRISB = 0b11110000;

    for (;;) // La suite du programme s'effectue en boucle{nop();for (temps=0;temps

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    11/19

    La programmation des PIC en CLa gestion du temps

    Page 11/19

    Le timer

    Nous arrivons au traitement de la partie la plus complexe du PIC : le timer. Le timer est uncompteur de cycles d'instructions. Il suffit de lire rgulirement ce compteur pour valuer letemps qui s'coule. Il est galement possible d'initialiser ce compteur avec le nombre de notre

    choix. Il faut aussi noter que ce compteur doit tre configur pour fonctionner.

    1 - Constitution du timer.

    Le timer est constitu de : le TMR0. C'est un registre de 8 bits, qui compte les front montant3 du signal qu'on lui

    fournit. Arriv 255, il repasse 0. Il est accessible en lecture ou criture de la mmefaon que le PORTA, le PORTB ou les variables.

    le prdiviseur. Il divise la frquence du signal qu'on lui fournit par une constante qu'il estncessaire de programmer. Ex : un signal de priode 1us divis par 32 donnera un signalde priode 32s.

    les aiguillages. Ils permettent de dfinir le chemin qu'emprunteront les informations (sortie

    des aiguillages en B et C). les bits de configuration (RTE, RTS ). Ils permettent de dfinir les diffrentes fonctions. la synchro. Retarde le dbut du fonctionnement de 2 cycles d'instruction lorsqu'un bit

    relatif au timer est modifi. Cette fonction est due l'architecture du timer et ne peut trecontourne.

    Voici le schma du timer. Pas d'affolement, nous allons l'expliquer.

    Prdiviseur

    TMR0SynchroPatteRA4

    RTE

    fosc/4

    RTS PS2, PS1, PS0 PSA

    1

    0

    0

    1

    A

    B C

    A gauche, sont notes les entres du timer. Elles sont au nombre de deux : le signal duquartz divis par 4 (soit un signal de priode 1us) et la patte RA4.

    L'entre RA4 attaque une porte "ou exclusif" qui fournit en A un signal dpendant du bitRTE selon le tableau ci-contre.Cette fonction permet d'inverser les fronts montant et les

    fronts descendants4si RTE=1. Le signal en B dpend de l'aiguillage command par RTS.

    Nous avons donc grce RTS le choix de la sourced'entre du timer.

    Le signal en C dpend de l'aiguillage command par PSA.Nous choisissons donc avec PSA d'utiliser ou non leprdiviseur.

    Le prdiviseur divise la frquence du signal prsente en B par un nombre calcul grce PS2, PS1, PS0. et donn dans le tableau page suivante.

    La synchro retarde de 2 cycles d'instruction le dbut du comptage. TMR0 compte les fronts montants.

    3Un front montant est le passage de l'tat 0 l'tat 1 d'une entit.

    4Un front descendant est le passage de l'tat 1 l'tat 0 d'une entit.

    RTE = 0 RTE = 1

    A = RA4 A = !RA4

    RTS = 0 RTS = 1

    B = fosc/4 B = A

    PSA = 0 PSA = 1

    C = Prdiviseur C = B

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    12/19

    La programmation des PIC en CLa gestion du temps

    Page 12/19

    Ex : En positionnant PS2, PS1 et PS0 1,le taux de prdivision est de 256. Un signal enentre du prdiviseur de priode 1s,donnera en sortie un signal de priode 256

    s.

    2 - Configuration du timer

    La configuration du timer se fait par la configuration des bits vus prcdemment. Ces bits sontaccessibles par le registre appel OPTION.

    Registre OPTION

    7 6 5 4 3 2 1 0RTS RTE PSA PS2 PS1 PS0Reset 1 1 1 1 1 1 1 1

    Remarques : Les fonctions des deux bits de gauche de ce registre ne sont pas donnes. Ces deux bits

    sont utiliss pour d'autres ressources du PIC. Les tats du registre option sont donns lors du reset (ligne Reset). Dans cette

    configuration, TMR0 compte les fronts descendants de la patte RA4.

    3 - Utilisation du timer.

    L'utilisation du timer est assez simple et se fait en 3 tapes. mise jour du registre OPTION mise jour du TMR0 lecture du TMR0

    Remarques : A chaque mise jour du registre TMR0 ou d'un bit de configuration, 2 cycles d'instructions

    sont ncessaires avant le commencement du comptage. La lecture d'un bit par contre ne perturbe pas le comptage.

    4Exemples de programmes.

    Notre premier exemple sera trs original puisque nous allons faire clignoter la led 1 avec unepriode de 2 secondes (1 seconde allume, 1 seconde teinte).

    Nous configurerons le timer de la faon suivante : source : fosc/4 prdiviseur : 256.

    Avec une horloge de 4Mhz, TMR0 s'incrmentera toutes les 256s. Pour obtenir cetteconfiguration, nous mettrons le registre OPTION 0b11000111 (le bit 4 peut tre indiffremmentpositionn 0 ou 1. Les bits 6 et 7 sont laisss leur tat au reset).

    Pour raliser notre temporisation de 1 seconde, nous allons : attendre que le registre TMR0 initialement 0 atteigne 250 (il se sera donc coul

    256s*250 = 64 ms) pour incrmenter une variable temps initialement 0.

    5Mise sous tension du pic ou action sur la patte MCLR

    PS2 PS1 PS0Taux du

    prdiviseur

    0 0 0 2

    0 0 1 4

    0 1 0 8

    0 1 1 16

    1 0 0 321 0 1 64

    1 1 0 128

    1 1 1 256

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    13/19

    La programmation des PIC en CLa gestion du temps

    Page 13/19

    attendre que la variable temps atteigne 16 ( il se sera coul 64ms * 16 = 1.024 seconde). mettre jour la led 1.

    // Attention de respecter les majuscules et minuscules//---------------------------------E/S et variables generales---------------------char sortie @ PORTB;

    bit led1 @ RB0;char temps;//-------------------------------Fonction principale------------------------------void main(void){

    sortie = 0; // Initialisation des pattes du microcontroleurTRISB = 0b11110000;OPTION = 0b11000111; //prediviseur 256 entre : clock/4temps = 0;TMR0 = 0;for (;;) // La suite du programme s'effectue en boucle

    {if (TMR0 == 250) { ++temps; TMR0 = 0; } // 64ms sont passesif (temps == 16) { led1=!led1; temps = 0; } // 1,024 seconde est passe

    }}

    Je vous laisse tester et comprendre compltement ce programme.Si vous voulez observer la temporisation avec la fentre stopwatch et les "run to cursor", il faudra

    crire le dernier if de la faon suivante : if (temps == 16) {led1=!led1; temps = 0; }

    et faire un 'run to cursor' sur la deuxime ligne. En effet, l'criture sur une ligne provoque l'arrt dela simulation chaque excution du if, soit 16 fois par seconde.

    Voici une deuxime configuration du timer qui va rpondre au mme clignotement sans aucuneerreur sur la temporisation. Nous configurerons le timer de la faon suivante :

    source du timer :fosc/4; prdiviseur : 64.

    Avec une horloge de 4Mhz, TMR0 s'incrmentera toutes les 64s. Pour obtenir cetteconfiguration, nous mettrons le registre OPTION 0b11000101 (le bit 4 peut tre indiffremmentpositionn 0 ou 1. Les bits 6 et 7 sont laisss leur tat au reset).

    Pour raliser notre temporisation de 1 seconde, nous allons :

    incrmenter une variable temps chaque incrmentation du TMR0 (donc toutes les 64s); attendre que la variable temps atteigne 15625. Il se sera coul exactement 1 seconde; mettre jour la led 1.

    Afin d'viter une quelconque erreur, il ne faudra jamais mettre jour TMR0 ou un bit deconfiguration (voir le problme de la fonction synchro).

    Nous avons donc besoin d'une variable temps de 16 bits et d'une autre variable afin de dtecterl'incrmentation de TMR0.Nous l'appellerons newtmro.

    // Attention de respecter les majuscules et minuscules//---------------------------------E/S et variables generales---------------------

    char sortie @ PORTB;bit led1 @ RB0;unsigned temps : 16;

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    14/19

    La programmation des PIC en CLa gestion du temps

    Page 14/19

    char newtmro;//-------------------------------Fonction principale------------------------------void main(void){

    sortie = 0; // Initialisation des pattes du microcontroleurTRISB = 0b11110000;OPTION = 0b11000101; //prediviseur 64 entre : clock/4

    temps = 0;newtmro = TMR0+1;for (;;) // La suite du programme s'effectue en boucle

    {if (TMR0 == newtmro) { ++temps; ++newtmro; } // 64us sont passesif (temps == 15625) {led1=!led1; temps = 0; } // 1 seconde est passe

    }}

    Je vous laisse tester et comprendre compltement ce programme.

    Voici un dernier exemple qui met en avant l'intrt du timer sur la fonction delay. Le bouton poussoir 1 allume la led 1 et teint les autres. Le bouton poussoir 2 allume la led 2 et teint les autres. Le bouton poussoir 3 allume les leds 1, 2 et 3. Le bouton poussoir 4 teint les leds. 1, 2 et 3. Dans le cas o aucun ou plusieurs interrupteurs sont actionns, rien ne se produit. La led 4 clignote avec une priode de 2 secondes.

    Nous avons donc le clignotement de la led 4 en mme temps que d'autres actions.

    Voici le programme correspondant.

    // Attention de respecter les majuscules et minuscules//---------------------------------E/S et variables generales---------------------char sortie @ PORTB;bit inter1 @ RA0;bit inter2 @ RA1;bit inter3 @ RA4;bit inter4 @ RB5;bit led1 @ RB0;bit led2 @ RB1;bit led3 @ RB2;bit led4 @ RB3;

    //-----------------------------Variables generales--------------------------------char etat_inters;char temps;//-------------------------------Fonction principale------------------------------void main(void){

    sortie = 0; // Initialisation des pattes du microcontroleurTRISB = 0b11110000;OPTION = 0b11000111; //prediviseur 256 entre : clock/4temps = 0;TMR0 = 0;

    etat_inters=0;for (;;) // La suite du programme s'effectue en boucle

    {

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    15/19

    La programmation des PIC en CLa gestion du temps

    Page 15/19

    etat_inters.0=inter1; // Mise de l'etat des inter dans la variable etat_intersetat_inters.1=inter2;etat_inters.2=inter3;etat_inters.3=inter4;switch (etat_inters){

    case 1: //action sur inter1 uniquementled1=1;

    led2=0;led3=0;break;

    case 2: // action sur inter2 uniquementled2=1;led1=0;led3=0;break;

    case 4: // action sur inter3 uniquementled1=1;led2=1;led3=1;break;

    case 8: // action sur inter4 uniquementled1=0;led2=0;led3=0;break;}

    if (TMR0 == 250) { ++temps; TMR0 = 0; } // 64ms sont passsif (temps == 16) { led4=!led4; temps = 0; } // 1,024 seconde est pass

    }}

    Pour raliser un programme avec cette mthode, il faut faire attention plusieurs choses. Le programme doit obligatoirement excuter la ligne if (TMR0 == rgulirement. Il est donc interdit d'utiliser une boucle longue. La dure maximale de scrutation de tout le programme autorise est de 64 ms. En effet,

    toutes les 64 ms, il est indispensable de raliser la ligne if (TMR0 == . La prcision de latemporisation est donc ici au minimum de 64 ms.

    Reprenez maintenant le code correspondant la rsolution des 3 instructions delay en dbut dufascicule. Vous tes enfin capable de le comprendre. Nous aborderons l'instruction clrwdt(); unpeu plus loin.

    L'intrt du timer est d'tre prcis, de permettre d'effectuer des oprations pendant latemporisation. Son inconvnient est d'tre difficile programmer, ncessite la ralisation decomparaison rgulirement pendant le programme. Il rend donc difficile l'utilisation de bouclelongue. Pour palier au dernier inconvnient, il sera ncessaire d'avoir recours aux interruptions,notion qui sera aborde dans le prochain fascicule.

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    16/19

    La programmation des PIC en CLa gestion du temps

    Page 16/19

    Rcapitulatif

    Le tableau ci-dessous rcapitule les utilisations classiques de chaque mthode.

    nop(); boucle delay timertimer

    +interruption

    Temporisation trs courte X

    Temporisation sans le timer X

    Temporisation peu prcise,facile mettre en uvre X

    Temporisation prcise X

    Temporisation prcise,accompagne de boucles longues X

    Le timer du PIC 16F84 correspond la structure la plus rpandue chez les PIC. Il existe aussides timers 8 bits plus complexes, des timers 16 bits. Certains pic ont plusieurs timers. Il est doncncessaire en fonction de la complexit de l'application raliser de choisir le pic le plusappropri. Il sera alors indispensable de bien lire la documentation du pic afin de pouvoir leprogrammer.

    Je vous conseille de regarder la doc du PIC16F627 ou 16F628. Ces deux pic sont compatiblesbroche broche avec le 16F84, les programmes du 16F84 sont utilisables directement avec les16F627 et 16F628 condition de rajouter une instruction supplmentaire en dbut de programmede faon dsactiver la ressource appele "comparateurs analogiques".

    L'avantage de ces PIC est de possder un timer 8 bits pour les petites temporisations, un timer16 bits pour les longues temporisations, un timer 8 bits complexes pour des horloges particulires.Il est aussi possible de gnrer automatiquement grce aux deux derniers timer des signaux avecdes priodes variables, des rapports cycliques6variables.

    6Temps l'tat haut divis par la priode (permet de quantifier combien de temps le signal reste l'tat haut

    pendant la dure d'une priode).

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    17/19

    La programmation des PIC en CLa gestion du temps

    Page 17/19

    Le chien de garde

    On retrouve le chien de garde sous le nom watchdog timerdans toutes les documentations dePIC. Le chien de garde est utilis pour faire un reset (le programme recommence au dbut,

    certaines ressources sont mises des tats dtermins) du PIC. Cette fonction, premire vuesans intrt pour un dbutant, est en ralit principale.

    Dans un microcontrleur, donc un PIC, les causes de dysfonctionnement d'un programme sontnombreuses mme lorsque celui-ci est sans erreur :

    coupure courte d'alimentation modifiant un registre, champs lectromagntique modifiant un registre, action imprvue sur la patte reset (cause mcanique lectromagntique), choc mcanique, modifiant un registre, surtension due la mise en fonction d'un appareil proche, d'un composant

    Vous savez bien que lorsqu'un appareil lectronique ne fonctionne pas correctement, il suffit de

    le dbrancher, puis de le remettre en fonction pour obtenir le fonctionnement attendu. Personne nes'explique le disfonctionnement, et bien il en est de mme pour les PIC. Le chien de garde permetun reset du PIC lorsque certains dfauts apparaissent.

    Le chien de garde correspond un timer particulier. Celui-ci est connect une horloge interne, indpendante du quartz. Il compte en permanence et au moment du dbordemen t7, fait un reset du

    microcontrleur. Afin d'viter le dbordement il est indispensable de le remettre 0grce l'instruction

    clrwdt();. Le temps de dbordement est typiquement de 18ms. Il est possible d'allonger ce

    temps en utilisant le prdiviseur du timer. Le prdiviseur n'est alors plus utilisable par letimer. Il est aussi possible de dsactiver cette fonction grce un fusible accessible au

    moment de la programmation.

    Ci-dessous le schma du timer et du chien de garde.

    Prdiviseur

    TMROSynchroPatteRA4

    RTE

    fosc/4

    RTS PS2, PS1, PS0 PSA

    1

    0

    0

    1

    A

    B C

    PSA

    0

    1

    PSA

    1

    0

    Chien de

    garde

    WDT

    Fusible de validation du

    chien de garde

    gnration

    du

    resetdbordement

    7Passage de FF 0 du chien de garde.

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    18/19

    La programmation des PIC en CLa gestion du temps

    Page 18/19

    Le bit PSA dtermine si le prdiviseur est affect au timer ou au chien de garde PSA = 0, le prdiviseur est utilis pour le timer, le chien de garde gnre un reset au bout

    de 18ms. PSA = 1, le prdiviseur est affect au chien de garde, le taux de prdivision est donn dans

    le tableau ci-dessous (diffrent du taux pour l'affectation au timer).

    Reprenez maintenant le code correspondant la rsolution des 3 instructions delay en dbut dufascicule. Vous pouvez maintenant comprendre l'utilit des instructions clrwdt();

    L'exemple ci-dessous est identique celui permettant le clignotement de la led 1 avec unepriode exacte de 1 seconde, plus l'utilisation du chien de garde en scurit. Si pour une raisoninexplique l'instruction clrwdt(); ne se ralise pas toutes les 18ms au maximum, le programmerecommence 0.

    // Attention de respecter les majuscules et minuscules

    //---------------------------------E/S et variables generales---------------------char sortie @ PORTB;bit led1 @ RB0;unsigned temps : 16;char newtmro;//-------------------------------Fonction principale------------------------------void main(void){

    sortie = 0; // Initialisation des pattes du microcontroleurTRISB = 0b11110000;OPTION = 0b11000101; //prediviseur 64 entre : clock/4temps = 0;

    newtmro = TMR0+1;for (;;) // La suite du programme s'effectue en boucle

    {clrwdt();if (TMR0 == newtmro) { ++temps; ++newtmro; } // 64us sont passsif (temps == 15625) {

    led1=!led1; temps = 0; } // 1 seconde est pass}

    }

    PS2 PS1 PS0 Taux duprdiviseur

    0 0 0 1

    0 0 1 2

    0 1 0 4

    0 1 1 8

    1 0 0 16

    1 0 1 32

    1 1 0 64

    1 1 1 128

  • 7/25/2019 La programmation des PIC en C( le temp d'horloge).pdf

    19/19

    La programmation des PIC en CLa gestion du temps

    Tapez ce programme sous MPLAB.

    Ouvrez la fentre Configure>Configuration Bits.

    Mettre watchdog Timer 'on' pour la simulation.

    Simuler ce programme, la led1 clignote.

    Enlevez l'instruction clrwdt();

    Compiler, faites un run to cursorsur la ligne led1=!led1; temps = 0; }.La simulation n'arrivejamais sur cette ligne puisque toutes les 18ms le chien de garde dborde.

    Il est possible d'arrter la simulation au momentdu dbordement du chien de garde. Pour celaouvrez la fentre Debugger>Settings, cliquezsur l'onglet Break Options et configurez commeci-contre.

    Simuler votre programme. Celui-ci s'arrte aumoment du dbordement, donc au bout de18ms.

    Rajoutez l'instruction clrwdt();

    Pour programmer le PIC il est obligatoired'autoriser le watchdog timer. Pour cela,avant de lancer la programmation, validez lacoche "WDT".

    Tester votre PIC sur la platine LAB.

    Conclusion

    Avec ce quatrime didacticiel, vous tes enfin capable de parfaitement grer le temps. Vouspouvez maintenant concevoir n'importe quel programme. avec un PIC 16F84.Afin de programmer efficacement, il vous manque toutefois quelques notions. La notion de

    fonction, primordiale en C, sera aborde dans le prochain fascicule. Nous verrons aussi commentgnrer des interruptions afin d'utiliser, entre autres, le plus efficacement possible le timer.