Vous avez écrit le premier programme qui allume une LED. Oui, c’était spectaculaire ! Eh bien, pas vraiment, mais nous allons introduire un peu de folie à la LED. Nous allons donner une personnalité « bipolaire » en faisant clignoter. Puis nous allons intensifier un cran et faire clignoter très vite. Le programme est étonnamment concis et facile à mettre en œuvre.
Voyez par vous-même :
#include <avr/io.h>#include <util/delay.h> int main(void){DDRB | = 1 << PINB0 ;
while (1)
{
PORTB ^ = 1 << PINB0 ;
_delay_ms(100) ;
}
01001011 &10001101equals00001001
HÉ ! Quels sont les symboles de fous!! Crazy semble être un thème commun ici. Eh bien, je vais vous expliquer. Mais, je vous promets, c’est assez facile. Vous avez juste besoin de mémoriser un certain nombre de choses. J’entrerai dans un peu de détail, mais si vous ne recevez pas, ne vous inquiétez pas, juste mémoriser ce qu’accomplit l’instruction entière et vous serez amende. Je vous donnerai un soupçon le long du chemin. Voici le détail des opérations au niveau du bit :
Il y a des opérateurs logiques appelés AND, OR, ne pas et XOR qui nous préoccupe à ce stade. Ils signifient vraiment ce qu’ils disent. C’est tout pour le bien de comparer deux bits, "1" et "0". Voir ? Comment peut juste en comparant deux numéros être difficile ! « 1 » et « 1 » est vrai ou « 1 ». Et oui, vous l’aurez deviné, « 0 » et « 0 » est faux ou « 0 ». Mais ce qui est « 0 » et « 1 » et vice versa ? Eh bien, faux ou « 0 », évidemment. Ces gars-là sont différents, alors, vraiment, elles sont fausses.
Exemple et une opération binaire numéro (le « & » est utilisé en programmation pour C et) :
01001011 |10001101equals11001111
Facile, pas vrai ? Eh bien, ou est encore plus facile ! « 1 » ou « 1 » est « 1 », évidemment. « 0 » ou « 0 » est également « 0 ». Il commence à être très semblables aux AND, mais voici la différence. Si les deux nombres sont différents, il se traduira par « 1 ». Oui, « 1 » ou « 0 » est « 1 ».
Nous allons utiliser le même nombre binaire pour l’exemple (ce personnage drôle "|" est l’OR, parfois situé au-dessus de la « \ » sur le clavier) :
01001011 ^10001101equals11000110
Hmm, qui s’est sur tous les endroits où il n’avaient pas chers ! C’est là que la magie opère. Oui, il a gardé les plus dans le premier numéro et où il y a ceux dans le deuxième nombre binaire, mais pas le premier, il a changé à ceux à ceux. Très simple. PAS simplement prend tous les bits et les flips. Par exemple, pour ce nombre binaire : 01001101 va se transformer en 10110010. Il est devenu les 0 1 en 0 et 1, mais n’obtiennent pas ce confondre avec le XOR.
XOR est semblable à l’OR mais le « 1 » XOR « 1 » est en fait « 0 ». Je vais juste montrer l’exemple et vous pouvez comprendre ce que happenes.
#include <util/delay.h>
Eh oui, vous l’aurez deviné, le "^" c’est qui précède le « 6 » est le symbole XOR. Hmmm... Le "|" et le "^" sont au programme. Cool. Eh bien, puisque nous sommes programme de pensée, nous allons disect les choses nous ne savons pas encore !
DDRB = 0b00000001;
Vous savez déjà ce que fait le < avr/io.h >, donc je ne perdez pas votre temps avec celui-là, mais il y a une nouvelle instruction #include. Le delay.h nous donnera quelques méthodes pratiques pour nous d’utiliser. Tout comme son nom l’indique, le delay.h va nous fournir un moyen de créer des retards dans notre programme.
Ignorant le « principal » puisque nous savons que déjà, nous voyons le DDRB a changé. N’ayez pas peur ! Voici le processus où nous étions là où nous sommes :
C’est ce que nous avions avant. Ce n’est pas un très bon moyen de minipulating les broches parce qu’on vient de changer toutes les broches de 1 à 7 en entrée, mais « what if », nous avons eu un programme plus vaste qui utilise ces broches pour d’autres choses, comme par exemple, broche 2 commande de pression de frein allpies pour le système de freinage avec antiblocage. Vous ne voulez pas juste arbitrairement la définir en tant qu’entrée. Qui rendrait vos freins inutiles (ce qui seraient vraiment mauvais).
DDRB = DDRB | 0b00000001;
Nous avons besoin d’un moyen seulement affecter un bit, la broche 0 bit. Eh bien, si vous regardez le « OR » ci-dessus, nous pouvons le faire avec un masque (pas le masque de carnaval, que vous pensez, mais un masque binaire.
DDRB |= 0b00000001;
Cette volonté prend son ancien moi et « OR » à un masque. Le masque est : 0b00000001. Oui cela ressemble au nombre binaire réel, mais si le DDRB précédente a été, disons, 0b01001010, puis faire un RC à celle avec notre masque serait : 0b01001010 | 0b00000001 = 0b01001011. Ce qui est différent dans le résultat. C’est vrai, que la broche 0 bit est changé !
Cette statememt peut être plus compressé en C++ :
PORTB |= 1 << PINB0;_delay_ms(100);PORTB &= ~(1 << PINB0);_delay_ms(100);
Mais ce n’est pas ce qui est dans le programme. Même si cela est parfaitement valide, pourquoi ne nous profiter de certaines des définitions dans le fichier d’en-tête io.h. Je veux dire, c’est là pour notre confort, n’est-il pas ? Notez mon utilisation des contractions ! C’est la même chose en C++: "c’est" vraiment « c’est », comme "DDRB | = 0b00000001" équivaut à "DDRB = DDRB | 0b00000001 ". J’ai couler dans mon fauteuil avec cette mauvaise analogie. Whataver, aide !
Alors, pourquoi "DDRB | = 1 << PINB0" ?
1 << PINB0 est l’acte de créer le masque. Le « 1 » représente ce qui sera inséré dans le masque, le << est un opérateur de décalage vers la gauche. Il fait exactement ce qu’il dit, et PINB0 est un nombre de postes que le « 1 » se déplacera à gauche. En substance, le PINB0 est juste égale à 0. Donc, vous commencez avec un 0b00000000 et vous ajoutez un « 1 » pour faire 0b00000001 et ensuite vous quart-positions 0 à gauche. Si vous vous retrouvez avec 0b00000001, le même nombre d’en-haut. Donc, si c’était PINB4 ? La déclaration serait: 1 << PINB4. Le « 1 » serait déplacé à gauche 4 fois consistant en une : 0b00010000. N’oubliez pas, nous utilisons un indice de zéro, donc il y a quatre 0 s après le 1.
Passons sur le tout en boucle. Vous avez raison, nous n’avions rien dans la « boucle infinie » avant. Eh bien, maintenant nous devons le microcontrôleur pour montrer une action. Cela n’est possible dans le cadre de la boucle. La boucle est où l’action se répète encore et encore. Si l’action était situé avant la boucle, puis l’action se produirait seulement une fois, comme l’établissement de l’orientation de l’axe, ce qui est approprié pour ce programme. Mais pour créer le clignotant pour toujours, nous devons tourner la PINB0 sous et hors tension dans la boucle. Voici également les retards interviennent. Si nous n’avions pas de délais, nous ne verrions pas la LED clignote en tout, il ressemblerait comme si c’était tout de suite, puisque le clignotement produirait plus vite que le œil peut percevoir, donc nous avons besoin pour la ralentir.
Nous savons comment définir un bit spécifique dans le nombre binaire, mais nous ne savons pas comment faire un bit spécifique « 0 » si c’est un « 1 » encore. Le code suivant fait juste cela, mais vous remarquerez qu’il n’est pas ce que montre le programme. Les deux premières lignes se transforme le bit « 1 » (5 volts, lumière) et fait une pause pour 100 millisecondes (en passant, vous pouvez utiliser microsecondes en changeant les « ms » « nous »). Les deux deuxièmes lignes transforme le bit PINB0 "0" (0 Volt, pas de lumière). Non, la comparaison et ne peut pas faire juste un « 0 » de la mèche, mais si vous n’est pas "~" le masque de numéro binaire, il se tournera de 0 à 1 et tous les 1 s à 0 s. Ces prises permettent à n’affecter le bit PINB0 et transformez-le en un « 0 ». J’ai ajouté la parenthèse juste pour contenir l’opération de masquage pour le ne puisse pas les clés d’activation multiple entier et pas seulement le « 1 » avant le déplacement vers la gauche "<<".
PORTB ^= 1 << PINB0;_delay_ms(100);
Si le retard se passe même pour être sur et en dehors, nous pourrions raccourcir les quatre lignes précédentes à seulement deux et profiter de l’opération XOR. N’oubliez pas, le XOR transformera notre broche spécifique à un 1 si c’est 0 et vice versa. Cette instruction ne touchent que le PINB0. Chaque fois que l’instruction est exécutée, elle renversera le foret à l’opposé.
C’est tout. Voir ce n’était pas douloureux du tout.