<< The Fribotte Homepage >>
Un club de passionnés en robotique participant à la coupe de France E=M6.
[Accueil] [Qui sommes-nous ?] [Robots] [Coupe e=m6] [BD Technique] [Forum] [Reportages] [Liens] [WiKiFri]

Fribotte

 

La Programmation des pics
par Bigonoff
Premiere partie - pic 16f84 - Révision 6

Téléchargement des fichiers originels ici
Publié le 20/04/2002

2. Les systèmes de numérotation

Index coursIndex du cours
Chapitre précédent1. Introduction
Chapitre suivant3. Composition et fonctionnement des PICs

 

2. Les systèmes de numérotation
2.1 Le système décimal

Nous sommes habitués, depuis notre enfance à utiliser le système numérique décimal, à tel point que nous ne voyons même plus la manière donc ce système fonctionne, tant c'est devenu un automatisme.

Décimal, pourquoi ? Parce qu'il utilise une numérotation à 10 chiffres. Nous dirons que c'est un système en BASE 10. Pour la petite histoire, on a utilisé un système base 10 car nos ancêtres ont commencé à compter sur leurs 10 doigts, pas besoin d'aller chercher plus loin. Mais la position des chiffres a également une grande importance. Les chiffres les moins significatifs se situent à droite du nombre, et leur importance augmente au fur et à mesure du déplacement vers la gauche. En effet, dans le nombre 502, le 5 à une plus grande importance que le 2. En réalité, chaque chiffre, que l'on peut appeler DIGIT, à une valeur qui dépend de son RANG . Quel est ce rapport ? Il s'agit tout simplement de l'élévation de la BASE utilisée élevé à la puissance de son RANG .

Cela a l'air complexe à écrire, mais est très simple à comprendre. Quand vous avez compris ceci, vous comprendrez automatiquement n'importe quel système de numérotation. Reprenons, par exemple notre nombre 502. Que signifie-t-il ? Et bien, tout simplement que sa valeur est égale à 2 multiplié par la base (10) élevée à la puissance du rang du chiffre, c'est à dire 0. Remarquez ici une chose très importante : le comptage du rang s'effectue toujours de droite à gauche et en commençant par 0. Pour notre nombre 502, sa valeur est donc en réalité :

502 = 2*100 + 0*101 + 5*102

Notez que le symbole * est utilisé pour indiquer " multiplié ". Et rappelez-vous que 100 = (10/10) = 1, que 101 = 10, et que 102 = 10*10 = 100 etc.

2.2 Le système binaire

Vous avez compris ce qui précède ? Alors la suite va vous paraître simple. Cela ne pose aucun problème pour vous de compter sur vos 10 doigts, mais pour les ordinateurs, cela n'est pas si simple. Ils ne savent faire la distinction qu'entre 2 niveaux (présence ou absence de tension). Le système de numérotation décimal est donc inadapté.

On comprendra immédiatement que le seul système adapté est donc un système en base 2, appelé système binaire. Ce système ne comporte donc que 2 chiffres, à savoir 0 et 1. Comme, de plus, les premiers ordinateurs (et les pics) travaillent avec des nombres de 8 chiffres binaires, on a donc appelé ces nombres des octets (ou bytes en anglais). Le chiffre 0 ou 1 est appelé un BIT(unité binaire, ou BInary uniT) .

Pour nous y retrouver dans la suite de ce petit ouvrage, on adoptera les conventions suivantes : tout nombre décimal est écrit tel quel, ou en utilisant la notation D'xxx' ; tout nombre binaire est écrit suivant la forme B'xxxxxxxx' dans lesquels les 'x' valent... 0 ou 1, vous avez suivi.

Analysons maintenant un nombre binaire, soit l'octet : B'10010101'. Quelle est donc sa valeur en décimal ? Et bien, c'est très simple, on applique le même algorithme que pour le décimal. Partons de la droite vers la gauche, on trouve donc :

B'10010101' = 1*20 + 0*21 + 1*22 + 0*23 + 1* 24 + 0*25 + 0*26 + 1*27

Comme, évidemment 0 multiplié par quelque chose = 0 et que 1 multiplié par un chiffre = le chiffre en question, on peut ramener le calcul précédent à :

B  '10010101' = 1+4+16+128 = 149

Vous voyez donc qu'il est très facile de convertir n'importe quel chiffre de binaire en décimal. Et l'inverse me direz-vous ? Et bien, c'est également très simple. Il faut juste connaître votre table des exposants de 2. Cela s'apprend très vite lorsqu'on s'en sert.

