jeudi 31 octobre 2013

du sable au processeur

Enfant on s'amuse à construire des châteaux de sable, plus tard on l'utilise pour couler le béton des fondations de sa maison mais le sable a d'autres usages, le verre et les circuit-intégrés entre autre. Dans cette chronique je présentes et commente quelques vidéos intéressants que j'ai déniché sur youtube.

Le silicium est le second élément le plus abondant de ce qui constitue la croûte de notre planète. Cependant il n'existe pas à l'état pur. Le plus souvent il se présente sous sa forme oxydé comme la majorité des éléments d'ailleurs. Pour fabriquer des semi-conducteurs il faut du silicium pur à 99.9999999%. Mais cette pureté n'est pas suffisante en elle-même, il faut que le lingo dans lequel sont découpés les disques soit monocristallin. Le vidéo suivant montre comment à partir des pépites de silicium de grade électronique poly-cristallin on fabrique ce lingot très spécial.

Procédé de Czochralski

Les pépites de silicium sont fondues dans un creuset en graphite/quartz. Un petit Crystal de silicium accroché au bout d'une tige est plongé dans ce silicium en fusion. Le creuset tourne dans un sens et la tige dans l'autre. La tige est remontée lentement et le silicium qui s'accroche au cristal initial durci en gardant la même structure cristalline que ce dernier. Le procédé est arrêté lorsqu'il n'y a plus de silicium dans le creuset. On obtient ainsi un lingot cylindrique dont le diamètre varie entre 15cm et 40cm. Le diamètre est fonction de la vitesse à laquelle est remonté la tige.

Une fois le lingot refroidit les extrémités sont coupées et la couche extérieure enlevée. De plus une surface plate est créée sur le cylindre qui va servir de guide pour le reste du procédé. Le lingot est découpé en disques en utilisant un fil d'acier recouvert de grains de diamant. Le fils est enroulé de nombreuse fois sur une série de cylindres d'entrainement avec un espacement régulier entre chaque passage. Le lingot est déposé sur ce lit de fils. Comme le fil est tiré de la bobine débitrice vers la bobine réceptrice il frotte sur le lingot et s'enfonce lentement dans celui-ci. Au final on a les disques de silicium.

Les disques obtenus sont ensuite polis sur les 2 faces pour enlever la surface abimée et les réduire à l'épaisseur désirée. Ils subissent ensuite un traitement dans un bain chimique pour encore nettoyer la surface.

Ensuite les disques de silicium subissent le polissage final. Celui-ci est effectué avec un pâte abrasive dont la granularité est extrêmement fine car la surface des disques ne doit pas avoir d'aspérités supérieures à quelques atomes d'épaisseur. Après cette étape les disques sont prêt à être acheminés vers l'usine de fabrication de circuits intégrés.

Du disque de silicium au Circuit-intégré

Le silicium pur monocristallin est isolant à la température de la pièce, pour en faire un semi-conducteur il faut introduire des impuretés. Pour construire les transistors il faut 2 types de semi-conducteurs P et N. le silicium a 4 électrons de valences et ses 4 électrons sont fixés par la structure du cristal donc le courant ne peut circulé. En ajoutant quelques atomes de phosphore dans la matrice cristalline on libère un électron car le phosphore en a 5 et que seulement 4 participent au liens covalents de la structure cristalline. Ce type de semi-conducteur est dit de type Négatif car il y a un électron qui est libre de se déplacer dans la matrice. Si au contraire on ajoute du bore qui lui à 3 électrons de valence. Il y a un défaut de liaison dans la structure cristalline. Il manque un électron pour assuré le 4ième lien covalent. Ce type de semi-conducteur est dit de type Positif car il y a un ion positif dans la structure qui va attiré un électron vers lui.

Les circuits sont construits par couches successives. La technologie est dite CMOS pour Complementary Metal Oxyde Semiconductor. C'est à dire que chaque porte logique est construite avec 2 transistors à effet de champ complémentaire, PFET et un NFET.

Lorsqu'un des transistor conduit l'autre est bloqué de sorte que le signal de sortie est soit connecté à Vdd ou à Vss. Chaque transistor est construit avec les 2 types de semi-conducteurs. Les PFET on un canal (channel) construit avec le type P et les drains et sources avec le type N. C'est l'inverse pour les NFET.

