Vous êtes sur la page 1sur 56

COMPILATEUR

Microchip C18 v14

COMPILATEUR Microchip C18 v14 www.microchip.com Equipe de formation sur les microcontrôleurs PIC Robert Toquebeuf

Equipe de formation sur les microcontrôleurs PIC

Robert Toquebeuf Lycée Adam de Craponne 13700 Salon de Provence Académie d’Aix-Marseille

Christian Dupaty Lycée Fourcade 13120 Gardanne Académie d’Aix-Marseille

Compilateur MCC18 v14 SOMMAIRE 1. CARACTERISTIQUES GENE RALES DE MCC18 4 1.1. P ROPRIETES 4

Compilateur MCC18 v14

SOMMAIRE

1. CARACTERISTIQUES GENERALES DE MCC18

4

1.1.

PROPRIETES

4

1.2.

SCHEMA GENERAL DU PROCESSUS DE COMPILATION

4

1.3.

ROLE DU PRE-PROCESSEUR

5

1.4.

ROLE DES FICHIERS D'INCLUSION

5

1.5.

FICHIER P18F452.H

6

1.6.

DIRECTIVE #PRAGMA CONFIG

6

2. TP N° 1: PRISE EN MAIN DU COMPILATEUR MCC18

7

2.1.

PRISE EN MAIN DU COMPILATEUR

8

2.2.

GESTION DES PORTS PARALLELES

9

2.3.

MISE AU POINT DUN PROGRAMME ECRIT EN C DANS MPLAB

10

2.4.

CREATION DUNE FONCTION

11

2.5.

ANALYSE DUN PROGRAMME ECRIT EN C : DECALAGES

12

3. BIBLIOTHEQUES MCC18

13

3.1.

EDITEUR DE LIENS MPLINK

13

3.1.1.

ROLE ET CONTENU DES FICHIERS D'EDITION DE LIEN

13

3.1.2.

CODE DE DEMARRAGE (CRT – C RUN TIME)

13

3.2.

BIBLIOTHEQUES SPECIFIQUES D'UN PROCESSEUR

14

3.3.

FONCTIONS C ANSI

15

3.4.

FONCTIONS DE LA BIBLIOTHEQUE XLCD:

17

3.5.

INSTALLATION DE LA MISE A JOUR POUR PICDEM2+ :

18

3.6.

FTOA

18

3.7.

UTILISTAION DE XLCD :

19

3.8.

STDIO.H (MCC 18 V2.4X)

20

3.8.1.

PRINTF, FPRINTF, SPRINTF

21

3.8.2.

MATH.H

21

3.9.

TP N°2 UTILISATION DES BIBLIOTHEQUES

23

3.10.

EXERCICES, SORTIES DE CHAINES DE CARACTERES

25

4. SPECIFICITES DU COMPILATEUR MCC18

29

4.1.

TYPE DE DONNEES

29

4.2.

MACROS EN C POUR MICRO PIC

29

4.3.

ASSEMBLEUR EN LIGNE

29

4.4.

GESTION DE LA MEMOIRE

30

4.4.1.

DIRECTIVES DE GESTION DE LA MEMOIRE

30

4.4.2.

QUALIFICATIFS DE MEMORISATION

31

4.4.3.

FICHIER DE ROUTAGE MEMOIRE (FICHIER MAP)

31

4.5.

TP N° 3 : GESTION DE LA MEMOIRE

32

5. GESTION DES INTERRUPTIONS

34

5.1.

DIRECTIVES DE GESTION DES INTERRUPTIONS

34

5.2.

TP N° 4 : GESTION DES TIMERS EN INTERRUPTION

34

5.3.

EXEMPLE DE PROGRAMME FONCTIONNANT EN IT

35

5.4.

TIMERS

36

5.4.1.

PRODUCTION DE TEMPS

36

5.4.2.

MESURE DE TEMPS

37

6. STRUCTURE D’UN PROJET DANS MPLAB, GESTION DES BIBLIOTHEQUES

38

6.1. CREATION D'UNE BIBLIOTHEQUE PERSONNELLE

39

6.2. CREER ET UTILISER UNE LIBRAIRIE

40

6.3. TP N°5

: CREATION ET GESTION DES BIBLIOTHEQUES « LYCEE »

41

6.4. TP N°6 : GESTION DES PERIPHERIQUES INTEGRES

42

6.5. CONVERSION ANALOGIQUE/NUMERIQUE

43

6.6. ACCES EEPROM INTERNE

43

6.7. COMMUNICATIONS SERIES ASYNCHRONES

45

6.8. BUS I2C

 

48

6.9. BUS SPI

49

6.8. B US I2C   48 6.9. B US SPI 49 Académie d’Aix-Marseille – Formations mi

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

2 /56

Compilateur MCC18 v14 7. UTILISATION AVANC EE DE MCC18 51 7.1. I NSTALLATION DANS L

Compilateur MCC18 v14

7.

UTILISATION AVANCEE DE MCC18

51

7.1.

INSTALLATION DANS L'ENVIRONNEMENT MPLAB

51

7.2.

REPERTOIRE DINSTALLATION

53

7.3.

DIRECTIVES DU PRE-PROCESSEUR

53

7.3.1.

DIRECTIVES C ANSI

53

7.3.2.

DIRECTIVES SPECIFIQUES DU COMPILATEUR MCC18

54

7.4.

L’UTILITAIRE GRAPHIQUE VISUAL INITIALISER

54

7.5.

L’UTILITAIRE MICROCHIP MAESTRO

55

8.

PROGRAMMER LES PIC 10,12 ET 16 EN C

55

MPLAB, C18 et les data sheet des microcontrôleurs PIC 16 et PIC 18 sont disponibles sur www.microchip.com ôleurs PIC 16 et PIC 18 sont disponibles sur www.microchip.com

Les exemples et mises à jour de ce cours sont disponibles sur www.genelaix.fr.st Un site consacré au C sur PIC http://www.microchipc.com/

Prog rammer les PIC12 et PIC16 en C avec CC5x, compilateur gratuit sur grammer les PIC12 et PIC16 en C avec CC5x, compilateur gratuit sur

avec CC5x, compilateur gratuit sur http://www.bknd.com/cc5x/ Académie d’Aix-Marseille – Formations mi

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

3 /56

Compilateur MCC18 v14 1. Caractéristiques générales de MCC18 1.1. Propriétés • Compatibilité C ANSI •

Compilateur MCC18 v14

1. Caractéristiques générales de MCC18

1.1. Propriétés

Compatibilité C ANSI

Intégrable dans MPLAB pour faciliter la mise au point et la gestion d’un projet

Génération de modules objet relogeables

Compatible avec des modules objets générés par MP ASM

Bibliothèque étendue incluant des modules de gestion des périphériques ; PWM, SPI, …

Contrôle total par l’utilisateur de l’allocation des données et du code en mémoire

1.2.

Schéma général du processus de compilation

Bibliothèques en C (texte) *.c Fichiers d’inclusion *.h
Bibliothèques
en C (texte)
*.c
Fichiers
d’inclusion
*.h

Compilateur C Transforme le fichier C en un fichier objet (code machine), les fonctions pré- compilés sont déclarées dans les fichiers *.h

