Modifications

Sauter à la navigation Sauter à la recherche
aucun résumé de modification
Ligne 1 : Ligne 1 :  
{{Arduino-I2C-Intro-NAV}}
 
{{Arduino-I2C-Intro-NAV}}
 +
 +
== 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 entrées, 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 en un peu notre jouet I2C en permettant de configurer des sorties PWM et de lire des entrées analogies.
 +
 +
C'est là qu'intervient le "'''concept du registre'''".
 +
 +
Ce concept est également utilisé pour les [http://mchobby.be/PrestaShop/product.php?id_product=204 horloge temps réel] I2C... car il y a tellement d'information a renvoyer sur le bus qu'il faut faire de la sélection.
 +
 +
== 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 le fonctionnement du périphérique I2C.
 +
 +
== Comment cela fonctionne ? ==
 +
 +
Dans le cas du projet présenté ci-dessus (lecture d'une entrée sur le Mega), cela fonctionnerait comme suit:
 +
# D'envoyer un octet dans le registre (via le bus I2C) avec le numéro d'entrée à lire.
 +
# D'effectuer une lecture sur le bus I2C. Le périphérique renverra alors l'état de l'entrée.
 +
 +
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.
 +
 +
== 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 hecadé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)
 +
 +
<nowiki>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());</nowiki>
 +
 +
== Ressource ==
 +
* [http://tronixstuff.wordpress.com/2010/10/20/tutorial-arduino-and-the-i2c-bus/ Tutorial: Arduino and the I2C bus – Part One] de TronixStuff 
    
{{Arduino-I2C-Intro-TRAILER}}
 
{{Arduino-I2C-Intro-TRAILER}}
29 836

modifications

Menu de navigation