Pour injecter les ions phosphore ou bore dans la surface de silicium des canons à plasma sont utilisés. D'abord un masque est posé sur le disque et dans ce masque il y a des trous seulement aux endroits on les ions doivent-être implantés. Il y a un masque pour les transistors PFET qui sert à injectés les ions bore pour former les drains et source de ces transistors. Ensuite il y a un masque pour injecter les ions phosphore pour former les drains et sources des transistors NFET. Ensuite une couche isolante d'oxyde de silicium est déposée à la grandeur du disque. A l'étape suivante le masque pour former les gates de tous les transistors est utilisé. Les gates sont en silicium poly cristallin. Ensuite la couche isolante d'oxyde de silicium qui couvre les sources et drains doit-être enlevée pour pouvoir installer les conducteurs qui relient les transistors entre eux pour former le circuit désiré. Il peut y avoir plusieurs couches de conducteurs/isolants superposées car les fils se croisent à la surface comme pour un circuit imprimé.

Fab Intel

Finalement voici un vidéo filmé à l'intérieur d'une usine d'Intel qui fabrique les core I7. Ici il s'agit de disque de 40cm. Le procédé est presqu'entièrement automatisé. Ces usines coûtent plusieurs milliards de dollars Américains à fabriquer. L'air doit-être filtré avec des filtres extrêmement fins afin d'être débarrassée de toutes les poussières.

dimanche 27 octobre 2013

comment fonctionne un UAL

Dans cet article j'explique comment fonctionne l'Unité Arithmétique et Logique d'un microprocesseur. l'UAL (ALU en anglais) est la partie du processeur qui effectue les opérations arithmétiques et logiques sur les données. Les opérations les plus fréquentes sont l'inversion (NOT), le OU (OR), le ET (AND) et le OU exclusif (XOR), l'addition et la soustraction. Référez-vous à la page MCU 101 pour le schéma interne d'un microcontrôleur PIC de base.

Les fonctions logiques de base et leur symbole électronique sont à la page suivante: toute la vérité. Donc pour ces opérations logiques c'est simple il suffit de mettre en parallèle autant de portes logiques qu'il y a de bits dans les mots. Pour un microcontrôleur 8 bits on a donc 8 portes pour chaque opérations, un pour chaque paire de bits.

Pour chaque opération logique il existe un circuit semblable sauf que le ET est remplacé par l'opérateur désiré.

Addition et soustraction

Le circuit logique pour faire des additions est un peu plus complexe. Un additionneur sur 1 bit ressemble à ceci.

Si on regarde les tables de vérité des fonctions logique XOR et AND on comprend comment cet additionneur fonctionne. En effet dans le cas du XOR on a un 1 à la sortie seulement si A ou B a pour valeur 1 mais pas les 2 en même temps. En effet puisque 1+1=2 le bit le moins significatif reste à zéro et on a un report sur le bit suivant plus significatif. C'est le rôle du ET de faire ce report. Cependant puisque l'additionneur doit tenir compte du report du bit de poids faible qui le précède on doit doubler le circuit pour avoir un additionneur complet. Le Cin est le report du bit précédent et le Cout est le report qui va au Cin du bit suivant. Cout est à 1 si A+B=2 ou si Cin+A+B > 1. C'est bien ce que nous dit ce circuit.

Donc pour avoir une addition sur N bits il suffit de reproduire ce circuit N fois en rapportant le Cout vers le Cin du bit de poids plus fort qui suit. C'est à dire Cout0 -> Cin1, Cout1 -> Cin2, etc et le dernier Cout va dans le Carry du registre d'état (STATUS REGISTER) et indique s'il y a eu débordement lors de l'addition.

Pour faire les soustractions le même additionneur est utilisé mais avec un astuce qu'on appelle addition sur complément de 2. Je vais expliquer ce principe en utilisant la base 10 qui nous est plus familière. Supposons que je veux faire la soustraction 7-3=4 mais je n'ai pas de soustracteur alors j'utilise le complément à 10 de 3 et je l'additionne à 7. Le complément est la différence entre le chiffre et sa base. Donc pour 3 le complément est 7. Donc eu lieu de faire une soustraction je fait l'addition 7+7=14. Je ne garde que le 4 ce qui est bien le résultat de 7-3. Oui mais si j'ai 2 digits? 75-31=44. Ici le complément est sur 100 donc pour 31 il s'agit de 69. 75+69=144. Ce principe s'applique à toutes les bases numériques. Donc c'est le même concept en base 2. Pour faire une soustraction en base 2. J'inverse tous les bits de l'opérande qui est soustraite et j'ajoute 1 et ça donne le complément à 2.

En terme de circuit c'est simple, avant d'envoyer l'opérande qui est soustraite à l'additionneur on la fait passer par l'inverseur et de plus le Cin du bit 0 est mis à 1 et on effectue l'addition. Le carry bit du Status register est maintenant à 1 si le nombre soustrait est plus petit ou égal à l'autre nombre sinon il est zéro. Voilà pourquoi la logique du carry bit est inversée lors d'une soustraction par rapport à l'addition. Alors que lors d'une addition 1 dans le Carry indique un débordement, lors d'une soustraction 1 signifie qu'il n'y a pas eu d'emprunt (borrow).

