Sie sind auf Seite 1von 4

INITIATION A LA PROGRAMMATION DU MICROCONTROLEUR PIC 16F876

EN LANGAGE C

TP PIC
I/ Objectifs:
- connaître les structures de base;
- connaître les instructions réalisant les structures de base;
- connaître quelques instructions spécifiques du langage C de CSS dédiées au PIC;
- faire exécuter un programme sur une maquette;
- savoir modifier un programme existant.

II/ Description du système d'initiation à la programmation

L’écriture du programme dans la mémoire flash du PIC 16F876 se fait par l'intermédiaire d'un module
connecté au PC (ICD) identique à celui utilisé avec MPLAB , ce module permet également un dialogue avec le
PIC de la cible ( maquette pédagogique) afin de faire le "debuggage" du programme ( pas à pas, points d'arrêts,
modification directe des registres . . ).

RB6, RB7
dialogue PC-ICD RB3,
PC par liaison série Module ICD MCLR
+
CCS
(PCW)

- édition
- compilation
- mise au point
maquette pédagogique

PIC à programmer

Le logiciel CCS PCW permet de réaliser toutes les étapes nécessaires à la conception d'un programme en C
pour PIC.
- édition (écriture du programme source),
- compilation sur PC (génération du programme binaire au format HEX ),
- chargement par le module ICD du programme en mémoire flash,
- exécution ou "débuggage" du programme.

Le programme source a une extension .c (ex : prog1.c), lors de la compilation, le fichier binaire (ex:prog1.HEX)
est généré, un fichier listing ou apparaissent les instructions en assembleur réalisant le programme en C, ce
fichier a l’extension lst( ex : prog1.lst).

III/ Utilisation du système de développement


Le TP se fera à l’aide d'une maquette pédagogique possédant:
- deux boutons poussoir
- une LED
- deux afficheurs à anodes communes multiplexés.

Connecter l'ensemble comme représenté ci-dessus.


1) exécution d'un programme existant avec module ICD
Il faut au préalable que le module ICD ait été programmé afin de pouvoir fonctionner avec CCS.
(si cela n'a pas été fait, lancer le programme ICD et changer le firmware en choisissant celui pour PIC16)

On désire faire exécuter le programme en C exécutant la même chose que celui étudié en assembleur, c'est-à-
dire allumer la led quand on appuie sur le bouton poussoir connecté 0 RB1, pour cela réaliser les opérations
suivantes :

- lancer le logiciel de développement PCW (PIC C compiler ou PIC demo) et exécuter les
opérations suivantes
Ouvrir le programme "prog1.c" placé dans le répertoire "D:\tpccs"
Compiler le programme, c'est-à-dire transformer les instructions en C en instructions en
assembleur puis en code binaire.
 Lancer le debugger comme indiqué ci-dessous, la programmation se fait automatiquement

A partir de maintenant, plusieurs opérations sont possibles, on peut:


 faire exécuter le programme en appuyant sur GO.
 arrêter le programme en appuyant sur S.
 une fois le programme arrêté, l'exécuter en pas à pas (symbole de pieds), modifier des données
en RAM et placer des points d'arrêt.

 Faire exécuter le programme et vérifier son fonctionnement.

 Arrêter le programme et le faire exécuter en pas à pas en vérifiant que le déroulement


change quand on appuie sur le bouton poussoir.

2) exécution d'un programme existant sans module ICD

Comme pour MPLAB, pour que le programme puisse fonctionner sans module ICD, il faut dévalider le mode
débuggage en plaçant en commentaire ou en supprimant la ligne suivante: //#device ICD=TRUE et
recompiler. Il faut ensuite programmer le PIC par le programme ICD.

 Faire les opérations nécessaires afin que le programme s'exécute avec la maquette seule. (il faut
programmer le PIC avec le fichier .HEX généré lors de la compilation après avoir dévalidé l'option ICD)

3) modification d'un programme existant

 Modifier le programme afin que ce soit SW2 qui agisse sur la led et que celle-ci s'éteigne quand on
appuie sur SW2.

 Sans rajouter de ligne au programme modifier le programme afin que ce soit l'appui sur SW1 et SW2
qui allume la led. (utiliser le ET logique)

 Dans le programme précédent nous avons utilisé « IF … ELSE » (si SW1 actionné, on allume la led
sinon on éteint la led), on peut également présenter le fonctionnement de la manière suivante: Tant que l'on
appuie sur SW1 on allume la led. Dessiner l'algorigramme correspondant à l'instruction WHILE en pensant à
éteindre la led après l'appui sur BP1
Ecrire et tester le programme utilisant l'instruction WHILE.
4) Quelques instructions spécifiques au PIC

