Le
traitement du temps
Les timers
Le timer 1 est utilisé exclusivement pour générer le signal PPM.
Avec l'Atmega128 à 16 Mhz, sa précision est de 0,5µsec, soit environ 10 fois mieux que la précision d'un servo.
Une
interruption est générée à chaque changement du signal PPM: ce
processus est lancé au démarrage de l'émetteur et fournit en
permanence un signal PPM.
Les
valeurs des voies sont calculées dans la boucle de calcul et sont
exprimées dans la table des variables sous la forme d'un nombre entier
de µsec.
La fonction io_ppm_load transfère ces variables vers le processus ppm.
Pour les détails, voir io_timer.c
Le
timer 3 est cadencé plus lentement, il est utilisé pour les mesures de temps.
Il est
cadencé ici à 64µsec/ et génère une interruption par seconde.
Cette interruption est utilisée pour les chronomètres (à développer).
Le
timer lui-même est lu à la fin de chaque boucle de calcul,pour mesurer la durée d'une boucle de
calcul, exprimée en "ticks" de 64µsec.
Cette durée de boucle se trouve
dans la variable rc.clock_calc. Elle est accessible par le menu Status qui donne le nombre de boucles par seconde.
La vitesse de calcul est importante: plus de 80 boucles/seconde pour un modèle complexe.
Les boutons des menus
Lorsqu'on enfonce ce bouton le programme doit enregistrer UNE entrée, pas plusieurs !
La
fonction io_debounce supprime les rebondissements d'un bouton poussoir.
Elle utilise la variable d'état rc.io_state [i] qui prend les valeurs
suivantes pour le bouton i :
0 = état de repos
ensuite on compte le nombre de cycles
1 à IODEB (valeur 10) = état incertain, on compte le nombre de cycles pendant lesquels le bouton reste enfoncé
dès que ce compteur dépasse IODEB, la variable d'état passe à 128
128 = bouton enfoncé, pas encore lu par la boucle de calcul
la fonction io_getbutton est utilisée pour lire le bouton, elle renvoie 1 et met la variable d'état à 255
255 = bouton enfoncé ET lu par le programme
quand on relache le bouton, on décompte jusqu'à 255-IODEB : état incertain
retour à 0
Le
programme utilise io_getbutton pour lire un bouton. Cette fonction
renvoie une seule fois la valeur 1 lorsque le bouton est enfoncé.
Les trims digitaux
Un
trim digital est constitué d'une paire de boutons. On le remet à zéro
en appuyant sur les deux boutons à la fois. Si on garde le doigt sur le
bouton, la vitesse augmente progressivement.
Ceci est réalisé dans la fonction io_tick, appelée toutes les 100 msec par la fonction io_butread100
La
fonction io_butread100 lit les boutons toutes les 100 msec à l'aide
d'une boucle d'attente, fonction de la variable rc.clock_calc.
La fonction io_tick lit une paire de boutons et accélère progressivement le mouvement.
Un paramètre (io_maxspeed) détermine la vitese maximum:
- en cours de vol la vitesse est
limitée car le pilote ne peut pas suivre l'écran LCD. Un bref signal
sonore est fourni chaque fois que le trim a bougé de 1% .
- lorsqu'on est dans la sélection d'un menu, la vitesse n'est plus
limitée , il n'y a plus de signal sonore et il est indispensable de
suivre l'écran. Ceci s'applique à tous les trims digitaux.
Les chronos
voir les codes opération
©
Copyright 2008 2009 Robert Spilleboudt - Tous droits
réservés.
Projet
rcopensource - Licence GPL V2