Vous êtes sur la page 1sur 83

Chapitre 12 : Programmation du PIC en C Section 12.1: Pourquoi programmer les PIC en C. Section 12.

2: Types de donnes et dlais de retard en C Section 12.3: Programmation I/O en C. Section 12.4: Les oprations logiques en C Section 12.5: Programmes de conversion des donnes en C Section 12.6: Srialisation des donnes en C
Systmes microprocesseurs

Introduction
La programmation en C sera le principal objectif de ce chapitre. Il sera vu et discut - les types de donnes, et les dlais temporels, - la programmation I/O, - les oprations logiques AND, OR, XOR, inverseur, et le dcalage, - les conversion ASCII et BCD, - la srialisation des donnes pour les PIC18. Nous allons voir aussi comment le compilateur C18 utilise le programme ROM pour sauvegarder les donnes. Nous allons aussi examiner comment le compilateur C18 traite lallocation des donnes RAM.

12.1 Pourquoi programmer les PIC en C

Les compilateurs produisent des fichiers HEX quon imprime dans la ROM des microcontrleurs. La taille du fichier HEX produit par le compilateur est lune des proccupations des programmeurs des microcontrleurs pour deux raisons que sont: 1. Les microcontrleurs ont une ROM limite. 2. Lespace occup par le code pour les PIC18 est limit 2M.

Pendant que la programmation assembleur produit un code plus compact par rapport C, mais la tache est fastidieuse et couteuse en temps de programmation. En contre partie, la programmation C consomme moins de temps mais facile programmer. Ce qui suit sont les principales raisons : 1. Moins de temps pour programmer par rapport lassembleur. 2. Cest facile modifier et faire voluer ou mettre jour. 3. On peut utiliser le code valable sous forme de bibliothques de fonctions. 4. Le code C est portable dun microcontrleur un autre avec peu ou presque aucune modification.

Plusieurs compagnies (Tiers Partie) fabrique des compilateurs C pour les PICs. Lobjectif est de ne pas vous recommander lun ou lautre des compilateurs existants, mais de vous fournir les notions de base de programmation C pour les PICs. Pour les exemples de programmes qui seront traits, vous pouvez choisir le compilateur de votre choix, en particulier si dsir celui de Microchip, le C18 intgr au MPLAB IDE.

12.2 Types de donnes et dlais de retard en C


Une bonne comprhension des types de donnes C destins pour le compilateur C18 aide les programmeurs crer des codes HEX petits. Voici la liste des types largement utiliss par le C18:

Unsigned char
Puisque les microcontrleurs sont de 8-bits, le type de donnes caractres est le choix Naturel dans la plupart des applications. Il convient de se rappeler que les compilateurs C utilsient Signed char comme dfaut Sinon il faut le prcder par le mot cl unsigned devant char. Nous pouvons utiliser unsigned char pour les chaines de caractres ASCII incluant les caractres ASCII tendu. Dans la dclaration des variables, on doit faire attention la taille des donnes et essayer dutiliser unsigned char la place du type int si possible, cause du nombre limit des Registres et des locations des donnes dans la RAM puisque du type int prend 16-bits. Ceci conduit et inutilement un fichier large de code HEX.

Exemple 2 : crire un programme C18 qui envoie les valeurs 00-FFh vers le port B.

NOTE: linstruction while(1) est ncessaire que si on excute Le programme en hardware. Elle est quivalente aux instructions Assembleur GOTO $ et BRA $.

Exemple 2 : crire un programme qui envoie les valeurs HEX des caractres ASCII 0, 1, 2, 3, 4, 5, A, B, C, and D vers le port B.

Excuter le programme ci-dessus sur votre simulateur pour voir Comment le PORT B affiche les valeur 30h, 31h, 32h, 33h, 34h, 35h, 41h, 42h, 43h, et 44h (les valeurs HEZ de 0, 1, 2, etc.).

Exemple 3 : crire un programme qui inverse tout les bits du port B continuellement.

Excuter le programme ci-dessus sur votre simulateur pour voir Le rsultat

