« Kidule Ascenseur » : différence entre les versions

Contenu supprimé Contenu ajouté
Marc0NICOLE (discussion | contributions)
Marc0NICOLE (discussion | contributions)
Aucun résumé des modifications
Ligne 115 :
Le mieux, c'est de copier ce bout de programme dans votre programme, pour ne pas avoir à tout déclarer à la main. Pour l'atelier, vous trouverez un fichier '''hardwareAsc.h''' déjà présent dans le répertoire.
 
= Test de tout le matériel =
= TestAsc01.pde =
On va commencer par un tout petit programme pour comprendre le début de la programmation.
 
Ce programme ne fait presque rien: si on presse sur le bouton du Rez, cela allume la Led 0 du Dé:
 
<source lang="C">
//Si on presse sur le bouton du Rez du kidule Ascenseur, cela allume la Led 0 du kidule Dé
#include "hardwareAsc.h" // Toutes les définitions
 
void setup()
{
setupHard();
}
 
void loop()
{
if (BoutonRez==Presse) {
Led0 = Allume;
}
else {
Led0 = Eteint;
}
}
</source>
== Explications ==
Examinons ce petit programme pas à pas:
=== Déclarations de tout le Hardware ===
<source lang="C">
#include "hardwareAsc.h"
</source>
indique au compilateur qu'il faut inclure un autre fichier. C'est comme si on avait tapé toutes les lignes contenues dans ce fichier. C'est bien plus lisible de n'avoir qu'a inclure ce fichier, plutôt que de le recopier. ici, on inclu le fichier [[#hardwareAsc.h|hardwareAsc.h]] qui contient toutes les déclarations nécessaires.
 
