Cours:InfoS2 tdI2cRegistres : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(Registres)
(Ecrire dans un registre i2c)
Ligne 41 : Ligne 41 :
 
#include <Wire.h>
 
#include <Wire.h>
 
const uint8_t targetAdress=0x04;
 
const uint8_t targetAdress=0x04;
uint8_t regAd=5;
+
uint8_t regAd=7;
uint8_t value=0b01010101;
+
uint8_t value=0b10101010;
  
void setup() {
+
int main()
  Wire.begin();        // join i2c bus (address optional for master)
 
  Serial.begin(9600);
 
}
 
 
 
void loop()
 
 
{
 
{
    Wire.beginTransmission(targetAdress); // start transmitting
+
Wire.begin();        // join i2c bus (address optional for master)
    Wire.write(regAd);         // sends @ registre
+
Serial.begin(9600);
    Wire.write(value);         // sends value registre
+
sei();
    Wire.endTransmission();     // stop transmitting
+
while(1)
 +
{
 +
    Wire.beginTransmission(targetAdress); // start transmitting
 +
    Wire.write(regAd);                   // sends @ registre
 +
    Wire.write(value);                   // sends value registre
 +
    Wire.endTransmission();               // stop transmitting
 +
}
 
}
 
}
 
</source>
 
</source>
Ligne 65 : Ligne 66 :
  
 
{{Question|Ecrire un programme permettant de faire varier l'intensité lumineuse d'une, puis de plusieurs, leds}}
 
{{Question|Ecrire un programme permettant de faire varier l'intensité lumineuse d'une, puis de plusieurs, leds}}
 
  
 
=Lire un registre i2c=
 
=Lire un registre i2c=

Version du 19 mars 2024 à 10:20

lien enseignants

https://www.tinkercad.com/things/awVHilHmAIi


vérification des @i2c

Todo.jpg Pensez à utiliser un programme pour lister les adresses des targets i2c, cf td précédent !

Registres

Les targets i2c ne sont pas des composants programmables. Par contre, il convient de pouvoir les configurer.

Le principe retenu pour la plupart des targets est d'utiliser la notion de registres.

  • 1 registre est une mémoire sur la cible
  • 1 registre est associé à une adresse
  • chaque registre modifie/observe le fonctionnement de la target
  • 1 registre à un rôle spécifique
  • pour utiliser le composant, il faut indiquer l'adresse du registre, que l'on souhaite lire ou écrire


I2c modele.png


Une transmission i2c devient alors une trame selon le principe simplifié suivant :

  • bit de start
  • @ de la target (7 bits)
  • bit de lecture/écriture
  • attente de l'acknowledge (accusé de bonne réception) de la cible
  • choix d'un registre (8 bits)
  • acknowledge
  • envoi/réception de la valeur (8 bits)
  • acknowledge
  • bit de stop

Ecrire dans un registre i2c

Voici un programme d'exemple pour modifier la valeur d'un registre :

#include <Wire.h>
const uint8_t targetAdress=0x04;
uint8_t regAd=7;
uint8_t value=0b10101010;

int main()
{
	Wire.begin();        // join i2c bus (address optional for master)
	Serial.begin(9600);
	sei();
	while(1)
	{
	    Wire.beginTransmission(targetAdress); // start transmitting
	    Wire.write(regAd);                    // sends @ registre
	    Wire.write(value);                    // sends value registre
	    Wire.endTransmission();               // stop transmitting
	}
}

Nous considérons ici la cible avec les leds.

Cette target i2c possède 6 registres d'adresses 0 à 5.

Chaque registre est une valeur [0 255], qui modifie l'intensité lumineuse d'une led.

Question.jpg Ecrire un programme permettant de faire varier l'intensité lumineuse d'une, puis de plusieurs, leds

Lire un registre i2c

Voici un programme d'exemple pour lire la valeur d'un registre :

#include <Wire.h>
const uint8_t targetAdress=0x04;
uint8_t regAd=5;
uint8_t value=0b01010101;

void setup() {
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);
}

void loop()
{
    Wire.beginTransmission(targetAdress); // start transmitting
    Wire.write(regAd);          // sends @ registre
    Wire.endTransmission();    // stop transmitting
    Wire.requestFrom(targetAdress, 1);
    while (Wire.available()) value = Wire.read();
    Serial.println(value);
}

Nous considérons ici la cible avec les potentiomètres.

Cette target i2c possède 4 registres d'adresses 0 à 3.

Chaque registre est une valeur [0 255], qui varie en fonction de la position du potentiomètre.

Question.jpg Ecrire un programme permettant de lire les valeurs des potentiomètres

Association

Question.jpg Faire en sorte que chaque potentiomètre modifie l'intensité lumineuse d'une led différente