Comment l'opération est sélectionnée

Maintenant comment l'opération indiqué par le code machine est-elle sélectionnée? On utilise des démultiplexeurs et des multiplexeurs. Voici un bloc diagramme avec démultiplexeurs sur les opérandes et un multiplexeur sur la sortie du résultat. Le deuxième shéma n'utilise pas de démultiplexeurs en entrée. les opérandes sont envoyées vers tous les opérateurs et on ne sélectionne que le résultat désiré. Dans le cas d'un PIC puisque W est toujours sélectionné comme une des opérandes on peut le laissé branché en permanence sur une des entrées des opérateurs. Pour l'autre opérande le seul sélecteur est le décodeur d'adresse de la RAM. C'est plus économique comme circuit.

Les signaux Sx sont les entrées de sélection, les bits du code machine qui sélectionne l'opération sont envoyés vers ces entrées. Le nombre d'entrées Sx est le logarithme base 2 du nombre de sorties. S'il y avait plus de 4 sorties il faudrait ajouté une entrée S2 et les portes ET devrait avoir 4 entrées. Il faut une entrée par bit sélecteur plus 1 pour le bit à transférer.

Dans le cas du démultiplexeur le bit d'entrée i est dirigé vers le circuit de la fonction désirée fx en fonction du code présent en S1 et S0.

Dans le cas du multiplexeur l'un des bits d'entrée ix est dirigé vers la sortie dépendant du code présent en S1 et S0.

fonctionnement d'un sélecteur

En réalité la majorité des portes logiques utilisées dans un MCU sont dans les sélecteurs (multiplexeur/démultiplexeur). Les sélecteurs sont basés sur des portes ET. Leur principe de fonctionnement est le suivant.

Si une des entrées d'une porte ET est à zéro la sortie sera bloquée à zéro quelque soit la valeur des autres entrées. Donc dans le schéma ci-haut il suffit qu'une seule des entrée de sélection soit à zéro pour que i ne puisse être transféré à la sortie. Pour la porte ET du haut la valeur inverse de S0 et S1 est utilisé pour contrôler la porte. Donc pour que i puisse contrôler la valeur de sortie de cette porte il faut que S0=0 et S1=0 de sorte que leur inverse est à 1. Pour la porte ET du bas les entrées de contrôle sont S0 et ~S1. Donc pour que i puisse contrôler la sortie il faut que S0=1 et S1=0 de sorte que les 2 entrées de contrôle sont à 1. Avec ce type d'arrangement 1 seule porte est ouverte à la fois. On peut multiplié le nombre d'entrées de contrôles et le principe demeure le même. Pour 2 entrées de contrôle la table de vérité est la suivante.

S1S0f0f1f2f3
00=i000
010=i00
1000=i0
11000=i

Le décodeur d'instruction

Si on regarde comment les instructions sont encodé dans un microcontrôleur PIC de base comme le PIC10F200. Les instructions sont encodées sur 12 bits.

Prenons le premier format appelée byte-oriented file register operations. Le code d'opération est dans les bits 6 à 11. Ça veut dire que ces 6 bits contrôlent un multiplexeur qui sélectionne l'opération. Sur les PIC l'une des opérandes est toujours dans le registre W et l'autre provient d'un file register qui lui est sélectionné par les bits 0 à 4. Le bit 5 d décide de la destination du résultat. Puisque le résultat n'a que 2 destinations possibles 1 seul bit suffit. Ce bit contrôle un démultiplexeur à 2 sorties vers W ou vers F. Le fait qu'une des opérandes est fixe simplifie le circuit puisqu'on n'a pas besoins de sélecteur pour cette opérande et de plus les instructions peuvent-être encodées sur moins de bits. Il n'y a pas de doute que les PIC nécessitent moins de portes logiques que les AtTiny. Je serais curieux de savoir combien de gates il y a dans le core des PIC de base, 3000, 4000 peut-être.

Décodeurs d'adresse mémoire

Qu'il s'agisse de la mémoire flash ou de la RAM il y a 2 bus, 1 pour l'adresse et un pour la donnée. Le bus d'adresse est branché sur le sélecteur et détermine quel cellule mémoire sera connectée au bus de données. Le nombre d'adresses mémoire à sélectionner est trop élevé pour le multiplexeur simple montrer ci-haut. La raison principale est qu'il y a une limite au nombre de porte qu'une sortie peut alimenter. Or on le voie chaque bit sélecteur doit alimenter la moitié des portes. D'autre part il y a aussi une limite au nombre d'entrées qu'une porte ET peut avoir. Pour régler ce problème les sélecteurs de mémoire sont à 2 dimensions ou plus dépendant de la taille de la mémoire. Voici de quoi a l'air un sélecteur à 2 dimensions.