pré- compilés sont déclarées dans les fichiers *.h #include <stdio.h> main() { puts(" Bonjour à
pré- compilés sont déclarées dans les fichiers *.h #include <stdio.h> main() { puts(" Bonjour à
#include <stdio.h> main() { puts(" Bonjour à tous "); }
#include
<stdio.h>
main()
{ puts(" Bonjour à
tous ");
}

Bibliothèques

pré-compilées

(fichiers objet)

"); } Bibliothèques pré-compilées (fichiers objet) Editeur de lien LINKER Lie (donne des adresses aux
"); } Bibliothèques pré-compilées (fichiers objet) Editeur de lien LINKER Lie (donne des adresses aux
"); } Bibliothèques pré-compilées (fichiers objet) Editeur de lien LINKER Lie (donne des adresses aux

Editeur de lien

LINKER

Lie (donne des adresses aux fonctions) tous les fichiers objets et crée un fichier exécutable

Programme exécutable Prog.hex ( + Prog.err)
Programme
exécutable
Prog.hex
( + Prog.err)

Préprocesseur Met en forme le fichier source C à partir de directives #define, #include

Fichier

source C

contenant

la fonction

main

Fichiers pour debug Prog.cod Prog.lst
Fichiers pour
debug
Prog.cod
Prog.lst
fonction m a i n Fichiers pour debug Prog.cod Prog.lst Académie d’Aix-Marseille – Formations mi
fonction m a i n Fichiers pour debug Prog.cod Prog.lst Académie d’Aix-Marseille – Formations mi
fonction m a i n Fichiers pour debug Prog.cod Prog.lst Académie d’Aix-Marseille – Formations mi

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

4 /56

Compilateur MCC18 v14 1.3. Rôle du pré-processeur Le pré-processeur ou pré-compilat eur réalise des mises

Compilateur MCC18 v14

1.3. Rôle du pré-processeur

Le pré-processeur ou pré-compilateur réalise des mises en forme et des aménagements du texte d'un fichier source, juste avant qu'il ne soit traité par le compilateur. Il existe un ensemble d'instructions spécifiques appelées directives pour indiquer les opérations à 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 définition de macro

1.4. Rôle des fichiers d'inclusion

Les fichiers d'inclusion ou d'en tête *.h (header) contiennent pour l'essentiel cinq types d'informations :

Des définitions de nouveau type

Des définitions de structure

Des définitions de constantes

Des déclarations de fonctions

Des définitions de macro_fonctions

Exemple :

#define add(a,b) a+b

de macro_fonctions Exemple : #define add(a,b) a+b En général ces fichiers contiennent des directives de

En général ces fichiers contiennent des directives de compilation ou pré_compilation conditionnelles. De ce fait ils ne sont pas toujours aisés à déchiffrer pour une personne qui débute en langage C. néanmoins il est indispensable d'en prendre petit à petit connaissance.

Il s'agit d'un fichier d'inclusion particulièrement important lorsqu’on travaille en C sur un micro-contrôleur : le fichier de définition des registres internes du micro-contrôleur p18F452.h par exemple . p18f452.h possède les définitions des registres et des bits ce qui permet d'accéder directement aux registres du µcontrôleur par leur nom (ceux du data sheet) et également de tester ou positionner individuellement les bits de ces registres de la façon suivante :nom_registre.nom_bit

exemples :

PORTB=0xA4 ; ou a=PORTB ;

PORTBbits.RB0=0 ; ou PORTBbits.RB0=1 ;

On utilise LATBbits.LATB0 pour accéder au latch B0.

If (PORTAbits.RA4) … ; else …. ; L‘expression sera vraie si PORTA4 est non nul, il est donc inutile d’écrire (PORTAbits.RA4==1)

Pour inclure un fichier contenant du code source (.c ou .h) dans un autre fichier il faut utiliser la directive #include de la façon suivante :

#include<Nomfichier> recherche du fichier dans :

Les répertoires mentionnés à l’aide de l’option de compilation /Idirectory

Les répertoires définis à l’aide de la variable d’environnement INCLUDE

#include "Nomfichier" recherche du fichier dans :

Idem cas précédent + Le répertoire courant Il est également possible de préciser le chemin complet du fichier : #include "c:\exo\monfichier.c"

Un fichier source en C pour PIC18F452 contiendra toujours la déclaration :

en C pour PIC18F45 2 contiendra toujours la déclaration : #include <p18f452.h> Académie d’Aix-Marseille –

#include <p18f452.h>

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

5 /56

Compilateur MCC18 v14 1.5. Fichier P18F452.h Il s'agit d'un fichier d'inclusion particulièrement important

Compilateur MCC18 v14

1.5. Fichier P18F452.h

Il s'agit d'un fichier d'inclusion particulièrement important lorsqu’on travaille en C sur un micro-contrôleur : le fichier de définition des registres internes du micro-contrôleur (P18F452.h) qui sont déclarés dans le fichier de déclaration des registres du processeur (p18f452.asm), fichier assembleur qui après compilation donne un fichier (p18f452.o) lui même contenu dans la bibliothèque pré-compilée (p18f452.lib) .

Par exemple dans le le fichier P18F452.h port A est définit de la façon suivante :

extern volatile near unsigned char PORTA; extern volatile near union { struct { unsigned RA0:1; unsigned RA1:1; unsigned RA2:1; unsigned RA3:1; unsigned RA4:1; unsigned RA5:1; unsigned RA6:1;

} ; struct { unsigned AN0:1; unsigned AN1:1; unsigned AN2:1; unsigned AN3:1; unsigned :1; unsigned AN4:1; unsigned OSC2:1;

} ;

struct { unsigned :2; unsigned VREFM:1;

unsigned VREFP:1; unsigned T0CKI:1; unsigned SS:1; unsigned CLK0:1;

} ;

struct { unsigned :5; unsigned LVDIN:1;

} ;

} PORTAbits ;

Le port A est un octet (unsigned char) défini dans un fichier externe (extern) dont la valeur peut être écrasée entre 2 appels (volatile).

La deuxième déclaration précise que PORTAbits est une union de structures anonymes de bits adressables. Du fait que chaque bit d’un registre de fonction peut avoir plusieurs affectations, il y peut y avoir plusieurs définitions de structures à l’intérieur de l’union pour un même registre.

Dans le cas présent les bits du port A sont définis comme :

1 ère structure :

port d’E/S parallèle (7 bits ; RA0 à RA6) 2 ème structure :

port d’entrées analogiques (5 entrées AN0 à AN4) + entrée

OSC2.

3 ème structure :

Des entrées de tension de référence du CAN, entrée horloge externe du timer0 (T0CKI), entrée de sélection du port série synchrone (SS), sortie du timer0 (CLK0). 4 ème structure :

entrée low voltage detect (LVDIN)

Le contenu du registre ADCON1 déterminera l’affectation d’un bit (cf DS39564B page 182).

L’accés à un bit du portA se fait de la façon suivante :

Nom_union.nom_bit

Exemple :

PORTAbits.RA0 = 1 ; // mise à l’état haut de RA0

1.6. Directive #pragma config

La version 2.40 de MCC18 permet de configurer le microcontrôleur cible sans passer par les menu de MPLAB grâce à la directive #pragma config (voir MPLAB C18 C Compiler Configuration Bit Setting Addendum (DS51518))

C18 C Compiler Configuration Bit Setting Addendum (DS51518)) Exemple : #pragma config OSC = HS #pragma

Exemple :

#pragma config OSC = HS #pragma config WDT = OFF #pragma config LVP = OFF #pragma config DEBUG = ON

WDT = OFF #pragma config LVP = OFF #pragma config DEBUG = ON Académie d’Aix-Marseille –

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

6 /56

