Étape 9: Deux Blinky – le sens des déclarations
L’idée générale du programme Blinky deux : tout d’abord, la valeur B0 comme une sortie et B1 (et le reste) en tant qu’entrée. B0 conduit la LED et B1 est une entrée pour le commutateur. Nous voulons que la LED clignote, qui signifie que B0 doivent constamment faire basculer États lorsque l’entrée est de B1 à logique 0 (c'est-à-dire, les NIP à terre). Pour LED clignotant, nous devons écrire alternativement 0 et 1 à exactement une seule broche, nommément B0 sans affecter aucune autre broche. Nous faisons cela à l’aide d’opérations de bits de manière à affecter seulement B0. Pour déterminer si l’entrée sur le B1 est logique 0, nous utilisons un masque (et une opération de bits) pour singulariser le bit B1 et tester si elle est zéro, ce qui correspond à la LED en mode clignotant. Normalement, on n’utiliserait pas un tel arrangement compliqué, à moins qu’il n’en existait aucun autre choix. L’interrupteur serait très probablement être placé sur un autre port disponible distinct de la LED.
Pour certains de l’exposé qui suit, vous pouvez imprimer les deux Blinky codage afin de comparer facilement le codage avec l’explication.
Le #include #define F_CPU 8000000UL et #include n’ont pas changé de Blinky One, ni avoir les déclarations DDRB = 0b00000001, while(1) et les déclarations de _delay_ms.
Avis que DDRB = 0b00000001 ensembles B0 en tant que sortie, alors que tous les autres B physiques pins sont entrées à la MCU. En particulier, le B1 est une entrée. B0 entraîne la LED et B1 détecte l’interrupteur.
PORTB = 0b00000010 : ici, B0 étant une sortie, la main droite 0 dans cette cession PORTB définit pin B0 à zéro volts (LED « off »). Ensuite, B1 étant un intrant, la 1 dans l’attribution du PORTB écrit un 1 sur une entrée (B1) qui active la résistance de pull-up B1.
uint8_t : entier non signé de 8 bits, qui est généralement appelé un « octet ». Ce type de variable de stocker des nombres composé d’au plus 8 bits. Cette variable peut varier de 0 à 11111111 qui est 255 (ou 0 à 0xFF). L’uint8_t est un type défini et n’est pas C/C++ natif, bien que ces langues ont « char » et « unsigned char ». Note qu’un octet « signé » tels qu’int8_t aurait également une valeur de 0 à 0xFF, mais le bit le plus significatif (c'est-à-dire, le z en 0bzxxxxxxx) est de 1 pour négatif et 0 pour les nombres positifs.
Masque d’uint8_t = 0b00000010 : définit une variable 8 bits masque qui se voit attribuer la valeur de 0b00000010. Le masque servira à éliminer les bits 0 et 2-7 de l’examen.
Uint8_t MaskL = 0b00000001 : définit une 8 bits MaskL variable d’une valeur de 0b00000001 de masquage. Le L en MaskL sert à rappeler qu’elle s’applique à la LED. MaskL sera utilisé pour supprimer les morceaux B1 à B7 d’examen et ne touchent que peu B0.
uint8_t Test = 1: une variable 8 bits, compte tenue de la valeur initiale de 0b00000001. Dans ce cas, la valeur initiale n’est pas grave étant donné que la variable de Test sera donnée une valeur avant de vérifier sa valeur. La partie « = 1 » pourrait ont été laissée hors ; Toutefois, le point-virgule est toujours requis.
Test = PINB & masque : déclaration de The PINB va lire les bits dans le Registre qui représente les bits B7 par B0. Le « & » représente un bit par bit logique (voir tableau 2). Seulement peu #1 dans la variable de Test (par exemple, le bit correspondant à B1) conservera la valeur PINB originale après le masquage (c.-à-d. & masque) [16]. Par conséquent, selon le tableau 2, la variable pour que test aura tous les zéros, sauf peut-être bit B1 qui peut être 0 ou 1.
Lorsque l’extrémité du fil est reliée au rail 0v, broche B1 sera de zéro et donc PINB & masque produira tous les zéro pour tous les bits et Test aura donc la valeur 0. Le MCU conduira ensuite la LED « on ». Si l’extrémité du fil est enlevée, la résistance de pull-up placera Vcc sur la broche B1 afin que la valeur de PINB & masque aura la valeur 0b00000010. Le MCU verra une valeur différente de zéro pour Test et il permet de désactiver le LED.
if(x) : un contrôle de flux qui exécute des instructions entre les deux suivantes d’accolades {} lorsque l’instruction x est vrai. Dans ce cas, l’instruction x a la forme de Test == 0. Le double-signe égal « == » demande si oui ou non la variable « Test » est identique à « zéro » (c.-à-d., 0 x 00). En C/C++, la logique « faux » est équivalent à la valeur « 0 », mais la logique « true », c’est quoi que ce soit pas '0' par exemple '1' ou 5' et ainsi de suite. Pour deux Blinky, la variable « Test » est nul lorsque l’interrupteur est fermé et qui a quand nous voulons la LED clignote. Donc nous utilisons l’instruction ' si (Test == 0)'.
PORTB | = MaskL : généralement, la ligne verticale | On entend au niveau du bit ou [16]. L’instruction est un raccourci pour
PORTB = PORTB | MaskL
La main droite PORTB lit la valeur précédente envoyée au port. La main gauche PORTB puis écrit les résultats de l’opérateur ou au port. Le masquage utilise MaskL = 0b00000001 avec un 1 uniquement en position #0 (correspondant à B0), qui contrôle la LED. L’OR sera alors seulement affectent peu B0 en lui affectant 1 logique (broche 12 sera Vcc) tel que discuté en conjonction avec le tableau 3. Les autres bits dans l’écriture de portB sera la même car ils étaient Quand ai lu. Donc lorsque PORTB est écrit, aucun d'entre les résistances de pull-up sera être activé ou désactivé ! Seulement le bit le moins significatif (c'est-à-dire, B0) sera écrit dans 1 qui placera ensuite 5v sur la broche de B0 physique et qui va activer la LED.
PORTB & = ~ MaskL : cette déclaration est raccourci pour PORTB = PORTB & ~ MaskL où & est l’opération de bits AND (c.f., tableau 4). La main droite PORTB lit les valeurs écrites précédemment dans portB. La main gauche PORTB écrit le résultat de l’et retour à portB. Étant donné que MaskL = 0b00000001 then ~ MaskL = 11111110. L’AND affecterez bit #0 en PORTB logique 0. Les bits restants de port ne seront pas affectés et les valeurs d’origine vont être réécrites sur le portB. C’est pourquoi la connectivité des résistances de pull-up ne souffrira pas. Le code pin B0, qui entraîne la LED, sera défini sur zéro et la LED sera « off ».