Étape 1: Les opérations binaires et au niveau du bit
Avant de nous plonger dans les fiches techniques, nous avons besoin de comprendre certains concepts de bas niveau que vous utiliserez chaque fois que vous voulez faire quelque chose d’intéressant avec un micro.
Permet de démarrer à la base, le bit.
Un bit est la plus petite unité de données à un ordinateur, c’est un « 1 » ou un « 0 ».
En d’autres termes, c’est soit sur ou hors tension.
Pour faire quoi que ce soit utile dans un ordinateur, un seul bit ne suffit pas, donc ils sont regroupés en octets.
Un octet est 8 bits ensemble, et binaire comptant un octet peut stocker 0-255 (256 numéros) ou -128 à 127 (Merci à Joel dans les commentaires pour s’en apercevoir l’erreur).
Par exemple :
00000000 = 0
00000001 = 1
00000010 = 2
00000011 = 3
00000100 = 4
Tout comme lorsque vous faites l’inventaire sous forme décimale (base 10, comme les 10 doigts!), quand vous dépassez 9, vous mettez un 1 à l’avant et mettre le second chiffre 0.
C’est la même chose avec le binaire, mais étant donné que 0 ou 1, lorsque vous dépassez « 1 » vous mettez un 1 à l’avant et un « 0 », comme le deuxième chiffre.
Les caractéristiques d’un microcontrôleur sont contrôlés par les registres. Dans le cas d’un AVR 8 bits, ils sont 8 ou 16 bits de long.
Au lieu de tout cela représentant un nombre cependant, chaque bit détermine si une certaine fonctionnalité est activée ou désactivée.
Nous allons regarder beaucoup de différents registres plus tard, mais pour l’instant, Let's make up un imaginaire nous pouvons voir comment les manipuler.
Imaginez que nous trouvons un registre dans la feuille de données qui se connecte à 8 LEDs, appelés LEDREG.
Chaque bit dans le Registre est un 1 ou un 0, la LED est allumé, ou il est désactivé.
Nous pourrions allumer la première LED comme suit :
LEDREG = 1 ; 00000001
2 LED
LEDREG = 2 ; 00000010
Mais qu’en est-il de la LED 3ème ?
Si nous l’avons fait :
LEDREG = 3 ; 00000011
Nous ne serait pas obtenir le 3ème LED, nous obtiendrions LED 1 & 2 illuminé à la place !
Avec les registres, il n’est pas le nombre qui compte, mais ressemblent à ce que les bits sous-jacent.
Le 3ème LED look serait comme ceci :
LEDREG = 4 ; 00000100
Si vous voulez tourner sur différents modèles de LED, vous pourriez travailler tous les 256 combinaisons, mais ce serait fastidieux.
Il y a un meilleur moyen !
Logique booléenne
Les ordinateurs à le œuvre de niveau le plus bas avec quelque chose appelé logique booléenne.
Ils utilisent des portes logiques pour combiner des nombres binaires.
Par exemple une porte et sortie seulement un 1 si les deux entrées sont à 1.
Une porte d’OR sortira un 1 si une de ses entrées est 1.
Jetez un oeil ici :
http://www.Electronics-Tutorials.WS/Boolean/bool_6.html
Il montre les « tables de vérité » pour des portes logiques communs.
Alors, à quoi sert tout cela pour nous ?
Nous pouvons faire usage de ces portes logiques directement à l’aide des opérateurs de bits
Opérations au niveau du bit
Permet de dire, nous avons déjà la LED 3ème sur :
LEDREG = 4 ; 00000100
Comment pouvons nous allumer la première LED ?
Nous pourrions mettre dans la valeur 5 (00000101), mais nous ne voulons pas avoir à comprendre quelle combinaison chaque fois.
Au lieu de cela nous pouvons utiliser un opérateur OR comme suit :
LEDREG = LEDREG | 1 ;
Ce qui veut dire cela
00000100 ou
00000001
--------------
00000101
L’opérateur OR aligne chaque bit et si elle est activée dans chaque octet, il sera sur la production.
Un moyen plus rapide d’écrire "LEDREG = LEDREG | 1;"est :
LEDREG | = 1 ;
Vous pouvez également enchaîner vos opérateurs comme suit :
LEDREG | = 1 | 2 ;
Cela vous sera utile lorsque nous apprenons des opérateurs de décalage.
Que se passe-t-il si vous souhaitez activer/désactiver toutes les LEDs ?
Vous pouvez utiliser un opérateur NOT :
LEDREG = ~ LEDREG ;
Un opérateur NOT inverse tous les bits, donc vous obtenez :
00000101 pas
--------------
11111010
Suivant permet d’observer l’opérateur AND.
ET sert à masquer une valeur.
Autrement dit, il est utilisé pour les vierges des sections d’un octet, mais maintenir la valeur de la section démasquée, comme suit :
11111010 et
00001111
-------------
00001010
Vous pouvez utiliser un et désactiver tout un groupe de LED sans changer l’état du reste.
Dans l’exemple ci-dessus, il pourrait être utilisé comme :
LEDREG & = 15 ; 00001111
Un opérateur plus utile avant de passer est le XOR.
XOR est synonyme d’eXclusive ou.
Cependant, il est semblable à une porte d’OR, si les deux bits sont sur, ils sont éteints.
Par exemple :
LEDREG ^ = 15 ;
00001010 XOR
00001111
-------------
00000101
Maintenant, seuls les opérateurs sont limités, vous devez convertir de binaire en nombre décimal équivalent.
C’est où les opérateurs de décalage entrent en
Opérateurs de décalage
Un opérateur de décalage ne fait que déplacer tous les chiffres à gauche ou à droite.
Par exemple un décalage à gauche de 1 :
x = 5 << 1 ;
vous donne x == 10
en binaire, c’est :
00000101 <<
-------------
00001010
Un décalage vers la droite déplace simplement les bits vers la droite :
00001010 >>
--------------
00000101
Des bits aux extrémités sont tout simplement perdus (ou stockés dans un registre de carry, mais permet d’ignorer que pour l’instant!)
Un opérateur de décalage peut servir une très rapide multiplication & division, aussi longtemps que vous êtes heureux avec seulement multiplier / diviser par des puissances de 2, par exemple :
x << 1 == x * 2
x << 2 == x * 4
x << 3 == x * 8
Quarts de travail sont beaucoup utilisées dans les registres de réglage.
Permet de revenir à notre exemple de LED.
Si nous voulons définir le bit 6, au lieu de travailler les quel nombre qui serait, puis ORing avec le registre, nous pouvons utiliser un déplacement vers la gauche comme ainsi :
LEDREG | = (1 << 5) ;
NB: Il est "5", pas "6" que nous avons seulement besoin de déplacer la « 1 » 5 fois.
En binaire, il regarderait comme suit :
00000001 <<
-------------
00100000
Qui est alors ajouté au registre comme suit :
00000101 OU
00100000
-------------
00100101
Dans les fiches techniques, la position de certains un peu habituellement reçoit un nom comme « RXEN » qui sert à allumer reçoit la mode dans le périphérique série et « TXEN » transmit.
Ensemble ils auraient l’air quelque chose comme ceci :
UCSRB | = (1 <
Cela devrait être suffisant pour vous aider à démarrer, laisse passer quelques exemples concrets !