Cette rubrique PicTrain est toute nouvelle, elle a débuté la semaine dernière ! Vous pouvez aisément nous rattraper et sauter en marche !
Aujourd´hui à notre menu :
2.
2.1.
2.1.1.
2.1.2.
2.1.3.
2.2.
2.2.1.
2.2.2.
UN PEU PLUS SUR LES MICROP
Un peu plus sur la structure du microp...
   Et pourtant il tourne !
   Il pense donc il est !
   Et il communique !
Et sur son fonctionnement
   Les données
   Les registres
2. Un peu plus sur les microP
2.1.Un peu plus sur la structure du microP
On ne peut pas nier que les microP sont des choses assez compliquées si on rentre vraiment dans les détails, par exemple ci-contre la structure logique interne du 12F675 (cliquer sur ce schéma pour le voir en grand).
Pour ceux qui sont vraiment vicieux, la documentation technique complète fait 132 pages auxquelles on ne manquera pas d´ajouter 200 à 300 pages d´annexes...
Heureusement que ces détails ne nous intéressent pas !
Pour comprendre et utiliser à notre niveau ces bêtes, il suffit de comprendre certaines notions assez simples, et de toujours avoir un raisonnement bien logique.

2.1.1. Et pourtant il tourne !
Comme je l´ai déjà signalé, un microP n´est normalement jamais au repos, il y en permanence une horloge qui tourne et égrène les tic-tac (pas confondre avec les tii-taa du klaxon).
Il y a différentes manières de faire tourner cette horloge, et à différentes vitesses, mais nous prendrons la plus simple : l´horloge interne standard. Cette horloge tourne à 4 MHz, c´est-à-dire qu´elle donne un tic toutes les 1/4·000·000 de seconde (4·000·000 de tics par seconde). Elle peut aller plus vite (ou plus lentement), mais c´est plus compliqué, et cela ne nous apporte rien pour notre utilisation.
Il faut toujours 4 tics au microP pour exécuter une instruction, ce qui veut dire qu´il exécute 4·000·000/4 = 1 million d´instructions par seconde, ce qui est pas mal, et en plus cette vitesses est précise à moins d´un pour cent près.
Vous devinez déjà l´intérêt de cette horloge : nous allons pouvoir générer, avec un programme adéquat, d´autres fréquences, et notamment les 370 et 660 Hz du klaxon, et aussi la demi-seconde du durée d´un son.
2.1.2. Il pense donc il est !
Dans un programme, on peut exécuter différentes opérations, comme des additions ou soustractions, ainsi que toutes les opérations logiques (et, ou...) chères à Jidé.
Cela fonctionne exactement comme vous devant votre calculatrice de poche ! (ne prenez pas une calculatrice avec une bande de papier, c´est trop facile).
Lorsque vous voulez effectuer un calcul, vous introduisez un nombre, vous déclenchez l´opération voulue, introduisez le deuxième nombre, et tapez = pour avoir un résultat qui s´affiche. Si vous avez d´autres opérations, vous sauvez le résultat dans la mémoire s´il y en a une dans votre calculatrice, ou l´écrivez sur un bout de papier pour le récupérer plus tard.
Dans un microP, vous allez faire la même chose : vous allez mettre le premier nombre dans une case, le deuxième dans une autre case, exécuter l´instruction additionner, et vous retrouvez le résultat (en général dans une des cases). Vous pouvez sauvegarder les résultats intermédiaires dans différentes cases, comme sur votre bout de papier (on verra plus loin que ces cases s´appellent des registres).
C´est donc très proche de ce que vous faites à la main, mais il y a une grosse différence:: dans une calculette, la taille des nombres que vous manipulez est en général limitée à 10·000·000 (dix millions) ; dans un microP vous êtes limités à 255 (deux cent cinquante-cinq). Qu´est-ce que cela veut dire ?
Cela veut dire que dans un microP vous allez être obligés de calculer comme si vous faisiez l´addition à la main, chiffre par chiffre de chacun de vos nombres ! Vous allez dire “Stop, on arrête tout, ce n´est pas la peine de continuer”, mais vous avez tort : une addition n´est que la succession toujours identique d´opérations élémentaires (les instructions), et que ces suites d´instructions ont été écrites par d´autres pour vous (comme moi par exemple), et que donc on ne va pas réinventer la roue chaque fois (algorithme).
PTI+   ALGORITHME — Définition : Ensemble des règles opératoires intervenant dans toute espèce de calcul. — En pratique : Ensemble d’opérations élémentaires permettant d’obtenir un résultat. Tout programme est donc aussi un algorithme.
ALGORITHME STANDARD —  Il y a des algorithmes que l’on peut appeler “standards”, comme par exemple la méthode pour effectuer une addition à la main. On n’a pas besoin de réfléchir pour le créer, il existe, vous l’avez appris à l’école primaire. — En pratique : En informatique aussi, il existe des algorithmes standards (morceaux de programme), que l’on trouve dans les documentations ou sur Internet, comme additionner des grands nombres dans un microP ; là non plus il n’y a rien à cogiter, on applique bêtement.
Ensuite et surtout n´oubliez pas la vitesse d´exécution du microP : même s´il faut par exemple 500 instructions pour additionner deux nombres, à la vitesse d´un million d´instructions par seconde cela ne prendra que 1/2·000 de seconde, ce qui est quand même plus rapide que vous !
Bref, ce qu´il faut surtout retenir, c´est qu´un microP ne peut effectuer que des opérations simples sur des nombres très petits, mais que comme il va très très vite, on s´y retrouve quand même ! En d´autres termes, le microP ne pense pas beaucoup, mais il pense très vite.
2.1.3. Et il communique !
Un microP tout seul, sans communication avec l´extérieur, ne sert pas à grand-chose !
Il faut bien communiquer avec lui (appuyer sur le bouton) et recueillir un résultat (un exemple ? tiiii-taaaaa ).
Tout microP dispose donc d´“Entrées/Sorties”. Ce sont en général des connections électroniques qui fonctionnent en “tout ou rien”, et qui sont disponibles dans le programme via des bits d´information à 0 ou 1.
Les caractéristiques électriques en entrée sont comparables à celles des circuits logiques intégrés :
zéro volt sur la patte = le bit est à zéro ;
cinq volts sur la patte = le bit est à 1
.
Dans notre exemple, quand je dis que “je regarde si on appuie sur le bouton”, cela veut dire que dans mon programme je regarde le bit correspondant à l´entrée (on verra plus loin où il se trouve) ; s´il est à 1, il ne se passe rien* et je continue de regarder ; s´il est à 0, je déclenche la suite d´instructions pour émettre mon tiiii-taaaa.
* Inactif à un, curieux, non  ? Comme souvent, dans nos montages électroniques “réels”, les bits sont “actifs” à 0 et inactifs à 1 (ce qui est aussi le cas dans les PIC) à cause des résistances de rappel (pull-up) connectées au plus.
En sortie, la patte est à 0 V (la masse) lorsque j´écris 0 dans le bit correspondant à la sortie, et à 5 V pour un 1. La sortie débite 20 mA, suffisants pour allumer une led, et aussi suffisant pour alimenter notre haut-parleur.
Dans notre montage, on va émettre une succession de 0 et de 1 sur la patte correspondant au haut-parleur (c´est-à-dire écrire 0 puis 1 dans le bit de sortie), aux bonnes fréquences, c´est-à-dire 370 fois par seconde pour le taaaa et 660 fois par seconde pour le tiiii.
PTI+   Pour les électroniciens:
— Les entrées sont à haute impédance.
— Pour les sorties, on peut les mettre à un, à zéro ou dans certains cas “en l’air” (tri-state). Par ailleurs, toutes les pattes ont de multiples fonctions : E/S normale, entrées/sortie de comparateurs, entrées de conversion analogique/numérique...
— La fonction d’une patte est définie par le programme, et peut être changée en cours de route. Par exemple, une patte peut être en entrée durant une partie du programme et en sortie durant une autre partie.
— On peut aussi définir l’activation en interne de résistances de rappel, et certaines entrées sont à trigger de Schmitt.
2.2.Un peu plus sur le fonctionnement du microP

