Micro-Info asbl --------------- La Vague version 5 pour AtMega 16 --------------------------------- Description des tâches ---------------------- Utilisation de la touche S5 Boucle de clignotement des Leds en vague 3 avec attente d'une action sur S5 Les paramètres de la vague seront définis à travers une variable "Sens" et une variable "Durée". A chaque boucle Horlogique et Antihorlogique, aller à la routine de LectureBouton et tester la touche S5 et si il y a eu appuis, effectuer le traîtement suivant: Si appuis court, le sens sera changé. Si appuis long, changement de la durée selon une fonction "triangle" ************************************************************************ Structure du programme ************************************************************************ La structure du programme est récupérée du programme "optimisé". BEGIN DECLARE pas AS byte ' numéro du pas, varie de 0 à 29 DECLARE intensité AS byte ' "niveau" pour chaque led, peut varier de 0 à 36 ' puis valeur de l'intensité d'éclairement DECLARE n AS nibble ' indice du numéro de led, varie de 0 à 7 DECLARE led(8) AS nibble ' Array de 8 leds, intensité de chaque led, varie de 0 à 255 DECLARE durée AS byte ' définit la durée d'éclairement des leds DECLARE i AS byte ' variable de comptage pour la durée DECLARE nbre AS byte ' définit le nombre de niveaux d'intensité DECLARE a AS Byte ' constante calculée, définit le nombre de pas DECLARE b AS Byte ' constante calculée, définit un seuil de test DECLARE c AS Byte ' constante calculée, définit un seuil de test DECLARE d AS Byte ' constante calculée, définit le multiplicateur ' utilisé pour allumer la led avec PWM DECLARE S5 AS Bit ' Lecture du 3ième poussoir à partir du bas ' ("1" au repos,"0" Appuyé DECLARE VitSens AS Bit ' Sens de la variation de la vitesse ("0 Augmente, "1" Diminue ) DECLARE Longueur AS Bit ' Variable définissant la longueur d'appuis sur S5 DECLARE Sens AS Bit ' Définition du sens de "Rotation" de la vague DECLARE Compteur AS Byte ' Va servir à déterminer la durée d'appuis sur S5 LET durée=1 ' définit durée comme une constante. Ceci nous ' permettra de "jouer" avec la durée d'éclairement ' afin de déterminer le meilleur effet. LET nbre=16 ' définit le nombre de niveaux d'intensité. Ici ' aussi, nous pourrons "jouer" sur cette valeur ' pour varier les différents effets. LET a=nbre*2-3 ' définit a, b , c et d comme des constantes LET b=a+1 ' les valeurs a, b, c et d étant dérivées de nbre. LET c=nbre-1 LET d=INT(255/nbre) DO WHILE pas=pas ' boucle "infinie" IF Sens = 1 THEN ' Si Sens est "horlogique" GOSUB Horlogique ' Aller à la routine qui fait "tourner" ELSE ' les leds dans le sens horlogique GOSUB Antihorlogique ' Aller à la routine qui fait "tourner" ENDIF ' les leds dans le sens antihorlogique ENDDO SUB Horlogique ' Routine de la vague dans le sens horlogique GOSUB LectureBouton ' Routine de traîtement de S5 ' ' ENDSUB SUB Antihorlogique ' Routine de la vague dans le sens Anti-horlogique GOSUB LectureBouton ' Routine de traîtement de S5 ' ' ENDSUB SUB LectureBouton ' Routine de traîtement de S5 IF THEN ' Si la touche S5 n'est pas appuyée IF Compteur = 1 THEN ' S5 a été appuyé et relâché rapidement, ' Le compteur n'a changé qu'une seule fois LET Sens = Sens + 1 ' On inverse le Sens de défilement LET Longueur = 0 ' Appuis court sur S5 ENDIF Let Compteur = 0 ' Remise à zéro du Compteur ELSE LET Compteur = Compteur + 1 ' Incrémentation du Compteur IF Compteur > 5 THEN ' Si Appuis Long ( Valeur arbitraire) GOSUB AppuisLong ' Traîtement d'un Appuis Long LET Longueur = 1 ' Nous avons un Apuis Long IF Compteur > 254 THEN ' Dépassement de la valeur Maximale LET Compteur = 6 ' Valeur minimale pour Appuis Long ENDIF ENDIF ENDIF ENDSUB SUB AppuisLong ' Routine de gestion du la touche S5 IF Longueur = 1 THEN ' Nous avons un Appuis Long sur la touche IF VitSens = 0 THEN ' Si le sens est en augmentation LET Duree = Duree + 1 ' Augmentation de Duree (Ralentit IF Duree > 6 THEN ' Test de la butée haute LET Duree = 5 ' MàJ de Duree LET VitSens = 1 ' et inversion du sens ENDIF ELSE ' Si le sens est en diminution LET Duree = Duree - 1 ' Diminution de Duree ( Accélère IF Duree < 2 THEN ' Test de la butée basse LET Duree = 1 ' MàJ de Duree LET VitSens = 0 ' et inversion du sens ENDIF ENDIF ENDIF ENDSUB END Layout pour ATMega16 -------------------- $regfile = "m16def.dat" ' Chargement de la bibliothèque $crystal = 8000000 ' Définition de la fréquence du quartz $hwstack = 32 ' Valeur par défaut pour hardware stack $swstack = 10 ' Valeur par défaut pour SW stack $framesize = 40 ' Valeur par défaut pour frame space Ddra = &B11111111 ' Toutes les pins du port A en sortie Porta = &B00000000 ' Toutes les pins mises à zéro Ddrd = &B00000000 ' Toutes les pins du port D en entrée Portd = &B11111011 ' Toutes avec PullUp sauf D2 qui est raccordée à S5 Dim Pas As Byte ' Numéro du pas, varie de 0 à 29 Dim Intensite As Byte ' "niveau" pour chaque led, peut varier de 0 à 36 ' puis valeur de l'intensité d'éclairement Dim N As Byte ' Indice du numéro de led, varie de 0 à 7 Dim Led(8) As Byte ' Intensité de chaque led, varie de 0 à 255 Dim Duree As Byte ' Définit la durée d'éclairement des leds Dim I As Byte ' Variable de comptage pour la durée Dim J As Byte Dim K As Byte Dim L As Byte Dim Nbre As Byte ' Définit le nombre de niveaux d'intensité Dim A As Byte ' Constante calculée, définit le nombre de pas Dim B As Byte ' Constante calculée, définit un seuil de test Dim C As Byte ' Constante calculée, définit un seuil de test Dim D As Byte ' Constante calculée, définit le multiplicateur ' utilisé pour allumer la led avec PWM Dim Sens As Bit ' Définition du sens de "rotation" de la vague Dim Vitsens As Bit ' Sens de comptage ou décomptage de Duree Dim Longueur As Bit ' Variable définissant la longueur de l'appuis sur S5 Dim Compteur As Byte ' Compteur de test de durée de la touche S5 appuyée Dim S5 As Bit ' Lecture du 3ième poussoir à partir du bas ' ("1" au repos,"0" Appuyé Let Duree = 2 ' Définit durée comme une constante. Ceci nous ' permettra de "jouer" avec la durée d'éclairement ' afin de déterminer le meilleur effet. ( Choisi valeur 5 ) Let Nbre = 16 ' Définit le nombre de niveaux d'intensité. Ici ' aussi, nous pourrons "jouer" sur cette valeur ' pour varier les différents effets. Let A = Nbre * 2 ' Définit a, b , c et d comme des constantes Let A = A - 3 ' Les valeurs a, b, c et d étant dérivées de nbre. Let B = A + 1 Let C = Nbre - 1 Let D = 255 / Nbre Let Sens = 1 Let Compteur = 0 Let Longueur = 0 Let Portd = 0 ------------------------------------------------------------------------------ Principal ------------------------------------------------------------------------------ Do ' Début de la boucle "infinie" If Sens = 1 Then Gosub Horlogique Else Gosub Antihorlogique End If Loop ' Fin de la boucle infinie End ' Fin du programme --------------------------------------------------------------------------- Sous-routines Horlogique: Gosub Lecturebouton ' ( Idem que la vague 4 ) ' Return Antihorlogique: Gosub Lecturebouton ' ( Idem que la vague 4 ) ' Return Lecturebouton: ' Routine de (appuis sur S5) If Pind.2 = 1 Then ' S5 est relâché If Compteur = 1 Then ' Compteur n'a changé qu'une seule fois Toggle Sens ' On inverse le sens de défilement Let Longueur = 0 End If Let Compteur = 0 Else Incr Compteur If Compteur > 4 Then Gosub Appuislong Let Longueur = 1 If Compteur > 254 Then Let Compteur = 5 End If End If End If Return Appuislong: If Longueur = 1 Then ' Nous avons un appuis long If Vitsens = 0 Then ' Test le sens de comptage ou décomptage de Duree Incr Duree ' On incrémente la durée If Duree > 6 Then ' Valeur maximale dépassée Let Duree = 5 ' Valeur maximale choisie pour un bel effet Let Vitsens = 1 ' On change la variable pour décrémenter au End If ' prochain passage Else Decr Duree ' On décrémente la durée If Duree < 2 Then ' Test pour valeur minimale Let Duree = 1 ' Fixe la valeur minimale Let Vitsens = 0 ' On change la variable pour incrémenter au End If ' prochain passage End If End If Return