=== Initialisation ===
<source lang="C">
void setup()
{
setupHard();
}
</source>
Dans l'environnement Pinguino, il faut impérativement déclarer une fonction '''setup()''' qui est appelée tout au début du programme une fois.
{{Définition|titre=fonction|contenu=
Une fonction est un petit bout de programme que l'on pourra appeler autant de fois que l'on veut. On lui donne un nom (ici setup). Ensuite, c'est comme si le langage avait un mot de plus.
On déclare une fonction en écrivant '''void''', le nom de la fonction (qui ne doit pas avoir d'espace, ni d'accent... que des lettres) suivit de '''()'''
Puis, on écrit le bout de programme que cette fonction représente entre '''{''' et '''}'''
}}
 
Pour l'instant, on se contente d'appeler la fonction '''setupHard()''' qui a été déclarée dans le fichier [[#hardwareAsc.h|hardwareAsc.h]]. Celle-ci configure le PIC avec les bonnes entrées et sorties pour ces deux Kidules.
 
=== Boucle principale ===
Pinguino demande que l'on déclare une 2eme fonction qui doit s'appeler '''loop()'''. Cette fonction est appelée de manière continue après setup(). c'est elle qui contient ce que notre programme doit faire inlassablement.
<source lang="C">
void loop()
{
if (BoutonRez==Presse) {
Led0 = Allume;
}
else {
Led0 = Eteint;
}
}
</source>
Ce qui devient de plus en plus intéressant c'est de comprendre ce qui fait que l'on peut lire un bouton et allumer ou éteindre une LED.
 
On va commencer par le milieu:
<source lang="C">
Led0 = Allume;
</source>
 
{{Définition|titre=Instruction|contenu=
la ligne '''Led0 = Allume;''' est ce que l'on appelle en C une instruction. Une instruction est par exemple le remplissage d'une variable avec une valeur.
Un programme est une suite d'instruction les unes après les autres. Chaque instruction est traduite par le [[compilateur]] dans un langage de mini instructions que le processeur sait comprendre et exécuter.
En C, les instructions se terminent pas un ''';''' (point-virgule). '''ATTENTION''', c'est très facile à oublier et le compilateur n'aime pas du tout en donnant un message d'erreur pas facile à comprendre :-(
}}
{{Principe|titre=En C les majuscules et minuscules sont importantes|contenu=
'''ATTENTION''' le compilateur C pense que '''LED0''' ou '''Led0''', ce n'est pas du tout la même chose !!! alors regardez bien lorsque cela ne marche pas comme prévu.
 
Encore une chose: les espaces montrent la fin d'un mot (une variable, une fonction ou un mot clé comme if...). Donc impossible d'appeler la variable qui pilote la LED '''Led 0'''. le compilateur ne comprendra pas!
Pour éviter cela, on utilise souvent les majuscules minuscules lorsque l'on veut faire une petite phrase, comme par exemple '''BoutonRez''' pour parler du bouton du rez.
Dans les noms, on '''doit''' commencer par une lettre, puis on peut mettre des lettres et des chiffres et même des '_' si on veut (mais c'est moche! alors pas trop souvent)
}}
 
Pour savoir si un bouton est pressé ou non, on peut utiliser un '''test''' que l'on fait avec l'instruction '''if'''
{{Définition|titre=if|contenu=
l'instruction if est une instruction qui permet de faire un test. Elle s'écrit '''if''' (''condition'') ''instruction à faire si test vrai'' '''else''' ''instruction à faire si test faux''
 
La ''condition'' peut être faite de n'importe quelle expression qui retourne soit vrai soit faux, comme par exemple '''==''' qui regarde si on est égal à gauche et a droite.
 
'''ATTENTION''': '''==''' compare et '''=''' met quelque chose dans une variable. Malheureusement C permet d'écrire BoutonRez = Presse, ce qui ne fait pas du tout ce que l'on veut: cela met un 0 dans BoutonRez (ce qui ne fait rien car c'est une entrée) et dit que la condition est fausse (parce que 0).
 
Comme souvent, on ne peut pas mettre qu'une instruction, on peut mettre un bloc d'instruction qui commence par '''{''' et fini par '''}'''. et pour bien comprendre ce que l'on fait, on met le tout sur plusieurs ligne, bien aligné avec des espaces pour que ce soit très clair où est la condition, ce que l'on fait si c'est vrai et ce que l'on fait sinon.
 
la partie '''else''' n'est pas obligatoire.
}}
 
{{Définition|titre=Bloc d'instruction {..}|contenu=
En C, il a y beaucoup d'instruction comme '''if''' qui ne veulent qu'une instruction a exécuter si la condition est vraie. Mais on a souvent besoin de plusieurs instruction. On peut alors faire un bloc d'instructions en commençant par '''{''' et en terminant par '''}'''.
}}
 
Toujours dans notre fichier [[#hardwareAsc.h|hardwareAsc.h]], on a définit
<source lang="C">
#define BoutonRez PORTBbits.RB2
#define Presse 0
</source>
Comme pour la Led, on voit que le bouton du Rez est connecté sur la patte RB2 du processeur qui a lui-même une variable PORTB qui contient RB2. Cette variable peut cette fois être lue (car c'est une entrée) et elle vaut 0 si le bouton et pressé (= 0 Volt) et 1 si il n'est pas pressé (5Volts). Comme pour la LED, c'est plus simple de donner des mots différents avec #define pour que l'on comprenne bien ce qui se passe.
 
== 1er Exercice==
en partant de ce programme, essayer de faire en plus que la Led 1 s'allume si on ne presse pas sur le bouton du Rez et qu'elle s'éteigne si on presse (le contraire de la Led0 !)
{{Solution|contenu=
<source lang="C">
#include "hardwareAsc.h"
 
void setup()
{
setupHard();
}
 
void loop()
{
if (BoutonRez==Presse) {
Led0 = Allume;
Led1 = Eteint;
}
else {
Led0 = Eteint;
Led1 = Allume;
}
}
</source>
Facile non ??
}}
 
== 2eme Exercice ==
en partant du programme précédent, faire en sorte que la Led1 s'allume si on presse sur le Bouton1er et s'éteigne si on presse sur le bouton du Rez
{{Solution|contenu=
<source lang="C">
#include "hardwareAsc.h"
 
void setup()
{
setupHard();
}
 
void loop()
{
if (Bouton1er==Presse) {
Led1 = Allume;
}
 
if (BoutonRez==Presse) {
Led0 = Allume;
Led1 = Eteint;
}
else {
Led0 = Eteint;
}
}
</source>
Facile non ??
}}
 
= TestAsc02.pde =
Avant de commencer de faire un vrai programme pour l'ascenseur, il est bon de faire un petit programme de test qui vérifie que toutes les déclarations que l'on a fait sont correcte et correspondent bien au hardware que l'on a.
 
Ligne 349 ⟶ 189 :
 
</source>
 
On a déjà vu un bonne partie des instructions, mais il y en a maintenant des nouvelles:
<source lang="C">
long i;
</source>
Ce code déclare une nouvelle variable et lui donne un nom.
{{Définition|titre=Déclaration de variable|contenu=
Une déclaration de variable commence par le type de la variable. ce qui existe qui est utile pour nous:
* '''byte''' c'est un nombre entre 0 et 255. C'est en fait ce que le PIC peut mettre dans une case de sa mémoire et il est capable de faire des calculs simples en un coup avec des bytes. Lorsque l'on a pas besoin de plus, c'est bien de demander qu'un byte.
* '''int''' un nombre qui va de -32768 à plus 32767, cela convient bien pour beaucoup de choses, mais c'est plus compliqué pour le PIC, il doit faire plusieurs instructions pour y arriver et cela lui prend 2 cases mémoires pour mettre cette variable.
* '''long''' un grand nombre qui va de -2'147'483'648 à +2'147'483'647. Mais il faut 4 case mémoires est plusieurs instructions pour chaque calculs pour un PIC. (par contre pour un PC moderne, il fait n'importe quel calcul en un seul coup avec des nombres comme ceux-là).
 
ensuite on donne le nom de la variable:
*doit commencer par une lettre (ou '''_''')
*suivit de chiffres ou de lettres ou '''_'''
 
Si on veut, on peut encore lui donner quelle valeur on veut mettre au début en écrivant '''=''' ''valeur''
 
Et on termine par ''';''' comme n'importe quelle instruction
}}
 
{{Définition|titre=for|contenu=
Ligne 395 ⟶ 215 :
 
== Exercice pratique ==
# Lancez le programme et laisser une fois clignotterclignoter toutes les LED.
# Pressez sur le Poussoir du kidule Dé jusqu'à ce que toutes les LED s'allument.
# Ensuite Pressez sur le bouton du 1{{er}} jusqu'à ce que que plus aucune LED du Kidule Dé ne soit allumées.