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_ca
lc. 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