Il y a 2 décodeurs. Un appelé lignes et l'autre colonnes. Les cellules mémoires sont reliées aux 2 décodeurs selon une topologie qui rappelle un plan. Pour qu'une cellule soit sélectionnée il faut que sa ligne et sa colonne le soit. Si la mémoire est trop grosse pour 2 décodeurs on ajoute un troisième décodeur qui lui sélectionne des plans superposés d'où le nom de 3 dimensions. Si on prend le PIC10F200 qui n'a que 256 mots flash, le décodeur doit avoir seulement 2 dimensions avec 4 bits par décodeur. Les bits 0-3 du compteur ordinal vont sur le décodeur de lignes et les bits 4-7 sur le décodeur de colonnes ou vice-versa peut importe.

Conclusion

En conclusion peut importe le nombre de bits du processeur il s'agit simplement de répéter ces circuits le nombre de fois qu'il y a de bits 8, 16, 32, 64 . Si cette introduction vous a plus et que vous avez envie d'en savoir plus il y a cours gratuit sur internet (en anglais) qui s'appelle from NAND to TETRIS

. Ce cours commence avec les portes simples et progresse vers les circuits plus complexe jusqu'au processeur complet et s'accompagne d'un logiciel qui permet de définir les circuits logiques et de les tester dans un simulateur. Très bien fait, c'est une formation 5 étoiles gratuite.

mardi 8 octobre 2013

brève introduction à forth (4e4th)

Le premier contact avec un programme écris en forth peut générer un certain mouvement de recul car la syntaxe n'a pas grand chose à voir avec celle des langages les plus courants comme C, pascal, basic ou python. Gardez présent à l'esprit les faits suivants concernant la syntaxe du forth:

  • Le seul séparateur de mot est l'espace
  • un identificateur, que se soit le nom d'un variable, d'une constante ou d'une fonction (mot forth) peut utilisé n'importe quel caractère sauf l'espace.
  • Les arguments s'écrivent avant la fonction (mot forth).
  • En forth un fonction ou sous-routine s'appelle un mot et la définition de chaque mot est conesrvée dans un dictionnaire.

Calculatrice forth

Je présume que vous avez configuré votre launchpad tel que décris dans ma chronique précédente et que présentement l'émulateur de terminal de votre choix est connecté à celui-ci.

Entrez dans le terminal la ligne suivante:

3 4 * . <ENTER>

Après avoir fait la touche <ENTER> le nombre 12 devrait apparaître dans la fenêtre terminal suivit de ok. Lorsque la ligne que vous avez saisie est sans erreur ok s'affiche à la suite du texte que vous avez saisi ou de la réponse s'il y en a une et le curseur passe à la ligne suivante. L'interpréteur est prêt à recevoir une nouvelle commande.

Donc ici on a saisi les paramètres '3', '4', le mot '*' et finalement le mot '.' . On a donc calculé le produit de 3 et 4 et on l'a imprimé. Le mot '.' sert à imprimer le nombre qui est au sommet de la pile des paramètres. Lorsqu'on imprime ainsi la valeur au sommet de la pile cette valeur disparait de la pile, elle est consommée. Mais si on ne l'avait pas imprimée elle serait restée au sommet de la pile. Essayons ceci.

3 4 * <ENTER>
2 / <ENTER>
. <ENTER>

Après la dernière commande le nombre 6 devrait apparaître. Le nombre intermédiaire 12 n'a pas été imprimé car on ne l'a pas demandé. La deuxième ligne de commande a divisé ce nombre qui était au sommet de la pile par 2. Et finalement la troisième ligne a imprimé la valeur au sommet de la pile. Important on ne peut écrire 3 4*2/ chaque mot doit être séparé des autres par un espace. En forth il n'y a aucun mot ou symbole réservé même les chiffres ne sont pas réservés. Je pourrais définir un nouveau mot forth qui s'appellerais '3' et le système l'accepterais. L'embêtant est que le nombre 3 ne pourrait plus être utilisé mais le chiffre 3 pourrait-être inclus dans un autre nombre.

Lorsque forth cherche un mot dans le dictionnaire il commence toujours par le dernier mot qui a été défini donc on peut masquer un mot en le redéfinissant. La première définition demeure dans le dictionnaire mais n'est plus accessible. Forth procède comme suis lorsqu'il analyse la ligne de commande:

  1. A partir de la position courante saute les espaces.
  2. Le premier caractère qui n'est pas un espace est le début du mot suivant.
  3. Avance le curseur jusqu'au premier espace qui suit le mot.
  4. Cherche le mot dans le dictionnaire en commençant par la fin (plus récent).
  5. Si le mot est trouvé l'exécute immédiatement et recommence à 1 jusqu'à ce que toute la ligne de commande est été analysée ou qu'il y est une erreur.
  6. Si le mot n'est pas trouvé essai de le convertir en nombre, s'il réussi il met ce nombre au sommet de la pile des paramètres et retourne au point 1. Sinon affiche une erreur, vide la pile des arguments et retourne à la ligne de commande.