On procède simplement de la manière suivante (il y en a d'autres) :

Quel est le plus grand exposant de 2 contenu dans 149 ? Réponse 7 (27 = 128)
On sait donc que le bit7 vaudra 1. Une fois fait, il reste 149-128 = 21
Le bit 6 représente 64, c'est plus grand que 21, donc b6 = 0
Le bit 5 représente 32, c'est plus grand que 21, donc b5 = 0
Le bit 4 représente 16, donc ça passe, b4 = 1, il reste 21-16 = 5
Le bit 3 représente 8, c'est plus grand que 5, donc b3 = 0
Le bit 2 représente 4, donc b2 = 1, reste 5-4 = 1
Le bit1 représente 2, c'est plus grand que 1, donc b1 = 0
Le bit 0 représente 1, c'est ce qu'il reste, donc b1=1, reste 0

Le nombre binaire obtenu est donc B'10010101', qui est bien notre octet de départ. Notez que si on avait trouvé un nombre de moins de 8 chiffres, on aurait complété avec des 0 placés à gauche du nombre. En effet, B'00011111' = B  '11111', de même que 0502 = 502.

Pensez à toujours compléter les octets de façon à obtenir 8 bits, car c'est imposé par la plupart des assembleurs (nous verront ce que c'est dans la suite de ces leçons).

Notez que la plus grande valeur pouvant être représentée par un octet est donc : B'11111111'. Si vous faites la conversion (ou en utilisant la calculette de Windows en mode scientifique), vous obtiendrez 255. Tout nombre supérieur à 255 nécessite donc plus d'un octet pour être représenté.

2.3 Le système hexadécimal

La représentation de nombres binaires n'est pas évidente à gérer, et écrire une succession de 1 et de 0 représente une grande source d'erreurs. Il fallait donc trouver une solution plus pratique pour représenter les nombres binaires. On a donc décidé de couper chaque octet en 2 (QUARTET) et de représenter chaque partie par un chiffre.

Comme un quartet peut varier de b'0000' à b'1111', on constate que l'on obtient une valeur comprise entre 0 et 15. Cela fait 16 combinaisons. Les 10 chiffres du système décimal ne suffisaient donc pas pour coder ces valeurs.

Plutôt que d'inventer 6 nouveaux symboles, il a été décidé d'utiliser les 6 premières lettres de l'alphabet comme CHIFFRES. Ce système de numérotation en base 16 a donc été logiquement appelé système hexadécimal.

Notez que ce système est simplement une représentation plus efficace des nombres binaires, et donc que la conversion de l'un à l'autre est instantanée. Dans la suite de ces leçons, nous noterons un nombre hexadécimal en le faisant précéder de 0x. Voyons si vous avez bien compris :

Tableau de conversion des différents quartet (un demi-octet) :

Binaire

Hexadécimal

Décimal

B'0000'

0x0

0

B'0001'

0x1

1

B'0010'

0x2

2

B'0011'

0x3

3

B'0100'

0x4

4

B'0101'

0x5

5

B'0110'

0x6

6

B'0111'

0x7

7

B'1000'

0x8

8

B'1001'

0x9

9

B'1010'

0xA

10

B'1011'

0xB

11

B'1100'

0xC

12

B'1101'

0xD

13

B'1110'

0xE

14

B'1111'

0xF

15


Pour représenter un octet il faut donc 2 digits hexadécimaux. Par exemple, notre nombre B'10010101' est représenté en hexadécimal par 0x95. Si vous faites la conversion de l'hexadécimal vers le décimal, vous utilisez le même principe que précédemment, et vous obtenez 0x95 = 9*161 + 5*160 = 149, ce qui est heureux.

Pour preuve, quel est le plus grand nombre hexadécimal de 2 digits pouvant être représenté ? Réponse : 0xFF, soit 15*16 + 15 = 255.

Si vous avez bien tout compris, vous êtes maintenant capable de convertir n'importe quel nombre de n'importe quelle base vers n'importe quelle autre.Vous trouverez également dans certaines revues, des allusions au système octal, qui est un système en base 8 qui a été largement utilisé.
 

2.4 Les opérations

Après avoir converti les nombres dans différents formats, vous allez voir qu'il est également très simple de réaliser des opérations sur ces nombres dans n'importe quel format. Il suffit pour cela d'effectuer les mêmes procédures qu'en décimal.

