Modifications

Sauter à la navigation Sauter à la recherche
Ligne 11 : Ligne 11 :  
== Programme SlaveRegisterDataTypes ==
 
== Programme SlaveRegisterDataTypes ==
   −
Le fonctionnement du programme Arduino est identique à celui de l'exemple du Registre dont vous trouverez [[ArduPi-I2C-Registre-CodeArduino|les détails du fonctionnement ici]].
+
{{bloc-etroit|text= Le fonctionnement du programme Arduino est identique à celui de l'exemple du Registre dont vous trouverez [[ArduPi-I2C-Registre-CodeArduino|les détails du fonctionnement ici]].
   −
N'oubliez pas d'ouvrir le moniteur série d'Arduino, car une communication série est initialisée pour permettre l'affichage de quelques informations utiles.
+
N'oubliez pas d'ouvrir le moniteur série d'Arduino, car une communication série est initialisée pour permettre l'affichage de quelques informations utiles.  
    
{{ambox-stop|text=Avant de démarrer le programme MasterWriterDataTypes.py sur votre Raspberry, assurez-vous de voir le message "Bus I2C pret" apparaitre sur le moniteur série d'Arduino IDE.}}  
 
{{ambox-stop|text=Avant de démarrer le programme MasterWriterDataTypes.py sur votre Raspberry, assurez-vous de voir le message "Bus I2C pret" apparaitre sur le moniteur série d'Arduino IDE.}}  
   −
=== Envoi d'une valeur décimale ===
+
}}
L'envoi d'une valeur décimale (ex: 5.67) se fait à l'aide du type '''Double''' qui est décomposé en 4 octets.
+
=== Envoi d'une valeur décimale (double) ===
 +
 
 +
{{bloc-etroit|text=L'envoi d'une valeur décimale (ex: 5.67) se fait à l'aide du type '''Double''' qui est décomposé en 4 octets.
    
La magie se passe dans la fonction Wire_SendDouble() qui utilise un struct de type union entre Double et byte[4]. Cela permet d'accéder à un même espace mémoire de feux façons différentes:
 
La magie se passe dans la fonction Wire_SendDouble() qui utilise un struct de type union entre Double et byte[4]. Cela permet d'accéder à un même espace mémoire de feux façons différentes:
 
* une fois pour y stocker une valeur sous le type double,
 
* une fois pour y stocker une valeur sous le type double,
* Une autres fois pour lire chacun des bytes/octets (tronçons de 8 bits) ''composant ce type double'' stockant la valeur numérique.
+
* Une autres fois pour lire chacun des bytes/octets (tronçons de 8 bits) ''composant ce "type double"'' qui stock la valeur numérique.
 +
 
 +
Grâce à cette structure, il est possible de saucissonner un espace mémoire pour l'envoyer sur le bus I2C. 
 +
 
 +
Les 4 octets/bytes sont accessibles comme un tableau... ou un buffer. Il est donc possible d'utiliser directement la méthode Wire.write() pour envoyer le ''buffer'' de 4 octets de long sur le bus I2C.
 +
}}
 +
 
 +
=== Envoi d'une valeur décimale (float) ===
 +
 
 +
Si votre valeur décimale est contenue dans un type '''float''', il faudra faire un transtypage du pointeur (casting) avant l'envoi sur le bus I2C.
 +
 
 +
Le code d'envoi I2C pour un type '''double''' ressemble à ceci
 +
<nowiki>double valeurDouble;
 +
...
 +
valeurDouble = 123.57;
 +
Wire_SendDouble( &valeurDouble );</nowiki>
 +
 
 +
Le code d'envoi I2C pour un type '''float''' ressemble à ceci
 +
<nowiki>float valeurFloat;
 +
...
 +
valeurFloat = 312.777;
 +
Wire_SendDouble( (double*)&valeurFloat );</nowiki>
   −
Les 4 octets/bytes sont accessibles comme un tableau... ou un buffer. Il est donc possible d'utiliser directement la méthode Wire.write() pour envoyer le ''buffer'' sur le bus I2C.
+
{{ambox|text=Sur un ATMEGA, les types double et float sont rigoureusement identiques (4 bytes).<br />
 +
Cette opération de transtypage ne sera pas valide sur un DUE ou un double fait 4 bytes et un float 8 bytes!}}
   −
+
=== Code source ===
    
   <nowiki>// === ArduPi-I2C ================================================
 
   <nowiki>// === ArduPi-I2C ================================================
29 917

modifications

Menu de navigation