2.2.1. Les données
Comme tout bon circuit logique, les microP manipulent des bits à 0 ou 1. On a vu aussi ci-dessus que l´on peut manipuler des chiffres. En informatique, quel que soit son niveau, de notre modeste microP jusqu´aux systèmes les plus sophistiqués, on utilise l´octet (en anglais byte), composé de 8 bits.
PTI+    Bits et octets. — Le bit est l’unité élémentaire d’information, qui ne peut prendre que deux valeurs : 0 ou 1 (oui-non, allumé-éteint...). L’octet (ou byte en anglais) est un ensemble de huit bits. Pour des raisons historiques, la plupart des processeurs fonctionnent sur 8 bits (ou multiples de 8).
Au niveau physique du microP, tout est de toute façon traité comme des suites de 0 et de 1, mais nous n´allons pas “descendre” jusqu´à ce niveau. Dans nos programmes, nous travaillerons donc au niveau des octets, qui ont deux utilisations :
Soit l´octet contiendra un ensemble de bits indépendants, chacun ayant son utilité propre.
Soit il contiendra un nombre, de valeur entre 0 de 255 (il n´y a pas de nombres négatifs dans un microP).
Dans l´écriture des programmes il existe différentes manières de représenter le contenu d´un octet. Je propose cependant de n´en utiliser que deux :

