Microcontrôleur PIC – Présentation du langage C pour PIC TEln
Présentation succinte du langage C
Les commentaires se font en mettant « // » en début de ligne ou en entourant un bloc pour le mettre en commentaire par « /* » et « */ ».Exemple :// Ceci est un commentaire sur une ligne/* Ceci est un bloc mis en commentaire */
Chaque instruction se termine par un point virgule, chaque début et fin de blocs d'instructions sont entourés par { et }. La fonction principale d'un programme s'appelle toujours main :Exemple :void main(){
\\ Votre code ici}
Les variables que vous utiliserez pour le PIC seront de deux types :● entier noté int, la variable sera comprise entre 0 et 255, déclaration : int nom_variable
● caractère noté char, la variable contiendra un caractère ascii, déclaration : char nom_variable
● flottant (nombre à virgule) noté float, déclaration : float nom_variable● dans les trois cas vous pouvez initialiser les variables lors de leur création.
Exemple :int i=0, j=100, k;char carac='a', car='@', car2;float pi=3.1415, coeff=0.97;
Vous pouvez aussi utiliser des tableaux à une dimension, la déclaration se fait :type_stocké nom_du_tableau[nombre_elements_tableau]. Attention le premier élément est numéroté à partir de 0 et donc le dernier élément sera nombre_elements_tableau1.Exemple :int valeurs[3]; déclare un tableau de 3 éléments de type entiers. Le premier élément sera accessible par valeurs[0] et le dernier élément sera valeurs[2].float mesures[2] = {14.65,45.23}; déclare un tableau de 2 éléments de type flottant. Le premier élément (mesures[0]) est initialisé à 14,65 et le deuxième (mesures[1]) à 45,23.
Tableau des opérateurs standards en langage C : reportez à la photocopie jointe à ce document.
Le test « Si »Nous avons vu lors de l'examen des opérateurs l'expression conditionnelle. Il existe également bien sûr une structure de contrôle qui réalise l'exécution conditionnelle. Sa syntaxe est la suivante :
if (<condition>) { <instructions ...>}
La condition est testée comme un booléen, c'estàdire qu'elle est considérée comme vraie si son évaluation n'est pas nulle. « 0 » est considéré comme la valeur booléenne FAUX, « différent de 0 » est considéré comme la valeur booléenne VRAI. Vous pouvez aussi utiliser les valeurs « TRUE » et « FALSE » dans vos tests. Dans le cas où une seule instruction est à exécuter quand la condition est vraie,
Olivier DARTOIS – Jacques DUPRAT Page 1
Microcontrôleur PIC – Présentation du langage C pour PIC TEln
on trouvera souvent cette instruction toute seule à la place du bloc entre accolades.Le test « Si » avec alternative :if (<condition>) { <instructions ...>} else { <instructions ...>}Là encore il est possible de remplacer l'un ou l'autre (ou les deux) blocs entre accolades par une unique instruction. Attention dans ce cas, il faut terminer cette instruction par un pointvirgule.
Le test « Si » avec de multiples alternatives :if (<cond1>) { <instructions ...> /* Si cond1 est vraie */} else if (<cond2>) { <instructions ...> /* si cond1 fausse et cond2 vraie */ } else { <instructions ...> /* si cond1 et cond2 fausses */ }}Exemple :if (val_can<128) { // si la valeur lu par le CAN est inférieur à 128 ouput_b(0x0F); // on met à 1 les 4 bits de poids faibles du port B} else { ouput_b(0xF0); // sinon on met à 1 les 4 bits de poids forts du port B}
Le switch()switch (<expression>) { case <val 1>: <instructions ...> case <val 2>: <instructions ...> ... case <val n>: <instructions ...> default: <instructions ...>}L'instruction switch permet de diriger le programme vers une séquence d'instructions choisie parmi plusieurs, suivant la valeur d'une expression qui doit être de type entier.
Le branchement se fait à l'étiquette case dont la valeur est égale à l'expression de tête (il ne doit y avoir au plus qu'une étiquette qui correspond). Si aucune étiquette ne correspond, le saut se fait à l'étiquette default si elle existe.
Attention, une fois le branchement effectué, le programme continue de s'exécuter dans l'ordre, y compris les case qui peuvent suivre. Pour empêcher ce comportement, on utilise souvent break à la fin des instructions qui suivent le case : son effet est de sauter directement après le bloc du switch.
Exemple :int val,c;c=1;val = mafonctiondecalcul(); /* une fonction définie ailleurs */switch (val) { case 0:
Olivier DARTOIS – Jacques DUPRAT Page 2
Microcontrôleur PIC – Présentation du langage C pour PIC TEln
case 1: printf("Résultat 0 ou 1\n"); c=2; break; case 2: printf("Résultat 2\n"); break; case 4: printf("Résultat 4\n"); c=0; break; default: printf("Cas non prévu\n");}Les bouclesLa boucle « for » ou « pour »:C'est une boucle beaucoup plus générale que dans d'autres langages. Son rôle ne se limite pas à la simple répétition en incrémentant un entier. Son utilisation est la suivante :for ( <inst. initiale> ; <cond. de poursuite> ; <inst. d'avancement> ) { <instructions ...>}
L'instruction initiale est exécutée avant le début de la boucle, la condition de poursuite est testée à chaque début de boucle et l'instruction d'avancement est exécutée en dernière instruction à chaque tour de boucle.Exemple :int tab[100];
for (i=0; i<100; i++) { output_b(tab[i]); /* exécutées pour i=0, i=1 ... i=99 */}
La boucle « while » ou « tant que »:while (<condition de poursuite>) { <instruction ...>}Exemple :while (input_c()!=4) { // tant que la valeur lu sur le port C est différente de 4 output_toggle(PIN_B0); // on fait clignoter la DEL qui est reliée au bit de poids faible du port B}
La boucle « do...while » ou « faire...tant que »:Ici le test est effectué en fin de boucle. Cette boucle est donc, contrairement aux deux boucles précédentes, exécutée au moins une fois, même si la condition est fausse dès le début de la boucle.
do { <instructions ...>} while (<condition de poursuite>);
Important : Consultez l'aide en ligne du compilateur
Présentation du langage C pour PIC
Pour réaliser les exemples qui suivent vous devez avoir en votre possession la documentation de présentation des PICs et du cheminement de programmation de ceuxci. Cette documentation sert uniquement à présenter des exemples.
Olivier DARTOIS – Jacques DUPRAT Page 3
Microcontrôleur PIC – Présentation du langage C pour PIC TEln
1. Ex. n°1 : Positionner des sorties - Faire clignoter une DELNous allons donc réaliser notre premier programme en langage C. Nous allons faire clignoter la DEL verte PC0 de la maquette inter+dels. Dans l'EDI, créez un nouveau fichier avec le nom « del.c » puis saisissez les lignes suivantes :
Les lignes 1 à 3 sont des commentaires car les lignes commencent par « // ».La ligne 5 précise quel type de µC nous allons utiliser et inclut un fichier utile à la compilation.La ligne 10 devra être décommentée si vous programmez votre PIC avec TinyBootLoader (décommenté = enlever les « // » devant).La ligne 12 précise les « fusibles » à programmer dans le PIC.La ligne 13 permet de préciser à quel fréquence le quartz de votre carte oscille. Dans la plupart des cas cette valeur sera 4000000 pour un quartz à 4MHz ou 20000000 pour un quartz à 20MHz.La ligne 15 indique le début de notre programme principal (fonction « main »), vous ouvrez donc une accolade. La ligne 17 permet de faire boucler indéfiniment notre programme (« while (true) » signifie « tant que vrai »). Les instructions entre les accolades seront donc exécutées sans arrêt.La ligne 18 permet d'envoyer (output) vers le port C (_c) la valeur entre paranthèse (ici 0 en hex= 0x00). Toutes les diodes du port C seront donc éteintes.Au passage vous remarquez que la fin d'une instruction se termine par « ; ».La ligne 19 permet d'attendre le nombre de ms indiqué entre paranthèse (ici 500ms donc 0,5s).La ligne 20 envoie la valeur 1 sur le port C, vous allumez donc la diode relié au bit de poids faible du port C (ici la DEL verte PC0).La ligne 21 permet d'attendre à nouveau 500ms.La ligne 22 indique la fin de la boucle « while(true) ».La ligne 23 indique la fin de notre programme car c'est l'accolade fermante de la fonction « main() ».
Sauvegardez votre programme puis compilezle. Programmez votre PIC et testez votre programme avec la
Olivier DARTOIS – Jacques DUPRAT Page 4
Microcontrôleur PIC – Présentation du langage C pour PIC TEln
carte inters+dels. Cela fonctionne...félicitations sinon reprenez le tout étape par étape. N'oubliez pas que l'on peut aussi simuler les programmes dans Isis comme dans le schéma cidessous :
RA0/AN02
RA1/AN13
RA2/AN2/VREF4
RA4/T0CKI6
RA5/AN4/SS7
OSC1/CLKIN9
OSC2/CLKOUT10
RC1/T1OSI/CCP2 12
RC2/CCP1 13
RC3/SCK/SCL 14
RB7/PGD 28RB6/PGC 27
RB5 26RB4 25
RB3/PGM 24RB2 23RB1 22
RB0/INT 21
RC7/RX/DT 18RC6/TX/CK 17
RC5/SDO 16RC4/SDI/SDA 15
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI 11
MCLR/Vpp/THV1
U1
PIC16F876PROGRAM=..\..\..\Documents and Settings\Olivier\Mes documents\TestCCS\del.HEXCLOCK=4MHz
Olivier DARTOIS Jacques DUPRATTELN 2005
D1LEDGREEN
R1
220
Simulation Clignotement DEL sur PC0
Exercice1 :1. Faites clignoter plus rapidement votre DEL puis faites clignoter la del verte PC1.2. Allumez alternativement les diodes vertes PC0,PC2,PC4 puis PC1,PC3,PC5.3. Faites un chenillard qui parcours les 6 diodes jaunes puis les 6 diodes vertes.
2.Ex. n°2 : Lire des entrées – Lire l'état des intersPour notre deuxième exemple, nous allons lire l'état des interrupteurs de la maquette inters+dels connectés au port B (inters PB0 à PB3) et afficher l'état de ceuxci sur les quatres DELs du port C (DELs verte PC0 à PC3). Dans l'EDI, créez un nouveau fichier avec le nom « inters.c » puis saisissez les lignes suivantes :
Olivier DARTOIS – Jacques DUPRAT Page 5
Microcontrôleur PIC – Présentation du langage C pour PIC TEln
Nous commentons seulement les lignes nouvelles.La ligne 14 permet de déclarer une variable de type entier (int). Cette variable sert à stocker le résultat d'un calcul ou la valeur d'un des ports du PIC. Une variable de type « int » permet de stocker des valeurs de 0 à 255 (8 bits). Pour stocker des nombres à virgules vous utiliserez le type flottant (float) coder sur 32 bits.La ligne 17 lit l'état des lignes connectées au port B (input_b) et vous stockez cette valeur dans la variable « val_inter ».La ligne 18 permet de mettre sur le port C la valeur « val_inter » et donc d'allumer les DELs correspondantes aux inters en position « 1 ».
Sauvegardez votre programme puis compilezle. Programmez votre PIC et testez votre programme avec la carte inters+dels. Si à chaque fois que vous actionnez un inter PB0 (à PB3) la diode PC0 (à PC3) s'allume votre programme fonctionne correctement sinon vérifiez le tout et recommencez.La schéma de simulation peut être le suivant :
RA0/AN02
RA1/AN13
RA2/AN2/VREF4
RA4/T0CKI6
RA5/AN4/SS7
OSC1/CLKIN9
OSC2/CLKOUT10
RC1/T1OSI/CCP2 12
RC2/CCP1 13
RC3/SCK/SCL 14
RB7/PGD 28RB6/PGC 27
RB5 26RB4 25
RB3/PGM 24RB2 23RB1 22
RB0/INT 21
RC7/RX/DT 18RC6/TX/CK 17
RC5/SDO 16RC4/SDI/SDA 15
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI 11
MCLR/Vpp/THV1
U1
PIC16F876PROGRAM=inters.HEXCLOCK=4MHz
Olivier DARTOIS
TELN 2005
PC0R1 220
Simulation Lecture Inters
PC1R2PC2
PC3R3
R4
PB0
PB2
PB1
PB3
R510k
R810k
+5V
et Aff ichage sur DELs
Jacques DUPRAT
Remarque : Les résistances R5 à R8 sont des résistances de tirage vers le haut (fixe un potentiel +5V donc un « 1 » logique lorsqu'un inter est ouvert). Le port B du PIC possède en interne des résistances de tirages vers le haut. Cellesci sont activées par l'instruction port_b_pullups(true) et désactivées par l'instruction port_b_pullups(false). Si vous activez dans votre programme les résistances de tirage vers le haut alors les résistances R5 à R8 ne sont plus nécessaires.
Exercice2 :Faites un programme qui lit l'état des inters PB0 à PB3 et qui allume les dels du port C avec les conditions suivantes:– si PB0 et PB1 sont à 1 alors vous allumez la diode verte PC0 et uniquement celleci.– si PB2 et PB3 sont à 1 alors vous allumez la diode verte PC1 et uniquement celleci.– si PB0 et PB3 sont à 1 alors vous faites clignoter les diodes PC0 et PC1.– dans tous les autres cas la diode verte PC2 devra être allumé.Indication : utilisez une structure « switch ».
Olivier DARTOIS – Jacques DUPRAT Page 6
Microcontrôleur PIC – Présentation du langage C pour PIC TEln
3.Ex. n°3 : La conversion analogique-numériqueLa plupart des capteurs délivrent une tension proportionnelle au phénomène qu'ils mesurent. Pour être exploitable cette tension doit être numérisée à l'aide d'un convertisseur analogique numérique (CAN ou DAC en anglais : Digital to Analog Converter). Le µC PIC possède des entrées analogiques sur le port A (entrées AN0 à AN4). Deux de ces entrées peuvent être configurées pour fixer la limite basse (VREF) et haute (VREF+) de la numérisation. La résolution du convertisseur interne du PIC est de 10 bits (soit 1024 valeurs possibles). Nous utiliserons une résolution plus faible sur 8 bits qui est la valeur par défaut du convertisseur (soit 256 valeurs possibles).
Dans notre exemple nous allons numériser la tension présente sur l'entrée AN2 et afficher le résultat sur les 6 DELs du port C.
Quand nous aurons une tension de 0V sur l'entrée AN2, toutes les DELs du port C seront éteintes. Quel sera la valeur de la tension présente lorsque les six premières dels du port C seront allumées ?
Dans l'EDI, créez un nouveau fichier avec le nom « can.c » puis saisissez les lignes suivantes :
Nous commentons seulement les lignes nouvelles.La ligne 14 permet de déclarer une variable de type entier qui va permettre de stocker le résultat de la conversion analogiquenumérique.La ligne 16 permet d'initialiser le port A en analogique et de préciser quelle entrée va être utilisé pour la conversion. Les valeurs possibles pour cette fonction sont :
Olivier DARTOIS – Jacques DUPRAT Page 7
Microcontrôleur PIC – Présentation du langage C pour PIC TEln
Valeurs Description
NO_ANALOGS Toutes les entrées du port A en mode numérique
ALL_ANALOGS Toutes les entrées du port A en mode analogique
AN0_AN1_AN2_AN4_VSS_VREF Entrées AN0, AN1, AN2 et AN4 en analogique, AN3 Tension Reférence haute (VREF+)
AN0_AN1_AN3 Entrées AN0, AN1 et AN3 en analogique, AN2 et AN4 en numérique
AN0_AN1_VSS_VREF Entrées AN0 et AN1 en analogique, AN3 Tension Reférence haute (VREF+), AN2 et AN4 en numérique
AN0_AN1_AN4_VREF_VREF Entrées AN0, AN1 et AN4 en analogique, AN2 Tension de Référence basse (VREF), AN3 Tension de Référence haute (VREF+)
AN0_AN1_VREF_VREF Entrées AN0 et AN1 en analogique, AN2 Tension de Réf. basse (VREF), AN3 Tension de Réf. haute (VREF+), AN4 en numérique
AN0 Entrées AN0 analogique, toutes les autres entrées en numérique
AN0_VREF_VREF Entrées AN0 analogique,AN2 Tension de Réf. basse (VREF), AN3 Tension de Réf. haute (VREF+), AN1 et AN4 en numérique
La ligne 17 détermine l'horloge utilisé pour la conversion.La ligne 18 permet de sélectionner l'entrée à numériser. Dans notre cas seul le canal 0 est utilisé donc on sélectionne celuici sinon il suffit de préciser le numéro de canal.La ligne 19 permet au convertisseur de s'initialiser en attendant 100ms.La ligne 22 permet de lire le résultat de la conversion et stocke celuici dans la variable val_can.La ligne 23 envoie sur cette valeur vers le port C et allume les DELs en conséquence.
Sauvegardez votre programme puis compilezle. Programmez votre PIC et testez votre programme avec la carte inters+dels. Tournez lentement le potentiomètre relié à la voie AN2. Lorsque vous faites varier cette tension les DELs du port C doivent s'éteindre ou s'allumer en fonction de la valeur convertie. Vérifiez l'état des DELs pour une tension de 0V, 1V (mesurez la tension au potentiomètre avec un multimètre) puis comparezlà avec la théorie. Vérifiez votre réponse à la question de la page précédente en allumant les 6 premières diodes vertes et en relevant au multimètre la tension sur le potentiomètre.
Le schéma de simulation pour cet exemple sera :
RA0/AN02
RA1/AN13
RA2/AN2/VREF4
RA4/T0CKI6
RA5/AN4/SS7
OSC1/CLKIN9
OSC2/CLKOUT10
RC1/T1OSI/CCP2 12
RC2/CCP1 13
RC3/SCK/SCL 14
RB7/PGD 28RB6/PGC 27
RB5 26RB4 25
RB3/PGM 24RB2 23RB1 22
RB0/INT 21
RC7/RX/DT 18RC6/TX/CK 17
RC5/SDO 16RC4/SDI/SDA 15
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI 11
MCLR/Vpp/THV1
U1
PIC16F876PROGRAM=can.HEXCLOCK=4MHz
Olivier DARTOIS
TELN 2005
PC0R1 220
Simulation CAN
PC1R2
PC2
PC3
R3
R4
et Aff ichage sur DELs
Jacques DUPRAT
PC4
PC5
PC6
PC7
R5
R6
R7
R8220
RV1
1k
+5V
Olivier DARTOIS – Jacques DUPRAT Page 8
Microcontrôleur PIC – Présentation du langage C pour PIC TEln
Exercice3 :Configurez le convertisseur analogique numérique du PIC pour qu'il prenne comme valeur basse de conversion la tension Vref et comme valeur haute de conversion la tension Vref+. Réglez Vref+ à 3V et Vref à 1V. Affichez sur les dels vertes du port C le résultat de la conversion.Comparez le quantum dans cette configuration et le quantum précédent. Quel est l'intérêt de cette configuration ?
4.Ex. n°4 : Utilisation de la voie sérieLa communication avec le « monde » extérieure (au µC PIC) est très importante aujourd'hui. En particulier la communication par voie série vers un ordinateur permet d'accéder à la puissance de stockage et de calculs qu'un µC ne possède pas forcement.Nous allons réaliser une conversion puis transmettre le résultat de cette conversion par la voie série vers le PC. Nous utiliserons le logiciel TinyBootLoader pour visualiser les résultats.
Dans l'EDI, créez un nouveau fichier avec le nom « série.c » puis saisissez les lignes suivantes :
La ligne 12 permet de définir les caractéristiques de la communication sur la voie série ainsi que les broches utilisées pour celleci. Dans notre exemple, vous transmettrez à une vitesse de 19200 baud, la broche d'émittion sera RC6 (portC, 6ème broche), la broche de réception sera RC7 (portC, 7ème broche) enfin il n'y aura pas de bit de parité (parity=None). Du coté de votre logiciel de dialogue sur la voie série (HyperTerminal), il faudra régler les mêmes paramètres.La ligne 17 définit une variable de type flottant (float) donc elle pourra stocker un nombre à virgule.La ligne 18 définit une constante (const) de type flottant. Son nom sera « Quantum » est vaudra 5V/255
Olivier DARTOIS – Jacques DUPRAT Page 9
Microcontrôleur PIC – Présentation du langage C pour PIC TEln
soit 0,0196V. Cette constante permet de transformer une valeur compris entre 0 et 255 fourni par le CAN en une tension compris entre 0V et 5V.La ligne 27 permet d'obtenir le résultat de la conversion du CAN, de le multiplier par le Quantum afin d'obtenir dans la variable tension la valeur de la tension présente sur l'entrée AN0.La ligne 28 permet d'envoyer des informations sur la voie série. La fonction utilisée est la fonction « printf ». Cette fonction est relativement complexe et est expliquée dans la documentation officielle du compilateur C. Dans notre cas, nous envoyons vers la voie série le texte qui est compris entre guillements ou « %2.2f » est remplacé par la valeur de la tension :
• le « \r » permet de ramener le curseur au début de la ligne.• le « \n » permet de sauter une ligne.• le « %2.2f » permet de formater le flottant tension (lettre 'f' dans '%2.2f') pour qu'il s'affiche avec
deux chiffres avant la virgule et deux chiffres aprés la virgule.
Sauvegardez votre programme puis compilezle. Programmez votre PIC et testez votre programme en injectant une tension analogique variable (alimentation par exemple) sur la ligne AN0. Connectez l'interface de communication sur le connecteur HE1010 correspondant de votre carte gestion et sur le PC lancez le programme TinyBootLoader. Les valeurs de la tension numérisée par le PIC sur la voie AN0 devraient apparaitre alors dans l'onglet « Terminal » si vous vous êtes bien connecté. Faites varier votre tension analogique et constatez les changements.
Le schéma de simulation pour Isis utilise des composants virtuels et en particulier le composant « Virtual Terminal ». Saisissez le schéma suivant et testezle :
RA0/AN02
RA1/AN13
RA2/AN2/VREF4
RA4/T0CKI6
RA5/AN4/SS7
OSC1/CLKIN9
OSC2/CLKOUT10
RC1/T1OSI/CCP2 12
RC2/CCP1 13
RC3/SCK/SCL 14
RB7/PGD 28RB6/PGC 27
RB5 26RB4 25
RB3/PGM 24RB2 23RB1 22
RB0/INT 21
RC7/RX/DT 18RC6/TX/CK 17
RC5/SDO 16RC4/SDI/SDA 15
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI 11
MCLR/Vpp/THV1
U1
PIC16F876PROGRAM=serie.HEXCLOCK=4MHz
Olivier DARTOIS
TELN 2005
Numérisation voie AN0et envoie valeur sur voie série
Jacques DUPRAT
RV1
1k
+5V
RXD
RTS
TXD
CTS
VIRTUAL TERMINAL
BAUDRATE=19200DATABITS=8PARITY=NONESTOPBITS=1
5.Ex. n°6 : Utilisation d'un afficheur LCDPour que les affichages de données soient plus attrayant vous pouvez utiliser un afficheur LCD. Le modèle que nous utiliserons fait 2 lignes de 16 caractères. Le compilateur CCS est fourni avec un pilote d'afficheur LCD, nous allons donc utiliser cette bibliothèque de fonction :
● lcd_init() : fonction d'initialisation de l'afficheur LCD. A appeler en premier.
Olivier DARTOIS – Jacques DUPRAT Page 10
Microcontrôleur PIC – Présentation du langage C pour PIC TEln
● lcd_putc(c) : fonction qui permet d'envoyer un caractère vers l'afficheur LCD. Les caractères spéciaux « \f » (effacement écran), « \n » (passer à la deuxième ligne) peuvent être utilisés dans la chaine de caractères que vous envoyez au LCD.
● lcd_gotoxy(x,y) : fonction qui permet de déplacer le curseur de l'afficheur.● lcd_getc(x,y) : fonction qui permet de récupérer le caractère qui se trouve sous le curseur. Vous
n'utiliserez pas cette fonction.
Pour que votre afficheur fonctionne sur vos maquettes, il faut rajouter avant la ligne « #include <lcd.c> » la ligne « #define use_portb_lcd TRUE » pour dire au compilateur que l'afficheur est connecté au port B du PIC.
Nous allons réaliser un programme qui affiche un message de bienvenue sur l'afficheur pendant 3s puis nous testerons l'appui des boutons K1 et K2 et nous afficherons un message en conséquence sur l'afficheur.
Pour cela, dans l'EDI, créez un nouveau fichier avec le nom « lcd.c » puis saisissez les lignes suivantes :
La ligne 6 indique que vous réaliserez la programmation avec le logiciel TinyBootLoader.La ligne 16 permet d'initialiser l'afficheur LCD. Les lignes 17 et 18 affichent un message sur les deux lignes de l'afficheur LCD.La ligne 23 permet de récupérer la valeur du port C et de la stocker dans la variable val_portC.
Olivier DARTOIS – Jacques DUPRAT Page 11
Microcontrôleur PIC – Présentation du langage C pour PIC TEln
La ligne 24 permet de récupérer l'état des deux interrupteurs K1 et K2 en éliminant tous les autres bits. Sur le schéma structurel, vous voyez que lorsqu'un bouton poussoir est enfoncé vous positionnez le bit correspondant à 1. Si le bouton est relaché, le bit correspondant est à 0 (résistance de rappel vers la masse). K1 est relié à PC4 et K2 est relié à PC5. Pour éliminer les bits non significatifs vous faites donc un ET logique entre la valeur lue sur le port C et la valeur binaire 00110000.La ligne 25 teste si la valeur lue sur le port C est égale à 16 (symbole == dans la condition de test du si). En effet K1 relié à PC4 donc en décimal si ce bit est à 1 son poids vaut 16 en décimal. Si c'est le cas alors vous affichez un message sur l'afficheur LCD.Les lignes 26 et 27 sont quasiment identiques dans le raisonnement à la ligne 25.
Modifiez votre programme pour afficher un message si les deux boutons K1 et K2 sont enfoncés. Envoyez sur la voie série l'état des boutons et visualisez dans TinyBootLoader ce qu'envoie le PIC.
Le schéma de simulation de ce montage est le suivant :
RA0/AN02
RA1/AN13
RA2/AN2/VREF4
RA4/T0CKI6
RA5/AN4/SS7
OSC1/CLKIN9
OSC2/CLKOUT10
RC1/T1OSI/CCP2 12
RC2/CCP1 13
RC3/SCK/SCL 14
RB7/PGD 28RB6/PGC 27
RB5 26RB4 25
RB3/PGM 24RB2 23RB1 22
RB0/INT 21
RC7/RX/DT 18RC6/TX/CK 17
RC5/SDO 16RC4/SDI/SDA 15
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI 11
MCLR/Vpp/THV1
U1
PIC16F876PROGRAM=LCD.HEXCLOCK=4MHz
+5V
Afficheur LCD
Olivier DARTOIS
TELN 2005
Jacques DUPRAT
R110k
R210k
K1 K2
+5V
D7
14D
613
D5
12D
411
D3
10D
29
D1
8D
07
E6
RW
5R
S4
VSS
1
VD
D2
VEE
3LCD1LM016L
6.Les fonctions disponibles en langage C pour PICReportezvous à l'aide intégré dans le compilateur C et aux documentations mises à votre disposition sur le réseau.
Olivier DARTOIS – Jacques DUPRAT Page 12