Signed char Le signed char est un type de donne 8-bits qui utilise le bit Le plus significatif D7 pour reprsenter le signe. Nous navons donc que 7 bits pour reprsenter la magnitude. Il est ncessaire pour reprsenter les grandeurs avec signe comme La temprature. A noter que char tout seul quivalent signed char. Sinon il faut mettre unsigned evant char, soit unsigned char.

Exemple : crire un programme C18 qui envoie des valeurs au choix entre -4 et +4 vers le port B.

Excuter le programme ci-dessus sur votre simulateur pour voir comment le port B affiche: 1, FFh, 2, FEh, 3, FDh, 4 et FCh.

Unsigned int

Signed int

Autres types de donnes

Exemple : crire un programme C18 qui inverse les bits de port B 50 000 fois.

Excuter le programme ci-dessus sur votre simulateur pour voir le port B.

Exemple 2 : crire un programme C18 qui inverse les bits de port B 100 000 fois.

Excuter le programme ci-dessus sur votre simulateur pour voir le port B.

Dlais temporels

Exemple : crire un programme C18 qui inverse les bits de port B continuellement avec un retard de 250ms en supposant que le systme est le PIC18F458 avec XTAL = 10 MHz.

Exemple 2 : crire un programme C18 qui inverse les bits des ports C et D continuellement avec un retard de 250ms en supposant que le systme est le PIC18F458 avec XTAL = 10 MHz.

12.3 Programmation I/O en C


Programmation I/O au niveau Octet
Les ports A-D sont accessibles par Octet. Nous utilisons les tiquettes PORT A-D Comme dfinies dans le fichier entte de C18. Exemple : Des LEDs sont connectes aux bits des ports B et C. crire un programme C18 qui montre le comptage de 00 FFh sur les LEDs.

Le rsultat aprs litration 24.

Exemple 2 : crire un programme C18 qui permet dobtenir un octet de donnes du PORT B. Attendre une seconde, et lenvoyer ensuite vers le PORT C.

Exemple 3 : crire un programme C18 qui permet dobtenir un octet de donnes du PORT C. Si elle est infrieure 100, lenvoyer ensuite vers le PORT B sinon lenvoyer au port D.

Programmation I/O au niveau Bit

Rappel

Structure des Bits du port B tel que donne par le compilateur C18. On peut trouver la Structure des ports dans le fichier entte du microcontrleur.

Exemple : crire un programme C18 qui permet dinverser continuellement le bit RB4 du PORT B sans perturber les autres bits.

Exemple 2: crire un programme C18 qui permet de surveiller le bit RC5 du PORT C. Sil est haut, envoie 55h au port C sinon envoyer AAh au port D.

Vrification avec le simulateur MPLAB

Exemple : Un capteur douverture de portes est connect au RB1 et un metteur de son est connect au RC7. crire un programme C18 qui permet de surveiller le capteur douverture de portes et quand cest ouvert, envoyer un son. Pour cela, on peut mettre une onde carre de quelques centaines de Hz.

Vrification avec lanalyseur logique de MPLAB

Exemple : Les pins de donnes dun LCD sont connects au Port B. Linformation est passe au LCD quand le pin ENABLE passe de ltat haut ltat bas. crire un programme C18 qui permet denvoyer le message suivant au LCd: Le monde est un village plantaire

``Le monde est un village plantaire``

Vrification avec lanalyseur logique de MPLAB

Exemple : crire un programme C18 qui permet dinverser continuellement les port B, C, et D aprs chaque 250ms.

Exemple : crire un programme C18 qui permet dinverser continuellement le bit 5 du port B 50 000 fois.

Exemple : crire un programme C18 qui permet de vrifier continuellement ltat du bit RB0 et lenvoyer au RC7.

Dsassemblage de lexemple prcdent.

12.4 Les oprations logiques en C


Oprateurs niveau Bit

Exemples

Oprateurs de dcalage niveau Bit Exemples

Exemple : crire un programme C18 qui permet dinverser continuellement les bits des ports B et C aprs 250ms en utilisant loprateur dinversion de bits.

Exemple : crire un programme C18 qui permet dinverser continuellement les bits des ports B, C et D aprs 250ms en utilisant loprateur EX-OR niveau bit.

