TP N°7 : Programmation en C - jfalycee.free.frjfalycee.free.fr/IMG/pdf/tp7.pdf · Sélectionner la...
Transcript of TP N°7 : Programmation en C - jfalycee.free.frjfalycee.free.fr/IMG/pdf/tp7.pdf · Sélectionner la...
JFA 2015 Page 1 /24 TP7
TP N°7 : Programmation en C
A. Introduction :
Nous allons utiliser l’environnement de développement MPLAB de chez Microchip©
B. MPLAB : Lancer le programme MPLAB :
Faire Project -> Project Wizard :
JFA 2015 Page 2 /24 TP7
Vous obtenez alors la fenêtre suivante :
Sélectionner la référence exacte du PIC qui est sur votre Carte (ici Pic18F45K20)
JFA 2015 Page 3 /24 TP7
Choisissez ou gardez le programme CCS C Compiler.
Créez et sélectionnez un répertoire de sauvegarde de votre projet.
JFA 2015 Page 4 /24 TP7
Faire suivant
Si vous avez déjà un fichier source en langage C, vous pouvez l’insérer.
JFA 2015 Page 6 /24 TP7
On va maintenant créer le fichier code source en C
Choisissez le même répertoire que le projet et donnez le même nom au fichier que le projet.
JFA 2015 Page 7 /24 TP7
Vous pouvez maintenant entrer votre programme dans cette fenêtre.
Tapez alors le programme ci-dessous :
JFA 2015 Page 9 /24 TP7
Et vérifiez qu’il n’y a pas d’erreurs dans la fenêtre « Output »
Mode « Programmer » Si vous voulez seulement programmer votre carte Pic, effectuez les opérations ci-dessous, sinon passer à la
connexion en mode « Debugger ».
Sélectionnez PicKit 3 comme programmer.
Une fenêtre pop-up vous demande de vérifier la connexion et les valeurs d’alimentions de votre carte.
JFA 2015 Page 10 /24 TP7
Faire ok. Et sélectionnez le menu Programmer -> Settings, et dans l’onglet « Power »
Sélectionnez 3,25 V comme tension d’alimentation en glissant le curseur ou en tapant la valeur dans la case. Et
cochez la case « Power target circuit from PicKit3 », ce qui permet d’alimenter la carte avec le PicKit 3 si le courant
consommé n’est pas trop important !
Et vérifiez l’onglet « Status » et le cadre « Voltage » pour vérifier que vous avez la bonne tension !
JFA 2015 Page 11 /24 TP7
Mode « Debbuger » Si vous voulez programmer et débuguer votre carte Pic, effectuez les opérations ci-dessous.
Sélectionnez PicKit 3 comme debugger.
Si vous étiez en mode « Programmer » une fenêtre vous indique que vous devez choisir le mode « Programmer »,
soit le mode « Debugger ». On choisit alors le mode « Debugger » !
JFA 2015 Page 12 /24 TP7
Une fenêtre popup vous demande de vérifier la connexion et les valeurs d’alimentions de votre carte.
Faire ok. Et sélectionnez le menu Debugger -> Settings,
JFA 2015 Page 14 /24 TP7
Sélectionnez 3,25 V comme tension d’alimentation en glissant le curseur ou en tapant la valeur dans la case. Et
cochez la case « Power target circuit from PicKit3 », ce qui permet d’alimenter la carte avec le pickit 3 si le courant
consommé n’est pas trop important !
Et vérifiez l’onglet « Status » et le cadre « Voltage » pour vérifier que vous avez la bonne tension !
Et il demande confirmation que vous êtes bien sûr !
et dans l’onglet « Program Memory », vous pouvez cocher les cases « Program after successful Build » et « Run after
successful program », ce qui va effectuer automatiquement la programmation, et l’exécution du programme si tout
est correct !
Sinon vous pouvez cliquer sur l’icône Program pour programmer votre carte avec le programme compilé,
JFA 2015 Page 15 /24 TP7
Et vous pouvez lancer l’execution de votre programme :
et vérifier sur la carte que cela fonctionne !
JFA 2015 Page 16 /24 TP7
C. CCS :
Le langage CCS est un langage C adapté aux microcontrôleurs et Pics. C’est donc en langage qui
contient tous les mots clés du C plus des mots clés particuliers pour les microcontrôleurs.
I. Port du microcontrôleur :
Tout microcontrôleur contient des broches qui peuvent envoyer ou recueillir des informations. Ces
broches sont organisées en blocs de 8 pour former un PORT et ceux-ci sont repérés par une lettre
A, B, C, D, E, …. On peut trouver plusieurs types d’entrées sorties sur le microcontrôleur. Elles
peuvent être logiques, analogiques, de type timers, de type bus, … et ils peuvent avoir des
spécificités de connections.
II. Pour les entrées-sorties logiques (I/O) :
Ces ports logiques sont appelées entrées-sorties. Car on peut les programmer indépendamment soit
en entrée, soit en sortie. Pour lire ou écrire des niveaux logiques, il va falloir effectuer deux
opérations :
1°) Configuration de la direction du port :
Avant de pouvoir utiliser un bit (ou tout) du port, il va falloir configurer la direction voulue
pour le bit (ou port). Donc programmer la broche en entrée ou en sortie !
C’est l’opération SET_TRIS_x () qui va se charger de cette configuration.
Cherchez dans la documentation CCS la fonction de la commande SET_TRIS_x () et
déterminez que fait la commande suivante :
JFA 2015 Page 17 /24 TP7
SET_TRIS_B (0xAA);
// B ,B ,B ,B sont des sorties,
// B ,B ,B ,B sont des entrées.
2°) Lecture ou écriture du port :
Maintenant que la direction du port est configurée, il nous reste maintenant à lire ou à
écrire dans ce port :
a. Ecriture du port :
Il existe plusieurs commandes CCS pour écrire des données sur le port :
La commande : output_x( )
Cherchez dans la documentation CCS la fonction de la commande output_x( ) et
déterminez ce que fait la commande suivante, avec la configuration de port
précédente :
OUTPUT_B (0x15) ;
// B , B , B , B sont à 1,
// B , B , B , B sont à 0.
// B , B , B , B sont à X,
La commande : output_bit( )
Cherchez dans la documentation CCS la fonction de la commande output_bit( ) et
déterminez ce que fait la commande suivante, avec la configuration de port
précédente :
OUTPUT_BIT (PIN_B0, 0) ;
OUTPUT_BIT (PIN_B2, 1) ;
OUTPUT_BIT (PIN_B4, 1) ;
OUTPUT_BIT (PIN_B6, 0) ;
// B , B , B , B sont à 1,
// B , B , B , B sont à 0.
// B , B , B , B sont à X,
La commande : output_high( )
Cherchez dans la documentation CCS la fonction de la commande output_high( ) et
déterminez l’équivalent de la commande suivante :
OUTPUT_B (0x15) ; et avec la configuration de port précédente, avec les
commandes :
JFA 2015 Page 18 /24 TP7
OUTPUT_HIGH ( , );
OUTPUT_HIGH ( , );
OUTPUT_HIGH ( , );
OUTPUT_HIGH ( , );
// B , B , B , B sont à 1,
// B , B , B , B sont à 0.
// B , B , B , B sont à X,
La commande : output_low( )
Cherchez dans la documentation CCS la fonction de la commande output_low( ) et
déterminez l’équivalent de la commande suivante :
OUTPUT_B (0x15) ; et avec la configuration de port précédente, avec les
commandes :
OUTPUT_LOW ( , );
OUTPUT_LOW ( , );
OUTPUT_LOW ( , );
OUTPUT_LOW ( , );
// B , B , B , B sont à 1,
// B , B , B , B sont à 0.
// B , B , B , B sont à X,
La commande : output_toggle( )
Cherchez dans la documentation CCS la fonction de la commande output_toggle( ) et
déterminez l’équivalent de l’inverse de la commande suivante :
OUTPUT_B (0x15) ; et avec la configuration de port précédente, avec les
commandes :
OUTPUT_TOGGLE ( , );
OUTPUT_TOGGLE ( , );
OUTPUT_TOGGLE ( , );
OUTPUT_TOGGLE ( , );
// B , B , B , B sont à 1,
// B , B , B , B sont à 0.
JFA 2015 Page 19 /24 TP7
// B , B , B , B sont à X,
b. Lecture du port :
Il existe plusieurs commandes CCS pour lire les données du port :
La commande : input( )
Cherchez dans la documentation CCS la fonction de la commande input( ) et déterminez ce que font les commandes suivantes si le port A vaut 0x55 :
Valeur0 = INPUT(PIN_A0) ;
Valeur1 = INPUT(PIN_A1) ;
Valeur2 = INPUT(PIN_A2) ;
Valeur3 = INPUT(PIN_A3) ;
Valeur4 = INPUT(PIN_A4) ;
Valeur5 = INPUT(PIN_A5) ;
Valeur6 = INPUT(PIN_A6) ;
Valeur7 = INPUT(PIN_A7) ;
La commande : input_change ( )
Cherchez dans la documentation CCS la fonction de la commande input_change( ) et
déterminez ce que font les commandes suivantes si le port A valait 0x50 et vaut
maintenant 0x55 :
Valeur0 = INPUT_CHANGE (PIN_A0) ;
Valeur1 = INPUT_CHANGE (PIN_A1) ;
Valeur2 = INPUT_CHANGE (PIN_A2) ;
Valeur3 = INPUT_CHANGE (PIN_A3) ;
Valeur4 = INPUT_CHANGE (PIN_A4) ;
Valeur5 = INPUT_CHANGE (PIN_A5) ;
Valeur6 = INPUT_CHANGE (PIN_A6) ;
Valeur7 = INPUT_CHANGE (PIN_A7) ;
La commande : input_x ( )
Cherchez dans la documentation CCS la fonction de la commande input_x( ) et
déterminez ce que fait la commande suivante si le port A vaut 0x55 :
Valeur = INPUT_A ( ) ;
JFA 2015 Page 20 /24 TP7
III. Pour les délais :
Les délais d’attente les plus simples peuvent être obtenus avec les commandes suivantes. Pour cela
il faut utiliser la commande #USE DELAY pour spécifier au compilateur la vitesse d’horloge du
microcontrôleur (valeur du quartz) utilisée pour qu’il adapte correctement les commandes delay :
La commande : delay_us ( )
Cherchez dans la documentation CCS la fonction de la commande delay_us( ) et
déterminez ce que fait la commande suivante :
DELAY_US (5000) ;
La commande : delay_ms ( )
Cherchez dans la documentation CCS la fonction de la commande delay_ms( ) et déterminez ce que fait la commande suivante :
DELAY_MS (2000) ;
IV. Synthèse :
Pour vérifier que vous avez bien compris les commandes précédentes, analyser le programme ci-
dessous et déterminer sa fonction :
//------------ Programme prog1.c ---------------------------
//
// Auteur : JFA
// Version: 1.0
//-----------------------------------------------------------
#include <16F876A.H> // fichier Header
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
// Déclaration des adresses des ports E/S
#byte PORTB = 6 // adresse du PORT B
// Fréquence du quartz
#use delay (clock=20000000) // Fréquence du quartz 20MHz
// Affectation des entrées et sorties de type bit
#define Led1 PIN_B1
#define Led2 PIN_B2
#define Led3 PIN_B3
#define Led4 PIN_B4
//----------Programme principal ---------------------------------
void main (void)
{
JFA 2015 Page 21 /24 TP7
PORTA=0x00;
set_tris_a(0b11111111);
PORTB=0x00;
set_tris_b(0b00000000);
do {
output_high(Led1) ;
delay_ms(1000);
output_low(Led1) ;
delay_ms(1000);
output_bit(Led2,1) ;
delay_ms(1000);
output_bit(Led2,0) ;
delay_ms(1000);
output_b(0x04) ;
delay_ms(1000);
output_b(0x00) ;
delay_ms(1000);
output_toggle(Led4) ;
delay_ms(1000);
output_toggle(Led4) ;
delay_ms(1000);
} while ( ! input(PIN_A1) ) ;
}
JFA 2015 Page 22 /24 TP7
V. Pour les entrées-sorties analogiques (ADC) :
Ces ports analogiques sont appelés AN.
Ils peuvent être répartis sur plusieurs ports. Pour lire ou écrire des niveaux analogiques, il va falloir
effectuer plusieurs opérations dans le bon ordre :
1°) Configuration de l’ADC :
La commande : setup_adc_port(valeur)
Cherchez dans la documentation CCS la fonction de la commande
setup_adc_port(valeur) et déterminez les options « valeurs » disponibles, et déterminer
que fait la commande suivante :
setup_adc_port (ALL_ANALOG );
2°) Configuration du mode de l’ADC :
La commande : setup_adc(mode)
Cherchez dans la documentation CCS la fonction de la commande setup_adc(mode) et
déterminez les options « mode » disponibles, et déterminer que fait la commande
suivante :
setup_adc(ADC_CLOCK_INTERNAL);
3°) Choix du convertisseur :
La commande : set_adc_channel(valeur)
Cherchez dans la documentation CCS la fonction de la commande
set_adc_channel(valeur) et déterminez les options « valeur » disponibles, et
déterminer que fait la commande suivante :
set_adc_channel(0) ;
Quelle commande faut-il mettre absolument après ?
JFA 2015 Page 23 /24 TP7
4°) Lecture de la valeur :
La commande : read_adc (mode)
Cherchez dans la documentation CCS la fonction de la commande read_adc (mode), et
déterminez les options « mode » disponibles, et déterminer que fait la commande
suivante :
read_adc(ADC_START_ONLY);
delay_us(10) ;
value=read_adc(ADC_READ_ONLY);
Quelle est la contrainte à respecter sur la variable valeur ?
5°) Durée de conversion :
La conversion d’une tension analogique en numérique n’est pas instantanée et peut
prendre un peu de temps à l’échelle de l’horloge du microcontrôleur ! De plus sur
certains convertisseurs, le temps de conversion dépend de la valeur de la tension à
convertir. Plus la tension est élevée, plus la conversion est longue. Donc il faut soit
attendre un temps maximum, soit attendre la fin de la conversion avant d’aller chercher
la valeur convertie.
La commande : adc_done( )
Cherchez dans la documentation CCS la fonction de la commande adc_done( ), et
déterminer que fait la commande suivante :
int1 done = adc_done();
while(!done) {
done = adc_done(); }
VI. Synthèse :
Pour vérifier que vous avez bien compris les commandes précédentes, analyser le programme ci-
dessous et déterminer sa fonction :
/*
* File: main.c
*
* Created on January 25, 2013, 18:09 PM */
#include <18F45K20.h> //Déclaration des registre et de la configuration
#fuses FOSC,NOWDT,NOPROTECT,NOLVP,NOPUT
#use delay(clock=20000000) //quartz à 20MHZ
void main(void)
{
int value;