Compilateur MCC18 v14 2. TP N° 1: Prise en main du compilateur MCC18 (Travail individuel,

Compilateur MCC18 v14

2. TP N° 1: Prise en main du compilateur MCC18

(Travail individuel, Durée : 1h30)

Objectifs :

Utiliser le compilateur MCC18 dans l'environnement MPLAB

Etre capable de gérer les ports parallèles en C

Etre capable de créer une fonction avec paramètres

Prérequis :

Caractéristiques générales du compilateur MCC18 - Connaissance élémentaire du langage C

Notions d'algorithmique

Architecture du µcontrôleur PIC 18F452

Données :

Documentation minimale PIC 18F452

Guide d'utilisation de la carte PICDEM2 PLUS + TD associé

d'utilisation de la carte PICDEM2 PLUS + TD associé Académie d’Aix-Marseille – Formations mi
d'utilisation de la carte PICDEM2 PLUS + TD associé Académie d’Aix-Marseille – Formations mi

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

7 /56

Compilateur MCC18 v14 2.1. Prise en main du compilateur Création d’un projet générique en C,

Compilateur MCC18 v14

2.1. Prise en main du compilateur

Création d’un projet générique en C, ce projet pourra servir pour tester les programmes exemples et effectuer les exercices.

Project New Name : generic Directory : c:\exopic\

Project New Name : generic Directory : c:\exopic\ Project Select language tools suite Microchip C18

Project Select language tools suite Microchip C18 Tools suite

Project Build options

suite Microchip C18 Tools suite Project Build options Les librairies du C18 sont compilées pour le
suite Microchip C18 Tools suite Project Build options Les librairies du C18 sont compilées pour le
suite Microchip C18 Tools suite Project Build options Les librairies du C18 sont compilées pour le

Les librairies du C18 sont compilées pour le mode d'adressage étendu. Afin d’éviter certains « warning » lors de la compilation :

Dans project-buld options- project Onglet MPLAB C18 catégorie « memory model » Valider « large code model »

« memory model » Valider « large code model » Sources Files contient les fichiers sources
« memory model » Valider « large code model » Sources Files contient les fichiers sources
« memory model » Valider « large code model » Sources Files contient les fichiers sources

Sources Files contient les fichiers sources en C à compiler. Pour essayer les exemples qui suivent. Placer ici le fichier à compiler.

Un fichier d’édition de lien (.lkr) est un fichier de commande pour contrôler les opérations d’édition de lien par MPLINK pour un processeur cible donné ; ici un 18f452 (le i indique une configuration pour ICD2)

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

8 /56

Compilateur MCC18 v14 Travaux pratiques sur PICDEM2+ Etre capable de gérer les ports parallèles en
Compilateur MCC18 v14
Travaux pratiques sur PICDEM2+
Etre capable de gérer
les ports parallèles en C,
utiliser les déclarations de
p18f452.h

2.2. Gestion des ports parallèles

Debut Initialise PRB0 en sortie Bouton RA4 oui non enfoncé ? Allumer PB0 Eteindre PB0
Debut
Initialise PRB0 en
sortie
Bouton RA4
oui
non
enfoncé ?
Allumer PB0
Eteindre PB0

Créer 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 <p18f452.h>

void main(void)

{ TRISA=0xFF;

TRISB = 0;

while(1)

void main(void) { TRISA=0xFF; TRISB = 0; while(1) « header » du processeur cible (contient en

« header » du processeur cible (contient en particulier les définitions de TRISB, PORTA et PORTB

// PORTA en entrée /* PB en sortie */ // une boucle infinie

}

{

}

Remarques :

if (PORTA & 0x10) PORTB=1; else PORTB=0;

{ } Remarques : if (PORTA & 0x10) PORTB=1; else PORTB=0; PORTA&0x10 est « vrai »

PORTA&0x10 est « vrai » si PORTA4 est à 0, bouton relâché

seule la LED sur PB0 devant être modifiée, on aurait pu écrire : PORTB=PORTB|0b00000001; pour mettre PB0 à 1 et PORTB=PORTB&0b11111110; pour mettre PB0 à 0.

Très souvent les masques sont utilisés en C pour les tests ou les positionnements de bit, cependant MCC18 permet de contrôler simplement n’importe quel bit à l’aide de ses déclarations de structure :

ex PORTAbits.RA0=1 ou a= PORTAbits.RA0

Exemples

pour tester si PA4=1

PORTA

x

x

x

x

x

x

x

x

&

0

0

0

1

0

0

0

0

=

0

0

0

x

0

0

0

0

Le résultat est nul si PA4=0. Le C associe dans les tests la notion de faux au 0 et la notion de vrai à un nombre différent de 0.

Positionner PA4 à 0

positionner PA4 à 1

PORTA

x

x

x

x

x

x

x

x

PORTA

x

x

x

X

x

x

x

x

&

1

1

1

0

1

1

1

1

OU

0

0

0

1

0

0

0

0

=

x

x

x

0

x

x

x

x

=

x

x

x

1

x

x

x

x

Ex1 :

Modifier ce programme afin d’incrémenter PRB à chaque pression sur RA4. ( pour tester RA4 : while(PORTAbits.RA4) ; … On utilisera les définitions de bits. PORTxbits de p18F452.h

utilisera les définitions de bits. PORTxbits de p18F452.h Académie d’Aix-Marseille – Formations mi

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

9 /56

Compilateur MCC18 v14 2.3. Mise au point d’un prog ramme écrit en C dans MPLAB

Compilateur MCC18 v14

2.3. Mise au point d’un programme écrit en C dans MPLAB

Les fonctions de débug sont les mêmes qu’en assembleur : step into, step over, points d’arrêtes etc… Il est possible de tracer un programme en C et simultanément dans le fichier assembleur généré par

MCC18.

Le compilateur C gérant les adresses, le programmeur ne connaît pas les adresses physiques des données. Le fichier asm généré par le C et la fenêtre watch permet de visualiser les données,

le C et la fenêtre watch permet de visualiser les données, . Académie d’Aix-Marseille – Formations
le C et la fenêtre watch permet de visualiser les données, . Académie d’Aix-Marseille – Formations
le C et la fenêtre watch permet de visualiser les données, . Académie d’Aix-Marseille – Formations

.

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

10 /56

Compilateur MCC18 v14 Etre capable de créer une fonction avec paramètres d’entrée/sortie 2.4. Création d’une
Compilateur MCC18 v14
Etre capable de créer une fonction
avec paramètres d’entrée/sortie
2.4. Création d’une fonction
Debut Programme
Principal ( PP )
S/P TEMPO
Recopier le programme led.c

#include <p18f452.h>

#define duree 10000

led.c #include <p18f452.h> #define duree 10000 La déclaration d’un prototype est nécessaire car la

La déclaration d’un prototype est nécessaire car la fonction tempo est définie après son appel

void tempo(unsigned int count);

void main(void) { PORTB = 0x00; TRISB = 0x00; while(1) { Boucle infinie PORTB++; incrémentant
void main(void)
{
PORTB = 0x00;
TRISB = 0x00;
while(1) {
Boucle infinie
PORTB++;
incrémentant PRB
tempo(duree);
}
}
void tempo(unsigned int compte)

{

while(compte--);

}

PORTB en sortie incrémente PORTB Tempo N
PORTB en sortie
incrémente PORTB
Tempo N
Compte=N Décremente Compte Compte=0 ?
Compte=N
Décremente
Compte
Compte=0 ?

NON

OUI Retour
OUI
Retour
La fonction tempo reçoit un paramètre (int) qui est recopié dans la variable « compte
La fonction tempo reçoit un paramètre (int) qui est recopié dans la variable « compte », locale à la fonction.
(duree n’est pas modifié)
Remarque : Si une fonction est écrite avant son appel le prototype devient inutile.
Ex2 : modifier le programme led.c de manière à modifier la tempo (passer de 10000 à 20000) si S2 est
appuyé.
Ex3 : Réaliser un programme faisant clignoter RB0 avec une période proche de 1s et un rapport
cyclique ¼ si S2 est appuyé et ½ sinon.
Debut Programme
Principal ( PP )
Debut Programme
Principal ( PP )
PORTB0 en sortie
PORTB en sortie
Bascule PORTB0
incrémente PORTB
OUI
S2 appuyé ?
S2 appuyé ?
NON
OUI
NON
PORTB0=0
NON
OUI
Tempo N
N=10000
N=20000
Tempo N
N=5000
N=15000
N=10000
Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs
11 /56
Compilateur MCC18 v14 Etre capable d’analyser un programme avec une syntaxe complexe en C
Compilateur MCC18 v14
Etre capable d’analyser un programme avec
une syntaxe complexe en C

2.5. Analyse d’un programme écrit en C : décalages

Utilisation des opérateurs de décalage gauche et droite, ces derniers permettent également des multiplications et divisions par deux très

rapides. (Filtre numérique par exemple)

main PRB en sorite PRB= 00000001 PRB=8 ? oui PRB=1 ? oui oui c!=0 ?
main
PRB en sorite
PRB= 00000001
PRB=8 ?
oui
PRB=1 ?
oui
oui
c!=0 ?
oui
S2 enfoncé ?

#include <p18f452.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);

}

}

A essayer puis compléter !
A essayer puis
compléter !
wait (paramètre cnt) cnt=x retour
wait
(paramètre cnt)
cnt=x
retour

non

puis compléter ! wait (paramètre cnt) cnt=x retour non Académie d’Aix-Marseille – Formations mi

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

12 /56

Compilateur MCC18 v14 3. Bibliothèques MCC18 Une bibliothèque regroupe un ensemble de fonctions. Les fonctions

Compilateur MCC18 v14

3. Bibliothèques MCC18

Une bibliothèque regroupe un ensemble de fonctions. Les fonctions utilisées peuvent être liées directement dans une application par l’éditeur de liens MPLINK à condition d'être déclarée dans un fichier header (.h)

3.1. Editeur de liens MPLINK

Lie entre eux les différents fichiers et résout les problèmes d’affectation en mémoire du programme et des données.

3.1.1. Rôle et contenu des fichiers d'édition de lien

Un fichier d’édition de lien est un fichier de commande pour contrôler les opérations d’édition de lien par MPLINK . Il permet :

D’indiquer des chemins d’accès à des répertoires supplémentaires

D’inclure des bibliothèques pré-compilées ou des fichiers objet

De définir l’organisation mémoire du processeur cible

D’allouer des sections sur le processeur cible

D’initialiser la pile (taille et emplacement) Exemple : fichier 18F452i.lkr // Sample linker command file for 18F452i used with MPLAB ICD 2 // $Id: 18f452i.lkr,v 1.2 2002/07/29 19:09:08 sealep Exp $ LIBPATH

. FILES c018i.o FILES clib.lib FILES p18f452.lib

CODEPAGE

CODEPAGE

CODEPAGE

CODEPAGE

CODEPAGE

CODEPAGE

CODEPAGE

NAME=vectors START=0x0

NAME=page

NAME=debug

START=0x2A

END=0x29

END=0x7DBF

END=0X7FFF

Chemins d’accés de bibliothèques ou fichiers objet.

Fichiers objets et bibliothèques précompilées à lier. Définition de la mémoire programme Définition de la
Fichiers objets et
bibliothèques
précompilées à lier.
Définition de la
mémoire
programme
Définition de la
mémoire
Données

Définition de la pile logicielle

PROTECTED

START=0x7DC0

PROTECTED

Le fichier lkr indique les chemins et librairies à balayer pour trouver le code

START=0x200000

END=0x200007

PROTECTED

objet des fonctions déclarées dans les fichier header (*.h). Il y a trois

START=0x300000

END=0x30000D

PROTECTED

librairies par défaut pour chaque lkr de chaque processeur.

START=0x3FFFFE

END=0x3FFFFF

PROTECTED

C018i.o contient le CRT (C Run Time) d’initialisation des

START=0xF00000

END=0xF000FF

PROTECTED

variables et d’appel « main »

clib.lib contients les fonction standard CANSI

END=0x7F

p18fxxx.lib contient les équivalences et fonctions propres au

START=0x80

END=0xFF

microcontrôleur START=0x100 cible.

END=0x1FF

START=0x200

END=0x2FF

START=0x100 cible. END=0x1FF START=0x200 END=0x2FF START=0x300 END=0x3FF START=0x400 END=0x4FF START=0x500

START=0x300

END=0x3FF

START=0x400

END=0x4FF

START=0x500

END=0x5F3

END=0xFFF

NAME=idlocs

NAME=config

NAME=devid

NAME=eedata

ACCESSBANK NAME=accessram START=0x0

NAME=gpr0

DATABANK

DATABANK NAME=gpr2

DATABANK

NAME=gpr1

DATABANK NAME=gpr3 DATABANK NAME=gpr4 DATABANK NAME=gpr5

DATABANK NAME=dbgspr START=0x5F4 END=0x5FF PROTECTED

PROTECTED

ACCESSBANK NAME=accesssfr START=0xF80 SECTION NAME=CONFIG ROM=config STACK SIZE=0x100 RAM=gpr4

3.1.2. Code de démarrage (CRT – C Run Time)

RAM=gpr4 3.1.2. Code de démarra ge (CRT – C Run Time) 3 versions sont fournies avec

3 versions sont fournies avec le compilateur MCC18

Co18.o Initialise la pile logicielle et se branche au début du programme utilisateur (fonction main ) minimum de code .

Co18i.o Idem + initialisation des données avant l’appel du programme utilisateur

Co18iz.o Idem co18i.o + initialisation à zéro des variables statiques non initialisées par le programme (compatibilité C ANSI). Le code source de ces programmes se trouve dans mcc18\src\startup .Pour reconstruire le code de démarrage et copier les fichiers objet dans le répertoire \lib lancer build.bat . Le CRT boucle sur la fonction main, il est donc utile de toujours placer une boucle sans fin dans main

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

13 /56

Compilateur MCC18 v14 3.2. Bibliothèques spécifiques d'un processeur Elles contiennent des fonctions dépendantes

Compilateur MCC18 v14

3.2. Bibliothèques spécifiques d'un processeur

Elles contiennent des fonctions dépendantes du processeur de la famille PIC 18 utilisé. Ces fonctions sont de véritables composants logiciels fournis par MICROCHIP pour exploiter les ressources matérielles des micro-contrôleurs de la famille PIC18.

Elles sont contenues dans les bibliothèques " pprocesseur.lib " P18F452.lib

.

Les fonctions de ces bibliothèques sont décrites dans le document MPLAB® C18C COMPILER LIBRARIES

(DS51297A) Sous répertoire \doc du répertoire d'installation:

Chapitre 2 : Hardware Peripheral Functions Fonctions de gestion des périphériques matériels:

o

ADC

o

Capture

Le code source correspondant se trouve dans les sous répertoires

o

I2C

suivants du répertoire d'installation :

o

Ports d'E/S //

Src\pmc\ADC [CCP, I2C, PORTB, PWM, SPI, Timers, USART]

o

PWM

o

SPI

o

Timer

o

USART

Chapitre 3 : Software Peripheral Library Gestion de périphériques externs et interfaces logiciels.

o

Afficheur lcd

o

CAN2510

o

I2C logiciel

o

SPI logiciel

o

UART logiciel

Le code source correspondant se trouve dans les sous répertoires

suivants du répertoire d'installation :

Src\pmc\XLCD [CAN2510, swI2C, SW SPI, SW UART]

La reconstruction de la bibliothèque s'effectue à l'aide d’un fichier commande (DOS) du répertoire \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 PIC18F452 , P18F452.LIB :

pour reconstruire la librairie du PIC18F452 , P18F452.LIB : makeonep18f242. 18f452 Académie d’Aix-Marseille –

makeonep18f242. 18f452

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

14 /56

Compilateur MCC18 v14 3.3. Fonctions C ANSI Elles sont contenues dans la bibliothèque " clib.lib

Compilateur MCC18 v14

3.3. Fonctions C ANSI

Elles sont contenues dans la bibliothèque " clib.lib ". Les fonctions de cette bibliothèque sont décrites dans le document MPLAB® C18C COMPILER LIBRARIES (DS51297A) Sous répertoire \doc du répertoire d'installation:

Chapitre 4 : General Software Library

Chapitre 5 : Math Libraries

Le code source correspondant se trouve dans les sous répertoires suivants du répertoire d'installation

Src\math fonctions mathématiques

Src\stdclib Classification des caractères, Fonctions de conversion de données standard C ANSI(atof, itoa etc.), Fonctions de mémorisation et de manipulation de chaînes de caractères (printf etc…)

Src\delays Temporisations

Les bibliothèques existent en deux version "traditionnal" et "extended". Extended concerne les nouveaux PIC 18 avec un jeu d'instructions étendu. La reconstruction de la bibliothèque " clib.lib " s'effectue à l'aide de l'utilitaire makeall.bat du répertoire \src.

ANSI 1989 standard C library

ctype.h

Function

Description

isalnum

Determine if a character is alphanumeric.

isalpha

Determine if a character is alphabetic.

iscntrl

Determine if a character is a control character.

isdigit

Determine if a character is a decimal digit.

isgraph

Determine if a character is a graphical character.

islower

Determine if a character is a lower case alphabetic character.

isprint

Determine if a character is a printable character.

ispunct

Determine if a character is a punctuation character.

isspace

Determine if a character is a white space character.

isupper

Determine if a character is an upper case alphabetic character.

isxdigit

Determine if a character is a hexadecimal digit.

stdlib.c

Function

Description

atob

Convert a string to an 8-bit signed byte.

atof

Convert a string into a floating point value.

atoi

Convert a string to a 16-bit signed integer.

atol

Convert a string into a long integer representation.

btoa

Convert an 8-bit signed byte to a string.

itoa

Convert a 16-bit signed integer to a string.

ltoa

Convert a signed long integer to a string.

rand

Generate a pseudo-random integer.

srand

Set the starting seed for the pseudo-random number generator.

tolower

Convert a character to a lower case alphabetical ASCII character.

toupper

Convert a character to an upper case alphabetical ASCII character.

ultoa

Convert an unsigned long integer to a string.

ultoa Convert an unsigned long integer to a string. Académie d’Aix-Marseille – Formations mi

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

15 /56

Compilateur MCC18 v14 string.h Function Description Memchr Search for a value in a specified memory

Compilateur MCC18 v14

string.h

Function

Description

Memchr

Search for a value in a specified memory region

memcmp

Compare the contents of two arrays.

memcmppgm

memcmppgm2ram

 

memcmpram2pgm

Memcpy

Copy a buffer from data or program memory into data memory.

memcpypgm2ram

Memmove

Copy a buffer from data or program memory into data memory.

memmovepgm2ram

Memset

Initialize an array with a single repeated value.

Strcat

Append a copy of the source string to the end of the destination string.

strcatpgm2ram

Strchr

Locate the first occurrence of a value in a string.

Strcmp

Compare two strings.

strcmppgm2ram

Strcpy

Copy a string from data or program memory into data memory.

strcpypgm2ram

Strcspn

Calculate the number of consecutive characters at the beginning of a string that are not contained in a set of characters.

Strlen

Determine the length of a string.

Strlwr

Convert all upper case characters in a string to lower case.

Strncat

Append a specified number of characters from the source string to the end of the destination string.

strncatpgm2ram

Strncmp

Compare two strings, up to a specified number of characters.

Strncpy

Copy characters from the source string into the destination string, up to the specified number of characters.

strncpypgm2ram

Strpbrk

Search a string for the first occurrence of a character from a set of characters.

Strrchr

Locate the last occurrence of a specified character in a string.

Strspn

Calculate the number of consecutive characters at the beginning of a string that are contained in a set of characters.

Strstr

Locate the first occurrence of a string inside another string.

Strtok

Break a string into substrings, or tokens, by inserting null characters in place of specified delimiters.

Strupr

Convert all lower case characters

delays.h

Function

Description

Delay1TCY

Delay one instruction cycle.

Delay10TCYx

Delay in multiples of 10 instruction cycles.

Delay100TCYx

Delay in multiples of 100 instruction cycles.

Delay1KTCYx

Delay in multiples of 1,000 instruction cycles.

Delay10KTCYx

Delay in multiples of 10,000 instruction cycles.

reset.h

Function

Description

isBOR

Determine if the cause of a RESET was the Brown-Out Reset circuit.

isLVD

Determine if the cause of a RESET was a low voltage detect condition.

isMCLR

Determine if the cause of a RESET was the MCLR pin.

isPOR

Detect a Power-on RESET condition.

isWDTTO

Determine if the cause of a RESET was a watchdog timer time out.

isWDTWU

Determine if the cause of a wake-up was the watchdog timer.

isWU

Detects if the microcontroller was just waken up from SLEEP from the MCLR pin or an interrupt.

StatusReset

Set the POR and BOR bits.

interrupt. StatusReset Set the POR and BOR bits. Académie d’Aix-Marseille – Formations mi

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

16 /56

Compilateur MCC18 v14 3.4. Fonctions de la bibliothèque XLCD: Fonctions   Descriptions void OpenXLCD (

Compilateur MCC18 v14

3.4. Fonctions de la bibliothèque XLCD:

Fonctions

 

Descriptions

void OpenXLCD( unsigned char lcdtype );

Initialise l’afficheur LCD, l’appel de cette fonction est obligatoire (passage en mode 4bits) Data Interface:

exemple :

FOUR_BIT EIGHT_BIT LCD Configuration:

Mode 4-bit

Mode 8-bit

OpenXLCD(FOUR_BIT & LINES_5X7 );

LINE_5X7

caractères 5x7, une ligne caractères 5x10 caractères 5x7, plusieurs lignes

LINE_5X10

LINES_5X7

unsigned char BusyXLCD( void );

La fonction teste la disponibilité du contrôleur LCD. Elle retourne :

exemple :

1

si le contrôleur est occupé (busy)

while( BusyXLCD()) ;

0

sinon.

void putsXLCD( char *buffer ); void putrsXLCD( const rom char *buffer ); exemple :

char mybuff [20]; putrsXLCD( “Hello World” ); putsXLCD( mybuff );

Affiche une chaîne présente en RAM

Affiche une chaîne présente en ROM

unsigned char ReadAddrXLCD( void ); exemple :

Cette fonction lit l’adresse courante du contrôleur LCD . Cette adresse se trouve dans la ram du générateur de caractères ou dans la ram d’affichage selon la fonction Set??RamAddr précédemment appelée.

char addr; while ( BusyXLCD() ); addr = ReadAddrXLCD();

char ReadDataXLCD( void ); exemple :

Cette fonction lit l’octet à l’adresse spécifiée du contrôleur LCD . Cet octet se trouve dans la ram du générateur de caractères ou dans la ram d’affichage selon la fonction Set??RamAddr précédemment appelée.

char data; while ( BusyXLCD() ); data = ReadAddrXLCD();

void SetCGRamAddr( unsigned char addr ); exemple :

Fixe l’adresse en ram du générateur de caractères du contrôleur LCD

char cgaddr = 0x1F; while( BusyXLCD() );

SetCGRamAddr( cgaddr );

void SetDDRamAddr( unsigned char addr ); exemple :

char ddaddr = 0x10; while( BusyXLCD() ); SetDDRamAddr( ddaddr );

Fixe l’adresse d’affichage des caractères

Ligne 1 : 0x00 à 0x0F Ligne 2 : 0x40 à 0x4F

 

void WriteCmdXLCD( unsigned char cmd );

exemple :

DOFF

Efface l’affichage

CURSOR_OFF Affichage sans curseur BLINK_ON Affichage curseur clignotant BLINK_OFF Affichage sans curseur SHIFT_CUR_LEFT Affichage vers la gauche SHIFT_CUR_RIGHT Affichage vers la droite SHIFT_DISP_LEFT Défilement à gauche SHIFT_DISP_RIGHT Défilement à droite

while( BusyXLCD() ); WriteCmdXLCD( EIGHT_BIT & LINES_5X7 ); WriteCmdXLCD( BLINK_ON ); WriteCmdXLCD( SHIFT_DISP_LEFT );

void WriteDataXLCD( char data );

Les deux fonctions envoient un caractère sur l’afficheur. Ce caractère se trouve dans la ram du générateur de caractères ou dans la ram d’affichage selon la fonction Set??RamAddr précédemment appelée.

ou void putcXLCD ( char data );

appelée. ou void putcXLCD ( char data ); Académie d’Aix-Marseille – Formations mi

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

17 /56

Compilateur MCC18 v14 Afficheur LCD : Adresses curseur 0x00 à 0x0F 0,0 1,0 2,0 3,0

Compilateur MCC18 v14

Afficheur LCD : Adresses curseur

0x00 à 0x0F

0,0

1,0

2,0

3,0

4,0

5,0

6,0

7,0

8,0

9,0

10,0

11,0

12,0

13,0

14,0

15,0

0,1

1,1

2,1

3,1

4,1

5,1

6,1

7,1

8,1

9,1

10,1

11,1

12,1

13,1

14,1

15,1

0x40 à 0x4F

CODE ASCII (American Standard Code for Information Interchange)

code 0 1 2 3 4 5 6 7 8 9 A B C D
code
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0x00
NUL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
HT
LF
VT
NP
CR
SO
SI
0x10
DLE
DC1
DC2
DC3
DC4
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
RS
US
0x20
SP
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
0x30
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
0x40
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
0x50
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
0x60
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
0x70
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
DEL

3.5. Installation de la mise à jour pour PICDEM2+ :

Pour pouvoir utiliser la bibliothèque XLCD de mcc18 pour piloter l'afficheur de la carte PICDEM2plus il faut :

1 - Copier le fichier modifié xlcd.h dans le répertoire \mcc18\h du disque d'installation

2 - Copier le fichier modifié openxlcd.c dans \mcc18\src\pmc\XLCD\18Cxx\

3 - Recompiler la bibliothèque p18f452.lib --> makeonep18f242 18f452

Un fichier de commande fourni avec les exemples du cours, install.bat effectue ces tâches automatiquement

3.6.

ftoa

ftoa (float to ascii) est une fonction standard du C ANSI mais elle n’est pas fournie avec MCC18. Pour afficher des nombres réels, utiliser ftoa.c qu’il suffit d’inclure 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 réel en ACSII prec indique la précision, 0 pour avoir le maximum si format ='s' affichage scientifique 1.6666666E3 si format ='f' affichage classique 1666.6666

si format ='f' affichage classique 1666.6666 Académie d’Aix-Marseille – Formations mi

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

18 /56

Compilateur MCC18 v14 3.7. Utilistaion de XLCD : Exemples pour afficheur LCD sur PICDEM2+ avec

Compilateur MCC18 v14

3.7. Utilistaion de XLCD :

Exemples pour afficheur LCD sur PICDEM2+ avec librairie XLCD

Exemples pour afficheur LCD sur PICDEM2+ avec librairie XLCD Déclarations des bibliothèques #include

Déclarations des

bibliothèques

#include <delays.h>

// temporisation pour afficheur LCD

#include <xlcd.h>

// fonctions de gestion du LCD

 

#include <stdlib.h>

// pour itoa, btoa etc

 

#include "ftoa.c"

// ftoa n'est pas inclue dans MCC18

#define putchar(a) WriteDataXLCD(a) // putchar est standard C ANSI

char chaine[]="RAM";

unsigned char tampon[5];// mémoire pour les chaines converties avec ITOA et BTOA

unsigned char tamponf[30];// mémoire pour les chaine converties avec FTOA

float f;

// une chaine de caractère en RAM

// un réel à afficher

// Temporisation nécessaires aux composants de la bibliothèque XLCD

 

void DelayFor18TCY(void) {

   

Delay10TCYx(2);

 

}

 

void DelayPORXLCD(void)

   

{

 

Temporisations nécessaires aux composants de la bibliothèque XLCD

Delay1KTCYx(15); //Delai de 15 ms

}

 

void DelayXLCD(void)

   

{

   

Delay1KTCYx(20); //Delai de 20 ms

}

 

void main(void) //Programme principal

{

OpenXLCD(FOUR_BIT & LINES_5X7 );

SetDDRamAddr(0);

putsXLCD(chaine);

SetDDRamAddr(0x40);

putrsXLCD("ROM");

SetDDRamAddr(4);

putsXLCD(itoa(1234,tampon)); // écrit un integer (16 bits)

SetDDRamAddr(0x44);

putsXLCD(btoa(-12,tampon));

SetDDRamAddr(0x48);

// positionne le curseur en x,y // écrit un chaine mémorisée en RAM

// écrit une chaine mémorisée en ROM

// écrit un byte

(8 bits)

putchar('c');

// écrit un caractère (putchar est standard C ANSI)

f=5000.0/3.0;

// calcul d'un réel pour exemple d'affichage

SetDDRamAddr(9);

// affichage scientifique 1.67E3, 2 chiffres après la virgule

affichage scientifique 1.67E3, 2 chiffres après la virgule } putsXLCD(ftoa(f,tamponf,2,'S'));

}

putsXLCD(ftoa(f,tamponf,2,'S'));

SetDDRamAddr(0x4A);

putsXLCD(ftoa(f,tamponf,2,'F')); // affichage normal 1666.67

while(1);

// affichage normal 1666.67 while(1); Afin d’aérer les programmes utilisant XLCD, un fichier

Afin d’aérer les programmes utilisant XLCD, un fichier initxlcd.c contenant les #include et les tempos

un fichier initxlcd.c contenant les #include et les tempos (en gris) peut être utiliser en écrivant

(en gris) peut être utiliser en écrivant en début de programme #include initxlcd.c

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

19 /56

Compilateur MCC18 v14 3.8. stdio.h (MCC 18 V2.4x) La librairie xlcd n'inclue que des fonctions

Compilateur MCC18 v14

3.8. stdio.h (MCC 18 V2.4x)

La librairie xlcd n'inclue que des fonctions degestion de l'afficheur LCD de bas niveau. stdio.h est une librairie de gestion de sortie des caractères qui définit stdout (la sortie standard). Elle permet le formatage simple de chaînes de caractères vers différentes sorties (output stream) Sur les PIC la sortie par defaut est l’USART. L’utilisateur peut définir sa propre sortie de caractères. _H_USART est le nom du flux vers l’USART, 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 <p18f452.h>

#include <stdio.h> #include <xlcd.h>

// dirige user_putc vers l'afficheur LCD du PD2+ int _user_putc (char c)

// pour fprintf // pour OpenXLCD et putcXLCD

{

putcXLCD(c);

}

void main(void)

{

SPBRG = 25; /* configure la vitesse (BAUD) 9600 N 8 1*/ TXSTA = 0x24; RCSTA = 0x90; /* active l'USART*/ OpenXLCD(FOUR_BIT & LINES_5X7 );// LCD sur PD2 SetDDRamAddr(0); //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 l’afficheur LCD d’un KIT PICDEM2+ il faut définir stdout et rediriger _user_putc vers l’afficheur LCD. (putcXLCD envoie un caractère vers l’afficheur LCD)

stdout = _H_USER ;

int _user_putc(char c)

{

putcXLCD(c) ;

}

En déclarant #include <stdio

h>

on dispose des fonctions :

Fonction

Description

fprintf

Envoie une chaîne formatée vers le flux défini fprintf(_H_USER, « vers l’afficheur LCD ») ; fprintf(_H_USART, « vers l’afficheur l’USART ») ;

fputs

Envoie une chaîne terminée par un passage à la ligne (newligne) vers le flux défini fputs(« Bonjour USART »,_H_USART) ;

printf

Envoie une chaîne formatée vers stdout. Exemples page suivante

putc

Envoie un caractère vers le flux défini putc(‘A’, _H_USART) ; envoie A sur l’USART

puts

Envoie une chaîne terminée par un passage à la ligne (newligne) vers stdout. puts(« Bonjour ») ; envoie Bonjour vers stdout

sprintf

Envoie une chaîne formatée vers une zône mémoire RAM. Exemples page suivante

vfprintf

Comme fprintf mais en utilisant les arguments de stdarg (compatibilité CANSI)

vprintf

Comme printf mais en utilisant les arguments de stdarg (compatibilité CANSI)

vsprintf

Comme sprintf mais en utilisant les arguments de stdarg (compatibilité CANSI)

_usart_putc

Envoie un caractère vers l’USART

_user_putc

Envoie un caractère vers la sortie utilisateur (doit être écrit par l’utilisateur)

sortie utilisateur (doit être écrit par l’utilisateur) Le fichier installXLCDPD2.bat (tpmcc18v14.zip) installe

Le fichier installXLCDPD2.bat (tpmcc18v14.zip) installe les modifications permettant à la librairie xlcd.h de gérer l'afficheur LCD du KIT PICDEM2+ (xlcd.h) Le fichier installLCD_LIB.bat bat (tpmcc18v14.zip) installe _user_putc pour printf ainsi que quelques utilitaires de gestion de l'afficheur LCD et ftoa. (lcd_pd2.h)

/* redirection de putc vers XLCD pour printf */ int _user_putc(char c); // initialise l'afficheur pour PICDEM2+ pour printf void init_printf_LCDPD2(void); // initialisation afficheur LCD sur PICDEM2+, printf et charge les caracteres personalises void initLCDPD2(void); // positionne le curseur en x-y (0<x<15 et 0<y<1) void gotoxy(unsigned char x, unsigned char y); // efface l'afficheur void efface(void);

// temporisation void tempo(unsigned int t);// decale l'affichage à gauche si c='g' à droite si c='d' void decaleLCD(unsigned char c); // création caractères perso pour LCD, les caractères ont les codes ASCII 0 à 7, nécessite fonts.h void initNouveauxCharacters(void); // ftoa unsigned char *ftoa (float x, unsigned char *str,char prec,char format);

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

20 /56

Compilateur MCC18 v14 3.8.1. printf, fprintf, sprintf printf permet la sortie formatée de chaînes de

Compilateur MCC18 v14

3.8.1. printf, fprintf, sprintf

printf permet la sortie formatée de chaînes de caractères (ici i=23 et c='A')

Format :

printf("un int %d un caractere %c",i,c);

Format : printf("un int %d un caractere %c",i,c); un int 23 un caractere A

un int 23 un caractere A

int %d un caractere %c",i,c); un int 23 un caractere A Transmission des arguments : printf("%dh
Transmission des arguments : printf("%dh %dm %ds",heu,min,sec); 12h 41m 20s
Transmission des arguments :
printf("%dh %dm %ds",heu,min,sec);
12h 41m 20s

%

Affichage

Formats binaire et hexadécimal

%c

Caractère ASCII

%X

AB

%d

Décimal signé pour entiers 8 ou 16 bits

%#x

0xab

%o

Octal pour entiers 8 ou 16 bits

%#X

0XAB

%u

Décimal non signé pour entiers 8 ou 16 bits

%#06X

0X00AB

%b

Binaire pour entiers 8 ou 16 bits (b)

%B

1010

%B

Binaire pour entiers 8 ou 16 bits (B)

%#b

0b1010

%x

Hexadécimal pour entiers 8 ou 16 bits (minuscules)

%#B

0B1010

%X

Hexadécimal pour entiers 8 ou 16 bits (majuscules)

%#010B

0B00001010

%s

Chaîne ASCII en RAM

%S

Chaîne ASCII en ROM

%p

Pointeur Hexadécimal 16 bits (minuscules)

%P

Pointeur Hexadécimal 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

Affichage

 

printf("Dec : %d %u",a,a);

Dec : -27 65509

 

printf("Hex: %#06X %x ",b,b);

Hex: 0X00B5 b5

 

printf("Bin: %16b",b);

Bin: 0000000010110101

 

printf("Bin: %#010B",b);

Bin: 0B10110101

 

printf("%c %c %d",'b',c,(int)c);

b

A 65

 

printf("J habite %S",chrom);

J

habite en ROM

 

printf("J habite %s",chram);

J

habite en RAM

 

printf("pointeur RAM:%p %04P",pram,pram);

 

printf("pointeur ROM:%p %P",prom,prom);

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 chaîne constituée peut-être envoyée ensuite sur n’importe quelle sortie. unsigned char tampon[20] ; sprintf(tampon,"Dec : %d %u",a,a);

3.8.2. math.h

La librairie math.h le fichier de définition des constantes mathématiques

math.h

mathdef.h

Fonction

Description

 

Definitions

 

acos

Compute the inverse cosine (arccosine).

#define PI

3.141592653589793

// Constante Pi

asin

Compute the inverse sine (arcsine).

#define PI_2

6.283185307179586

// Constante 2 Pi

 
 

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

 

21 /56

Compilateur MCC18 v14 atan Compute the inverse tangent (arctangent). #define PI_DIV2 1.570796326794896 //

Compilateur MCC18 v14

atan

Compute the inverse tangent (arctangent).

#define PI_DIV2

1.570796326794896

// Constante Pi/2

atan2

Compute the inverse tangent (arctangent) of a ratio.

#define INV_PI

0.318309886183790

// Constante 1/Pi

ceil

Compute the ceiling (least integer).

#define INV_PI_2

0.159154943091895

// Constante 1/2Pi

cos

Compute the cosine.

#define INV_PI_DIV2

0.636619772367581

// Constante 2/Pi

cosh

Compute the hyperbolic cosine.

#define LN2

0.693147180559945

// Constante Log[2]

exp

Compute the exponential e .

#define INV_LN2

1.442695040888963

// Constante 1/Log[2]

fabs

Compute the absolute value.

#define LN2_2

1.386294361119890

// Constante 2 Log[2]

floor

Compute the floor (greatest integer).

#define INV_LN2_2

0.346573590279973

// Constante 1/2Log[2]

fmod

Compute the remainder.

#define INV_LN10

0.434294481903252

// Constante 1/Log[10]

frexp

Split into fraction and exponent.

#define E

2.718281828

// Constante e

ieeetomchp

Convert an IEEE-754 format 32-bit floating point value into the Microchip 32-bit floating point format.

// degre - radian et radian - degre #define deg2rad(x) ((x)*1.7453293e-2) #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.

Microchip n’utilise pas le format IEEE pour coder les réels, pour visualiser ceux-ci dans une fenêtre WATCH, il faut demander IEEE pour coder les réels, pour visualiser ceux-ci dans une fenêtre WATCH, il faut demander le format MCHP Float

une fenêtre WATCH, il faut demander le format MCHP Float Académie d’Aix-Marseille – Formations mi

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs crocontrôleurs Microchip - PICs

22 /56

Compilateur MCC18 v14 3.9. TP N°2 Utilisation des bibliothèques (Travail individuel , Durée : 2h30)

Compilateur MCC18 v14

3.9. TP N°2 Utilisation des bibliothèques

(Travail individuel , Durée : 2h30)

Objectifs :

Gérer l’afficheur LCD sur PICDEM2

Mettre en oeuvre des fonctions de conversion btoa, itoa, ftoa et fonctions mathématiques

Mettre en œuvre stdio.h, rediriger printf vers l'afficheur LCD du KIT PICDEM2+

Utiliser des bibliothèques de composants logiciels MCC18

Associer plusieurs fichiers sources dans un projet.

Installer et mettre en œuvre la bibliothèque mathématique

Prérequis :

Caractéristiques générales du compilateur MCC18 - Connaissance élémentaire du langage C

Notions d'algorithmique

Architecture du µcontrôleur PIC 18F452

Données :

Documentation minimale PIC 18F452

Guide d'utilisation de la carte PICDEM2 PLUS

Guide d’utilisation des bibliothèques MCC18 : Ccompliler librairies DS51297a.pdf

bibliothèques MCC18 : Ccompliler librairies DS51297a.pdf Travail demandé : Exercices sur les librairies •

Travail demandé :

Exercices sur les librairies

Installation de la bibliothèque xlcd.h et LCD_PD2.h

Prise en main, essais d’affichage de différents types de donnée (tstprintf.c)

Visualisation dans MPLAB des échanges de données "chaines" ROM / RAM (salutLCD.c)

Test de la fonction mathématique « srqt » (racine carée)

Intégration de la fonction « exp » (exponentielle) et création de la fonction « abs » (valeur absolue)

et création de la fonction « abs » (valeur absolue) Académie d’Aix-Marseille – Formations mi

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

23 /56

Compilateur MCC18 v14 La version 2.40 de MCC18 inclue la bi bliothèque standard CANSI <stdio.h>.

Compilateur MCC18 v14

La version 2.40 de MCC18 inclue la bibliothèque standard CANSI <stdio.h>. Testez et analysez le fichier tstprintf.c (necessite la mise à jour de xlcd.h pour PICDEM2+)

#include <p18f452.h> #include <stdio.h>

#include <lcd_pd2.h> //initLCDPD2, gotoxy, decaleLCD ftoa, etc

//initLCDPD2, gotoxy, decaleLCD ftoa, etc // printf unsigned char c; int i; unsigned char tampon[10];

// printf

unsigned char c; int i; unsigned char tampon[10]; rom const unsigned char chrom[]=" en ROM"; unsigned char chram[]=" en RAM"; unsigned char * pram; rom unsigned char *prom; float f;

Ouvrir stdio.h et lcd_pd2.h et vérifier la présence des prototypes des fonctions utilisées dans le programme

Données utilisées dans le programme : variables et constantes de tous les types

le programme : variables et constantes de tous les types void main(void) { TRISA=0xFF; // PORTA

void main(void)

{ TRISA=0xFF;

// PORTA en entrée pour S2

initLCDPD2(); // init LCD, _user_putc pour printf, caracteres perso etc…

f=5000.0/3.0;

i=150-200;

c='A'; pram=(unsigned char *)0x12AB ; prom=(rom unsigned char *)0xAB12;

while(1)

La fonction "touche" est à insérer dans le programme ci contre

void touche(void)

{

while(PORTA & 0x10); while(!(PORTA & 0x10)); efface();

}

{

gotoxy(0,0);

printf("TESTS PRINTF");

gotoxy(0,1);

printf("appuyez sur S2"); touche();

Affichage d'octets sous forme de caractère et de nombre décimal et hexadécimalgotoxy(0,1); printf("appuyez sur S2"); touche(); gotoxy(0,0); printf("caracteres: %c ",c);

gotoxy(0,0);

printf("caracteres: %c ",c);

gotoxy(0,1);

printf("%d %X %#X ",c,c,c); touche();

}}

gotoxy(0,0);

printf("integers: %d",i);

gotoxy(0,1);

printf("%u %#x",i,i); touche();

gotoxy(0,0);

printf("binaires: %b",0x1A);

gotoxy(0,1);

printf("%010b",0x1A);

touche();

Affichage de mots signé ou non signé en décimal et en hexadécimal et en hexadécimal

Affichage d'octets en binairede mots signé ou non signé en décimal et en hexadécimal gotoxy(0,0); printf("Ptr RAM: %p",pram);

gotoxy(0,0);

printf("Ptr RAM: %p",pram);

gotoxy(0,1);

printf("%#010P",pram);

touche();

gotoxy(0,0);

printf("Ptr ROM: %p",prom);

gotoxy(0,1);

printf("%#010P",prom);

touche();

gotoxy(0,0);

printf("RAM %s",chram);

gotoxy(0,1);

printf("ROM %S",chrom); touche();

Affichage d'un pointeur en RAM (adresse)gotoxy(0,1); printf("ROM %S",chrom); touche(); Affichage d'un pointeur en ROM (adresse) Affichage

Affichage d'un pointeur en ROM (adresse)touche(); Affichage d'un pointeur en RAM (adresse) Affichage d'une chaine en RAM et en ROM gotoxy(0,0);

Affichage d'une chaine en RAM et en ROMRAM (adresse) Affichage d'un pointeur en ROM (adresse) gotoxy(0,0); ftoa(f,tampon,3,'s'); printf("Reel:

gotoxy(0,0);

ftoa(f,tampon,3,'s');

printf("Reel: %s",tampon);

gotoxy(0,1);

printf("Reel: %s",ftoa(f,tampon,5,'f')); touche();

Affichage d'un réel. Necessite la passage dans ftoa, avant d'afficher la chaîne obtenue

gotoxy(0,0);

printf("caract%cres perso",5);

gotoxy(0,1);

printf(" %c%c%c%c%c%c%c%c ",0,1,2,3,4,5,6,7); touche();

Affichage les caractères personnalisés dans font.h.

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

24 /56

Compilateur MCC18 v14 3.10. Exercices, sorties de chaines de caractères 1) Tester et analyser le

Compilateur MCC18 v14

Compilateur MCC18 v14 3.10. Exercices, sorties de chaines de caractères 1) Tester et analyser le programme

3.10. Exercices, sorties de chaines de caractères

1) Tester et analyser le programme salutLCD.c Visualiser les contenus de la RAM (file register) et de la ROM (program memory) avant et après exécution du programme. On remarque la présence du texte RAM en RAM ET en ROM (recopie des variables initialisées)

en RAM ET en ROM (recopie des variables initialisées) #include <p18f452.h> #include "initxlcd.c"
en RAM ET en ROM (recopie des variables initialisées) #include <p18f452.h> #include "initxlcd.c"

#include <p18f452.h> #include "initxlcd.c"

rom unsigned char chainerom[]="j'habite en ROM"; unsigned char chaineram[]="j'habite en RAM";

void main(void)

{

OpenXLCD(FOUR_BIT & LINES_5X7 );

SetDDRamAddr(0);

putrsXLCD (chainerom);

LINES_5X7 ); SetDDRamAddr(0); putrsXLCD (chainerom); SetDDRamAddr(0x40); putsXLCD (chaineram); while(1); } 2)
LINES_5X7 ); SetDDRamAddr(0); putrsXLCD (chainerom); SetDDRamAddr(0x40); putsXLCD (chaineram); while(1); } 2)
SetDDRamAddr(0x40); putsXLCD (chaineram); while(1); } 2) Utiliser fprintf seule À partir programme tstprint.c :
SetDDRamAddr(0x40);
putsXLCD (chaineram);
while(1);
}
2) Utiliser fprintf seule
À partir programme tstprint.c :
ftoa ne
SetDDRamAddr(0);
positionne le curseur en 0,0, et

