Cette rubrique PicTrain est toute nouvelle, elle a débuté il y a trois semaines ! Vous pouvez aisément nous rattraper et sauter en marche ! Ptitrain est ravi d´avoir déjà reçu plusieurs messages (certains signés par des “pointures” du modélisme) dont la teneur est résumée ici : « Depuis le temps que je voulais me lancer dans les PIC sans avoir jamais osé le faire du fait de la complexité des documentations... je ne vais plus avoir de prétexte... » « Je me suis surpris à le lire comme tout autre article du Meccano, avec plaisir et intérêt ! »
Aujourd´hui à notre menu :
3.
3.1.
3.2.
3.3.
3.3.1.
3.3.2.
3.3.3.
 • SUR LA PROGRAMMATION
 Principe de base : W !
 2e principe de base : les boucles et tests
 Structure d'un programme
     Structure générale
     La ligne de programme
     Les sous-programmes
Vous n'avez toujours pas vu de programme, mais on va y arriver maintenant.
3. Sur la programmation
3.1 Principe de base : W !
Si vous avez suivi jusqu'ici, vous pouvez entrevoir la suite : programmer, c'est principalement travailler sur les registres ! On va les modifier, les additionner, les incrémenter ou les décrémenter, les tester, changer ou tester un bit... Sur les 35 instructions, seules 6 n'utilisent pas les registres, et sur ces 6 il y en a 3 que nous n'aurons probablement jamais l'occasion d'utiliser (ici, dans nos programmes Pictrain).
C'est aussi ici que se présente la différence entre nos microP et d'autres gammes de microP plus compliquées (et en général plus chers : chez nous il existe un registre très particulier, appelé W (comme “work” (évidemment), qui est le passage presque obligé de toute opération.
Je m'explique : pour faire une addition de deux registres, A et B par exemple, on ne fait pas A + B, mais on fait comme dans le dessin ci-dessous :
Aucune instruction ne concerne deux registres généraux, mais toujours un registre général et W. Lorsque l'on a compris ce principe, le reste devient facile.
PTI+   Le courrier reçu montre que le calcul en binaire n'est pas la tasse de thé de tout le monde... Donc un petit rappel ?
À la ligne 1 du schéma de notre meuble à tiroirs, le contenu de W au début (c'est n'importe quoi, selon ce qu'on a fait auparavant). Ligne 2 : on mis dans A un chiffre qui nous intéresse, 0010·1101, ce qui correspond à d'43' (43 en notation décimale). En ligne 3 on a fait de même avec ce 0010·1011 qui vaut d'45'. En 4, on a "mouvé" dans le registre de travail W le contenu de A. W vaut 43. Ensuite en 5 on a additionné W et B. En binaire, on additionne de droite à gauche, et en posant des retenues, exactement comme "en français" :
On n'ira pas plus loin car, pour plus dur que ça, on utilisera la Calculatrice gratuite de Windows , en "Affichage... Scientifique" et "bouton Bin".
Bien sûr, un bug : elle n'affiche pas les zéros de gauche ! Par exemple 00000101 s'affiche 101. Ça ne modifie pas les résultats, mais ça fait pas sérieux...
Cela dit, on peut vérifier l'addition faite par notre meuble à tiroirs ; taper 00101011, convertir en décimal ("bouton Déc") et voir que ça fait 43. Puisque b vaut 45 en Déc, le résultat est 88. Et 88 ça fait juste 01010000. On ressortira souvent cette calculette, surtout pour les AND et XOR... [Encadré signé Jidé.]
3.2.  2 principe de base : les boucles et tests
Cela, vous devez aussi commencer à deviner : quand je dis plus haut que “je regarde (le microP regarde) si on appuie sur le bouton”, ça se programme :
Je teste si le bit qui correspond à mon entrée (dans le registre des entrées/sorties) est à 0,
Si non (non = bit à 1*), je retourne ci-dessus et recommence.
Si oui (oui = bit à 0*), je fais autre chose, en l'occurrence émettre des ti-ta.
* Non= un, curieux, n'est-ce pas  ? Comme dans la note du paragraphe 2.2.2... Il faudra se méfier des réflexes acquis où “non ---> zéro” !
Dans cet exemple tout simple, vous avez les deux instructions de structuration du programme :
Tester : je regarde si un bit a la valeur 0 (ou 1), et je fais quelque chose dans le cas un et autre chose dans le cas zéro.
Aller à : je décide d'aller systématiquement à un autre endroit du programme.

ATTENTION à votre entourage : si vous dites à votre petit-fils que vous allez commencer à programmer des microprocesseurs en langage machine (assembleur), s'il sait un peu ce que c'est, il va penser que Papy est tombé sur la tête, mais pourtant vous êtes ici à la pointe du progrès,
En effet, je suis souvent simpliste dans ces pages, et j'essaie de rester vraiment au niveau suffisant pour notre plaisir de ptitrainiste, mais cela s'applique vraiment d'en bas jusqu'aux systèmes les plus sophistiqués, votre P.C. d'abord, mais aussi par exemple aux milliers de microprocesseurs qui sont disséminés dans un T.G.V...
3.3 Structure d'un programme
3.3.1. Structure générale
Il y d'abord deux parties principales :
Le début : l'initialisation (comme son nom l'indique) permet de mettre en place tous paramètres de notre programme (registres spéciaux), d'initialiser des variables (registres généraux). Cette partie n'est exécutée qu'une seule fois lorsque l'on met le courant.
La boucle principale : nous avons vu qu'un microP ne s'arrête jamais, et qu'il exécute donc tout le temps des instructions.
Ces cette partie que nous allons retrouver les instructions de notre programme. Cela se présente sous la forme  :
Dans le morceau de programme ci-dessus, vous avez vos premiers éléments de programmation.
BouclePrincipale : ceci est une étiquette, c'est-à-dire un endroit dans le programme où l'on “saute” d'un autre endroit ; l'étiquette est toujours cadrée à gauche de la feuille.
Les Instruction1 et Instruction2, décalées un peu à droite.
goto : votre première instruction, elle indique que le programme retourne (saute) à l'étiquette mentionnée.
Dans l'exécution du programme, le microP commence par l'instruction 1, puis la 2 puis les autres, et arrivé à goto il retourne à l'étiquette BouclePrincipale et recommence sans fin.
3.3.2. La ligne de programme
Un programme est écrit ligne par ligne, avec une structure de ligne bien précise :
Les étiquettes sont toujours à gauche, il n'y a rien d'autre sur la ligne (sauf un commentaire éventuel, plus loin).
L'opérateur, décalé à droite, suivi en général d'un opérande.
Tout à fait à droite vous avez des commentaires, commençant par un point-virgule.
Il n'y a toujours qu'une seule instruction par ligne.

Tout cela paraît bien rébarbatif et difficile à suivre, mais continuez, ne vous inquiétez pas, à force de voir et revoir tout cela dans les pages suivantes, ça deviendra un automatisme de pensée.
PTI+   Les commentaires : On insistera jamais sur l’absolue nécessité de mettre des commentaires dans les programmes, surtout dans les programmes en assembleur.
Les instructions n’ont absolument rien d’intuitif, et comprendre ce que fait un programme rien qu’en lisant ses instructions est presque impossible.
Même celui qui écrit le programme ne se souvient absolument plus ce qu’il a voulu faire deux semaines après ! C’est pourquoi il faut toujours mettre de nombreux commentaires sur toutes les lignes de votre programme.

3.3.3. Les sous-programmes
Le sous-programme est un élément clé de la structure des programmes, mais son principe en est simple : il s'agit d'une suite d'instructions que l'on veut exécuter plusieurs fois, à des endroits différents de notre programme.
Par exemple, nous aurons dans notre programme les instructions pour faire le son ti, et d'autres instructions pour faire le son ta.
Mais en plus, je veux faire un son “composé”, par exemple tiii-taaa-ti. Nous allons donc écrire des sous-programmes pour ti (sonTI) et pour ta (sonTA), que nous allons rappeler plusieurs fois.
Les sous-programmes :
et ailleurs dans le programme nous aurons “l'appel” de ces sous-programmes :
Apparaissent deux nouvelles instructions :
call : est l'appel d'un sous programme.
return : indique la fin du sous-programme,
Comment ça marche :
pendant l'exécution du programme, le microP tombe sur l'instruction call, et saute à l'étiquette, qui est ici le nom du sous-programme.
Il exécute le sous-programme, et lorsqu'il trouve l'instruction return, il retourne d'où il est parti, c'est-à-dire à juste après l'instruction call initiale.
Dans notre exemple, le microP arrive sur la ligne 1 (call), saute à l'étiquette sonTI, exécute les instructions jusqu'à return, puis revient ligne 2 (autre call), qui le fait sauter à sonTA, sur return il revient à la ligne 3 et ainsi de suite jusqu'au dernier sonTI d'où il revient à la ligne 6 et continue le programme.
Mine de rien, nous avons ainsi déjà passé en revue trois instructions importantes :
goto, qui permet de se déplacer dans le programme,
call et return, qui permettent de structurer les sous-programmes.
Nous allons maintenant pouvoir passer à la première application réelle, le “YouBiTonMatic”, où l'on va continuer de voir les autres instructions dans notre premier programme complet.
Résumé des instructions rencontrées jusqu´ici

FAQ   J'aime bien aller plus vite que la musique. Merci de me copier le résultat définitif de toutes vos élucubrations... — JIDE : Pas de problème, recopie juste ce qui suit dans ton microP :
020000040000FA0200000017 28BF0800080C00003
100010000C1C0D285B200 C1012288B1A0B1D228AB
1000200065200B11410E8300C00E400E090083169F
10003000FF2390008312203084008001840A041F73
100040001D28841E1D288316810196018C019F01A5
100050009901831207309900900183168501851656
10006000950195168B018B170B178C010C148312BD
100070008510851A39284320432043204F204F20E4
10008000432043203928FD30A1008F001B30A200FF
100090008E001014FF30A00010184C280800FA3011
1000A000A1008F00C930A2008E00101c00004E0010
1000B000101858280800101021088F0022088E0000
0C00C00002308506A00B10140800080098E0010FFA
02400E00843FED0442000003000200B500000001FF
Eh oui, après "assemblage", il ne restera que cela de toutes nos cinq premières pages !

Psi

8/5/07
N.B. — Textes, schémas, programmes © Psi pour Ptitrain. Photos Jidé ou D.R. quand signalé. — Toutes vos remarques et commentaires sont bienvenus, et les pages de Ptitrain ne sont pas statiques : les erreurs sont corrigées sitôt connues, les améliorations, éclaircissements, etc. feront l´objet de mises à jour fréquentes.
Ptitrain, l´e-magazine du train éclectique. — Directeur de la publication : Christophe Franchini.
Rédacteur en chef : Jean-Denis Rondinet