Exercice c Ecrire un programme qui allume successivement les huit leds de la carte MI en fonction de la position d'un des potentiomètre, avec une une fonction barre ou points, en fonction de la position dee l'intérupteur ******************************************************************************* Tout d'abord, il faut faire une lecture du potentiomètre pour vérifier les valeurs obtenues lors de la lecture des potentiomètres sur les entrées P8 et P9. Comme nous avons 2 potentiomètres sur la carte et que les raccordement électriques sont inversés, nous allons utiliser les programmes Mi-Test-IN8 et Mi-Test-IN9 pour éffectuer des lectures de contrôle. Nous remarquons, en considérant la rotation "logique", que P8 varie de 288 à 1 et que P9 varie de 1 à 70. Comme nous n'avons que 8 leds, il faudra adapter les valeurs lues pour qu'elles soient comprises entre 0 et 7. La première idée qui vient à l'esprit est de diviser la valeur lue par (valeur-maxi/7). Le problème, c'est comme le STAMP travaille en entier, nous aurons les résultats compris entre 0 et 0,9999 qui auront la valeur 0, les résusltats compris entre 1 et 1,9999 qui auront la valeur 1, et ainsi de suite jusqu'aux valeurs comprises entre 6 et 6,9999 qui retournerons la valeur 6, alors que le 7 lui, n'aurra cette valeur que pour la lecture MAXI. ce qui provoquera un déséquilibre dans la lecture. Donc, pour avoir des intervalles de lecture réguliers il faudra diviser la valeur maximale par 8 et non par 7. Ce qui nous donne 288/8=36 et comme 288/36=8, il faudra diviser la lecture de P8 par la valeur 37 et non 36 pour éviter d'avoir la valeur 8 qui provoquerait une erreur, les leds étant définies de 0 à 7. Et pour P9, nous avons les valeurs 70/8=8,75 et nous choisirons donc 9. Lors de l'utilisation des programmes de test, nous avons remarqués que sur l'entrée 8, les valeurs étaient inversées (288 pour la position gauche et 0 pour la position droite) alors que pour l'entrée 9, les valeurs lues correspondent à l'ordre logique. Comme nous ne pouvons inverser le raccordement du potentiomètre placé sur l'entrée 8, il faudra inverser la logique de contrôle de la lecture. Donc, si pour l'entrée 9 la valeur de l'indice de LED (i) sera donnée par le calcul i=pot/9 (pot étant la valeur lue), par contre, lors de l'utilisation de l'entrée 8, le calcul sera i=7-(pot/37), ce qui nous donneras bien 0 pour la position de gauche et 7 pour la position de droite. Pour le choix de la fonction point/barre une simple lecture de l'entrée 10 nous permettra d'attribuer la fonction point à la valeur 0 et la fonction barre à la valeur lue 1. Enfin, tout ceci devra trouver sa place dans un boucle infinie qui lira en permamence l'état des entrées et affichera les résultats. ******************************************************************************** Structure du programme pour la lecture sur IN8 ' Valeurs de lecture : 288 à 0 BEGIN DECLARE pot AS WORD ' Variable de lecture du potentiomètre DECLARE genre AS BIT ' Variable de lecture de l'intérupteur DECLARE i AS NIBBLE ' Variable d'indice pour la position de la led DECLARE j AS NIBBLE ' Variable de calcul LET i=1 DO WHILE i = i ' Début de la boucle infinie LET pot = (valeur de lecture) LET genre = (valeur de lecture) LET i=7-(pot/37) IF genre = 1 ' Fontion Barre j=0 ' Mise à zéro de la variable de comptage DO ' Comptage pour les 8 leds IF j <= i ' Pour chaque indice inférieur ou égal à i ' Allumer la led correspondante ELSE ' Pour chaque indice supérieur à i ' Eteindre la LED correspondante ENDIF LET j=j+1 ' Incrémentation de l'indice UNTIL j > 7 ' Bouclage ELSE ' Fonction Point j=0 ' Mise à zéro de la variable de comptage DO ' Comptage pour les 8 leds IF j <= i ' Pour chaque indice égal à i ' Allumer la led correspondante ELSE ' Pour chaque indice différent de i ' Eteindre la LED correspondante ENDIF LET j=j+1 ' Incrémentation de l'indice UNTIL j > 7 ' Bouclage ENDIF ENDDO ' Fin de la boucle infinie END ' fin du programme ******************************************************************************** Structure du programme pour la lecture sur IN9 ' Valeurs de lecture : 0 à 70 BEGIN DECLARE pot AS WORD ' Variable de lecture du potentiomètre DECLARE genre AS BIT ' Variable de lecture de l'intérupteur DECLARE i AS NIBBLE ' Variable d'indice pour la position de la led DECLARE j AS NIBBLE ' Variable de calcul LET i=1 DO WHILE i = i ' Début de la boucle infinie LET pot = (valeur de lecture) LET genre = (valeur de lecture) LET i=pot/9 IF genre = 1 ' Fontion Barre j=0 ' Mise à zéro de la variable de comptage DO ' Comptage pour les 8 leds IF j <= i ' Pour chaque indice inférieur ou égal à i ' Allumer la led correspondante ELSE ' Pour chaque indice supérieur à i ' Eteindre la LED correspondante ENDIF LET j=j+1 ' Incrémentation de l'indice UNTIL j > 7 ' Bouclage ELSE ' Fonction Point j=0 ' Mise à zéro de la variable de comptage DO ' Comptage pour les 8 leds IF j <= i ' Pour chaque indice égal à i ' Allumer la led correspondante ELSE ' Pour chaque indice différent de i ' Eteindre la LED correspondante ENDIF LET j=j+1 ' Incrémentation de l'indice UNTIL j > 7 ' Bouclage ENDIF ENDDO ' Fin de la boucle infinie END ' fin du programme '****************************************************************************** 'Programme pour le STAMP 'Pour l'affichage point/barre nous utiliserons le registre OUTL dans lequel 'nous mettrons le résultat de la fonction << (décalage à gauche) 'avec la valeur calculée de i pour le décalage et avec le nombre 1 (%00000001) 'pour la fonction point ou avec le nombre 255 (%11111111) pour la fonction barre. 'Ceci nous permettra de mettre à jour l'allumage des leds en une seule opération. 'Exercice : 04-2C8 'Vumètre avec lecture sur l'entrée 8 (288 à 1) 'Definition des variables de travail pot VAR WORD 'valeur lue sur le potentiomètre genre VAR Bit 'type d'affichage 0=point, 1=barre i VAR Byte 'Indice de position boucle: HIGH 8 ' Mise a 5V de l'I/O 8 PAUSE 1 ' Attente avant lecture RCTIME 8,1,pot ' Lecture de l'I/O 8 genre = IN10 ' Lecture de l'intérupteur i=7-(pot/37) ' calcul de l'indice de la led IF genre=0 THEN point ' Test de la fonction point-barre outl = 255 >> (7-i) ' affichage par barre GOTO sortie ' Sortie vers bouclage point: outl = 1 << i ' affichage par point sortie: GOTO boucle ' Bouclage "infini" END ' fin du programme 'Exercice : 04-2C9 'Vumètre avec lecture sur l'entrée 9 (1 à 70) 'Definition des variables de travail pot VAR Byte 'valeur lue sur le potentiomètre genre VAR Bit 'type d'affichage 0=point, 1=barre i VAR Byte 'Indice de position boucle: LOW 9 ' Mise a la masse de l'I/O 9 PAUSE 1 ' Attente avant lecture RCTIME 9,0,pot ' Lecture de l'I/O 9 genre = IN10 ' Lecture de l'intérupteur i=pot/9 ' calcul de l'indice de la led IF genre=0 THEN point ' Test de la fonction point-barre outl = 255 << i ' affichage par barre GOTO sortie ' Sortie vers bouclage point: outl = 1 << i ' affichage par point sortie: GOTO boucle ' Bouclage "infini" END ' fin du programme