Vous êtes sur la page 1sur 4

INITIATION A LA PROGRAMMATION DU MICROCONTROLEUR PIC 16F876 EN LANGAGE C

I/ Objectifs:

TP PIC

- 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 RB3, PC dialogue PC-ICD par liaison série Module ICD MCLR + CCS (PCW)
RB6, RB7
RB3,
PC
dialogue PC-ICD
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

ci-dessous, la programmation se fait automatiquement A partir de maintenant, plusieurs opérations sont

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

du PORTC.

LED pin_c7" La variable LED correspond au bit 7

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 D2 3 10k 10k R16
VDD
K3
1
R18
R17
RB3
Q3
2
Q2
RB6
D2
3
10k
10k
R16
VDD
RB7
2N2907
4
5
330
2N2907
6
AFF2
AFF1
RJ11
d
d
Q1
D4
R15
BC547
C7
1N4001
R11
g
g
10
10
100nF
1k
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
18
R1 330
RC6/TX/CK
RV1
f b
b
17
6
6
R2 330
RC5/SDO
10k
16
R3 330
RC4/SDI/SDA
a
a
15
7
7
R4 330
RC3/SCK/SCL
a
a
14
R5 330
RC2/CCP1
13
IC1
R6 330
RC1/T1OSI/CCP2
12
R12
LM35
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
RB2
MCLR/Vpp/THV
10k
23
1
RB1
OSC2/CLKOUT
22
10
RB0/INT
OSC1/CLKIN
21
9
R8
PIC16F876
10k
D1
K2
BAT85
X1
VDD
C3
1nF
C2
C1
4MHz
22pF
22pF
K5
R9
R10
D3
10k
10k
VDD
U3
7805
1N4001
1
3
VI
VO
SW1
SW2
C5
C6
C4
100nF
100uF
100nF
dp
5
8
AC
AC
3
2
GND
dp
5
8
AC
AC
3

VSS