Electromag1 Circuits électroniques et Picaxes

Petit site pour ceux qui bricolent en électronique en général et sur les PICAXES en particulier.
Les PICAXES sont des microprocesseurs (PIC de Microship) programmables en BASIC. Pleins de qualités, pas chers, ultra faciles à programmer.
Tout (ou presque) est sur le site du distributeur Gotronic (voir les liens).
Les pages  seront ajoutées ou modifiées petit à petit.
Dans le but d'améliorer ce blog, communiquez moi vos remarques et les erreurs que vous pouvez constater.
Pour me contacter: Envoyez un mail à l'adresse : mag1mic@free.fr .  Tout message reçoit une réponse
Pour retourner au menu, Cliquer sur "LISTE DES PAGES", ici ou en haut de la colonne de gauche
Pour laisser un message, allez dans le "LIVRE D'OR"
Bonne visite
 
 

Les interruptions

Une autre solution pour sortir d'une pause avant la fin est d'utiliser une interruption.
Lorsque les conditions de l'interruption sont réunies, le programme quitte la tâche en cours (sauf pour quelques commandes bloquantes) pour exécuter le sous programme d'interruption nommé "interrupt:"
Si l'interruption intervient pendant une pause, le programme sort de la pause, exécute le sous programme d'interruption et le "return" de ce sous programme renvoit à l'instruction SUIVANT la pause, ce qui fait sortir de cette pause..

Un exemple:
 


Explications:
La commande setint pose l'interruption. Elle est décrite dans les deux octets qui suivent.
Le second octet donne la broche utilisée pour déclencher l'interruption, ici : C.1
Pour le 20M2, seules les broches C.1 à C.5 peuvent être utilisées (voir doc setint).
Le premier octet donne la valeur de la broche qui déclenchera l'interruption, ici:le niveau haut.

La bouche do loop positionne la broche B.3  60 s au niveau haut puis 60 s au niveau bas.
Si la valeur de C.1 passe de 0 à 1, la pause en cours est interrompue et lorsque cette valeur repasse à 0, le programme passe à l'instruction suivante.
Chaque commande setint ne fonctionne qu'une fois. Pour pouvoir recommancer l'opération, il faut que le programme passe par une nouvelle commande setint.
En général, cette réactivation est effectuée par un setint placé à la fin du sous programme interrupt.

Un phénomène apparaît avec notre exemple:
C.1 passe au niveau 1, l'interruption envoie le programme dans le sous programme, setint réactive l'interruption, le return renvoie le programme dans la boucle principale, très bien.
Mais si C.1 est toujours au niveau haut, l'interruption se redéclenche immédiatement et le programme joue au ping pong entre la boucle principale et le sous programme, tant que C.1 est à l'état haut.
Pour cet exemple, il n'y a pas de conséquences, mais si il s'agit de compter des impulsions, il y aura certainement des erreurs.
Dans cet exemple,  une boucle de blocage donne une solution (faites un essai en plaçant un ";" devant la ligne do loop).

Un autre exemple, fourni par dje8269,  un "débutant" venant de découvrir les picaxes:
Petit chenillard bidirectionnel avec blocage par poussoir "télérupteur".

 
Les sous programmes:

Les sous programmes permettent de structurer un programme pour le rendre plus lisible.
A l'analyse , on a intéret à découper un projet en modules intégrables dans un sous programme et exécuté sur demande du programme principale.
Les sous programmes évitent de réécrire les mêmes lignes de codes à des endroits différents du programme.

Le gosub et son return
Le sous programme est appelé par un gosub ex:  subcalcul
Le sous programme commence par une étiquette se terminant par ":" ex: subcalcul:
Le sous programme se termine par un "return"

Le sous programme est un déroutement temporaire du programme, à la fin du sous programme, le programme reprend à la ligne suivant le gosub, l'adresse de retour et mémorisée dans une pile, chaque gosub a une adresse de retour, effacée en passant par le return correspondant. Si on ne passe pas par ce return, les adresses de retours font "déborder" la pile et plante le programme.
Et cela vient assez vite, le nombre de gosub imbriqués est limité à 8.
Le problème est que cette erreur n'est pas détectée lors du contrôle de syntaxe et ne le sera peut être pas pendant une simulation, mais le plantage arrivera un jour.


