|
J.D.
Nicoud, Mouette 5 CH-1092 Belmont, Switzerland Tel ++41 21 728-6156, Fax ++41 21 728-6157 Email info@didel.com www.didel.com |
File www.didel.com/picg/doc/AideDebug.html |
Pour mettre au point un
programme, il faut pouvoir visualiser par où il passe, et quel est l’état de
certaines variables. Ceci sans perturber le fonctionnement de façon
significative. La solution la plus commode est de disposer d’une interface
série et d’afficher sur l’écran d’un terminal ce que l’on décide en complétant
son programme par des modules d’affichages qui peuvent devenir assez
encombrant, et prendre un temps d’exécution non négligeables.
Deux considérations sont
importantes lorsque l’on doit décider de la solution d’aide : le temps que
l’on peut prélever sur le processeur pour aider au déverminage pendant que
l’application tourne, et le nombres d’entrées-sorties que l’on peut sacrifier
dans ce but. La longueur des programme d’affichage d’aide est rarement
significative.
Le nombre d’entrées-sorties
utilisables pour l’aide à la mise au point est souvent le point le plus
critique. Si l’application est bien optimisée, ce nombre est nul : il n’y
a pas de sorties de libre et on peut tout au plus sacrifier une fonctionnalité
pour libérer des lignes qui permettent de visualiser certains paramètres. La
plupart des applications ayant un affichage, on peut utiliser cet affichage
pour l’aide à la mise au point, en désactivant sa fonctionnalité dans
l’application.
L’utilisation d’un
processeur plus complet est une solution recommandée pour la mise au point
d’applications complexes. Si un processeur à 28 ou 40 broches est utilisé pour
mettre au point une application qui se fera avec un processeur à 8, 14 ou 18
broches, un ou deux ports 8 bit peuvent être disponibles pour affichage, pour
synchroniser un oscilloscope, connecter un terminal série.
Il est bon de connaître
toutes les possibilités d’aide et d’en prévoir le plus possible au début du
projet. Il faudra souvent en rajouter en cours de route. Faisons cet
inventaire.
Dans le cas ou
l’environnement de mise au point est différent de l’environnement de
l’application, on effectuera dès le début des assemblages conditionnels. Si la
constante Test=1, on déclare ce qui correspond au processeur de test.
On peut déclarer d’autres
constantes liées à des test que l’on veut pouvoir faire apparaître ou disparaître
facilement, mais il ne faut pas s’empêtrer dans un nombre excessif d’options.
Il est sage de vérifier fréquemment la compatibilité (assemblage et exécution
avec Test=0 et Test=1) pour éviter que l’environnement de test ne se
complexifie inutilement et devienne incompatible.
La figure suivante montre un
exemple ou un 16F626 dans son boitier de 59 milligrammes a été remplacé pour le
développement par un 16F871 en boitier DIL 40 broches (sur kit WdPicDev87x). Le
16F871 a permis lla liaison avec une interface série (la seule tâche du
programme principal), et le port B a été très utile pour afficher des variables
et compteurs via le convertisseur D/A (voir plus loin).
|
|
|
|
|
|
Disposer d’un port 8 bits
avec des leds permet de faire beaucoup, et l’affichage d’une variable
quelconque ne prend que 2 microsecondes. On ne peut naturellement pas passer
d’une variable à l’autre, et si la variable varie rapidement, l’affichage est
guère utile. Néanmoins, notre conseil est dans tous les cas, garder un port 8
bits pour afficher des variables, et ceci jusqu’à la fin de la mise au point.
A noter que si les diodes
sont actives lorsque le port est à zéro, il suffit d’inverser tous les bits
lors du transfert :
Not Variable,W
Move W,PortB
Un convertisseur D/A sur un
port 8 bits peut être très utiles lorque le signal varie et que l’on dispose
d’un oscilloscope, à mémoire de préférence. Si on mesure une vitesse, ou
l’écart par rapport une consigne, ce convertisseur 4, 6 ou 8 bits est facile à
réaliser avec un réseau de résistance R/2R ou en utilisant un AD588, Max506,
DAC0808 ou équivalent.
Câbler un réseau R/2R sur un
veroboard qui s’enfiche sur les connecteurs des modules WdPicDev est facile. La
précision 8 bits est rarement nécessaire, et il peut être utile d’avoir un
module qui ne prend que les 6 bits ou 4 bits de pids faible.
|
|
|
|
Par exemple, pour dépanner
un programme qui décode un message IR
formé d’impulsions de longueur variable, visualiser le
compteur/décompteur associé à la mesure de durée des impulsions aide
considérablement à la mise au point, et à l’étude du comportement en cas de
mauvaises transmissions. |
|
Lorsque les valeurs sont peu
stables ou varient autour d’une valeur moyenne, l’affichage en binaire sur 8
leds n’est pas idéal, car si l’affichage oscille entre 7 et 8, 0111 et 1000, on
ne voit que 4 bits en demi-intensité. Avec un affichage linéaire, facile à
programmer, on verrait 0011 et 0111. Les Leds de l’affichage s’allument
progressivement lorsque la valeur de la variables augmente. Avec 8 Leds, il
peut y avoir +/-6% d’erreur, puisqu’il n’y a que 9 états possibles (0 à 8 leds
allumées), mais c’est souvent acceptable.
Une solution simple divise
par 32 (on ne garde que les 3 bits de poids fort) et passe par une table pour
afficher le bon nombre de Leds. De 0 à 31 il y a une Led allumée, de 32 à 63,
deux Leds, etc. Le zero est en fait testé séparément pour qu’il n’y ait pas de
Led allumée. Une solution un peu plus proportionnelle et plus longue (env 30
instructions) divise par 28 pour afficher 0 Led de 0 à 14, une Led de 15 à 43, etc.
Le SPI bien connu génère un
signal d’horloge et des données en série pour charger un registre à décalage
(voir www.didel.com/doc/DocSPI.doc). Une 3e ligne Enable ou LD
charge un registre parallèle en fin de décalage. Il est facile de construire
avec des registres CD4094 ou 74HC164 un affichage 8 ou 16 bits d’aide au
dépannage, tel qu’il a été incorporé dans le module WdPicDev676.
Le transfert 8 bits prend 85
microsecondes. On apelle SndS8 ou SndSPI8 avec la valeur à afficher dans W. Les
routines sont documentées en XSPI8R.asi
Si on accèpte le
clignotement de l’affichage pendant le décalage, il suffit de 2 fils. Le
clignotement pendant 85 us n’est pas perceptible si l’affichage est mis à jour
toutes les 50ms ou plus. Les programmes Pict870D.asi ez Pict676D.asi montrent
comment programmer un transfert 8 bits.
Jdn 030930
I2C n’utilise que 2 lignes
et il existe un choix de circuits pour commander des interfaces parallèles, des
affichages alphanumériques de 2-3 lignes, des convertisseurs D/A. Il peut donc
être très intéressant si un canal I2C existe déjà dans l’application. La
gestion par interruption ou directe est toutefois assez lourde, et utilise
passablement de temps processeur. I2C ne semble donc pas approprié pour des
applications avec fortes contraintes temps réel.
Si une seule ligne est
utilisée pour communiquer un information d’aide au dépannage, on peut imaginer
plusieurs solutions. La plus efficace serait un codage Manchester avec un
circuit comportant quelques circuits intégrés (monostables bien réglés,
registre à décalage) pour afficher la valeur 8 ou 16 bits envoyée. La routine 8
bits dure dans les 100 us. La solution Dallas est plus lente, et les circuits
Dallas n’ont pas une fonctionnalité qui peut nous aider pour le dépannage.
En général, cette seule
ligne utilisable pour la mise au point commande une LED et nous allons chercher
des solutions qui évident de construire du matériel supplémentaire.
La fréquence de clignotement
est un moyen peu précis pour signaler quelques états. Dans un programme temps
réel qui supporte le clignotement de la LED pour signaler les modes de fonctionnement
de l’application, l’utilisation de cette primitive ne perturbe pas le processus.
Dans une application qui
n’a pas de contraintes temps réel, on peut appeler une routine qui clignote
un certain nombre de fois la LED. L’application est bloquée pendant ce temps,
et il est facile de compter les clignotement pour savoir ou le programme se
trouve, et éventuellement quelle est la valeur d’un paramètre.
Pour montrer une valeur binaire,
on peut envoyer les 8 bits sous forme d’impulsion lumineuses brèves pour un
0, longues pour un 1, avec un silence entre chaque train de 8 bits.
Jdn
030816