mercredi 10 octobre 2012

ambiance pingpong

Après avoir vu ceci j'ai décidé de me faire une lampe d'ambiance mais tout ce que j'avais en main comme globe c'était des balles de pingpong. Donc mon mood light est en format réduit. Disons que c'est une lampe d'ambiance pour Amster ;-).

En première sur ce blog je vais présenter la version en language C du code avec la version en assembleur. J'ai voulu comparer le code assembleur au code produit par la version gratuite du compilateur XC8 en téléchargement sur le site de Microchip.

schéma électronique



montage




Pour ce montage je n'ai pas utilisé de platine de montage sans soudure. J'ai fait le montage final directement en installant des tie points où j'ai branché les fils pour la programmation. Il s'agit de fils avec une broche à une extrémité que je branche directement dans le PICKIT 2 ou 3 et à l'autre une petite pince.



Pour l'alimentation j'ai simplement empilé 3 piles LR44 qui tiennent ensemble avec du ruban d'électricien. Comme ça si je veux les remplacer je n'ai qu'à enlever le ruban, pas de soudage à faire. Pour prolonger la durée des piles la balle s'éteint au bout d'une minute. Pour la réanimer il suffit de la bouger. Dans ce but j'ai fabriquer une tilt switch de mon cru visible sur la photo du haut. 2 fils à la verticale avec une boucle à l'extrimé. Un de ces fil est relié au V- et l'autre à l'entrée GP3 du MCU. Un 3ième fil les relie ensemble mais sans soudure ce qui donne un contact très instable. Il suffit de bouger la balle pour que le contact soit rompu une fraction de seconde. C'est suffisant pour sortir le MCU du mode sleep grâce à la fonctionalité wake up on pin change.

Le résultat final n'est cependant pas très élégant, il y a place à l'amélioration.

Le scotch tape qui tiens les 2 hémisphères ensemble laisse à désiré et la lumière des DEL n'est pas assé diffusée, d'où le spot blanc au pôle sud.


le logiciel


Comme je l'ai mentionné en introduction j'ai écris 2 versions la première en assembleur comme d'habitude et l'autre en C.

En gros comme le pic10f202 n'a pas de périphérique PWM c'est fait en code dans la sous-routine pwm_control. Ça fonctionne comme ceci:

  1. la sous-routine random génère un nombre de 24 bits qui est utilisé comme couleur RGB
  2. les variables pwm_red, pwm_green et pwm_blue détermine l'intensité de chaque couleur. Lorsque le compteur pwm_cntr arrive à une de ces valeur la couleur correspondante est éteinte. Lorsque le compteur pwm_cntr arrive à zéro le cycle se répète.

  3. Une transition d'une couleur à l'autre se fait progressivement grâce à la procédure transition. Une valeur au hasard est généré dans la variable rnd et ensuite transition amène les valeurs des variables pwm_xxx vers la valeur de la variable rnd.
  4. Lorsque les 3 valeurs pwm_xxx sont égales aux valeurs dans rnd random est appellé à nouveau pour générer une nouvelle valeur dans rnd et le processus de transition recommence.
  5. Le périphérique TMR0 est utilisé avec la variable off_timer comme minuterie. Au bout de 60 seconde les DEL sont éteinte et le MCU est mis en mode sleep
  6. Le MCU est configuré pour sortir du mode sleep lorsque l'état d'une entrée change. Donc la tilt switch et branchée sur GP3 et lorsqu'on brasse la balle l'état sur GP3 est modifié suite à une perte de contanct entre le V- et GP3 et la balle se réanime.

comparaison des codes assembleur et C

Programmer en C est beaucoup plus simple et rapide malheureusement en ce qui concerne le compilateur XC8 en version gratuite le code généré est médiocre. Le code généré par XC8 occupe 339 instructions tandis que la version assembleur en occupe 143.
La fréquence du cycle PWM pour le code assembleur est de 176Hz tandis qu'il tombe à 76hz pour le code généré par XC8. Dans le fenêtre qui affiche le résultat de la compilation de XC8 on nous informe que la version PRO réduirait le code de 144 instructions, Ce qui est encore plus que le code éris en asembleur mais est acceptable compte de tenu des avantages de la programmation en C. Le hic c'est le prix d'une licence PRO 995US$ et la version STANDARD qui optimise moins vaut 495US$. Je crois que je vais continuer à programmer en asembleur.


Aucun commentaire:

Enregistrer un commentaire