Voici comment évolue la pile des arguments pour la commande que nous avons entré précédemment.


'3' n'est pas dans le dictionnaire mais c'est un nombre donc il est empilé. Idem pour '4'. '*' est trouvé dans le dictionnaire il est exécuté. Ce mot fait le produit des 2 arguments au sommet de la pile et les remplaces par le résultat '12'. '2' est encore un nombre et est empilé. '/' est trouvé dans le dictionnaire et a pour effet de diviser le deuxième élément de la pile par le premier et de les remplacer par le résultat '6'. '.' est trouvé dans le dictionnaire et est exécuté. Il a pour effet d'enlever le nombre au sommet de la pile et de l'imprimer au terminal.

Entrez au terminal les 2 lignes suivantes:

variable j <ENTER>
3 constant trois <ENTER>

On viens de créé une variable nommé j et une constante nommée trois. ici les noms suivent le mot. C'est normal pour certains mots le ou les arguments suivent le mot forth contrairement à ce que j'ai dis plus haut. C'est vrai en autre pour les mots qui ajoute une entrée dans le dictionnaire comme le mot ':' que nous verrons plus loin ainsi que ces 2 là. Donc les noms de constantes et de variables sont aussi conservés dans le dictionnaire.
Entrez les 2 lignes suivantes:

trois . <ENTER>
j . <ENTER>

On a saisi trois qui est le nom d'une constante et sa valeur a été empilé on a ensuite imprimé cette valeur. C'est sans surprise mais que ce passe-t'il avec j? Ce nombre qui c'est imprimé c'est l'adresse mémoire ou la valeur de j est enregistré. Si on avait voulu imprimer la valeur de j il aurait fallu faire:

j @ . <ENTER>

Le mot '@' se prononce fetch et sert à lire la valeur de la variable dont l'adresse est au sommet de la pile. La valeur remplace l'adresse. Comme j n'avait pas été initialisée la valeur imprimée ne signifie pas grand chose non plus.

2 4 * j ! <ENTER>
j @ . <ENTER>

Ceci devrait affiché un 8 à l'écran du terminal. Sur la première ligne on a multiplié 2 par 4 ensuite on a enregistré le résultat dans la variable j. Le mot '!' qui se prononce store est le complément de @. Il sert à enregistrer une valeur dans une variable. L'adresse de la variable est au sommet de la pile et la valeur en seconde position. Après l'exécution ces 2 arguments sont disparus de la pile.
Sur la deuxième ligne on a été cherché la valeur de j pour l'imprimer.

maintenant on va voir comment compiler un nouveau mot dans le dictionnaire.

: carre dup * ; ( n|u -- n|u) \ calcule le carré

