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.