Etape 48 : Logiciel : temps de retard et Animations
Un des moyens plus efficaces de le faire est d’utiliser un compteur global qui obtient incrémenté dans une routine d’interruption. Dans la routine d’interruption du service pour Timer3, il y a une variable globale de 32 bits (count32) qui est incrémentée à chaque interruption. Cette variable sera alors utilisée dans la plupart de nos délais d’interruption avec une fonction appelée "Time_Check (UINT32 * mark, UINT16 intervalle)' permet de suivre le temps de retard tout en gardant le programme qui coule. Nous allons créer une animation exemple qui éclaire chaque ligne sur la grille de LED, un à la fois. Nous l’appellerons « Our_Test_Animation(void) ».
Our_Test_Animation(void)
1) dans le fichier Globals.h, dédier seq [x] à votre fonction que vous créez. « x » étant une variable inutilisée dans l’array seq. Pour cet exemple, nous utiliserons seq [24].
2) ajouter le prototype de fonction à votre fichier d’en-tête et de mettre en place la fonction dans le fichier de programme C. Pour cet exemple, nôtre sera « UINT8 Our_Test_Animation(void) ».
3) déclarez une variable de 'statique UINT8 last_seq' qui est égale à 0xFF et variable 'statique UINT32 tmark' qui est égale à 0. Ces variables doivent être statiques pour que la routine souvient leurs valeurs lorsqu’il effectue une boucle à travers l’animation.
4) nous aurons besoin d’au moins une variable locale appelée « retard » qui est utilisé pour faire référence à 'count32' dans la fonction Time_Check(). « retard » fait exactement comment ça s’appelle, elle retarde le programme un laps de temps spécifié (8ms/interrupt * valeur de « retard »).
5) La valeur de réinitialisation pour seq [x] est 0xFF. Lorsque la routine recommence, il exécutera le ' si (seq [24] == 0xFF)' morceau de code, c’est où nous avons mis en place certaines variables pour le démarrage de notre animation.
6) le prochain ' si (seq [24]! = last_seq)' instruction vérifie pour voir si il y a une nouvelle séquence. S’il existe, il mettra à jour last_seq à la valeur actuelle de la seq [24], il sera ensuite mettre à jour notre référence de synchronisation (tmark) et ensuite mettre à jour le code de l’animation.
7) ' si (Time_Check (& tmark, retard))' vérifie si l’intervalle de temps spécifié s’est écoulé depuis la dernière boucle, par le biais de la fonction. Si oui, il mettra à jour seq [24] à la séquence suivante et l’animation sera mis à jour de la prochaine boucle par le biais de la fonction.
8) ' si (seq [24] > 31)' vérifie si toutes les séquences ont été exécutées et que l’animation est terminée. La valeur de « 31 » dépend de combien de séquences vous avez dans votre routine (nous avons 32 séquences dans cette routine, 0 - 31). Si toutes les séquences ont été exécutées, nous seq [24] la valeur sa valeur par défaut de 0xFF et renvoient une erreur 0 indiquant que l’animation est terminée.
9) si l’animation n’a pas exécuté toutes ses séquences, elle retourne un 1.
Croix de référence les étapes ci-dessus avec le code fini en photo #4. En créant une animation de cette façon, nous sommes limités aux 255 séquences (255 séquences + 1 séquence de réinitialisation) parce que nous utilisons une variable 8 bits pour seq [x]. Si vous avez besoin de plus de 255 images, vous pouvez changer seq [x] à une variable 16 bits et ont des séquences jusqu'à 65535. Si vous avez besoin de synchronisation plus précis que Timer3 peut offrir (~ 8ms par interruption), vous pouvez configurer Timer5 d’interrompre plus tôt et de s’y installer le compteur global (count32). Enfin, les animations que le code peut prendre en charge la durée par défaut est 50. Si vous avez besoin de plus de 50 animations interruption retardée, vous avez juste besoin d’augmenter la valeur de la constante SEQ_AMOUNT (typedefs.h) à la valeur dont vous avez besoin.
La principale limite à l’utilisation d’un délai d’interruption comme celui-ci est que notre boucle principale doit être efficace et nous ne pouvons pas perdre trop de temps dans une routine dans la boucle principale. Le programme doit continuer à circuler tout le chemin à travers car si elle s’arrête pour cela diffèrerait trop longtemps le moment où le reste des routines avec elle. Photo #5 contient un autre exemple pour une animation appelée Cycle_Colors(void) qui utilise le même format de délai d’interruption.