Cours:InfoS2 tdI2cSlave : Différence entre versions
(→Recevoir des données sur une cible) |
(→Recevoir des données sur une cible) |
||
| Ligne 56 : | Ligne 56 : | ||
newValue=false; | newValue=false; | ||
} | } | ||
| + | } | ||
| + | } | ||
| + | </source> | ||
| + | |||
| + | |||
| + | {{Question|Ecrire un programme qui modifie la led allumée en fonction de la valeur reçue}} | ||
| + | |||
| + | {{Todo|Pensez à utiliser un programme pour lister les adresses des targets i2c, cf td précédent !}} | ||
| + | |||
| + | |||
| + | ==Envoyer des données depuis la cible== | ||
| + | |||
| + | Dans ce cas, le {{Rouge|master i2c}} recevra des données de l'{{Rouge|esclave i2c}}. | ||
| + | |||
| + | Ici la valeur envoyée sera un nombre entre {{Rouge|0 et 31}} que l'on augmente/diminue à l'aide des boutons (penser aux pull-up !) | ||
| + | |||
| + | Le principe est le suivant : | ||
| + | |||
| + | <source lang=cpp> | ||
| + | #include <Wire.h> | ||
| + | |||
| + | const int8_t i2cAddress = 0x??; | ||
| + | volatile uint8_t i2cData=0; | ||
| + | volatile bool newValue=true; | ||
| + | |||
| + | //fonction d'interruption exécutée lors de l'envoi de données sur le bus i2c | ||
| + | void requestEvent() | ||
| + | { | ||
| + | // envoi de la donnée | ||
| + | Wire.write(i2cData); | ||
| + | } | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | // initialise la liaison i2c en mode slave | ||
| + | Wire.begin(i2cAddress); | ||
| + | //indique la fonction à exécuter lors de la réception de données | ||
| + | Wire.onRequest(requestEvent); | ||
| + | sei(); | ||
| + | while(1) | ||
| + | { | ||
} | } | ||
} | } | ||
Version du 26 mars 2024 à 16:52
Pensez à mettre sur la 1ère ligne de votre code : // Compiler: Avrgcc device: nomDuMicrocontroleur
Fichiers pour simulide : SchemaI2cSlave.sim1
************************************************** *** Attention, programme dans un fichier .ino *** **************************************************
Vous disposez de 3 µcontrôleurs sur le schéma :
- l'atmega2560 sera un esclave i2c et permettra d'allumer 1 seule led parmi les 32
- l'atmega328p sur lequel sont connectés les boutons poussoirs sera également un esclave i2c
- le dernier {{Rouge|atmega328p sera le master i2c
Sommaire
Programmons les cibles i2c
Recevoir des données sur une cible
Dans ce cas, le master i2c enverra des données à l'esclave i2c.
Ici la valeur envoyée sera un nombre entre 0 et 31 qui indique le numéro de la led à allumer;
Le principe est le suivant :
#include <Wire.h>
const int8_t i2cAddress = 0x??;
volatile uint8_t i2cData=0;
volatile bool newValue=true;
//fonction d'interruption exécutée lors de la réception de données sur le bus i2c
void receiveEvent(int nbBytes)
{
while (Wire.available())
{
i2cData = Wire.read();
newValue=true;
}
}
int main()
{
// initialise la liaison i2c en mode slave
Wire.begin(i2cAddress);
//indique la fonction à exécuter lors de la réception de données
Wire.onReceive(receiveEvent);
sei();
while(1)
{
if (newValue)
{
....
newValue=false;
}
}
}
Ecrire un programme qui modifie la led allumée en fonction de la valeur reçue
Pensez à utiliser un programme pour lister les adresses des targets i2c, cf td précédent !
Envoyer des données depuis la cible
Dans ce cas, le master i2c recevra des données de l'esclave i2c.
Ici la valeur envoyée sera un nombre entre 0 et 31 que l'on augmente/diminue à l'aide des boutons (penser aux pull-up !)
Le principe est le suivant :
#include <Wire.h>
const int8_t i2cAddress = 0x??;
volatile uint8_t i2cData=0;
volatile bool newValue=true;
//fonction d'interruption exécutée lors de l'envoi de données sur le bus i2c
void requestEvent()
{
// envoi de la donnée
Wire.write(i2cData);
}
int main()
{
// initialise la liaison i2c en mode slave
Wire.begin(i2cAddress);
//indique la fonction à exécuter lors de la réception de données
Wire.onRequest(requestEvent);
sei();
while(1)
{
}
}
Ecrire un programme qui modifie la led allumée en fonction de la valeur reçue
Pensez à utiliser un programme pour lister les adresses des targets i2c, cf td précédent !