Recopier le fichier en tstfprintf.c. Supprimer la ligne #include <lcd_pd2.h> Remplacer tous les printf par fprintf, le flux de sortie sera _H_USER. La fonction _user_putc(char c) devra être redéfinie pour écrire sur l’afficheur LCD du KIT PD2+. (voir exemple précédent)

Attention, les fonctions initLCDPD2(); gotoxy(x,y); et

sont plus disponibles. Les deux premières se trouvent dans la bibliothèque xlcd.h :

OpenXLCD(FOUR_BIT & LINES_5X7 ) permet initialiser l’afficheur LCD

du PD2+2,

SetDDRamAddr(0x40); en 1,0 La fonction ftoa se trouve dans le fichier ftoa.c à inclure dans le projet. Les temporisations d’écriture dans l’afficheur LCD nécessaires à xlcd.h se trouvent dans tempo_lcd_pd2.c Vérifier le fonctionnement du programme tstfprintf.c (rq : les caractères personnels ne s’affichent plus !)

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

25 /56

Compilateur MCC18 v14 3) Sorties LCD ou USART La sortie standard (std_out) est l’USART du

Compilateur MCC18 v14

3) Sorties LCD ou USART La sortie standard (std_out) est l’USART 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 l’USART 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*/ Il ne reste plus qu’à brancher un câble série entre le KIT PD2+ et le port série d’un PC , et de lancer un émulateur de terminal (le TERMINAL WINDOWS par exemple) Le simulateur de MPLAB V7.2x peut également afficher les sorties USART. Activer le simulateur comme debugger (debugger-select tool-MPLAB sim) Puis debugger-setting, la fenêtre « output » possède maintenant un onglet « Sim UART »