Lorsqu´il s´agit d´un octet contenant des bits indépendants, par exemple reliés au monde extérieur (poussoir, led...), on écrira explicitement la série de bits sous la forme b´01100011´ (c´est-à-dire une série de huit zéros ou uns avec un b comme bit ou binaire).
Pour l´écriture de nombres (bits considérés comme un groupe, un octet), on écrira par exemple d´99´ (d comme décimal, le nombre le plus grand sera 255).
Notez bien : le b ou le d indiquent le type d´écriture, bit à bit ou décimal.
Attention : lorsque l´on utilise la représentation par bits, ils sont numérotés de 0 à 7 à partir de la droite ; dans l´octet b´01100011´ les bits à 1 sont les numéros 0, 1, 5 et 6.
Il vaut mieux ne pas oublier ces deux remarques (le premier bit est le n° 0, et il se trouve tout à droite) , car nous allons très souvent travailler au niveau ces bits à l´intérieur d´un octet, et vous ne comprendrez rien si vous confondez l´ordre ou le numéro des bits.
2.2.2. Les registres
Où sont les données ? Nous avons vu ci-dessus la représentation des données, mais il faut bien les stocker quelque part. Un peu plus haut, j´ai utilisé le mot “case”. Dans nos microP, ces cases s´appellent simplement des registres. Ici aussi, il s´agit d´un terme historique, ne cherchons donc pas à savoir pourquoi.
Les registres sont donc simplement des emplacements de la mémoire du microP où l´on range les données, toujours bien entendu sur 8 bits (un octet).
Ci-contre, vus au microscope électronique, les registres d´un microP. Ce modèle, assez ancien, comporte sept registres ; quand on tire sur un registre, on voit les huit bits à l´intérieur.
Il y a deux types de registres :
 Les registres spéciaux, qui contiennent les données spécifiques au fonctionnement du microP (on pourrait appeler cela des paramètres). Le meilleur exemple est le registre d´entrée/sortie, qui contient un bit par entrée et donne l´état (0 ou 1) de chaque entrée.
Dans le 12F675, il y 35 registres spéciaux, car ce microP sait faire beaucoup de choses. Rassurez-vous, dans notre pratique, nous n´en utiliserons que 5, on oubliera tous les autres.
 Les registres généraux, qui sont à notre disposition. Dans le 12F675, il y en 64, ce qui est largement suffisant pour nos besoins.
ATTENTION : les registres sont effacés lorsque l´on coupe le courant, et on perd l´information qui s´y trouvait. Ils ne sont donc “valables” que pour la durée d´exécution de notre programme.
A l´initialisation (lorsque l´on met le courant), les registres spéciaux contiennent des valeurs précises données par la documentation. Comme ce ne sont pas en général celles que l´on désire, au début d´un programme, on va commencer par les changer comme il nous convient.
Pour les registres généraux, leur contenu est aléatoire et inconnu, c´est à nous de les initialiser, généralement à 0 (c´est-à-dire tous les huit bits à zéro). On reverra tout ceci lorsque l´on attaquera (bientôt) notre premier programme.
RE-ATTENTION : un registre comporte toujours 8 bits, peu importe son utilisation (c´est-à-dire une valeur entre 0 et 255 ou une série de bits indépendants). Il existe des instructions travaillant sur un octet (mettre à zéro, additionner, copier...) ou sur un seul bit dans l´octet, comme mettre tel bit à zéro ou un.
Voici un registre plein de zéros, le chiffre décimal correspondant est zéro... Et un autre registre plein de uns, le chiffre décimal correspondant est 255.
Voilà un registre plein de zéros et de uns et comment on calcule le chiffre décimal correspondant (99), toujours en partant de la droite. Après tout, ça n´est pas radicalement différent de ce qu´on ferait “en français” si l´on décomposait par exemple l´année de la Révolution, toujours en partant de la droite   !
RE-RE-ATTENTION : il est vrai que cela commence à se compliquer, et avec les registres on entre vraiment dans la programmation des microP. Si vous avez suivi jusqu´ici, tout va bien. Sinon, relisez une fois (ou deux), et si cela ne va toujours pas, exprimez-vous sur la liste Ptitrainmatique  : ma pédagogie ne doit pas être très bonne !
À suivre : “Un peu plus sur la programmation
Psi

26/3/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, écl1/4/07rave; jour fréquentes.
Ptitrain, l´e-magazine du train éclectique. — Directeur de la publication : Christophe Franchini.
Rédacteur en chef : Jean-Denis Rondinet