Petit exemple : Que vaut B'1011' + B  '0110' ?

Et bien, on procède exactement de la même façon que pour une opération en décimal.

B'1011 '

+ B'1110 '

---------------


On additionne les chiffres de droite, et on obtient 1 + 0 = 1
On écrit 1
On additionne 1 + 1 , et on obtient 10 (2 n'existe pas en binaire). On écrit 0 et on reporte 1
On additionne 0 + 1 + le report et on obtient 10. On écrit 0 et on reporte 1
On additionne 1 + 1 + le report et on obtient 11. On écrit 1 et on reporte 1
Reste le report que l'on écrit, soit 1.

La réponse est donc B'11001', soit 25.

Les 2 nombres de départ étant B'1011', soit 11, et B'1110', soit 14. Vous procéderez de la même manière pour les nombres hexadécimaux, en sachant que :

0xF + 0x1 = 0x10, soit 15+1 = 16

2.5 Les nombres signés

Dans certaines applications, il est nécessaire de pouvoir utiliser des nombres négatifs. Comme les processeurs ne comprennent pas le signe " - "  , et comme il fallait limiter la taille des mots à 8 bits, la seule méthode trouvée a été d'introduire le signe dans le nombre.

On a donc choisi (pas au hasard) le bit 7 pour représenter le signe. Dans les nombres signés, un bit 7 à "1" signifie nombre négatif. Si on s'était contenté de cela, on aurait perdu une valeur possible. En effet, B'10000000' (-0) serait alors égal à B'00000000' (0). De plus, pour des raisons de facilité de calcul, il a été décidé d'utiliser une notation légèrement différente.

Pour rendre un nombre négatif, il faut procéder en 2 étapes.

  • On inverse la totalité du nombre.
  • On ajoute 1

On obtient alors ce qu'on appelle le COMPLEMENT A DEUX du nombre.

Exemple : soit le nombre 5 : B'00000101' Comment écrire -5 ?

  • On inverse tous les bits (complément à 1) B'11111010'
  • On ajoute 1 (complément à 2) -5 = B'11111011'

Pour faire la conversion inverse, on procède de façon identique.

  • On inverse tous les bits B'00000100'
  • On ajoute 1 B '00000101'

Et on retrouve notre 5 de départ, ce qui est logique, vu que -(-5) = 5.

Dans le cas des nombres signés, on obtient donc les nouvelles limites suivantes :

La plus grande valeur est B'01111111', soit +127
La plus petite valeur devient B'10000000', soit -128.

Remarquez que les opérations continuent de fonctionner. Prenons -3 + 5

B'11111101' (-3)

+ B'00000101' ( 5)

= B'100000010' ( 2)


Et la, me direz vous, ça ne fait pas 2 ? Et bien si, regardez bien, il y a 9 bits , or le processeur n'en gère que 8. Le 9ème est donc tombé dans un bit spécial que nous verront plus tard. Dans le registre du processeur, il reste donc les 8 bits de droite, soit 2, qui est bien égal à (-3 )+ 5.

Maintenant, si vous avez bien suivi, vous êtes en train de vous poser la question suivante : Quand je vois B'11111101', est-ce que c'est -3 ou est-ce que c'est 253 ? Et bien vous ne pouvez pas le savoir sans connaître le contexte.

Sachez que les nombres signifient uniquement ce que le concepteur du programme a décidé qu'ils représentent. S'il travaille avec des nombres signés ou non, ou si cet octet représente tout autre chose. La seule chose qui importe c'est de respecter les conventions que vous vous êtes fixées lors de la création de cet octet. C'est donc à vous de décider de quoi vous avez besoin pour tel type de données.

2.6 Les opérations booléennes

Qu'est-ce que c'est que ça, me direz-vous ? Et bien, pour faire simple, disons que ce sont des opérations qui s'effectuent bit par bit sur un octet donné. Plutôt qu'une grosse théorie sur l'algèbre de Boole (j 'en vois qui respirent), je vais donner dans le concret en présentant les opérations indispensables à connaître dans la programmation des pics et autres microcontrôleurs.

2.6.1 Le complément

Que vous trouverez également sous les formes " inversion " ou " NOT " ou encore complément à 1. Elle est souvent notée " ! ". Son fonctionnement tout simple consiste à inverser tous les bits de l'octet.