« output » possède maintenant un onglet « Sim UART » Exemple de sorties sur USART
« output » possède maintenant un onglet « Sim UART » Exemple de sorties sur USART

Exemple de sorties sur USART et LCD sur PD2+ :

Affiche « fprintf USART » sur le terminal (PC-RS232 ou MPLAB sim) Affiche « fprintf USER » sur l’afficheur LCD

// fprintf.c demo pour fprintf C18 #include <p18f452.h>

#include <stdio.h> #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)

{

// pour fprintf // pour OpenXLCD et putcXLCD

putcXLCD(c);

}

void main(void)

{

 

SPBRG = 25; /* configure la vitesse (BAUD) 9600 N 8 1*/ TXSTA = 0x24;

RCSTA = 0x90;

/* active l'USART*/

OpenXLCD(FOUR_BIT & LINES_5X7 );// LCD sur PD2

SetDDRamAddr(0); //ligne 0 de l'afficheur

 

fprintf (_H_USART, "fprintf USART\n"); // vers USART

fprintf (_H_USER, "fprintf USER\n" );

// vers LCD

while(1);

}

USER\n" ); // vers LCD while(1); } Académie d’Aix-Marseille – Formations mi

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

26 /56

Compilateur MCC18 v14 4) Tester et analyser le programme de calcul de racines carrées (

Compilateur MCC18 v14

4) Tester et analyser le programme de calcul de racines carrées (tstsqrt.c sur LCD et tstsqrtUSART.c sur USART))

 