Le mot ':' sert à définir un nouveau mot dans le dictionnaire. Il est suivit du nom du mot qu'on va définir carre. Ce mot est très simple, il se compose de dup et *. Le mot 'dup' sert à cloner la valeur au sommet de la pile. Après son exécution les 2 premiers éléments de la pile sont donc identiques. Le mot '*' a déjà été présenté. Le mot ';' indique la fin de la définition. Ce qui viens après le point-virgule sont des commentaires. Il y a deux mots pour les commentaires en forth, le mot '(' introduit un commentaire qui est terminé par le délimiteur ')'. Le mot '\' introduit un commentaire qui se termine avec la fin de la ligne. Notez bien que j'ai écris qu'il s'agissait de mots. On doit donc laissé un espace avant et après chacun d'eux. Par contre la parenthèse de droite n'est pas un mot c'est un délimiteur. Cette forme de commentaire est une convention en forth. Le commentaire entre parenthèse décris l'état de la pile avant et après l'exécution du mot. On dit qu'au départ on a un nombre signé 'n' ou non signé 'u' et qu'après l'exécution du mot on a le même type de nombre au sommet de la pile en remplacement du nombre initial. Ici le symbole '|' indique une alternative (c'est l'un ou l'autre). Après ce commentaire un peut utiliser le mot '\' pour donner une brève description de ce que fait ce mot.

Premier programme en forth

Vous vous rappelez sans doute que la première fois que vous avez branché votre carte launchpad les LEDS verte et rouge se sont misent à clignoter en alternance. Mais maintenant qu'on a installé 4e4th dans le MCU ce programme a été écrasé. On va recréer ce programme en forth. Et vous allez être étonnés de la simplicité avec laquelle on fait ça. Mais d'abord entrez les lignes suivantes dans le terminal.

green .s drop drop <ENTER>
red .s 2drop <ENTER>

Je vous présente 5 nouveaux mots. 'green', 'red', '.s', 'drop' et '2drop'.

  • green empile les valeurs 64 et 33. 64 est le masque du bit P1.6 et 33 est l'adresse du port 1. Le LED vert est bien branché sur P1.6
  • red empile les valeurs 1 et 33. 1 est le masque du bit P1.0 et 33 encore un fois l'adresse du port 1. Le LED rouge est bien branché sur P1.0
  • .s est un mot utile pour le débogage. Il imprime le contenu de la pile sans la modifier. Le nombre entre '<' et '>' est le nombre d'éléments qu'il y a sur la pile. Suis les valeurs. La plus profonde à gauche et le sommet à droite.
  • drop jette la valeur qui est au sommet de la pile. Dans le première commande je l'ai utilisé 2 fois car je voulais jeter les 2 valeurs empilées par le mot green
  • 2drop jette les 2 valeurs qui sont au sommets de la pile. Plutôt que d'utiliser 2 fois drop.
Il existe plusieurs mots qui permettent de manipuler les valeurs sur la pile, ils sont parmis les premiers qu'il faut apprendre: swap, rot, over, tuck, nip, etc.
Voyons maintenant notre premier programme forth. Saisissez les lignes suivantes au terminal.

: rouge-vert ( -- ) \ allume en alternance les LEDS rouge et verte <ENTER>
green cclr <ENTER>
red cset <ENTER>
begin green ctoggle red ctoggle <ENTER>
250 ms <ENTER>
s2? until <ENTER>
green cclr red cclr ; <ENTER>
rouge-vert <ENTER>

La majorité des mots utilisés dans cette définition sont spécifique 4e4th sur launchpad et vous ne les retrouverez pas sur une autre plateforme. Donc on difini le mot rouge-vert.

  • cclr Ce mot prend l'adresse du port et le masque qui sont au sommet de la pile et met le(s) bit(s) correspondant(s) à zéro.
  • cset Ce mot prend l'adresse du port et le masque qui sont au sommet de la pile et met le(s) bit(s) correspondant(s) à 1.
  • ctoggle Ce mot prend l'adresse du port et le masque qui sont au sommet de la pile et inverse la valeur de(s) bit(s) correspondant(s).
  • begin Ce mot débute une boucle.
  • until Ce mot termine la boucle si la valeur au sommet de la pile est vrai.
  • s2? Ce mot vérifie l'état du bouton s2 qui est sur la carte et met la valeur vrai au sommet de la pile si le bonton est enfoncé, sinon mais la valeur faux.
  • ms Ce mot créé un délais en millisecondes dont la durée est spécifiée par la valeur au sommet de la pile.

Description du programme

Notre programme est un mot qui s'appelle rouge-vert. On commence par initialisé l'état des LEDs en inverse. Au départ on éteint la verte (ligne 2) et allume la rouge (ligne 3). Ensuite on crée une boucle dans laquelle à chaque cycle on inverse l'état des 2 LEDS (ligne 4). A la ligne 5 on crée un délais de 250 millisecondes. A la ligne 6 on vérifie l'état du bouton s2 qui est sur la carte et on termine la le programme si le bouton est enfoncé. Mais avant de quitter le programme on éteint les 2 LEDS. Une fois qu'un mot est définie dans le dictionnaire il suffit de taper son nom pour l'exécuter.

Conclusion

Si cette brève introduction au forth vous donne le goût d'en savoir plus, vous trouverez dans l'internet tout ce qu'il faut pour satisfaire votre soif de connaissance. Voici quelques liens pour débuter.

  • Vous pouvez télécharger et installer gforth sur votre ordinateur. Ce forth est conforme au standard ANS.
  • Vous pouvez aussi visiter le site Forth Interest Group
  • Les 2 livres de Leo Brodie sont disponible gratuitement dans l'internet. Thinking forth est disponible en PDF et Starting forth peut-être lu en ligne ici.
  • Je ne crois pas qu'il soit encore disponible sinon peut-être dans une bibliothèque publique, Programmer le forth de Robert Van loo aux éditions Marabout est une bonne introduction.

réparation d'un cat's meow

Ma soeur a acheté ce jouet pour son chat. Après un mois d'usage il est tombé en panne. Comme elle l'avais acheté usagé via l'internet, pas de garantie à faire valoir. Donc il s'est retrouvé entre mes mains pour réparation.

En le démontant j'ai constaté la simplicité du petit circuit électronique et j'ai compris rapidement qu'il s'agissait d'un MCU contrôlant le moteur via un pont H fabriqué avec 4 transistors Q1-Q4.

Le MCU était en surchauffe. Kaput! le MCU. IL n'étais pas identifié, le marquage ayant été effacé. Et de toute façon je n'aurais pas eu accès au firmware puisqu'il était kaput! et même s'il ne l'avait pas été... probablement protégé.

J'ai reconstitué le schéma-électronique à partir du circuit imprimé en remplaçant le MCU par celui que j'ai choisi.

J'ai remarqué que l'alimentation est sur les mêmes broches que sur un PIC12Fxxx. J'ai justement en main des PIC12F675 en format 8-SOIC. Pas de problème que je me dis je vais remplacé le MCU et faire ma propre version du Firmware.

J'ai ajouté un connecteur ICSP temporaire pour faire la programmation. Après avoir visionné le vidéo sur le site qui vend ce jouet, Je me suis dis ce que c'est très simple. Le moteur tourne dans une direction et ensuite dans l'autre. La seule variable est la durée de chaque rotation. Voici le code source, seulement 89 instructions machine.

Avant de brancher le moteur je le remplace par des LEDS back to back en série avec un résistance de 1Kohm. Test, tout semble fonctionner. Les LEDS allument en alternance avec une durée variable. Je remplace par un petit moteur. Ha! le moteur ne tourne que dans une seule direction. Un des transistors du pont est défectueux et ne conduit pas suffisamment pour faire tourner le moteur.

Finalement j'ai décidé de refaire aussi le circuit électronique.

J'ai récupéré mon PIC12F675 sur le vieux circuit imprimé et l'ai soudé en dead bug sur le nouveau circuit. J'ai aussi laissé le connecteur ICSP sur le nouveau circuit car il y avait de la place.

Maintenant tout fonctionne correctement. C'est le chat qui va être content, il paraît qu'il aime ce jeux au point de demander à sa maîtresse de le mettre en marche.

mise à jour 2013-10-10

J'ai été un peu cours dans cet article. Entre autre j'ai oublié de mentionner que lorsque j'ai pris la décision de refaire le circuit de contrôle, ce n'est pas tout à fait le circuit original, mis à part le MCU, les transistors ne sont pas les même et la valeur de R1 et R2. Pour Q1 et Q2 j'ai utilisé des ZTX649. Pour Q3 et Q4 j'ai utilisé des ZTX749. Les 4 transistors sont en boitier TO-92. J'ai augmenter la valeur de R1 et R2 à 300 ohm.

Description du schéma

Les 4 transistors forment ce qu'on appelle un H bridge, que j'ai traduit ci-haut par pont en H. En aucun cas GP0 et GP1 ne doivent être à VoH (V output High) en même temps sinon les 4 transistors seront en conduction et on obtient un court-circuit. C'est pour ça que dans le firmware j'arrête le moteur avant de le redémarrer dans l'autre direction. J'ajoute en plus un délais de 20msec avant de repartir le moteur pour laissé le temps à l'énergie accumulé dans le moteur de se dissiper. Donc Lorsque GP1 est à VoH, GP0 est à VoL et vice-versa. Lorsque GP0 est à VoH le transistor Q1 entre en conduction et son collecteur tombe VoL. A partir du collecteur de Q1 la résistance R3 alimente la base de Q3. Puisqu'il s'agit d'un transistor PNP dont l'émetteur est branché au V+ de la batterie, lorsque sa base est à VoL il entre en conduction. On a donc un circuit établi entre V+bat. et v-Bat. en passant par Q3ce le moteur et finalement Q1ce à v-bat. Si on met GP0 à VoL et GP1 à VoH, le même principe s'applique mais cette fois le courant circule de V+bat par Q4ce à travers le moteur et enfin à travers Q2ce. Le courant circule maintenant dans le moteur dans la direction opposé à la situation précédente donc la rotation du moteur est inversée.

Retenez la configuration de ce montage, elle est fréquemment utilisée pour contrôler la direction de rotation d'un moteur.

A noter aussi la présence de R5 et C1. La fonction de ces 2 composants est de filtrer le bruit électronique généré par le moteur qui autrement pourrait nuire au bon fonctionnement du MCU.

J'ai augmenter la valeur des résistances R1 et R2 à 300 ohm en faisant le calcul suivant. Le moteur consomme 150mA (mesuré). le courant dans la base du transistor doit-être de Ice/Hfe. Ice est le courant qui circule entre le collecteur et l'émetteur du transistor et Hfe est le gain DC du transistor. Les transistors utilisés ont un gain minimum de 100. Donc pour obtenir un courant Ice de 150mA il suffit d'injecter 1,5mA dans la base. Ça c'est dans le pire des scénario car le gain typique de ces transistors est en fait de 200. Il suffit donc de calculer R1 et R2 pour que le courant fourni par les sorties GP0 et GP1 soit d'au moins 1,5mA pour que ça fonctionne. On peut se donner une marge de sécurité mais il est inutile d'exagérer. Trop de courant dans la base de Q1 et Q2 n'aurait que pour conséquence de drainer la pile inutilement et de faire chauffé le MCU puisque le courant qui alimente les bases de Q1 et Q2 passe par celui-ci. Il ne faut pas oublier non plus que plus il passe de courant à travers le MCU plus la chute de voltage aux bornes de R5 augmente. Chaque fois que le moteur est démarré le courant à travers le MCU augmente, la chute de voltage à travers R5 aussi et le Vdd du MCU diminue d'autant. Avec 300 ohm pour R1 et R2 le courant qui circule dans la base est approximativement de (4,5-VbeSat-0,7)/(300+47). D'après les spécifications du transistor VbeSat=0,9 et d'après les spécifications du PIC12F675 VoH=Vdd-0,7. Donc (4,5-0,9-0,7)/347=8,3mA. 8,3mA c'est 5 fois plus qu'il n'en faut pour mettre Q1 et Q2 en saturation à 150mA. Ces calculs sont des approximations suffisantes pour cette utilisation.

2013-10-11, Une cliente satisfaite

Ma sœur viens de me téléphoner pour me dire que le cat's meow fonctionne mieux que lorsqu'elle l'a reçu. Il paraît qu'il est plus speedy!!! C'était pas prévu dans la réparation mais si elle le dit :-)

mise à jour 2018-06-17

Suite à une demande j'ai créer un dépôt sur https://github.com/Picatout/catmeow pour ce projet.

lundi 7 octobre 2013

forth sur launchpad

En faisant des recherches sur le langage Forth j'ai découvert quelque chose d'intéressant pour les propriétaires d'un MSP430 launchpad. Ça s'appelle 4e4th. Il s'agit d'un système forth qui fonctionne sur le MCU MSP430G2553 qui vient avec le launchpad de Texas instruments. C'est donc une bonne occasion d'explorer ce langage si vous ne le connaissez pas déjà. Une fois 4e4th installé sur le launchpad on interagit avec celui-ci via une connexion terminal en utilisant un logiciel comme TeraTerm ou autre logiciel d'émulation de terminal. C'est intéressant car ça fonctionne en interactif, on entre des commandes forth et on a le résultat immédiatement.

Installation

La procédure d'installation en anglais est ici. Mais vous pouvez lire ce qui suis si vous préférez. Je suppose ici que vous fonctionnez sous Windows. Je l'ai aussi testé sous linux et ça fonctionne aussi bien mais il faut utiliser un autre logiciel pour programmer l'image dans le MCU.

Au départ on suppose que vous avez un msp430 launchpad avec le MCU G2553 d'installé sur la carte. Vous devez télécharger le fichier HEX de l'image 4e4th.a43. Comme on ne peut programmer cette image à partir de code composer studio on télécharge l'utilitaire FET-Pro430 lite. On dézippe et installe (débrancher le launchpad avant d'installer FET-Pro430).