Exemple : crire un programme C18 qui une fois le bit RB2 obtenu, son inverse est envoy au RC7.

Exemple : crire un programme C18 qui lit les bits RB0 et RB1 et envoie un caractre ASCII au PD en suivant : Solution

Solution avec MPLAB

12.5 Programmes de conversion des donnes en C

Nombres ASCII

Conversion BCD vers ASCII

Exemple : crire un programme C18 qui convertit le BCD paquet 0x29 en ASCII et laffiche les octets sur les ports B et C.

Conversion ASCII vers BCD

Exemple : crire un programme C18 qui convertit les ASCII 4 et 7 en BCD paquet et les affiche au port B.

Vrification de la somme Vrifier par exemple le contenu dune ROM sil


nest pas corrompu par un incident quelconque.

Exemple

Vrifier avec le simulateur MPLAB en utilisant Single Step les contenus de ports B et C.

crire un programme C18 qui vrifie lexactitude de la somme des donnes de lexemple passe en envoyant le caractre ASCII G pour Good ou B pour Bad.

Changer une deux ou deux donnes dans mydata, simuler le programme pour voir les rsultats.

Conversion Binaire(HEX) vers Dcimal et ASCII avec C18

Exemple : crire un programme C18 qui convertit 11111110 ou FDh en dcimale en laffichant aux ports B, C et D.

12.6 Srialisation des donnes en C

Exemple : crire un programme C18 qui envoie 44h un bit la fois via RC0. Le bit LSB en premier.

Exemple : Mme chose mais le bit MSB en premier.

Exemple : crire un programme C18 qui amne un octet de donnes en srie un bit la fois partir du pin Rb0. Placer loctet au port D. Le bit LSB doit venir en premier.

Exemple : Mme chose mais le bit MSB en premier.

Question Comment coder EFFICACEMENT les procdures de Checksum, Conversion BCD/HEX vers ASCII en Assembleur. Rponse En utilisant le mode dadressage (IN)direct

Modes dadressage immdiat, direct et indirect Mode dadressage immdiat

Mode dadressage direct

Lopcode du Mode dadressage direct de MOVFF

Diffrence entre INFC fileReg, W et INFC fileReg, F

DECFSZ et DECF

Registres SFR et leurs adresses

Quelques adresses des registres SFR de PIC18

Quelques notes aux sujet de SFR

Exemple : crire un code qui envoie 55h au port B en incluant (a) les noms de Registres et (b) leurs adresses.

Quelques notes au sujet du mode dadressage direct du PIC18

Mode dadressage indirect

page 8 where

Les avantages du mode dadressage indirect

Next example

Next example

Exemple : crire un programme pour crire la valeur 55h vers les locations 40h 45h en utilisant : (a) le mode direct, (b) le mode indirect sans la boucle, et (c) avec la boucle.

Exemple 2 : Supposant que les locations RAM 30h 34h contiennent la chaine ASCII HELLO. crire un programme qui capture les caractres de la chaine et les envoie vers le port B un octet la fois. Utilises les deux modes dadressage: (a) direct et (b) indirect.

Option dauto-incrmentation de FSR

Next.

Exemple : crire un programme qui initialise 16 locations RAM partir de 60h de deux faons diffrentes: (a) avec FSRnL et (b) lauto incrmentation.

Exemple 2 : crire un programme qui transfert un bloc de 5 octets RAM partir de 30h vers 60h.

Exemple 3 : crire un programme qui additionne 4 octets RAM stocks dans les locations 40-43h et met le rsultat aux adresses 06h et 07h. Les octets sont respectivement:

Exemple 4: crire un programme qui effectue la somme multi-octets suivante: 12896577h + 12647839h. Ces 2 oprandes se trouvent partir respectivement des adresses 30h et 50h. Le rsultat de laddition doit se mettre partir de 60h.

Rappel: Procdures Checksum/Conversion BCD/HEX vers ASCII en Assembleur

Procdure Checksum

Procdure conversion BCD vers ASCII

This program

Procdure conversion Binaire (Hex) vers ASCII