I. Compilation
Le langage C est un langage d’assez bas niveau qui doit être compilé pour être compris par la machine.
Le rôle du compilateur est de traduire les instructions données en C en langage binaire (0 ou 1) qui est compris par les composants électroniques.
Le compilateur est différent d’une machine à l’autre, ce qui veut dire que le langage C n’est pas forcément traduit exactement de la même façon entre 2 machines.
C’est pour cela qu’un même programme pourra donner des résultats légèrement différents entre plusieurs postes informatiques.
Pour éviter ce genre de problème, il existe des langages qui ne sont pas compilés comme le HTML ou le Java.
II. Variables
Une variable est un élément dans lequel est stockée une valeur que l’on peut changer à tout moment. C’est une sorte de sac dans lequel est contenue une information d’un certain type.
On définit soit même une variable en lui donnant un nom. On peut donner le nom que l’on veut à une variable, mais en général il est préférable de la nommer en rapport avec son utilité.
Par exemple une variable dans laquelle on veut stocker un âge, sera le plus souvent de type int (nombre entier) et nommée Age ou monAge. (Il ne peut jamais y avoir d’espace dans le nom d’une variable)
Lorsque l’on définit une variable, on doit donner le type d’information qu’elle va stocker, il existe plusieurs grand types :
- Type int: permet de stocker un nombre entier
- Type float: permet de stocker un nombre décimal
- Type char: permet de stocker un caractère
Exemple :
int monAge = 28 ; // signifie que la variable monAge prend la valeur 28.
Il existe aussi le type long pour les entiers supérieurs à 2 147 483 647 et le type double pour les décimaux très grands.
Dans un programme on déclare en général toute les variables au début, avec en commentaire l’utilité de chaque variable.
Exemple :
Int main () {
int age = 0 ; // variable de l’âge du participant
int taille = 0 ; // variable de la taille du participant
float maTension = 0 ; // variable de la tension du participant
float maVO2 = 0 ; // variable de la VO2 max du participant
etc.
}
Remarque : Attention dans un type char on ne peut stocker qu’un seul caractère, pas un mot en entier ! Pour cela on utilise des chaînes de caractères.
III. Opérations
Une fois que l’on a déclaré toute les variables dont on a besoin, il est possible de les manipulés avec tout les outils mathématiques dont on dispose.
Il existe un certain nombre d’opérateur préenregistré en C :
III. 1. Les opérateurs de calculs :
Pour les 4 opérations de bases on utilise les signes usuels : +, -, *, /
III. 2. Les opérateurs logiques :
- ET : &&
- OU : ||
- NON : !
III. 3. Les opérateurs de comparaison :
- Supérieur : >
- Supérieur ou égal : =>
- Inférieur : <
- Inférieur ou égal : =<
- égal : ==
- différent : !=
Remarque : les opérateurs de comparaison effectuent un test, ils renvoient donc un 1 si le test est vrai et un 0 s’il est faux.
IV. Conditions et boucle
Dans un programme, on utilise des conditions et des boucles pour effectuer des scénarios plus ou moins complexes.
IV. 1. La structure if….else…
La structure en if est une structure conditionnelle. C’est-à-dire que son contenu n’est exécuté que si la condition est remplie.
Cette structure est composée de 2 mots clés au minimum : if (la condition), et else (lorsque la condition n’est pas remplie)
On peut y rajouter des conditions intermédiaires else if si on souhaite exprimer plusieurs conditions.
Exemples :
a) if else
if(note=>10){ // si la variable note est supérieur ou égal à 10
moyenne = 1 ; // alors la variable moyenne vaut 1
}
else { // Sinon
moyenne = 0 ; // la variable moyenne vaut 0
}
b) if else if else
if(note=>15){ // si la variable note est supérieur ou égal à 15
felicitation = 1 ; // alors la variable felicitation vaut 1
}
else if ((note =>10)&&(note<15)){ // Sinon, si la variable note est // supérieur à 10 et inférieur à 15
encouragement = 1 ; // la variable encouragement vaut 1
}
else{ // sinon
felicitation, encouragement = 0 ; // les variables valent 0
}
IV. 2. La boucle while
Pour qu’un programme exécute plusieurs fois le même morceau de code, on utilise des boucles. La boucle while exécute son contenu, tant que la condition est vraie.
Exemple :
While (note<10) { // tant que la note est inférieur à 10 alors
travail=1 ; // la variable travail vaut 1
}
IV. 3. La boucle for
La boucle for est un peu plus compliqué elle permet d’exécuter des instructions un nombre de fois précis.
Elle contient donc 3 paramètres, la valeur de départ, la valeur d’arrivée et la méthode d’incrémentation.
Elle s’écrit de cette façon : for(i = 0 ;i =50 ; i=i+1){contenu à répéter}
Dans ce cas la variable est i (il faut penser à la déclarer au début du programme)
- i = 0 signifie que la variable i vaut 0 à la première boucle
- i= 50 signifie que lorsque i vaut 50 alors le programme sort de la boucle
- i = i+1 signifie qu’à chaque itération i est augmenté de 1
Exemple :
for(i=0 ; i=10 ; i=i+1){ // pour i allant de 0 à 10
if(temperature<20){ // si temperature est inférieur à 20
temperature = temperature +1 ; //alors temperature augmente de 1
}
}
V. Fonctions
Un programme est toujours composé d’une fonction main(), c’est à l’intérieur de cette fonction que l’on écrit les instructions principales du programme.
De la même façon qu’il faut déclarer les variables avec un certain type, il faut également déclarer le type de fonction.
Le type d’une fonction indique le type de donnée qu’elle renvoi une fois qu’elle est exécutée.
Il y plusieurs type de fonction :
- int: fonction qui renvoie un entier
- char: fonction qui renvoie un caractère
- void: fonction qui ne renvoie rien
- float: fonction qui renvoie un décimal
En plus de la fonction main(), on peut déclarer et créer d’autres fonctions qui accompliront un calcul particulier. Cela permet ensuite d’éclaircir le code de le fonction main().
Une fonction se déclare selon la structure suivante :
Type nom_de_la_fonction (type paramètre1, type paramètre2,..)
{
Code de la fonction
}
Exemple :
float pourcent(float quantite, float total)
{ // ligne de déclaration
float pourcentage =0 ; // intialisation d’une variable
pourcentage = (quantite/total)*100 ; // calcul du pourcentage
return pourcentage ; // renvoi de la valeur calculé
}
Une fois qu’une fonction est déclarée, elle peut être appelée à n’importe quel moment dans le programme.
Par exemple en reprenant la fonction précédente :
int main () {
int nombre =0 ;
nombre = pourcent(23,55) ; // Appel de la fonction précédente.
….}
Ne pas oublier de bien déclarer toutes les fonctions avant la fonction main qui doit obligatoirement être la dernière du programme.
VI. Préprocesseur
En langage C, il existe de très nombreuses fonctions qui sont déjà codées. Pour que tout le monde puisse les utiliser, elles sont stockées dans des librairies.
Donc pour utiliser des fonctions qui existent déjà, il faut inclure le fichier librairie dans les premières lignes du programme.
Pour cela on utilise la syntaxe :
#include <la_librairie_dont_jai_besoin.h>
Le préprocesseur va ensuite compiler l’ensemble des fonctions des librairies avant de compiler votre programme.
Il est possible d’ajouter autant de librairie que nécessaire.
VII. Les erreurs
Lorsque l’on code, on fait toujours des erreurs, souvent bêtes. Pour ne pas s’énerver, il faut prendre le temps de lire le message d’erreur.
Même si c’est de l’anglais la ligne qui pose problème est toujours indiquée, cela signifie que le problème se trouve soit à cette ligne, soit à la fin de celle d’avant.
Voici quelques-unes des erreurs les plus communes :
- Error expected ‘;’ before …… : Vous avez oubliez un point-virgule !
- Error: ‘xxxxx’ undeclared (first use in this function) : Vous avez utilisé une variable ou une fonction sans la declarer.
- Error : expected declaration or statement at end of input : Vous avez oublié de refermer une accolade ou une parenthèse.
- Error: expected ‘;’ before ‘{‘ token : Vous avez probablement mis une condition dans un else, enlevez-la !
- Le programme a cessé de fonctionner : Vous avez oublié le & dans la fonction scanf()
- Error: redefinition of ‘main’ : Vous avez créé 2 fonctions main(), à quoi vous pensez ?!
- Et beaucoup d’autre
VIII. Pour résumer
Pour résumer un programme ressemble à cela :
#include <librairie1.h> /Déclaration des librairies du préprocesseur/
#include <librairie2.h>
#include <librairie3.h>
int ma_fonction1(param1,param2){ // Déclaration de la fonction1
int variable1=0 ; // Déclaration des variable de la fonction
calcul_de_la_fonction1 ; // Instructions
return resultat ; // fin de la fonction
}
Float ma_fonction2(param1){ // Déclaration de la fonction1
Int variable2 = 0 ; // Déclaration des variable de la fonction
Calcul_de_la_fonction2 ; // Instructions
Return resultat ; // fin de la fonction
}
Int main() { // Déclaration de la fonction main
Int variable_du_main=0 ; // Déclaration des variables du main
Instruction_de_la_fonction_main ; // Instructions
Return 0 ; // fin du programme
}
IX. Le langage C en électronique
La plupart des microcontroleurs peuvent être codés en langage C.
Chaque µC a ses propres commandes qui sont préinscrites dans les registres du composants par les constructeurs, pour les connaître il faut alors lire la documentation fournit avec.
Mais un certain nombre de commandes sont communes à tous les types de µC.
IX. 1. Configurer un port en entrée ou en sortie
Pour configurer un port complet en entré ou en sortie, on utilise la commande TRIS suivi de la lettre du port.
Lorsque l’on fixe la valeur du TRIS à 1, le port est en entrée.
Lorsque l’on fixe la valeur du TRIS à 0, le port est en sortie.
Exemple :
TRISA = 0 ; // instruction qui met le port A en sortie.
TRISB = 0xFF ; // instruction qui met le port B en entrée.
Attention TRISB = 1 ne met qu’un seul bit du port B en entrée, pas le port complet, c’est pour cela qu’il faut écrire 0xFF ou 0b11111111.
Il est aussi possible de configurer un seul bit de son choix en entrée ou en sortie en utilisant la commande. TRIS suivi de la lettre du port suivi de la commande bits.numéro du bit
Par exemple pour mettre le bit 4 du port B en entrée :
TRISBbits.RB3 = 1 ;
IX. 2. Donner à un port ou à un bit la valeur 1 ou 0
Pour donner une valeur sur un port complet, on utilise la commande PORT suivi de la lettre du port.
Lorsque l’on fixe la valeur du PORT à 1, tous ses bits sont à 1.
Lorsque l’on fixe la valeur du PORT à 0, tous ses bits sont à 1.
Exemple :
PORTA = 0 ; // instruction qui met le port A à 0.
PORTB = 0xFF ; // instruction qui met le port B à 1.
Attention PORTB = 1 ne met qu’un seul bit du port B à 1, pas le port complet, c’est pour cela qu’il faut écrire 0xFF ou 0b11111111.
Il est aussi possible de mettre un seul bit de son choix à 1 ou à 0, en utilisant la commande. PORT suivi de la lettre du port suivi de la commande bits.numéro du bit
Par exemple pour mettre le bit 4 du port B à 1 :
PORTBbits.RB3 = 1 ;