Académique Documents
Professionnel Documents
Culture Documents
Cours et exercices
v16
www.microchip.com
SOMMAIRE
1. CARACTERISTIQUES GENERALES DE MCC18 .................................................................................... 4 1.1. 1.2. 1.3. 1.4. 1.5. 1.6. 2. PROPRIETES .......................................................................................................................................... 4 SCHEMA GENERAL DU PROCESSUS DE COMPILATION ................................................................................ 4 ROLE DU PRE-PROCESSEUR .................................................................................................................... 5 ROLE DES FICHIERS D'INCLUSION (*.H) ..................................................................................................... 5 FICHIER P18FXXX.H ............................................................................................................................... 6 DIRECTIVE #PRAGMA CONFIG .................................................................................................................. 9
TP N 1: PRISE EN MAIN DU COMPILATEUR MCC18 ....... .................................................................... 7 2.1. 2.2. 2.3. 2.4. 2.5. PRISE EN MAIN DU COMPILATEUR............................................................................................................. 8 GESTION DES PORTS PARALLELES ........................................................................................................... 9 MISE AU POINT DUN PROGRAMME ECRIT EN C DANS MPLAB .................................................................10 CREATION DUNE FONCTION ..................................................................................................................11 ANALYSE DUN PROGRAMME ECRIT EN C : DECALAGES ...........................................................................12
3.
BIBLIOTHEQUES MCC18 .......................................................................................................................13 3.1. 3.1.1. 3.1.2. 3.2. 3.3. 3.4. 3.4.1. 3.4.2. 3.4.3. 3.5. 3.6. 3.7. 3.7.1. 3.7.2. 3.7.3. EDITEUR DE LIENS MPLINK ..................................................................................................................13 ROLE ET CONTENU DES FICHIERS D'EDITION DE LIEN ...........................................................................13 CODE DE DEMARRAGE (CRT C RUN TIME) ......................................................................................13 BIBLIOTHEQUES SPECIFIQUES D'UN PROCESSEUR ..................................................................................14 FONCTIONS C ANSI .............................................................................................................................15 LES SORTIES DE TEXTE .........................................................................................................................18 FTOA ................................................................................................................................................19 PRINTF, FPRINTF, SPRINTF .................................................................................................................20 FONCTIONS DE LA BIBLIOTHEQUE XLCD: ...........................................................................................21 PIC18FX620 CONFIGURATION DE LHORLOGE INTERNE.......................................................................22 MATH.H ................................................................................................................................................17 TP N UTILISATION DES BIBLIOTHEQUES ..............................................................................................23 2 EXERCICE, SORTIES LCD OU USART................................................................................................24 TESTER ET ANALYSER LE PROGRAMME DE CALCUL DE RACINES CARREES ............................................25 EXERCICES SUR MATH.H ...................................................................................................................26
4.
SPECIFICITES DU COMPILATEUR MCC18 ...........................................................................................27 4.1. 4.2. 4.3. TYPE DE DONNEES ...............................................................................................................................27 MACROS EN C POUR MICRO PIC ...........................................................................................................27 ASSEMBLEUR EN LIGNE .........................................................................................................................27
5.
GESTION DE LA MEMOIRE ....................................................................................................................28 5.1. 5.2. 5.3. DIRECTIVES DE GESTION DE LA MEMOIRE ...............................................................................................28 QUALIFICATIFS DE MEMORISATION .........................................................................................................29 TP N 3 : GESTION DE LA MEMOIRE .....................................................................................................30
6.
GESTION DES INTERRUPTIONS ...........................................................................................................32 6.1. 6.2. 6.3. 6.3.1. 6.3.2. 6.4. 6.4.1. 6.4.2. DIRECTIVES DE GESTION DES INTERRUPTIONS .......................................................................................32 TP N 4 : GESTION DES TIMERS EN INTERRUPTION ...............................................................................32 EXEMPLE DE PROGRAMME FONCTIONNANT EN IT....................................................................................33 AVEC LE PORTB : PROGRAMME DEMO_IT_RB0.C ..............................................................................33 AVEC LE TIMER 0 : PROGRAMME FLASHIT.C......................................................................................34 TIMERS ................................................................................................................................................35 PRODUCTION DE TEMPS ....................................................................................................................35 MESURE DE TEMPS ...........................................................................................................................36
7.
STRUCTURE DUN PROJET DANS MPLAB, GESTION DES BIBLIOTHEQUES ................................37 7.1. 7.2. 7.3. 7.4. 7.5. 7.6. TP N : GESTION DES PERIPHERIQUES INTEGRES ..............................................................................38 6 CONVERSION ANALOGIQUE/NUMERIQUE ................................................................................................39 ACCES EEPROM INTERNE ...................................................................................................................40 COMMUNICATIONS SERIES ASYNCHRONES .............................................................................................41 BUS I2C ..............................................................................................................................................44 BUS SPI ..............................................................................................................................................45
2 / 48
Compilateur MCC18 v16 7.7. DIRECTIVES DU PRE-PROCESSEUR ........................................................................................................ 47 7.7.1. DIRECTIVES C ANSI .........................................................................................................................47 7.8. LUTILITAIRE GRAPHIQUE VISUAL INITIALISER ...................................................................................47 7.9. LUTILITAIRE MICROCHIP MAESTRO.................................................................................................48
3 / 48
Proprits
Compatibilit C ANSI Intgrable dans MPLAB pour faciliter la mise au point et la gestion dun projet Gnration de modules objet relogeables Compatible avec des modules objets gnrs par MP ASM Bibliothque tendue incluant des modules de gestion des priphriques ; PWM, SPI, Contrle total par lutilisateur de lallocation des donnes et du code en mmoire
1.2.
#include <stdio.h> main()
{ puts(" Bonjour");
Prprocesseur Met en forme le fichier source C partir de directives #define, #include Fichier source C contenant la fonction main
Compilateur C Transforme le fichier C en un fichier objet (code machine), les fonctions prcompils sont dclares dans les fichiers *.h
Editeur de lien LINKER Lie (donne des adresses aux fonctions) tous les fichiers objets et cre un fichier excutable
4 / 48
1.3.
Rle du pr-processeur
Le pr-processeur ou pr-compilateur ralise des mises en forme et des amnagements du texte d'un fichier source, juste avant qu'il ne soit trait par le compilateur. Il existe un ensemble d'instructions spcifiques appeles directives pour indiquer les oprations effectuer durant cette tape. Les deux directives les plus courantes sont #define et #include. #define correspond une quivalence ex : #define pi 3.14 ou une dfinition de macro
1.4.
Les fichiers d'inclusion ou d'en tte *.h (header) contiennent pour l'essentiel cinq types d'informations : Des dfinitions de nouveau type Des dfinitions de structure Des dfinitions de constantes Des dclarations de fonctions Des dfinitions de macro_fonctions
En gnral ces fichiers contiennent des directives de compilation ou pr_compilation conditionnelles. De ce fait ils ne sont pas toujours aiss dchiffrer pour une personne qui dbute en langage C. nanmoins il est indispensable d'en prendre petit petit connaissance. Il s'agit d'un fichier d'inclusion particulirement important lorsquon travaille en C sur un micro-contrleur : le fichier de dfinition des registres internes du micro-contrleur p18fxxx.h (les xxx sont remplacer par le numro du microcontrleur : p18f4620.h) . p18fxxx.h possde les dfinitions des registres et des bits ce qui permet d'accder directement aux registres du contrleur par leur nom (ceux du data sheet) et galement de tester ou positionner individuellement les bits de ces registres de la faon suivante :nom_registre.nom_bit
#include <p18f4620.h>
5 / 48
1.5.
Fichier P18fxxx.h
Il s'agit d'un fichier d'inclusion particulirement important lorsquon travaille en C sur un micro-contrleur : le fichier de dfinition des registres internes du micro-contrleur (P18fxxx.h) qui sont dclars dans le fichier de dclaration des registres du processeur (p18fxxx.asm), fichier assembleur qui aprs compilation donne un fichier (p18fxxx.o) lui mme contenu dans la bibliothque pr-compile (p18fxxx.lib) . Par exemple dans le le fichier P18fxxx.h port A est dfinit de la faon suivante : extern volatile near unsigned char PORTA; extern volatile near union { Le port A est un octet (unsigned char) dfini dans un struct { fichier externe (extern) dont la valeur peut tre crase unsigned RA0:1; entre 2 appels (volatile). unsigned RA1:1; unsigned RA2:1; La deuxime dclaration prcise que PORTAbits est une unsigned RA3:1; union de structures anonymes de bits adressables. unsigned RA4:1; Du fait que chaque bit dun registre de fonction peut avoir unsigned RA5:1; plusieurs affectations, il y peut y avoir plusieurs dfinitions unsigned RA6:1; de structures lintrieur de lunion pour un mme registre. } ; struct { Dans le cas prsent les bits du port A sont dfinis comme : unsigned AN0:1; unsigned AN1:1; re 1 structure : unsigned AN2:1; port dE/S parallle (7 bits ; RA0 RA6) unsigned AN3:1; me 2 structure : unsigned :1; port dentres analogiques (5 entres AN0 AN4) + entre unsigned AN4:1; OSC2. unsigned OSC2:1; me 3 structure : } ; Des entres de tension de rfrence du CAN, entre struct { horloge externe du timer0 (T0CKI), entre de slection du unsigned :2; port srie synchrone (SS), sortie du timer0 (CLK0). unsigned VREFM:1; me 4 structure : unsigned VREFP:1; entre low voltage detect (LVDIN) unsigned T0CKI:1; unsigned SS:1; Le contenu du registre ADCON1 dterminera laffectation unsigned CLK0:1; dun bit (cf DS39564B page 182). } ; struct { Laccs un bit du portA se fait de la faon suivante : unsigned :5; unsigned LVDIN:1; Nom_union.nom_bit } ; } PORTAbits ; Exemple : PORTAbits.RA0 = 1 ; // mise ltat haut de RA0
6 / 48
Objectifs :
Utiliser le compilateur MCC18 dans l'environnement MPLAB Etre capable de grer les ports parallles en C Etre capable de crer une fonction avec paramtres Caractristiques gnrales du compilateur MCC18 - Connaissance lmentaire du langage C Notions d'algorithmique Architecture du contrleur PIC 18F4620 Documentation minimale PIC 18F4620 Guide d'utilisation de la carte PICDEM2 PLUS + TD associ
Prrequis :
Donnes :
7 / 48
2.1.
Cration dun projet gnrique en C, ce projet pourra servir pour tester tous les programmes exemples et effectuer les exercices. Project :New Name : generic (par exemple) Directory : c:\exopic\ (par exemple) Project Select language tools suite , choisir Microchip C18 Tools suite Vrifier les chemins des programmes et bibliothques dans Select language tools location
Slectionner le type de debugger (en gnral ICD2 ou ICD3) Chemins des programmes : Assembleur : C c:\mcc18\mpasm\mpasmwin.exe Linker : C:\mcc18\lkr Compilateur : C:\mcc18\bin\mcc18.exe Gnrateur de bibliothques : C:\mcc18\mpLib.exe Chemins des bibliothques Include search path : *.h Libray search path : *.lib Linker-Script search path : *.lkr
Les librairies du C18 sont compiles pour le mode d'adressage tendu. Afin dviter certains warning lors de la compilation : Dans project-buld options- project Onglet MPLAB C18 catgorie memory model Valider large code model
Sources Files contient les fichiers sources en C compiler. Pour essayer les exemples qui suivent. Placer ici le fichier compiler.
Un fichier ddition de lien (.lkr) est un fichier de commande pour contrler les oprations ddition de lien par MPLINK pour un processeur cible donn ; ici un 18f452 (le i indique une configuration pour ICD2) A partir de MPLAB 8.40, le lkr est dfinit par dfaut
8 / 48
1.1.
La version 2.40 de MCC18 permet de configurer le microcontrleur cible sans passer par les menu de MPLAB grce la directive #pragma config (voir MPLAB C18 C Compiler Configuration Bit Setting Addendum (DS51518)) Exemple :
#pragma config OSC = HS #pragma config WDT = OFF #pragma config LVP = OFF #pragma config DEBUG = ON
1.2.
Crer un nouveau fichier avec le programme bouton.c ci dessous /* Bouton et LED LED sur PICDEM2+*/ /* La LED sur PB0 s'teint si S2 (PA4) est enfonc*/ #include <p18fxxx.h> #pragma config OSC = #pragma config WDT = #pragma config LVP = #pragma config DEBUG
header du processeur cible (contient en particulier les dfinitions de TRISB, PORTA et PORTB
oui Bouton RA4 enfonc ? non Initialise PRB0 en sortie
HS OFF OFF = ON
Allumer PB0 void main(void) { TRISA=0xFF; // PORTA en entre TRISB = 0; /* PB en sortie */ while(1) // une boucle infinie { if (PORTA & 0x10) PORTB=1; else PORTB=0; } PORTA&0x10 est vrai si }
Eteindre PB0
Remarques : seule la LED sur PB0 devant tre modifie, on aurait pu crire : PORTB=PORTB|0b00000001; pour mettre PB0 1 et PORTB=PORTB&0b11111110; pour mettre PB0 0. Trs souvent les masques sont utiliss en C pour les tests ou les positionnements de bit, cependant MCC18 permet de contrler simplement nimporte quel bit laide de ses dclarations de structure : ex :
Le rsultat est nul si PA4=0. Le C associe dans les tests la notion de faux au 0 et la notion de vrai un nombre diffrent de 0. PORTA & = Positionner PA4 0 x 1 x x 1 x x 1 x x 0 0 x 1 x x 1 x x 1 x x 1 x PORTA OU = Positionner PA4 1 x 0 x x 0 x x 0 x X 1 1 x 0 x x 0 x x 0 x x 0 x
9 / 48
1.3.
Les fonctions de dbug sont les mmes quen assembleur : step into, step over, points darrts etc Il est possible de tracer un programme en C et simultanment dans le fichier assembleur gnr par MCC18. Le compilateur C grant les adresses, le programmeur ne connat pas les adresses physiques des donnes. Le fichier asm gnr par le C et la fentre watch permet de visualiser les donnes,
10 / 48
1.4.
S/P TEMPO
void tempo(unsigned int count); void main(void) { PORTB = 0x00; TRISB = 0x00; while(1) { PORTB++; tempo(duree); } }
incrmente PORTB
NON
Dcremente Compte
Tempo N
Compte=0 ?
void tempo(unsigned int compte) { while(compte--); } La fonction tempo reoit un paramtre (int) qui est recopi dans la variable compte , locale la fonction. (duree nest pas modifi) Remarque : Si une fonction est crite avant son appel le prototype devient inutile.
OUI
Retour
Ex2 : modifier le programme led.c de manire modifier la tempo (passer de 10000 20000) si S2 est appuy. Ex3 : Raliser un programme faisant clignoter RB0 avec une priode proche de 1s et un rapport cyclique si S2 est appuy et sinon.
Debut Programme Principal ( PP )
PORTB0 en sortie
PORTB en sortie
Bascule PORTB0
incrmente PORTB
OUI
S2 appuy ?
NON
S2 appuy ?
OUI
PORTB0=0 NON OUI
NON
Tempo N
N=10000
N=20000
Tempo N N=5000 N=15000 N=10000
11 / 48
1.5.
Utilisation des oprateurs de dcalage gauche et droite, ces derniers permettent galement des multiplications et divisions par deux trs rapides. (Filtre numrique par exemple)
main
#include <p18fxxx.h> void wait(int cnt) { for (;cnt>0; cnt--); } void main(void) { int x; char c=0; TRISB = 0; PORTB=0b00000001; while(1) { if (PORTB==8) c++; if (PORTB==1) c--; if (!c) PORTB>>=1; else PORTB<<=1; if (PORTA&0x10) x= 20000; else x=5000; wait(x); } }
PRB=8 ?
oui
PRB=1 ?
oui
oui
c!=0 ?
cnt=x
oui non
S2 enfonc ?
retour
12 / 48
2. Bibliothques MCC18
Une bibliothque regroupe un ensemble de fonctions. Les fonctions utilises peuvent tre lies directement dans une application par lditeur de liens MPLINK condition d'tre dclare dans un fichier header (.h)
2.1.
Lie entre eux les diffrents fichiers et rsout les problmes daffectation en mmoire du programme et des donnes.
2.1.1.
Un fichier ddition de lien est un fichier de commande pour contrler les oprations ddition de lien par MPLINK . Il permet : Dindiquer des chemins daccs des rpertoires supplmentaires Dinclure des bibliothques pr-compiles ou des fichiers objet De dfinir lorganisation mmoire du processeur cible Dallouer des sections sur le processeur cible Dinitialiser la pile (taille et emplacement) Exemple : fichier 18F4620i.lkr // Sample linker command file for 18F4620i used with MPLAB ICD 2 // $Id: 18f4620i.lkr,v 1.2 2002/07/29 19:09:08 sealep Exp $ LIBPATH . Chemins daccs de FILES c018i.o bibliothques ou FILES clib.lib fichiers objet. FILES p18f4620.lib
Fichiers objets et bibliothques prcompiles lier.
NAME=vectors START=0x0 END=0x29 PROTECTED NAME=page START=0x2A END=0x7DBF NAME=debug START=0x7DC0 END=0X7FFF PROTECTED Le fichier NAME=idlocs lkr indique les chemins et librairies balayer pour trouver le code START=0x200000 END=0x200007 PROTECTED objet des NAME=config fonctions dclares dans les fichiers header (*.h). Il y a trois START=0x300000 END=0x30000D PROTECTED librairies NAME=devid par dfaut pour chaque lkr de chaque processeur. START=0x3FFFFE END=0x3FFFFF PROTECTED C018i.o contient le CRT (C END=0xF000FF Run Time) dinitialisation des NAME=eedata START=0xF00000 PROTECTED variables et dappel main ACCESSBANK NAME=accessram contient les fonctions du standard CANSI END=0x7F clib.lib START=0x0 DATABANK NAME=gpr0 p18fxxx.lib contient les quivalences et fonctions propres au START=0x80 END=0xFF DATABANK NAME=gpr1 microcontrleur cible. START=0x100 END=0x1FF DATABANK NAME=gpr2 START=0x200 de mmoire supplmentaire pour le debug END=0x2FF p18f4620i.lkr, rserve deux blocs DATABANK NAME=gpr3 START=0x300 END=0x3FF DATABANK NAME=gpr4 START=0x400 END=0x4FF DATABANK NAME=gpr5 START=0x500 END=0x5F3 DATABANK NAME=dbgspr START=0x5F4 END=0x5FF PROTECTED ACCESSBANK NAME=accesssfr START=0xF80 END=0xFFF PROTECTED SECTION NAME=CONFIG ROM=config STACK SIZE=0x100 RAM=gpr4
2.1.2.
3 versions sont fournies avec le compilateur MCC18 Co18.o Initialise la pile logicielle et se branche au dbut du programme utilisateur (fonction main ) minimum de code. Co18i.o Idem + initialisation des donnes avant lappel du programme utilisateur Co18iz.o Idem co18i.o + initialisation zro des variables statiques non initialises par le programme (compatibilit C ANSI). Le code source de ces programmes se trouve dans mcc18\src\startup .Pour reconstruire le code de dmarrage et copier les fichiers objet dans le rpertoire \lib lancer build.bat . Le CRT boucle sur la fonction main, il est donc utile de toujours placer une boucle sans fin dans main
13 / 48
2.2.
Elles contiennent des fonctions dpendantes du processeur de la famille PIC 18 utilis. Ces fonctions sont de vritables composants logiciels fournis par MICROCHIP pour exploiter les ressources matrielles des micro-contrleurs de la famille PIC18. Elles sont contenues dans les bibliothques " pprocesseur.lib " P18Fxxx.lib . Les fonctions de ces bibliothques sont dcrites dans le document MPLAB C18C COMPILER LIBRARIES (DS51297A) Sous rpertoire \doc du rpertoire d'installation:
Le code source correspondant se trouve dans les sous rpertoires suivants du rpertoire d'installation : Src\pmc\ADC [CCP, I2C, PORTB, PWM, SPI, Timers, USART]
Le code source correspondant se trouve dans les sous rpertoires suivants du rpertoire d'installation : Src\pmc\XLCD [CAN2510, swI2C, SW SPI, SW UART]
La reconstruction de la bibliothque s'effectue l'aide dun fichier commande (DOS) du rpertoire \src pour l'ensemble des processeurs de la famille PIC18 (c'est long) et par un fichier particulier pour un processeur unique exemple : pour reconstruire la librairie du PIC18F4620 , P18F4620.LIB : makeonep18f242. 18f4620
14 / 48
2.3.
Fonctions C ANSI
Elles sont contenues dans la bibliothque " clib.lib ". Les fonctions de cette bibliothque sont dcrites dans le document MPLAB C18C COMPILER LIBRARIES (DS51297A) Sous rpertoire \doc du rpertoire d'installation: Chapitre 4 : General Software Library Chapitre 5 : Math Libraries Le code source correspondant se trouve dans les sous rpertoires suivants du rpertoire d'installation Src\math fonctions mathmatiques Src\stdclib Classification des caractres, Fonctions de conversion de donnes standard C ANSI(atof, itoa etc.), Fonctions de mmorisation et de manipulation de chanes de caractres (printf etc) Src\delays Temporisations Les bibliothques existent en deux version "traditionnal" et "extended". Extended concerne les nouveaux PIC 18 avec un jeu d'instructions tendu. La reconstruction de la bibliothque " clib.lib " s'effectue l'aide de l'utilitaire makeall.bat du rpertoire \src.
stdlib.c
Function atob atof atoi atol btoa itoa ltoa rand srand tolower toupper ultoa Description Convert a string to an 8-bit signed byte. Convert a string into a floating point value. Convert a string to a 16-bit signed integer. Convert a string into a long integer representation. Convert an 8-bit signed byte to a string. Convert a 16-bit signed integer to a string. Convert a signed long integer to a string. Generate a pseudo-random integer. Set the starting seed for the pseudo-random number generator. Convert a character to a lower case alphabetical ASCII character. Convert a character to an upper case alphabetical ASCII character. Convert an unsigned long integer to a string.
15 / 48
Search for a value in a specified memory region Compare the contents of two arrays.
Copy a buffer from data or program memory into data memory. Copy a buffer from data or program memory into data memory. Initialize an array with a single repeated value. Append a copy of the source string to the end of the destination string. Locate the first occurrence of a value in a string. Compare two strings. Copy a string from data or program memory into data memory. Calculate the number of consecutive characters at the beginning of a string that are not contained in a set of characters. Determine the length of a string. Convert all upper case characters in a string to lower case. Append a specified number of characters from the source string to the end of the destination string. Compare two strings, up to a specified number of characters. Copy characters from the source string into the destination string, up to the specified number of characters. Search a string for the first occurrence of a character from a set of characters. Locate the last occurrence of a specified character in a string. Calculate the number of consecutive characters at the beginning of a string that are contained in a set of characters. Locate the first occurrence of a string inside another string. Break a string into substrings, or tokens, by inserting null characters in place of specified delimiters. Convert all lower case characters
delays.h
Function Delay1TCY Delay10TCYx Delay100TCYx Delay1KTCYx Delay10KTCYx Description Delay one instruction cycle. Delay in multiples of 10 instruction cycles. Delay in multiples of 100 instruction cycles. Delay in multiples of 1,000 instruction cycles. Delay in multiples of 10,000 instruction cycles.
reset.h
Function isBOR isLVD isMCLR isPOR isWDTTO isWDTWU isWU StatusReset Description Determine if the cause of a RESET was the Brown-Out Reset circuit. Determine if the cause of a RESET was a low voltage detect condition. Determine if the cause of a RESET was the MCLR pin. Detect a Power-on RESET condition. Determine if the cause of a RESET was a watchdog timer time out. Determine if the cause of a wake-up was the watchdog timer. Detects if the microcontroller was just waken up from SLEEP from the MCLR pin or an interrupt. Set the POR and BOR bits.
16 / 48
2.3.1.
math.h
La librairie math.h le fichier de dfinition des constantes mathmatiques math.h mathdef.h Fonction Description Definitions acos Compute the inverse cosine (arccosine). #define PI 3.141592653589793 asin Compute the inverse sine (arcsine). #define PI_2 6.283185307179586 atan Compute the inverse tangent (arctangent). #define PI_DIV2 1.570796326794896 atan2 Compute the inverse tangent (arctangent) #define INV_PI 0.318309886183790 of a ratio. ceil Compute the ceiling (least integer). #define INV_PI_2 0.159154943091895 cos Compute the cosine. #define INV_PI_DIV2 0.636619772367581 cosh Compute the hyperbolic cosine. #define LN2 0.693147180559945 exp Compute the exponential e . #define INV_LN2 1.442695040888963 fabs Compute the absolute value. #define LN2_2 1.386294361119890 floor Compute the floor (greatest integer). #define INV_LN2_2 0.346573590279973 fmod Compute the remainder. #define INV_LN10 0.434294481903252 frexp Split into fraction and exponent. #define E 2.718281828 ieeetomchp Convert an IEEE-754 format 32-bit floating // degre - radian et radian - degre point value into the Microchip 32-bit #define deg2rad(x) ((x)*1.7453293e-2) floating point format. #define rad2deg(x) ((x)*57.296) ldexp Load exponent compute x * 2 . log Compute the natural logarithm. log10 Compute the common (base 10) logarithm. mchptoieee Convert a Microchip format 32-bit floating point value into the IEEE-754 32-bit floating point format. modf Compute the modulus. pow Compute the exponential x . sin Compute the sine. sinh Compute the hyperbolic sine. sqrt Compute the square root. tan Compute the tangent. tanh Compute the hyperbolic tangent.
// Constante Pi // Constante 2 Pi // Constante Pi/2 // Constante 1/Pi // Constante 1/2Pi // Constante 2/Pi // Constante Log[2] // Constante 1/Log[2] // Constante 2 Log[2] // Constante 1/2Log[2] // Constante 1/Log[10] // Constante e
Microchip nutilise pas le format IEEE pour coder les rels, pour visualiser ceux-ci dans une fentre WATCH, il faut demander le format MCHP Float
17 / 48
2.4.
Le formatage du texte repose sur les fonctions C ANSI printf (voir page20) de la bibliothque stdio.h Les sorties bas-niveau (matriels) utilisent xlcd.h (bibliothque cre avec lutilitaire MAESTRO voir page21) pour lafficheur LCD et la sortie par dfaut (RCREG) pour lUSART. La bibliothque libusart.h (voir page 41) pour nest utile que pour les entres de caractres.
stdio.h est une librairie de gestion de sortie des caractres qui dfinit stdout (la sortie standard). Elle permet le formatage simple de chanes de caractres vers diffrentes sorties (output stream) Sur les PIC la sortie par dfaut est lUSART. Lutilisateur peut dfinir sa propre sortie de caractres. _H_USART est le nom du flux vers lUSART, il utilise la fonction _usart_putc _H_USER est le nom du flux utilisateur. Il utilise la fonction _usart_putc
// fprintf.c demo pour fprintf C18 #include <p18fxxx.h> #include <stdio.h> // pour fprintf #include <xlcd.h> #include <tempo_lcd_pd2.c> // tempo pour xlcd.h // dirige user_putc vers l'afficheur LCD du PD2+ int _user_putc (char c) { XLCDPut(c); } void main(void) { SPBRG = 25; /* configure la vitesse (BAUD) 9600 N 8 1*/ TXSTA = 0x24; RCSTA = 0x90; /* active l'USART*/ XLCDInit();// /*initialise AffLCD*/ XLCDL1home() ; //ligne 0 de l'afficheur fprintf (_H_USART, "fprintf USART\n"); // vers USART fprintf (_H_USER, "fprintf USER\n" ); // vers LCD while(1); }
Pour rediriger stdout vers lafficheur LCD dun KIT PICDEM2+ il faut rediriger _user_putc vers lafficheur LCD. (XLCDPut envoie un caractre vers lafficheur LCD) int _user_putc(char c) { XLCDPut(c) ; }
18 / 48
Compilateur MCC18 v16 En dclarant #include <stdio..h> on dispose des fonctions : Fonction fprintf Description Envoie une chane formate vers le flux dfini fprintf(_H_USER, vers lafficheur LCD ) ; fprintf(_H_USART, vers lafficheur lUSART ) ; Envoie une chane termine par un passage la ligne (newligne) vers le flux dfini fputs( Bonjour USART ,_H_USART) ; Envoie une chane formate vers stdout. Exemples page suivante Envoie un caractre vers le flux dfini putc(A, _H_USART) ; envoie A sur lUSART Envoie une chane termine par un passage la ligne (newligne) vers stdout. puts( Bonjour ) ; envoie Bonjour vers stdout Envoie une chane formate vers une zne mmoire RAM. Exemples page suivante Comme fprintf mais en utilisant les arguments de stdarg (compatibilit CANSI) Comme printf mais en utilisant les arguments de stdarg (compatibilit CANSI) Comme sprintf mais en utilisant les arguments de stdarg (compatibilit CANSI) Envoie un caractre vers lUSART Envoie un caractre vers la sortie utilisateur (doit tre crit par lutilisateur)
fputs printf putc puts sprintf vfprintf vprintf vsprintf _usart_putc _user_putc
xlcd contient les fonctions : XLCDInit() XLCDPutc (char c) XLCDL1home() et XLCDL2home() (voir page 21)
0x10 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS
1.1.1.
ftoa
ftoa (float to ascii) est une fonction standard du C ANSI mais elle nest pas fournie avec MCC18. Pour afficher des nombres rels, utiliser ftoa.c quil suffit dinclure dans le projet unsigned char *ftoa (float x, unsigned char *str,char prec,char format); unsigned char chaine[10]; EX: ftoa(3.1415,chaine,2,s) ftoa convertit un rel en ACSII prec indique la prcision, 0 pour avoir le maximum si format ='s' affichage scientifique 1.6666666E3 si format ='f' affichage classique 1666.6666
19 / 48
1.1.2.
Format :
un int 23 un caractere A
% %c %d %o %u %b %B %x %X %s %S %p %P Affichage Caractre ASCII Dcimal sign pour entiers 8 ou 16 bits Octal pour entiers 8 ou 16 bits Dcimal non sign pour entiers 8 ou 16 bits Binaire pour entiers 8 ou 16 bits (b) Binaire pour entiers 8 ou 16 bits (B) Hexadcimal pour entiers 8 ou 16 bits (minuscules) Hexadcimal pour entiers 8 ou 16 bits (majuscules) Chane ASCII en RAM Chane ASCII en ROM Pointeur Hexadcimal 16 bits (minuscules) Pointeur Hexadcimal 16 bits (majuscules)
int a = -27; int b = 0xB5; char c = A; float r=31.416e-5; char chram[ ]="en RAM"; rom const char chrom[ ]=en ROM ; char *pram=0x1cd; rom char *prom=0x12Ab;
Script
printf("Dec : %d %u",a,a); printf("Hex: %#06X %x ",b,b); printf("Bin: %16b",b); printf("Bin: %#010B",b); printf("%c %c %d",'b',c,(int)c); printf("J habite %S",chrom); printf("J habite %s",chram); printf("pointeur RAM:%p %04P",pram,pram); printf("pointeur ROM:%p %P",prom,prom);
Affichage
Dec : -27 65509 Hex: 0X00B5 b5 Bin: 0000000010110101 Bin: 0B10110101 b A 65 J habite en ROM J habite en RAM pointeur RAM:1cd 01CD pointeur ROM:12Ab 12AB
fprintf est identique printf et permet de choisr la destination du flux fprintf (_H_USER, "fprintf USER\n" ); sprintf est identique printf, la sortie tant une zone RAM. La chane constitue peut-tre envoye ensuite sur nimporte quelle sortie. unsigned char tampon[20] ; sprintf(tampon,"Dec : %d %u",a,a); Pour sortir une chaine contenant des rels (le qualificatif %f nest pas reconnu par C18) on convertit le rel en chaine de caractres avec ftoa puis on inclut cette dernire dans fprintf avec le qualificatif %s unsigned char tampon[20] ; // on reserve 20 octets en mmoire RMA ftoa(3.1415,tampon,2,s) ; // ftoa converti 3.1415 en une chaine de caractres fprintf (_H_USER, "La valeur de PI est %s",tampon);//fprintf affiche cette chaine
20 / 48
1.1.3.
Cres partir de lutilitaire MAESTRO Microchip XLCDInit() Initialise lafficheur LCD (type 1602) en function de la description faite dans MAESTRO XLCDCommand(Command) Envoie une commande XLCDPut(data Envoie une donne afficher (code ASCII) XLCDIsBusy() Lit le drapeau busy et retourne vrai si lafficheur est occup XLCDGet() Lit la donne dans lafficheur ladresse courante XLCDL1home() Positionne le curseur gauche (ligne 1) XLCDL2home() Positionne le curseur gauche (ligne 2) XLCDClear() Efface la RAM et positionne le curseur en haut gauche XLCDReturnHome() Positionne le curseur en haut gauche XLCDGetAddr() Lit la DDRAM XLCDPutRomString(addr) Affiche une chaine depuis la ROM XLCDPutRamString(addr) Affiche une chaine depuis la RAM Ces fonctions sont dcrites dans la documentation MAESTRO : XLCDc.readme.pdf
21 / 48
1.2.
Dans MPLAB :
INT RC-CLOCKOUT on RA6, PORT on RA7 : lhorloge interne sort sur RA6, RA7 est un port // INT RC-Port on RA6, Port on RA7 : RA6 et RA7 sont des ports // Il est possible de ne pas utiliser MPLAB pour grer les bits de configuration mais une directive du C18 (dans ce cas cocher Configuration Bits set in code ) En C18 : #pragma config OSC = INTIO7 //pour INTRC-OSC2 as Clock Out, OSC1 as RA7 #pragma config OSC = INTIO67 //pour INTRC-OSC2 as RA6, OSC1 as RA7 #pragma config WDT = OFF //pour watch dog timer disable #pragma config LVP = OFF //pour low voltage program disable Pour plus dinformations consulter : PIC18 CONFIGURATION SETTINGS ADDENDUM.pdf Aprs dmarrage du programme il est possible de modifier la frquence et la source de lhorloge grce aux registres OSCCON et OSCTUNE.
Configuration de lhorloge interne, on suppose que les bits de configuration active la base de temps de 8MHz :
Les bits IRCF de OSCCON permettent de choisir la frquence de base (31KHz 8MHz). (1MHz par dfaut) Les bits TUN de OSCTUNE permettent dajuster la frquence interne (en cas de variation de temprature par exemple) Le bit PLLEN de OSCTUNE permet dactiver la PLL qui multipliera par quatre la frquence de base (donc max 32MHz), dsactive par dfaut) Les bits SCS de OSCCON permettre de choisir la source de lhorloge des priphriques et du CPU du PIC. (Interne par dfaut) Les bits OSTS et IOFC de OSCCON permettent de connatre ltat de lhorloge (active, stable )
22 / 48
OSCCONbits.IRCF2=1; // H interne 8MHz OSCCONbits.IRCF1=1; OSCCONbits.IRCF0=1; OSCTUNEbits.PLLEN=1; // PLL (x4) OSCCONbits.SCS1=0; // sortie sur osc interne OSCCONbits.SCS1=0;
1.3.
Objectifs :
Grer lafficheur LCD sur PICDEM2 Mettre en oeuvre des fonctions de conversion btoa, itoa, ftoa et fonctions mathmatiques Mettre en uvre stdio.h, rediriger printf vers l'afficheur LCD du KIT PICDEM2+ Utiliser des bibliothques de composants logiciels MCC18 Associer plusieurs fichiers sources dans un projet. Installer et mettre en uvre la bibliothque mathmatique
Prrequis :
Caractristiques gnrales du compilateur MCC18 - Connaissance lmentaire du langage C Notions d'algorithmique Architecture du contrleur PIC 18F4620
Donnes :
Documentation minimale PIC 18F4620 Guide d'utilisation de la carte PICDEM2 PLUS Guide dutilisation des bibliothques MCC18 : Ccompliler librairies DS51297a.pdf
23 / 48
1.3.1.
La sortie standard (std_out) est lUSART du PIC. On peut donc envoyer simplement des messages ASCII vers un PC (par exemple) avec printf ou fprintf(_H_USART, .) Il faut alors initialiser lUSART du PIC, par exemple pour un format 9600,n,8,1 on introduira les lignes : SPBRG = 25; /* configure la vitesse (BAUD) 9600 N 8 1*/ TXSTA = 0x24; RCSTA = 0x90; /* active l'USART*/ Brancher un cble srie entre le KIT PD2+ et le port srie dun PC , et lancer un mulateur de terminal (le TERMINAL WINDOWS par exemple) et tester le programme ci-dessous. // fprintf.c demo pour fprintf C18 #include <p18fxxx.h> #include <stdio.h> // pour fprintf #include <xlcd.h> // pour OpenXLCD et putcXLCD #include <tempo_lcd_pd2.c> // tempo pour xlcd.h // dirige user_putc vers l'afficheur LCD du PD2+ int _user_putc (char c) { XLCDputc (c); } void main(void) { SPBRG = 25; /* configure la vitesse (BAUD) 9600 N 8 1*/ TXSTA = 0x24; RCSTA = 0x90; /* active l'USART*/ XLCDInit();// LCD sur PD2 XLCDL1home() ; //ligne 0 de l'afficheur fprintf (_H_USART, "fprintf USART\n"); // vers USART fprintf (_H_USER, "fprintf USER\n" ); // vers LCD while(1); } Le simulateur de MPLAB peut galement afficher les sorties USART. Activer le simulateur comme debugger (debugger-select tool-MPLAB sim) Puis debugger-setting, la fentre output possde maintenant un onglet Sim UART
- Raliser un programme comptant les appuis sur S2 ( partir du programme page9) et envoyant le nombre dappuis vers lUSART ( partir du programme ci-dessus) sous cette forme : le bouton S2 a t enfonc x fois. (\n\r permet de passer la ligne et de revenir sur la premire colonne)
24 / 48
#include <p18fxxx.h> #include <stdio.h> #include "ftoa.c" char chaine1[15],chaine2[15]; float sqrt(float f) { float xi,xi1; char i; xi=1; for (i=0;i<8;i++) { xi1=(xi+f/xi)/2.0; xi=xi1; } return xi; } void main(void) // la sortie s'effectue sur l'USART {float f,r; SPBRG = 25; /* configure la vitesse (BAUD) 9600 N 8 1*/ TXSTA = 0x24; RCSTA = 0x90; /* active l'USART*/ f=9.0; r=sqrt(f); // on utilise Heron (pas math.h) ftoa(f,(unsigned char *)chaine1,3,'S'); ftoa(r,(unsigned char *)chaine2,3,'S'); fprintf(_H_USART,"Racine de %s = %s \n",chaine1,chaine2); while(1); }
Le CAST vite les affichages lors de la compilation: Warning [2054] suspicious pointer conversion
Exercice : A partir du programme tstsqrt.c ci-dessus, raliser un programme de test pour la fonction exp ci dessous retournant lexponentielle dun nombre La fonction abs retournant la valeur absolue de largument est crer Pour les rapides : crire la fonction mathmatique ralise par exp() ;
// fonction exponentielle sur nombres entiers float exp(float f) { float s=1.0,u=1.0; int n; for (n=1;abs(u)>0.001;n++) { u=u*f/n; s+=u; } return s; }
25 / 48
1.3.3.
A partir du programme tstmath.c, tester diverses fonctions mathmatiques de la librairie (sin, cos, log etc) Ici test de la fonction sinus. (Attention les angles doivent tre donns en radians) #include #include #include #include #include <xlcd.h> <stdio.h> <math.h> <mathdef.h> "ftoa.c" Consulter les .h dans c:\mcc18\h
char chaine[10]; void main(void) {float f,r; SPBRG = 25; TXSTA = 0x24; RCSTA = 0x90; /* active l'USART*/ f=PI/4.0; ftoa(f,chaine,4,'S'); fprintf(_H_USART,"sin(%s)=",chaine); r=sin(f); ftoa(r,chaine,4,'S'); fprintf(_H_USART,"%s \n\r",chaine); while(1); }
Visualiser les rsultats sur l'afficheur LCD et dans une fentre "WATCH"
26 / 48
Type de donnes
Size 8 bits 8 bits 8 bits 16 bits 16 bits 16 bits 16 bits 24 bits 24 bits 32 bits 32 bits Minimum -128 -128 0 -32768 0 -32768 0 -8,388,608 0 -2,147,483,648 0 Maximum 127 127 255 32767 65535 32767 65535 8,388,607 16,777,215 2,147,483,647 4,294,967,295
Entiers
Type char signed char unsigned char int unsigned int short unsigned short short long unsigned short long long unsigned long
Type
Rels
Size 32 bits 32 bits Minimum Exponent -126 -126 Maximum Exponent 128 128 Minimum Normalized 2126 = 1.17549435e - 38 2126 = 1.17549435e - 38 Maximum Normalized 2128 * (2-215) = 6.80564693e + 38 2128 * (2-215) = 6.80564693e + 38
float double
2.2.
Instruction Macro1 Action Nop() Executes a no operation (NOP) ClrWdt() Clears the watchdog timer (CLRWDT) Sleep() Executes a SLEEP instruction Reset() Executes a device reset (RESET) Rlcf(var, dest, access)2,3 Rotates var to the left through the carry bit. Rlncf(var, dest, access)2,3 Rotates var to the left without going through the carry bit Rrcf(var, dest, access)2,3 Rotates var to the right through the carry bit Rrncf(var, dest, access)2,3 Rotates var to the right without going through the carry bit Swapf(var, dest, access)2,3 Swaps the upper and lower nibble of var Note 1: Using any of these macros in a function affects the ability of the MPLAB C18 compiler to perform optimizations on that function. 2: var must be an 8-bit quantity (i.e., char) and not located on the stack. 3: If dest is 0, the result is stored in WREG, and if dest is 1, the result is stored in var. If access is 0, the access bank will be selected, overriding the BSR value. If access is 1, then the bank will be selected as per the BSR value.
2.3.
Assembleur en ligne
MCC18 contient un assembleur qui utilise une syntaxe identique MPASM. Un module assembleur dans un programme en C commence par _asm et se termine par _endasm char compte ; _asm /* Code assembleur utilisateur */ MOVLW 10 MOVWF compte, 0 /* boucle jusqu 0 */ debut: compte est une variable DECFSZ compte, 1, 0 dclare dans le fichier C GOTO fin BRA debut fin: _endasm
27 / 48
3. Gestion de la mmoire
3.1. Directives de gestion de la mmoire
Elles sont dcrites dans le tableau ci-dessous.
Cette directive permet de Contient des instructions excutables changer la section dans laquelle MCC18 va allouer les romdata : #pragma romdata [overlay] [nom[=adresse]] informations associes. Contient des constantes et des variables (normalement dclares avec le Une section est une partie de qualificatif rom). lapplication localise une udata : #pragma udata [overlay/access] [nom[=adresse]] adresse spcifique. Contient des variables utilisateur statiques non initialises (uninitialized) Ces directives permettent le contrle total par lutilisateur de lallocation des donnes et idata : #pragma idata [overlay/access] [nom[=adresse]] du code en mmoire Contient des variables utilisateur statiques non initialises (initialized) (optimisation, mise au point). Access : Localisation dans la zone access ram (256 octets : 00h 7Fh
De la Bank 0 et 80h FFh de la Bank 15. Overlay : Permet de localiser plusieurs sections la mme adresse physique. On peut ainsi conomiser de la mmoire en plaant plusieurs variables au mme emplacement. Cela fonctionne tant quon ne les utilise pas en mme temps.
#pragma varlocate
Indique au compilateur dans quel bloc mmoire (bank) placer une variable. Cela permet doptimiser le code gnr.
28 / 48
5.2.
Qualificatifs de mmorisation
Les microcontrleurs PIC possdent deux espaces mmoires (RAM et ROM) daccs diffrents en raison de larchitecture Harvard, donc deux types dinstructions pour y accder. Les constantes peuvent tre en ROM ou en RAM (zone interdite en criture dans le fichier *.lkr). Par dfaut les constantes sont recopies dans la RAM lors de linitialisation. Pour viter cela, il faut les dclarer ROM . Remarque : Il est possible de placer des variables en ROM sur les microcontrleurs quips de ROM FLASH (cette procdure est complexe et ncessite lajout dune procdure en assembleur propre au microcontrleur, qui nest pas encore implante automatiquement par C18)
Fichier de routage mmoire (fichier map) Pour gnrer ce fichier il faut activer loption Generate map file Dans le menu Project Build Option Project allez sous longlet MPLINK linker et activer la gnration du fichier map. Ce fichier rapporte loccupation mmoire. Fichier tstmem.map (partiel) Symbols - Sorted by Name Name Address Location Storage File --------- --------- --------- --------- --------c d main r s a b f p q 0x000128 0x000129 0x0000f6 0x00012b 0x00012d 0x00008f 0x000090 0x00008e 0x00008a 0x00008c program extern program extern program extern program extern program extern data extern data extern data static data extern data extern
29 / 48
5.3.
Objectifs :
TP N 3 : Gestion de la mmoire
(Travail individuel , Dure : 1h30)
Ex6 : 1. Essayer les trois exemples et valider leur fonctionnement en affichant les contenus des mmoires programme et donnes du PIC. 2. Raliser un programme dump . Affichage sur lUSART du contenu mmoire ROM puis RAM des 256 premiers octets par lignes de 16 octets sous la forme :
void fonction (void) { auto ram char e; //e est dans la pile (ram et auto sont facultatifs) static ram char f; // f est locale la fonction mais une adresse fixe } void main(void) { a=4; c=0xAA; }
30 / 48
void copyRom2Ram(rom unsigned char *Romptr,unsigned char *Ramptr) { while(*Romptr) { *Ramptr++=*Romptr++; } } void main(void) { ptr1=chaine1; ptr2=chaine2; copyRom2Ram(ptr1,ptr2); }
Le contenu du pointeur Romptr est recopi dans le contenu du pointeur Ramptr jusqu ce que ce dernier gale 0x00
31 / 48
6.1.
#pragma interruptlow
Dclaration dune fonction en tant que programme de traitement dinterruption non prioritaire. (vect = 0x18) l'instruction de retour sera RETFIE
//Sous programme de traitement de linterruption #pragma interrupt it_prioritaire #pragma interrupt void it_prioritaire (void) { Dclaration dune fonction en /* placer le code de traitement de l'IT ici */ tant que programme de if (INTbitx) { traitement de l'ITx traitement dinterruption INTbitxF=0; // efface drapreau d'ITx prioritaire. (vect = 0x08) } l'instruction de retour sera if (INTbity { traitement de l'ITy RETFIE FAST. Seuls les INTbityF=0; // efface drapreau d'ITy registres W, BRS et } STATUS sont restaurs } Rappel : Si le bit IPEN(RCON)=1 (0 par dfaut) les priorits d'interruptions sont actives. Si IPEN=0; GIE=1 active toutes les interruptions autoriss Si IPEN=1; GIEH=1 active les interruptions prioritaires et GIEL=1 les interruptions non prioritaires. Les registres PIR permettent de dfinir les priorits.
6.2.
Objectifs :
(Travail individuel , Dure : 2h00) Mettre en uvre les interruptions des Timers du PIC18F4620 en C18
Prrequis :
Caractristiques gnrales du compilateur MCC18 Connaissance lmentaire du langage C Documentation minimale PIC 18F4620 Guide d'utilisation de la carte PICDEM2 PLUS
2 Mesure de dure
Ex 8 : A partir du programme itcapt.c fourni en annexe, raliser un frquencemtre sur afficheur LCD. Dfinir en fonction des paramtres de TIMER1 les frquences max et min mesurables.
32 / 48
6.3.
// demo_it_rb0.c demo de mise en oeuvre des interruptions // ce programme incrmente une mmoire chaque appuis sur S3 // attention : sur PICDEM2+ retirer le strap J6 #include <p18f452.h> unsigned int cpt=0; // compteur d'interruption
// sous programme d'interruption #pragma interrupt it_sur_rb0 void it_sur_rb0(void) { if (INTCONbits.INT0IF) // vrifie que l'IT INT0, origine PB0=0 (bouton S3) { cpt++; //utiliser un WATCH pour visualiser cpt INTCONbits.INT0IF=0; //efface le drapeau d'IT } } #pragma code vecteur_d_IT=0x08 void une_fonction(void) { _asm goto it_sur_rb0 _endasm } #pragma code // vecteur d'IT
void main (void) { // configure IT sur PB0 TRISBbits.TRISB0=1; // PRB0 en entre INTCONbits.INT0IE=1; // INT0 active , front descendant INTCONbits.GIE=1; // Toutes les IT dmasques autorises while(1); } // attente d'un vnement, le programme ne fait plus rien
Le port B est configur en entre, linterruption sur front descendant de RB0 est active. Lors dun appui sue S3 (front descendant sur RB0) , il y a interruption, le processeur excute linstruction ladresse 0x08 (intrinsque au PIC18) . Lespace dinstruction cet endroit tant rduit, on place un saut absolu sur le sous programme dinterruption (void it_sur_rb0(void)). Le sous programme dinterruption vrifie lorigine de linterruption puis (pour cet exemple) incrmente un compteur (cpt). Le drapeau de linterruption est effac avant le retour vers la boucle while(1) du programme principal.
33 / 48
6.3.2.
Ce programme fait clignoter la LED sur PB0 par interruption sur le TIMER0 T=1.048s (TIMER0 produit des temps de 2expN). Il sagit dune mise en oeuvre simple du TIMER 0, chaque dbordement provoque une IT. Le timer est en mode 16 bits avec horloge Fosc/4 soit 1MHz, prdiviseur par 8 La priode des dbordements est donc 1uS * 8 * 65536 = 524.288 mS #include <p18fxxx.h> void traiteIT(void);
le vecteur d'IT prioritaire se trouve l'adresse 8. Cette pragma force le compilateur placer le code l'adresse indique
#pragma code it=0x08 Saut sur le S/P de traitement de linterruption void saut_sur_spIT(void) Facultatif ici, il ny a pas dIT { en 0x18 _asm goto traiteIT _endasm } le compilateur peut nouveau grer les adresses #pragma code #pragma interrupt traiteIT return. Il ny a aucun paramtre pour un SP d'IT car son appel est asynchrone void traiteIT(void) { if(INTCONbits.TMR0IF) //vrifie un dbordement sur TMR0 {INTCONbits.TMR0IF = 0; //efface le drapeau d'IT PORTBbits.RB0 = !PORTBbits.RB0; //bascule LED sur RB0 } } Debut Programme S/P IT vecteur 0x08 Principal ( PP ) void main() { PORTBbits.RB0 = 0; PORTB0 en sortie IT produire per Autorise IT OUI TRISBbits.TRISB0 = 0; TIMER0 ? TIMER0 T0CON = 0x82; INTCONbits.TMR0IE = 1; INTCONbits.GIEH = 1; Bascule PRB0 while(1); } NE RIEN FAIRE
NON
Ex : tester le programme, mesurer la priode du signal sur PRB0 et conclure par rapport la configuration du TIMER0
RETOUR
34 / 48
6.4.
Programme itcomp.c Le programme flashit.c ne permet pas de produire une dure de 500mS, pour cela il est ncessaire dutiliser la fonction COMPARE associe au TIMER1 par exemple . Il y a une IT toutes les 125mS, il
faut attendre 4 IT avant de basculer #include <p18fxxx.h> PB0. le compteur dIT tictac est // sous programme d'interruption local, il doit galement tre #pragma interrupt traite_it statique pour ne pas tre perdu la void traite_it(void) { static char tictac; // IT toutes les 125mS, 4 IT avant de basculer PB0 if( PIR1bits.CCP1IF) // l'IT provient d'une comparaison { if (++tictac>=4) { PORTBbits.RB0=!PORTBbits.RB0; //bascule PB0 tictac=0; } PIR1bits.CCP1IF=0; //efface Modifier itcomp.c de manire obtenir un Ex7 : le drapeau d'IT } rapport cyclique si S2 est enfonc et sinon en }
#pragma code vec_it=0x08 void vect8 (void) { _asm goto traite_it _endasm } #pragma code void main(void) { //configure PORTB PORTBbits.RB0=0; TRISBbits.TRISB0=0; // configure le TIMER1 T1CONbits.RD16=0; T1CONbits.TMR1CS=0; T1CONbits.T1CKPS1=1; T1CONbits.T1CKPS0=1; T1CONbits.T1SYNC=1; T1CONbits.TMR1ON=1;
// RB0 en sortie
Exercices pour les plus rapides : A partir de itcomp.c et tstxlcd.c, construire une horloge affichant heures, minutes, secondes. La mise lheure se fera dans le dbogueur MP-LAB Dans un deuxime temps la mise lheure se fera par S2 pour les minutes et S3 pour les heures. (EX10)
// TMR1 mode simple (pas de RW) // compte les impulsions sur internal clock // prdiviseur =1/8 periode sortie = 8uS
// TMR1 Activ
// configure le mode comparaison sur le TIMER1 avec IT sur CCP1 toutes les 62500 priodes de 8us soit 125ms T3CONbits.T3CCP2=0; // mode comparaison entre TMR1 et CCPR1 configure le CCP1CON=0x0B; // Trigger special event sur comparaison (RAZ TIMER1 lors de l'galit) mode comparaison CCPR1H=0x3d; // galit aprs 15625 priodes de 8ms (125mS) sur le TIMER1 CCPR1L=0x09; avec IT sur CCP1 toutes PIE1bits.CCP1IE=1; // active IT sur mode comparaison CCP1 les 62500 priodes de RCONbits.IPEN=1; // Interruption prioritaires actives 8us soit 125ms INTCONbits.GIE=1; // Toutes les IT dmasques autorises while(1); } // une boucle infinie, tout fonctionne en IT
35 / 48
6.4.2.
Mesure de temps
// mesure de priode sur CCP1 (RC2) (TIMER1 et fonction capture) (fichier itcapt.c) // initxlcd.c doit tre compile dans le projet pour la gestion de lafficheur LCD #include <p18fxxx.h> #include <xlcd.h> #include <stdio.h> #include <tempo_lcd_pd2.c> // tempo pour xlcd.h unsigned int duree=5555; char maj=1; // reprsente le comptage entre 2 fronts // indique qu'une nouvelle mesure est prte
// sous programme d'interruption #pragma interrupt itcomp void itcomp(void) { unsigned static int ancien; if(PIR1bits.CCP1IF) // l'IT provient d'une capture { duree=CCPR1; maj=1; // nouvelle mesure pr^te } PIR1bits.CCP1IF=0; //efface le drapeau d'IT } #pragma code interruption=0x8 void ma_fontion (void) { _asm goto itcomp _endasm } #pragma code
Ex9 : Raliser un frquencemtre sur afficheur LCD. Dfinir en fonction des paramtres de TIMER1 les frquences max et min mesurables.
void main(void) { // configure PORTC CCP1 DDRCbits.RC2=1; // RC2/CCP1 en entree // configure le TIMER1 T1CONbits.RD16=0; T1CONbits.TMR1CS=0; T1CONbits.T1CKPS1=1; T1CONbits.T1CKPS0=1; T1CONbits.T1SYNC=1; T1CONbits.TMR1ON=1;
// TMR1 mode simple (pas de RW) // compte les impulsions sur internal clock // prdiviseur =1/8 periode sortie = 8uS // pas de synchronisation sur sleep/Reset // TMR1 Activ
// configure le mode capture sur le TIMER1 avec IT sur CCP1 T3CONbits.T3CCP2=0; // mode comparaison entre TMR1 et CCPR1 CCP1CON=0x05; // capture mode sur fronts montants PIE1bits.CCP1IE=1; RCONbits.IPEN=1; INTCONbits.GIE=1; XLCDInit( ); while(1) { if (maj) { // active IT sur mode capture/comparaison CCP1 // Interruption prioritaires actives // Toutes les IT dmasques autorises
" ,duree);
36 / 48
Bibliothques Fichiers .h en C #define Fic hiers Prototypes dinc lus ion des *.h fonctions prcompile
F ichie rs so u rce s
M C C18
M PASM
p rog 1.o
p rog 2.o
F ichie rs o b je t re lo g ea b le s
device.lkr Plan mmoire pour lattribution des adresses de vice .lkr Dclaration des fichiers *.lib p18f 452i.lkr balayer ...
prog.lib librairie m ath .lib contenant Bibliothques des fichiers prc ompiles prog.o ...
M P L IN K
_m p2link . ex e
debugger
E d ite ur d e lie ns
m p2c od. ex e
m p2hex . ex e
F ichie rs d e sortie
p rog 1.o ut Fic hier li intermdiaire p rog 1.m ap Routage mmoire aprs lien p rog 1.he x Fic hier ex c utable s ur PIC p rog 1.lst Fic hier lis ting p rog 1.co d permet la mis e au point
MP L AB S I M
MPLAB IDE est un environnement de dveloppement intgr de projets logiciels. Associ au compilateur MCC18 il permet de compiler et/ou dassembler ensemble des fichiers sources dorigines diffrentes puis de lier les fichiers objet obtenus entre eux et avec des bibliothques prcompiles, partir dun fichier ddition de lien caractristique du processeur utilis, pour obtenir le fichier excutable.
37 / 48
7.1.
Objectifs :
Mettre en uvre le convertisseur analogique numrique (voltmtre) Utiliser lEEPROM interne en lecture/criture Mettre en uvre les communications sries asynchrones (USART liaison avec terminal.exe sur PC) Mettre en oeuvre linterface I2C (mesure de temprature)
Prrequis :
Caractristiques gnrales du compilateur MCC18 Connaissance lmentaire du langage C Notions d'algorithmique Architecture du contrleur PIC 18F4620
Donnes :
Documentation minimale PIC 18F4620 Guide d'utilisation de la carte PICDEM2 PLUS
Remarque pralable :
La dure prvue pour ce TP ne permet pas de solutionner les exercices proposs. Il sagit donc dans un premier temps de mettre en uvre les diffrentes interfaces avec les programmes proposs puis dans un deuxime temps de solutionner un ou plusieurs exercices.
Travail demand :
1 2 3 4 5 Convertisseur analogique numrique EEPROM interne Communications asynchrones BUS I2C BUS SPI
38 / 48
7.2.
Conversion analogique/Numrique
Programme atod.c atod.c montre comment mettre en uvre le convertisseur analogique numrique du PIC18F4620. La tension sur lentre AN0 est affiche en volts. #include xlcd.h #include <stdio.h> #include <tempo_lcd_pd2.c> // tempo pour xlcd.h #include "ftoa.c" #define q 4.8828e-3 char chaine[30]; void main(void) // quantum pour un CAN 10bits 0v-5v Ex8 : Raliser un voltmtre affichant la tension sur AN0 en volts en introduisant une fonction int mesvolt(char canal) retournant la valeur mesure sur lentre canal et en utilisant xlcd.h et stdio.h
{ float res; XLCDInit(); XLCDL1home() ; // positionne le curseur en x,y ADCON0=1; // CAN on. CLOCK=FOSC/2. CANAL0 (RA) ADCON1=0x8E; // justification droite, seul AN0 est activ, VREF+=VDD VREF-=VSS while(1){ ADCON0bits.GO_DONE=1; while(ADCON0bits.GO_DONE); res=(float)ADRES*q; ftoa(res,chaine,3,'f'); XLCDL1home(); XLCDPutRamString(chaine) } } // SOC // attend EOC // calcule la tension // convertit en chaine
Envoie vers lafficheur LCD une chane depuis la RAM
39 / 48
7.3.
Programme eeprom.c #include <p18fxxx.h> char chaine1[]="j'ecris en EEPROM"; char *chaine2; unsigned int adresse; char c; char eeplit(unsigned int ad) { EEADR=ad; EECON1bits.EEPGD=0; EECON1bits.RD=1; return(EEDATA); } // lecture de l'adresse ad
void eepecr(unsigned int ad,unsigned char c) // ecrit { EEADR=ad; EEDATA=c; EECON1bits.EEPGD=0; EECON1bits.WREN=1; EECON2=0x55; EECON2=0xAA; EECON1bits.WR=1;
EECON1bits.WREN=0; }
c l'adresse ad
void eepmess(unsigned int ad, unsigned char *p) // crit une chaine p l'adresse ad { while (*p) eepecr(ad++,*p++); } void main(void) { eepmess(0,chaine1); // ecrit chaine1 l'adresse 0 de l'EEPROM adresse=0; while(c=eeplit(adresse++)) *chaine2++=c; //recopie en RAM l'EEPROM while(1); }
Exercice : tester ce programme et constater lcriture et la recopie de la chane dans les fentres files registers et EEPROM Exercice : : raliser le mme programme laide de la bibliothque eep.h
40 / 48
7.4.
Programme tstusart.c Tstusart montre la mise en uvre des communications asynchrones. Ce programme ne traite pas la perte de donnes en rception par crasement // CD 03/03 // Test des communications asynchrones sans IT // connecter un mulateur de terminal sur le pour srie de PICDEM2+ // Attention au cable PC (brochage RX/TX) #include <p18fxxx.h> rom char mess[]="\nLes communications sont ouvertes\nTapez une touche ...\n\n"; // indique qu'un caractre est dans RCREG de l'USART char data_recue(void) // reception d'une interruption { if (PIR1bits.RCIF) /* char recu en reception*/ { PIR1bits.RCIF=0; // efface drapeau return (1); // indique qu'un nouveau caractre est dans RCREG } else return (0); // pas de nouveau caractre reu } // envoie un caractre sur USART void putch(unsigned char c) //putch est dfini sur le port srie { while(!TXSTAbits.TRMT); // pas de transmission en cours ? TXREG=c; /* envoie un caractre */ while(!PIR1bits.TXIF); } // envoie une chaine en ROM void putchaine(rom char* chaine) { while (*chaine) putch(*chaine++); } void main(void) { SPBRG = 25; TXSTA = 0x24; RCSTA = 0x90;
Bibliothque libusart.h
Cette bibliothque contient toutes les fonctions de gestion de lUSART et vite la perte de donne en rception par crasement. Chaque caractre reu dclenche une interruption qui stocke ce dernier dans un tampon mmoire. getsci lit dans ce tampon le plus ancien caractre reu.
41 / 48
PTLEC=PTECR
IT provient de l'USART
oui
Le caractre reu est plac l'adresse PTECR emission du caractre caractre lue = contenu de l'adresse PTLECC
PTLEC++
PTECR > adresse max du buffer PTLEC > adresse max du buffer
oui
oui
retour
getsci
putsci [s]
OUI
s++
42 / 48
Compilateur MCC18 v16 Etre capable danalyser un programme de traitement de donnes par pointeurs. Utiliser la librairie libpd2.h Tableau de rception : Les caractres reus sont rangs dans un tableau (buffer) ladresse dun pointeur PTECR qui est ensuite incrment. getsci retourne le caractre pont par PTRECR puis PTRECR est incrment. Lorsque tous les caractres reus ont t lus, PTERC=PTLEC. Si lun des pointeurs dpasse ladresse max du tableau il pointera nouveau le dbut [PTLEC-1] reprsente le dernier caractre lu et [PTECR-1] le dernier caractre reu.
0 36 1 54 2 4A 3 41 PTLEC 4 6D 5 43 6 8B 7 55 8 65 PTECR 9 30 38 69 39 7E
Programme tstusartlib.c Exemple dutilisation de usartlib.c /* gestion SCI en IT /* test de la librairie libpd2*/ #include "initxlcd.c" #include <p18fxxx.h> #include "libusart.c" void main(void) { unsigned char chaine[]="Bonjour les communications sont ouvertes\n"; unsigned char maj[]="Afficheur LCD mis jour \n"; OpenXLCD(FOUR_BIT & LINES_5X7 ); initsci(); putstsci(chaine); while(1) { // mettre une des 2 lignes ci dessous en commentaires // putsci(getsci()+1); // emmision / rception d'un caractre // putstsci(getstsci(chaine,'*'));// emmision / rception d'une chaine getstsci(chaine,'*'); SetDDRamAddr(0); Ex11 : raliser un voltmtre sur PC mesurant de tension sur AN0 et la putsXLCD(chaine); transfrant sur USART lors de la rception du caractre v putstsci(maj); } }
USB
COM1/2 AN
43 / 48
7.5.
Bus I2C
Exemple de gestion du module MSSP (Master Synchronous Serial Port) en mode I2C. Lecture de la temprature sur le capteur TC74 de PICDEM2+ (fichier I2Ctc74.C) Programme i2cTC74.c
// test TC74 sur picdem2+ // C.D 02/2003 #include <p18fxxx.h> #include "initxlcd.c" #define adrtc74 0b1001101 #define regtemp 0 #define config 1 signed char temp; unsigned char tampon[3];
void ack(void) // attend acknowledge (I2C) de l'esclave { while(SSPSTATbits.R_W); // attend fin de transmission while (SSPCON2bits.ACKSTAT); // attend fin ACK esclave } //retourne le contenu du registre cmd dans TC74 signed char lit_i2c(unsigned char adresse, unsigned char registre) { signed char t; SSPCON2bits.SEN=1; // START while (SSPCON2bits.SEN); SSPBUF=adresse<<1; // adresse ecriture ack(); SSPBUF=registre; // adresse registre ack(); SSPCON2bits.RSEN=1; // RESTART while (SSPCON2bits.RSEN); SSPBUF=(adresse<<1)|0b00000001; // adresse lecture ack(); SSPCON2bits.RCEN=1; // passe ne mode lecture d'un octet while (SSPCON2bits.RCEN); // attend reception termine t=SSPBUF; // mmorise temprature SSPCON2bits.ACKDT=1; // NON-ACK SSPCON2bits.ACKEN=1; while(SSPCON2bits.ACKEN); SSPCON2bits.PEN=1; // STOP while(SSPCON2bits.PEN); return (t); } void init_i2c(void) { DDRCbits.RC3 = 1; // SCL (PORTC,3) en entre DDRCbits.RC4 = 1; // SDA (PORTC,4) en entre SSPCON1=0b00101000; // WCOL SSPOV SSPEN CKP SSPM3:SSPM0 // efface WCOL et SSPOV, active I2C, I2C mode maitre horloge=FOSC/(4*(SSPADD+1)) SSPSTATbits.SMP=1; // slew rate inhib (f<400Khz) SSPADD=5; // horloge = 4Mhz / 24 = 166,66 KHz } void main(void) { OpenXLCD(FOUR_BIT & LINES_5X7 ); init_i2c(); while (1) { while(!(lit_i2c(adrtc74,config)&0b01000000)); // attend mesure ok (Bit D6 (du registre CONFIG TC74) =1) temp=lit_i2c(adrtc74,regtemp); // le rsultat est direct (cod signed char), voir doc TC74 SetDDRamAddr(0); putsXLCD(btoa(temp,tampon)); // crit un byte (8 bits) putchar('c'); } }
Exercices : A laide de la documentation du PIC18F4620 (chap 15 MSSP). Ralisez lalgorigramme de ce programme. Il sera essentiel danalyser la configuration des registres et bits utiliss Raliser le MME programme mais en utilisant la librairie libpd2.h Ex12 Ecrire un programme transmettant la temprature toutes les secondes sur lUSART
44 / 48
7.6.
Bus SPI
Connexion dun convertisseur analogique numrique 10 bits sur bus SPI : MAX 515
U3
VDD
C1 100nF
100
RC7/RX/DT RC6/TX/CK RC5/SDO RC4/SDI/SDA RC3/SCK/SCL RC2/CCP1 RC1/T1OSI/CCP2 RC0/T1OSO/T1CKL PIC18F252 VDD
GND
VOUT DOUT
7 4
R9 VOUT 1k
VDD 5v
J1 1 2 3 4 5 6 ICD
VDD R7 470K 4 U5 /SHDN OUT OS COM Passe Bas Switch-Capa MAX7410 5ime ordre 7 5 6 1
VDD
Vin
VOUT
GND
C4 100nF
Rfrence 2.5v
Exercices : Aprs cblage, tester le programme page suivante Ex 13 : Crer un programme recopiant Vin sur Vout avec fe=1Khz.
45 / 48
Compilateur MCC18 v16 // CD Lycee Fourcade 13120 Gardanne 01/2003 /* Librairie pour MAX515 sur BUS SPI (PIC18) initSPI_max515 initialise le port SPI pour MAX515 avec F=Fosc/4 Selection boitier sur /SS (PORTA5) pas d'interruption void max515(unsigned int v) envoie la valeur v(0<=v<=1023) vers le max515 Brochage MAX515 CNA 10 bits 1 DIN sur RC5/SDO 2 SCLK sur RC3/SCK 3 - /CS sur RA5 (ou ailleur) 4 DOUT (non connect) 5 GND 6 REFIN (ref 2,5v Microchip MCP1525 par exemple) 7 Vout (sortie 0-5v du CNA) 8 VDD (5v) */ #include <p18f252.h> void initSPI_max515(void) // initialisise SPI sur PIC18 { DDRAbits.RA5=0; // PRA5 en sortie (/SS) PORTAbits.RA5=1; // CS=1 DDRCbits.RC3=0; //SCK en sortie PORTCbits.RC3=0; DDRCbits.RC5=0; //SDO en sortie PORTCbits.RC5=0; PIR1bits.SSPIF=0; SSPSTAT=0b01000000; //echantillonne au milieu de la donne, sur front montant SSPCON1=0b00100000;// active SPI, IDLE=0, clock=FOSC/4 PIR1bits.SSPIF=0; // SSPIF indique une fin d'emmission par un 1 } void max515(unsigned int v) // envoie v sur CAN MAX515 {unsigned char fort,faible; // poids forts et faibles de v v<<=2;// formatage des donnes pour compatibilit avec MAX515 fort=v>>8; faible=v & 0b0000000011111111; PORTAbits.RA5=0; // CS=0 SSPBUF=fort; // emmision poids forts while(!PIR1bits.SSPIF); // attend la fin de l'mission PIR1bits.SSPIF=0; SSPBUF=faible; // emmisiion poids faibles while(!PIR1bits.SSPIF);// attend la fin de l'mission PIR1bits.SSPIF=0; PORTAbits.RA5=1; // CS=1 } /* programme de test de la librairie */ void main(void) { int val=0x0; initSPI_max515(); while(1) { max515(val++); } }
46 / 48
7.7.
Directives du pr-processeur
Les directives de pr-compilation commencent toutes par le caractre # et ne se terminent pas par un pointvirgule .
7.7.1.
Directive #include
Directives C ANSI
Rle Syntaxe / exemple
#include<Nomfichier> recherche du fichier dans : Les rpertoires mentionns laide de loption de compilation /Idirectory Les rpertoires dfinis laide de la variable denvironnement INCLUDE recherche du fichier dans :
Sert inclure un fichier contenant du code source (.c ou .h) dans un autre fichier.
#include "Nomfichier"
Idem cas prcdent + Permet de dfinir une variable prprocesseur en lui affectant ventuellement un contenu . Partout dans la suite du fichier source, la variable (identificateur) en question sera remplace par son contenu (valeur). La directive #undef permet de dtruire une variable prprocesseur, partir d'un endroit donn dans le code, et d'arrter toute substitution lie cette variable. Le rpertoire courant
#define identificateur [valeur] #define PI #define OUTPUT #define INPUT #define LCD_DATA #define lcd_clear() l'afficheur #define lcd_goto(x) 3.1416 0x0 0x1 LATD lcd_cmd(0x1) // efface lcd_cmd(0x80+(x))
#define #undef
Remarque : Dans ce dernier type de substitution, il est possible d'introduire des paramtres, on parle alors de macro-fonction. #if type_ecran==VGA nb_colonnes=640; nb_lignes=480;
Il s'agit de directives de compilation conditionnelle qui facilitent entre autre la rsolution de nombreux problmes de portabilit des codes "source".
#elif type _cran==SVGA nb_colonnes=800; nb_lignes=600; #elif type _cran==XGA nb_colonnes=1024; nb_lignes=768; endif #line numro_de_ligne ["nomfichier"]
Numrotation des lignes partir de 1 avec comme nom int calcul(int x, int y) calcul.c
A l'intrieur d'un fichier, en introduisant une directive #line, il est possible d'imposer une numrotation des lignes, ainsi ventuellement qu'un nouveau nom de fichier comme indication du code source compil. Ceci sert essentiellement pour les messages d'erreur de compilation
Permet de gnrer un message d'erreur qui s'affichera pendant la compilation
#line 1 "calcul.c"
#error
7.8.
47 / 48
Compilateur MCC18 v16 Ce module de MPLAB doit tre tlcharger depuis le site internet de MICROCHIP et install aprs MPLAB. Il permet la cration rapide dun squellette de programme en assembleur avec les priphrques pr-initiailiss qui peut tre li simplement avec un programme en C
7.9.
Maestro permet de crer le squelette dun programme en assembleur et en C avec des fonctions de gestion de prriphriques intgres, (LCD, Bus CAN, I2C, etc)
Notes
48 / 48