Dans le programme précédent, il a été possible de voir les points suivants:

 définitions des broches: ex: "#define LED pin_c7" La variable LED correspond au bit 7
du PORTC.

 mise à zéro ou à un d'une sortie: ex: "output_high(LED);" ou "output_low(LED);"


La broche correspondant à LED est soit mise à un, soit mise à zéro.

 lecture de l'état d'une entrée: ex: "input(SW1)" Cette instruction renvoie 0 ou 1 correspondant
à l'état logique de la broche nommée SW1.

Il peut être rapidement nécessaire de connaître les instructions suivantes:

 temporisation: Il existe les instructions de temporisation en millisecondes ("delay_ms()") ou


en microsecondes ("delay_us()")ex: delay_us(25); = temporisation de 25µs.

 écriture de 8 bits sur un port: ex "output_a (value)" Il y a écriture de la donnée 'value' sur
le port A, pour les autres ports il faut modifier la lettre du port (ex: output_b pour le port B).

 lecture des 8 bits d'un port: ex: "value = input_a()" La variable 'value' prend la valeur
correspondante au code formé par les 8 bits du port A, comme précédemment, if faut changer le lettre pour les
autres ports.

 Validation ou dévalidation des résistances de rappel du portB: " port_b_pullups(FALSE ou


TRUE);"

 Ecriture dans les registres de direction TRIS: "set_tris_a (value)" Ecriture de 'value' dans TRISA.
Pour les autres ports, changer la lettre.

remarque: Beaucoup d'autres fonctions sont fournies avec CCS, pour se renseigner, il faut utiliser l'aide
et aller dans la rubrique 'Built-In Function'.

5) exercices
1) Faire clignoter la led à 1Hz
2) Faire clignoter la led à 1Hz quand on appuie sur SW1.
3) Faire clignoter la led à 1Hz quand on appuie sur SW1et à 2Hz quand on appuie sur SW2.
4) Faire afficher '18' en permanence sur les afficheurs.
5) Réaliser un dé électronique sur un des deux afficheurs.
6) Réaliser un compteur de 0 à 10 s'incrémentant toutes les secondes en utilisant un tableau.
a) compléter le tableau digit[10], qui permet d'afficher les valeurs de 0 à 10. (pour
accéder à une valeur du tableau, il faut utiliser: digit[n], ou 'n' est le rang de la valeur dans le tableau. ex:
x=digit[1], x prend la deuxième valeur du tableau parce que l'indice du premier élément d'un tableau est 0)
b) écrire le programme en utilisant l'instruction FOR.
VDD

VDD K3
1
R18 R17 RB3
Q3 2
Q2 RB6
10k 10k D2 3
R16 VDD RB7
2N2907 4
330 5
2N2907 6
AFF2 AFF1
5

3
RJ11

d d Q1 D4

AC

AC
dp

dp
R15 BC547 C7 1N4001 R11
g g 100nF 1k
10 10 10k J1
c f c f
e 9 e 9
MCLR
e e
1 1 VDD
d d
g 2 g 2
U1
VDD
c c
4 4 RC7/RX/DT
b f b f 330 18
b b R1 RC6/TX/CK RV1
330 17
6 6 R2 RC5/SDO 10k
330 16
R3 RC4/SDI/SDA
a a 330 15
7 7 R4 RC3/SCK/SCL
AC

AC
a a 330 14
R5 RC2/CCP1
330 13
RC1/T1OSI/CCP2
IC1
R6 12 R12 LM35
8

R7 330 RC0/T1OSO/T1CKI RA5/AN4/SS


11 7 220
VDD RA4/T0CKI
6
RB7 RB7/PGD RA3/AN3/VREF+
28 5
RB6 RB6/PGC RA2/AN2/VREF-
27 4
RB5 RA1/AN1 VDD
26 3
RB4 RA0/AN0
25 2
RB3 RB3/PGM MCLR
R13 24
10k RB2 MCLR/Vpp/THV
23 1
RB1 OSC2/CLKOUT
22 10
RB0/INT OSC1/CLKIN
21 9
PIC16F876
R8
10k

D1
K2 BAT85
X1
VDD
C3
1nF
C2 4MHz
C1
22pF 22pF
K5
R9 R10
D3 10k 10k
VDD
U3
7805
1N4001
1 3
VI VO
GND

SW1 SW2
C5 C6
C4
2

100nF 100uF
100nF

VSS