Étape 9: Bit frappant exemple
À l’aide de I2C consiste à envoyer des données binaires vers une adresse d’un dispositif qui est à l’écoute des demandes du microcontrôleur, (appareil maître) une fois qu’une demande est reçue par l’appareil, (esclaves), l’appareil envoie un ou plusieurs octets de données vers le microcontrôleur.
En apprenant à programmer des communications aux périphériques I2C ou essayer de renverser l’ingénieur données provenant de périphériques I2C que vous devez regarder les données qu’il est la forme binaire.
Je vais vous donner un exemple simple de la façon de le faire en utilisant les méthodes que vous venez d’apprendre.
Dans l’apprentissage I2C, il est souvent judicieux d’étudier d’autres programmes, les programmeurs ont conçu, donc vous pouvez pencher comment les données sont passées entre les microcontrôleurs et dispositifs.
Donc pour notre exemple que nous allons regarder un extrait du programme de code RobotC écrit peu bang un périphérique I2C.
J’ai pris un exemple de programme C peu cogné écrit en RobotC par Xander qui anime un Blog de Robot appelé :
http://botbench.com/blog/2011/02/20/bit-banged-I2C-Master-on-robotc-for-Arduino/#comment-2674
Dans cet article de blog, il est peu frapper un programme I2C pour communiquer avec un tableau LED flash LED lumières dans une séquence.
Nous seront désosser la boucle for, qu’il utilise pour envoyer une série de bits à la matrice de LED.
Si vous n’avez jamais programmé avant, s’il vous plaît Google variables, boucles, fonctions et tout en boucles.
Voici l’extrait de code, que nous allons regarder :
tout en (vrai) {}
pour (int i = 0; i < 8; i ++) {}
PCF8574write (~ (1 << i)) ;
wait1Msec(50) ;
}
}
Normalement, je voudrais écrire un petit programme de Python pour imprimer les valeurs de la boucle for. Mais puisque je suppose que tout le monde est nouveau pour la logique booléenne et programmation je tape manuellement sur chaque itération de la boucle for.
Note spéciale : Python ne supporte pas un type de données byte, donc dans notre peu frappant exemple nous allons utiliser le modulo opérateur pour afficher un entier comme un octet non signé. S’il vous plaît Google inf, vous avez besoin d’aide,
Par exemple : si nous effectuons le suivant : >>> ~ (1 << 0), en Python, nous obtenons -2, si nous utilisons ensuite >>> bin(-2), nous obtenons '-0b10'. Pour corriger le problème et montrer un type intégral 8 bits dans ce qui suit :
>>> bin (-2 % 256)
« 0b11111110 »
Afin de bien voir ce qui se passe avec des morceaux, il faut voir les 8 bits complets.
Pour toujours en boucle While, l’ignorer pour l’instant.
La boucle boucles for où la variable i est égale de 0 à 7.
PCF8574write() est une fonction personnalisée qui nous ne discuterons pas dans le cadre du présent article. Vous pouvez consulter le code pour voir ce que cette fonction ne sur votre propre.
Ce qui nous intéresse est la valeur de i et ce nombre binaire, nous passons à la fonction PCF8574write().
Permet de traduire chaque itération de la boucle for :
Permet de taper chaque itération de la boucle en Python :
La variable j’ai commence comme 0 et extrémités vers le haut à une valeur de 7 :
>>> ~ (1 << 0)
-2
Permet de tirer cette expression dehors. Nous sommes en effectuant une opération de bits non sur la valeur suivante. Nous décaler à gauche la valeur 1, j’ai le temps.
C’est nous pas 1 << 0. Nous poussons les bits de droite à gauche. Dans la première boucle, nous sommes gauche déplacement 1, 0 fois ou nous pas le bit le plus significatif.
Ainsi, si nous examinons la valeur binaire-2 on obtient :
>>> bin (~ (1 << 0))
« 0b10 »
Permet de continuer, vous verrez bientôt le motif.
>>> ~ (1 << 0)
-2
>>> bin (-2 % 256)
«-0b11111110 »
>>> ~ (1 << 1)
-3
>>> bin (-3 % 256)
«-0b11111101 »
>>> ~ (1 << 2).
-5
>>> bin (-5 % 256)
«-0b11111011 »
>>> ~ (1 << 3)
-9
>>> bin (-9 % 256)
«-0b11110111 »
>>> ~ (1 << 4)
-17
>>> bin (-17 % 256)
«-0b11101111 »
>>> ~ (1 << 5)
-33
>>> bin (-33 % 256)
«-0b11011111 »
>>> ~ (1 << 6)
-65
>>> bin (-65 % 256)
« 0b10111111 »
>>> ~ (1 << 7)
-129
>>> bin (-129 % 256)
«-0b1111111 »
Le 0 est omis dans ce cas.
Il faut lire "-0b01111111"
Maintenant, si vous ne le n'avez pas déjà fait, allez à la page web et regarder la vidéo :
http://botbench.com/blog/2011/02/20/bit-banged-I2C-Master-on-robotc-for-Arduino/#comment-2674
Maintenant, regardez les modèles binaires très étroitement.
Notez que comme les pour boucle augmente que le bit 0 continue d’aller de suite à gauche.
Je vais essayer de vous confondre trop beaucoup ce moment, (il y a une autre opération de bits AND et une opération de décalage à gauche dans la fonction i2c_write()), la priorité est de comprendre les opérations booléennes et comment utiliser Python pour vous aider à comprendre ces opérations booléennes. Si vous vous sentez lui, désosser la fonction i2c_write() de voir comment les modèles binaires sont encore traitée avant d’être envoyés à la matrice de LED.
En travaillant avec des microcontrôleurs lorsqu’un morceau est élevé, d’une valeur de 1, normalement un appareil est allumé. Si un bit est faible, avoir un 0 valeur un périphérique est désactivé.
Notez que nous travaillons avec 8 bits et notre matrice de LED a 8 LED. Oui, c’est correct. Chaque fois que nous avons mis un peu sur, d’une valeur de 1, nous passons sur la LED. Quand nous la valeur de bit la valeur 0 ou partit le bit, nous éteindre la LED.
Maintenant, regardez la vidéo à nouveau. Maintenant l’image que les deux boucles, une dans la fonction principale et la boucle dans l’i2c_write fonction exécutent plus rapide ou plus vite que les LED clignotent.
La logique de la i2c_write() qui est en logique un peu plus complexe, utilisation de python de visualiser comment la haute ou basse peu États changent comme les 8 bits sont exécution pas à pas la boucle for.
S’il vous plaît garder à l’apprentissage microcontrôleurs et opérations booléennes, car ce sont les blocs de construction pour la programmation des microcontrôleurs.