Modifications

Sauter à la navigation Sauter à la recherche
4 401 octets ajoutés ,  26 septembre 2015 à 07:53
Ligne 1 : Ligne 1 :  
{{Arduino-I2C-Intro-NAV}}
 
{{Arduino-I2C-Intro-NAV}}
 +
 +
== Pourquoi le concept du registre? ==
 +
{{bloc-etroit|text=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 {{pl|204|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:
 +
 +
[[Fichier:Arduino I2C Intro-ConceptRegistre-01.jpg|640px]]
 +
 +
[[Fichier:Arduino I2C Intro-ConceptRegistre-02.jpg|640px]]
 +
 +
[[Fichier:Arduino I2C Intro-ConceptRegistre-03.jpg|640px]]
 +
 +
== 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)
 +
 +
<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 372

modifications

Menu de navigation