Arduino I2C Intro-ConceptRegistre
Pourquoi le concept du registre?
Le plus simple est encore de faire appel à un exemple concret.
Imaginez que vous voulez developper un contrôleur d'entrée/sortie I2C sur base d'un Arduino Mega... qui dispose quand même de 54 ports.
Si vous voulez activer des sorties, vous disposez du concept "Master Writer" (le Maître écrit). Mais quid si vous voulez lire les entrées... vous pouvez utiliser le le concept "Master Reader" (le Maître Lit).
Cependant, faire circuler autant d'information (toutes les informations) sur le bus I2C est conséquent et prendra du temps. Un comble si l'on n'a besoin que de la valeur d'une seule entrée. Imaginez si vous utilisez plusieurs de ces Arduino Mega en esclave... le tout pourrait devenir ingérable.
Complexifions encore un peu notre jouet I2C en permettant de configurer des sorties PWM et de lire des entrées analogiques.
Il n'est pas difficile de se rendre compte qu'il nous faut quelque-chose pour simplifier nos traitements.
C'est là qu'intervient le "concept du registre".
Ce concept est également utilisé pour les horloge temps réel I2C... car il y a tellement d'information a renvoyer sur le bus qu'il faut faire "une sélection" sur ce que l'on désire recevoir.
Qu'est ce donc qu'un registre?
Un registre est une petite zone mémoire du périphérique I2C dans laquelle il est possible d'écrire une information (1 octet).
Cette information modifie alors soit:
- le fonctionnement ou l'état du périphérique I2C.
- la réponse retournée par la lecture d'un autre registre.
Comment cela fonctionne ?
Dans le cas du projet présenté ci-dessus (lecture d'une entrée sur le Mega), cela fonctionnerait comme suit:
- Envoyer un octet dans le registre #1 (via le bus I2C) avec le numéro d'entrée à lire (ex: entrée n° 8).
- D'effectuer une lecture sur le bus I2C (du registre #0) et le périphérique renverra alors l'état de l'entrée correspondant à la valeur stockée dans le registre 1.
Pour envoyer l'octet (le numéro d'entrée) dans le registre, ont utilise le concept "Master Writer" (le Maître Ecrit)... comme ça le périphérique peut modifier son comportement.
Juste après ont passe on en mode "Master Reader" (le Maître lit) pour réclamer la valeur de l'entrée... qui sera renvoyé par le périphérique.
Voici quelques graphiques qui présentent les différentes étapes d'un tel échange:
Un, deux, trois registres
Chaque registre fait un octet (un byte)... donc 8 bits. Il est possible d'utiliser des groupes de bits. Il n'en faut que 6 pour coder les valeurs de 0 à 54 (voir arithmétique binaire). Cela laisse donc deux bits pour coder une opérations particulière (comme lecture/écriture + état).
Si l'arithmétique binaire est peut être ardue mais à au moins l'avantage d'être économique (transférer un octet c'est deux fois plus économique de deux octets).
Si l'arithmétique binaire vous rebute, vous pouvez utiliser plusieurs registres (deux par exemple)... que vous charger tout les deux dans l'ordre en écrivant deux octets avec "Master Writer" (le premier charge le "registre 1" et le deuxième charge le "registre 2").
Juste après l'écriture des registres, ils suffit de faire une lecture via "Master Reader" pour activer l'exécution de la demande stockée dans le/les registre(s).
Un petit exemple
Dans cet exemple, issu de TronixStuff.
Dans cet exemple, on s'adresse au périphérique 0x68 (adresse hexadécimale) pour y placer la valeur 0 dans le registre.
Ensuite, on fait une lecture de 7 octets pour recevoir l'information désirée (en l'occurrence: date et heure)
Wire.beginTransmission(0x68); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(0x68, 7); *second = bcdToDec(Wire.read()); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read()); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read());
Ressource
- Tutorial: Arduino and the I2C bus – Part One de TronixStuff
Réalisé par Meurisse D. pour MCHobby.be.
Contient également quelques images et exemples d'Arduino.cc, droits et copyrights sur ces ressources restant bien évidement à Arduino.cc.
Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : « Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.
L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.