Apprendre à programmer un PIC Partie II - Boutons et LED Historique des versions Version 1.0 16.11.2007 oca Table des matières Introduction...2 Faire clignoter une LED... 2 Allumer et éteindre une LED avec deux boutons... 5 Allumer et éteindre une LED avec un bouton ON/OFF... 7 1
Introduction Dans cette partie, nous allons nous familiariser avec la programmation. En utilisant des boutons et des LEDs. Bien sûr, il existe des solutions plus simples que les PIC pour jouer avec des boutons et des LED, mais ceci nous permettra d'assimiler quelques bases avant de passer à des notions plus interessantes des PIC. Faire clignoter une LED Lorsque l'on apprend un langage informatique, On commence souvent par écrire un programme qui consiste a afficher "Hello World". Avec la pluspart des langages comme le C, c'est très simple, mais avec un PIC, afficher "Hello World" n'est pas évident puisque l'on a pas d'écran pour le moment... j'ai bien dit pour le moment ;) Nous allons donc faire plus simple, et commencer par faire clignoter une LED. Voici tout de suite le programme... pin_b0_direction = output pin_b0 = on Passons sur la première ligne "" qui initialise juste deux trois choses pour nous et regardons directement la seconde ligne : pin_b0_direction = output Un PIC possède plusieurs pin, qui peuvent servir d'entrée ou de sortie. Dans ce programme nous allons utiliser un pin nommée "b0" comme une sortie, c'est a dire que nous allons faire varier la tension sur cette pin ce qui allumera notre LED. Nous avons ensuite la ligne : Toutes le instruction qui se trouve entre "" et "" seront executées cycliquement temps que le PIC est sous tension. La ligne suivante est pin_b0 = on qui met une tension (celle d'alimentation) sur la sortie B0 (et donc cela allume la LED. Cette ligne permet d'attendre une seconde sans rein faire... sinon la LED clignoterait trop vite! 2
Apprendre à programmer un PIC On éteint la LED Et on attend à nouveau une seconde avant de recommencer au debut de la boucle... Voici un petit schéma de principe (sans la partie alimentation et sans le clock). Figure 1. Un PIC et une LED sur la pin B0 Le programme peut être testé avec le simulateur "PICShell". afin que PICShell puisse dessiner la LED, Il faut ajouter la ligne ";@led_red pin_b0" qui ne modifie pas le programme, mais qui indique a PICShell qu'une led rouge se trouve sur la pin B0 Il faut également ajouter la ligne suivante : ";@use_virtual_delay" qui indique a PICShell que le temps d'attente est simulé. Sans cette ligne, PICShell n'arrive pas a simuler l'instruction "" assé rapidement. Voici donc le programme complet à tester dans PICShell : ;@use_virtual_delay ;@led_red pin_b0 pin_b0_direction = output pin_b0 = on 3
Partie II - Boutons et LED Et voici une image du resultat, avec la petite led rouge dans le carré en bas à droite. Figure 2. Un PIC et une LED sur la pin B0 4
Allumer et éteindre une LED avec deux boutons Le programme suivant utilise deux boutons et une led. Le premier bouton allume la led. Le deuxième bouton éteint la led. Le premier bouton se trouve sur la pin_c0, configurée come une entrée Le deuxième bouton se trouve sur la pin_c1, configurée come une entrée La led se trouve sur la pin B0 configurée comme une sortie Voici le shéma de principe Figure 3. Deux boutons, un PIC et une LED Et voici le code du programme: ;@led_red pin_b0 ;@mpd but_on pin_c0 ;@mpd but_off pin_c1 pin_b0_direction = output pin_c1_direction = input if pin_c0 == on then pin_b0 = on if pin_c1 == on then Ce programme utilise une nouvelle annotation : ";@mpd". Elle ne change rien au fonctionnement du programme, mais elle indique au simulateur PICShell qu'il y a un bouton à traiter. Attention, il existe plusieurs sorte de bouton... "mpd" veut dire : Momentary Pull Down 5
Un bouton momentané est un bouton qui ne garde pas son état (il revient à sa position initiale lorsque l'on arrète de presser dessus...) Le Pull Down est un système qui comporte un bouton et une résistance, qui va appliquer une tension de 0V lorsque l'on ne presse pas sur le button, et de VCC (5V par ex.) lorsque l'on presse dessus. Voici le schéma d'un "Momentary Pull Down" Figure 4. Le Momentary Pull-Down On utilise l'instruction "if" pour tester si un bouton est pressé. "if pin_c0 == high then" veut dire : "si la pin C0 est "on" alors..." Notre programme pourrait donc être traduit par : si la pin c0 est "on" alors allume la led qui est sur la pin b0 si la pin c1 est "on" alors éteint la led qui est sur la pin b0 6
Apprendre à programmer un PIC Allumer et éteindre une LED avec un bouton ON/OFF Le plus simple est d'utiliser un interrupteur "permanent", comme ceci : Figure 5. Un interrupteur "permanent" de type "Pull-Down" Avec le code suivant : ;@no_debug_all ;@led_red pin_c1 ;@ppd button pin_c0 pin_c1_direction = output if pin_c0==high then pin_c1 = high else pin_c1 = low Que l'on peut même simplifier de la manière suivante, puisque dans ce programme, la pin_c1 et pin_c0 ont toujours le même état (high ou low) ;@no_debug_all ;@led_red pin_c1 ;@ppd button pin_c0 pin_c1_direction = output pin_c1 = pin_c0 Dans ce cas, l'utilisation d'un bouton "permant" simplifie bien les choses... car il garde lui même "méchaniquement" son état. Dans certains cas, les boutons permanents peuvent cependant poser problèmes, Par exemple dans le cas ou l'on voudrait avoir un bouton "reset" qui éteint la led... Voici donc comment faire un ON/OFF avec un bouton momentané, qui lui ne garde pas son état. 7
Partie II - Boutons et LED Figure 6. Un interrupteur "momentané" de type "Pull-Down" ;@no_debug_all ;@led_red pin_c1 ;@mpd button pin_c0 pin_c1_direction = output pin_c1 = low if pin_c0 == high then if pin_c1 == high then pin_c1 = low else pin_c1 = high while pin_c0==high loop On a donc deux tests "if" l'un dans l'autre... le premier test nous permet de savoir si on a pressé sur le bouton, le deuxième test regarde si la led est allumer au moment ou éteinte, de façon à pouvoir inverser son état (l'éteindre si elle était allumer, et l'allumer si elle était éteinte...). On peut également simplifier ce programme, car JAL propose le signe "!" qui permet justement d'inverser un état... ;@no_debug_all ;@led_red pin_c1 ;@mpd button pin_c0 pin_c1_direction = output pin_c1 = low if pin_c0 == high then pin_c1 =! pin_c1 while pin_c0==high loop 8
La ligne "pin_c1 =! pin_c1" sert à mettre la pin c1 dans l'état inverse de son état actuel. Regardons maintenant cette drôle de ligne "while pin_c0==high loop "... Elle sert à attendre que l'on relache le bouton. Si on ne met pas cette ligne, la led va clignoter très vite lorsque l'on laisse le bouton pressé...pire, l'état de led va être difficle à prevoir lorsque l'on relache le bouton...la difficulté, c'est de garder en tête que nous sommes dans une boucle ()... Finalement le mieux, c'est encore d'essayer... Faites un petit test dans PICShell en supprimant cette ligne "while pin_c0==high loop " et vous verrez le problème... On est bien d'accord, l'utilisation d'un bouton momentané est un peu plus compliqué que l'utilisation d'un bouton permanent... mais cela à l'avantage d'avoir "toute la logique au même endroit, dans le PIC.". Dans des programme plus complet, l'utilisation de bouton momentané devient vraiment un plus... 9