// Test fonction Math // calcul les racines carrées avec l'algo d'héron // CD Lycée Fourcade 13120 Gardanne 5/2003 // evolution USART 11/2005

#include <p18f452.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);

Le CAST évite les affichages lors de la compilation:

Le CAST évite les affichages lors de la compilation:

Warning [2054] suspicious pointer conversion

}

while(1);

EX4 : A partir du programme « tstsqrt.c» ci-dessus, réaliser un programme de test pour la fonction « exp » ci dessous retournant l’exponentielle d’un nombre La fonction abs retournant la valeur absolue de l’argument est à créer Pour les rapides : écrire la fonction mathématique réalisée 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;

}

{   u=u*f/n; s+=u; } return s; } Académie d’Aix-Marseille – Formations mi

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

27 /56

Compilateur MCC18 v14 EX 5 : Exercice sur math.h A partir du programme tstmath.c, tester

Compilateur MCC18 v14

EX 5 : Exercice sur math.h

A partir du programme tstmath.c, tester diverses fonctions mathématiques de la librairie (sin, cos, log etc…) Ici test de la fonction sinus. (Attention les angles doivent être donnés en radians)

Consulter les .h dans c:\mcc18\h
Consulter les .h
dans c:\mcc18\h

#include <xlcd.h> #include <stdio.h> #include <math.h> #include <mathdef.h> #include "initxlcd.c" #include "ftoa.c"