Sur la carte launchpad mettez les cavaliers TX et RX perpendiculaire aux 3 autres pour que le port sériel soit en hardware plutôt qu'en software. Voir cette photo. Première chose, après l'installation de FET-Pro430 et avoir rebranché le launchpad lancez le gestionnaire de périphériques de Windows et vérifiez sur quel port série est installé le launchpad.

Maintenant lancez FET-Pro430 et allez dans le menu setup - connection/device reset et sélectionnez le port du launchpad:

Dans la fenêtre principale:

  • Cliquez le bouton Open code file et allez chercher le fichier 4e4th.a43
  • Dans le groupe Microcontroller type sélectionnez le MSP430G2553.
  • Cliquez AUTO PROG pour lancez la programmation du launchpad.
  • Lorsque la programmation est complétée, fermez le programme FET-Pro430.

Si tout c'est bien passé les 2 lumières (verte et rouge) sont allumée sur le launchpad. Attention si le programme FET-Pro430 est encore ouvert il se peut qu'elle soit éteintes.

Lancez maintenant votre émulateur de terminal préféré. J'utilise TeraTerm Pro. Configurer le port série (le même qu'utilisé par FET-Pro430) à 9600BAUD 8N1. Lorsque la connexion est établie faite ENTER. le prompt forth OK devrait apparaître dans votre fenêtre terminal. Si c'est le cas vous être prêt à interagir avec le launchpad.

Introduction au forth 4e4th

Dans la fenêtre terminal tapez: green cclr <ENTER>
La LED verte devrait éteindre. Tapez red cclr <ENTER>
La LED rouge devrait éteindre.

Ça suffit pour aujourd'hui. Dans ma prochaine chronique je vais présenter un petit tutoriel 4e4th.