Ce n'est pas toujours aussi évident que dans cet exemple:

 
Méme punition avec l'éditeur PE6:

Faire varier la luminosité d'une LED (ou la vitesse d'un moteur à courant continu).

Le principe généralement utilisé est la modulation de largeur d'impulsion (MLI), plus connu sous le nom de PWM (Pulse Width Modulation in english).
On délivre sur une sortie un signal carré de période fixe T et on modifie le rapport cyclique entre T1, temps valeur haute et T2, temps valeur basse:
La modulation
est une modification du rapport T1/T
entre 0 et 100%
Shéma du circuit de démo
pour la vidéo ci dessous.

Ici, c'est un 08M2, le plus petit des picaxes, il était déjà sur la platine d'essais. Il n'y a qu'une sortie compatible avec la commande PWM, la broche C.2. Chaque picaxe a une ou plusieurs broches compatibles (voir doc). 
Deux commandes pour gérer le PWM:
PWMOUT: Initialise la génération du signal (voir doc)
PWMDUTY: Fait varier le rapport cyclique sans interruption du signal
 
Pour obtenir la commande, l'éditeur fournit un utilitaire.
Cliquez sur PICAXE (bandeau)
puis Wizard, pwmout et le panneau ci dessous apparait:
 
 
Réglez la vitesse horloge
Choisissez la broche (si possible)
Entrez la fréquence (ici 1000Hz)
Le rapport cyclique (ici 100%)
et cliquez "Calculate":
La commande pwmout apparait:  pwmout pwmdiv4,2,249,1000
pwmdiv4= prédiviseur de la fréquence horloge pour obtenir la fréquence choisie.
2, c'est le n° la broche
249 donnera la fréquence 1000Hz
Le dernier paramètre est le rapport cyclique. Pour 100%, il est toujours égal au premier paramètre x 4,(bon, ici l'utilitare donne 1000).
En faisant varier ce paramètre entre 0 et 1000, on obtient une variation du rapport cyclique entre 0 et 100%

Le code démo:

 







 








Résultat:
La simulation du PWM n'est pas possible, voici donc une vidéo:
 

La variable système "time":

La variable "time" est spécifique de la série M2, c'est une simplification du timer présent sur les picaxes de la série X2.

Elle compte les secondes en tâche de fond 
dès le lancement du programme, sans qu'on ait besoin de le lui demander. Plus précisément, elle compte les secondes aux fréquences horloge de 4 et 16 MHz, pour les autres fréquences horloge, les unités time correspondent à ce tableau:
 

C'est une variable de type word, elle compte jusqu'à 65535 et repasse 0 sans prévenir.

L'utilisation est très simple, on peut lire (ex: W13 = time) ou remettre ce compteur à 0 (ex: time=0) à tout moment. La programmation de compteur, minuteur, et horloge en tout genre est très facilitée, pour les valeurs compatibles avec le tableau évidemment.

Le piège:

Si on veut afficher le temps qui passe sur un afficheur série on fait un petit programme tout simple, comme ceci:

 


Commmentaires:
L'opérateur / donne le quotient de la division par 60 , soit les minutes.
L'opérateur // (modulo) donne le reste de cette division , soit les secondes.
# décompose la valeur qui le suit en caractères ascii pour l'affichage.
Pour afficher la fenêtre Serial LCD, il faut cocher la case dans les options de simulation et choisir la broche de sortie utilisée dans la commande.

Donc, on est content,... pas très longtemps, on s'apperçoit très vite que la variable time prend un retard croissant.
Cela vient du fait que serout et time partagent le même timer et serout perturbe d'autant plus time qu'il est appelé plus souvent. Et dans cette boucle, la dégradation est très rapide.

Une solution boiteuse consiste à ne passer par serout qu'au changement de seconde.
Mais une meilleure solution est d'utiliser la version hardware de serout : hserout (qu'il faut configurer par hsersetup). Il n'y a plus le choix de la broche, mais il n'y a plus de perturbation. 

Voir la page suivante

 
 



Créer un site
Créer un site