char chaine[10];

void main(void)

{float f,r; OpenXLCD(FOUR_BIT & LINES_5X7 );

while(1)

{

 

gotoxy(0,0);

f=PI/4.0;

ftoa(f,chaine,4,'S');

fprintf(_H_USER,"sin(%s)=",chaine);

gotoxy(0,1);

r=sin(f);

ftoa(r,chaine,4,'S');

fprintf(_H_USER,"%s ",chaine);

}

}

fprintf(_H_USER,"%s ",chaine); } } Visualiser les résultats sur l'afficheur LCD et dans

Visualiser les résultats sur l'afficheur LCD et dans une fenêtre "WATCH"

sur l'afficheur LCD et dans une fenêtre "WATCH" Académie d’Aix-Marseille – Formations mi
sur l'afficheur LCD et dans une fenêtre "WATCH" Académie d’Aix-Marseille – Formations mi

Académie d’Aix-Marseille – Formations microcontrôleurs Microchip - PICs

28 /56

Compilateur MCC18 v14 4. Spécificités du compilateur MCC18 4.1. Type de données • Entiers Type

Compilateur MCC18 v14

4. Spécificités du compilateur MCC18

4.1. Type de données

Entiers

Type

Size

Minimum

Maximum

char

8

bits

-128

127

signed char

8

bits

-128

127

unsigned char

8

bits

0

255

int

16

bits

-32768

32767

unsigned int

16

bits

0

65535

short

16

bits

-32768

32767

unsigned short

16