Exemple : NOT B'10001111' donne 'B01110000  '. Vous voyez ici que pour les opérations booléennes, il est plus facile de travailler en binaire. Traduisez l'exemple ci-dessus en hexadécimal (on dira maintenant " hexa ") ou en décimal et essayez de complémenter directement. Bonjour les neurones.

A quoi sert cette opération ? Par exemple à lire une valeur dont les niveaux actifs ont été inversés, à réaliser des nombres négatifs, ou autres que nous verrons par la suite..

2.6.2 La fonction " ET " ou " AND "

Appelée également multiplication bit à bit, où " AND " et souvent notée "  & "

Elle consiste à appliquer un mot sur un autre mot et à multiplier chaque bit par le bit de même rang. Pour faire une opération " ET ", il faut donc toujours 2 octets.

Les différentes possibilités sont données ci-dessous (le tableau se lit horizontalement)
Première ligne : 0 AND 0 = 0. Ce type de tableau s'appelle " table de vérité " :

Bit1

Bit2

AND

0

0

0

0

1

0

1

0

0

1

1

1


On voit donc que la seule possibilité pour obtenir un " 1 " est que le Bit1 ET le Bit2 soient à " 1 ". Ceci correspond à une multiplication. 1*1 = 1, 0*1 = 0, 1*0 = 0.

Exemple :

Soit B'11001100' AND B  '11110000' donne B'11000000'

A quoi sert cette instruction ? Et bien, elle est utilisée pour MASQUER des bits qui ne nous intéressent pas.

Prenez l'exemple ci-dessus : Le 2ème octet contient 4 bits à 1 et 4 bits à 0. Regardez le résultat obtenu : Les 4 premiers bits de l'octet 1 sont conservés (1100), à l'emplacement des 4 autres nous trouvons des 0.

On peut donc à l'aide de cette instruction positionner un ou plusieurs bits dans un mot à 0 sans connaître son contenu précédent.

2.6.3 La fonction " OU " ou " OR "

Encore appelée OR, souvent notée " | " elle permet, comme son nom l'indique, de positionner un bit à 1 si le Bit1 OU le Bit2 est à 1.

La  table de vérité suivante explique le fonctionnement de cette fonction :

Bit1

Bit2

OR

0

0

0

0

1

1

1

0

1

1

1

1


Petit exemple B'10001000' OR B'11000000' donne B'11001000'

A quoi sert cette instruction ? Et bien, tout simplement elle permet de forcer n'importe quel bit d'un mot à 1 sans connaître son contenu précédent.

Vous voyez que dans l'exemple précédent, les 2 premiers bits ont été forcés au niveau 1, indépendamment de leur niveau précédent.

2.6.4 La fonction " OU EXCLUSIF " ou " Exclusif OR " ou " XOR "

Voici la dernière fonction que nous allons aborder dans cette mise à niveau. Elle est souvent appelée XOR (eXlusif OR). Elle se comporte comme la fonction OR, à un détail près.

Pour obtenir 1, il faut que le Bit1 soit à 1 OU que le Bit2 soit à 1 à l'EXCLUSION des deux bits ensemble. Si les 2 bits sont à 1, alors le résultat sera 0.

Voici donc la table de vérité :

Bit1

Bit2

XOR

0

0

0

0

1

1

1

0

1

1

1

0


Petit exemple : B'10001000  ' XOR B'11000000' donne B'01001000  '

A quoi sert cette instruction ? et bien tout simplement à inverser un ou plusieurs bits dans un mot sans toucher aux autres. Dans l'exemple précédent, vous voyez qu'à l'emplacement des 2 bits à 1 du 2ème octet, les bits correspondants du 1er octet ont été inversés.

Voilà, ainsi se termine le premier chapitre consacrée aux pics. Je sais qu'il était particulièrement rébarbatif, mais, si vous ne maîtrisez pas parfaitement ce qui vient d'être expliqué, vous ne pourrez pas réaliser correctement vos propres programmes.

 

Index cours
Index du cours
Chapitre précédent
1. Introduction
Chapitre suivant
3. Composition et fonctionnement des PICs

 


Complétez cette page, posez vos questions et remarques ici : WiKiFri

Page http://fribotte.free.fr/bdtech/cours/pic16f84/PART1_cours02.html modifiée le 14/10/2002.
Copyright fribotte@free.fr, libre de droit pour toute utilisation non commerciale.
Reproduction autorisée par simple mail