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 

 

 

Aide à la mise au point des programmes

 

Introduction

 

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.

 

Double environnement

 

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).

 

 

 

 

 

Port 8 bits

 

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.

 

Affichage linéaire

 

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.

 

Série SPI

 

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

 

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.

 

Une seule ligne

 

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