Cours:InfoS2 tdI2c : Différence entre versions
(→Trouver les adresses des "targets") |
|||
Ligne 132 : | Ligne 132 : | ||
} | } | ||
</source> | </source> | ||
+ | |||
+ | =Envoyer des données à la target i2c= | ||
+ | |||
+ | =Obtenir des données de la target i2c= |
Version du 9 mars 2022 à 16:50
Sommaire
Framework Arduino
Lors des tds précédents, nous avons utilisé uniquement les fonctions de la bibliothèque standard libc pour avr.
L'inconvénient principal réside dans la nécessité de devoir écrire/adapter un programme pour chaque µcontroleur (aussi nommé cible). L'avantage principal est d'avoir un programme très efficient en terme de taille d'exécutable et de rapidité d'exécution, et également beaucoup plus simple à écrire.
Afin de simplifier le changement de cible, on utilise le concept de couches d'abstractions.
L'idée sous-jacente est de ne pas faire un programme qui s'occupe de gérer directement les périphériques, mais utilise des fonctions qui s'occupent de faire le lien, un exemple sera plus parlant !
PORTB|=(1<<PB0);
digialWrite(8,1);
Ces 2 instructions sont équivalentes pour une carte arduino UNO, elles mettent toutes les 2 à 1 la broche étiquetée 8 sur cette carte.
Si nous changeons de carte (arduino Mega par ex), la broche utilisée sur le µcontroleur n'est pas la même et il faut alors remplacer :
PORTH|=(1<<PH5);
digialWrite(8,1);{{Rouge|
L'intérêt est ici évident de l'utilisation du framework (ensemble de fonctions) arduino qui permet d'écrire un programme quasiment indépendant de la carte (cible) utilisée.
Si nous parlons d'efficacité, par contre la fonction digialWrite est environ 20 fois moins rapide !
Il existe quelques framework pour les cibles avr (famille des µcontroleurs aTmega ATtiny), nous utiliserons le framework arduino pour utiliser la liaison i2c, l'utilisation du périphérique du µcontroleur étant assez fastidieux à configurer.
Trouver les adresses des "targets" (esclave i2c)
On programmera pour le moment uniquement la carte "controller" (identifiée carte n°2 sur tinkercad).
L'adresse d'un composant i2c étant codée sur 7 bits, quel est le nombre d'@ au total
Rque : certaines adresses sont réservées et non utilisables pour les périphériques.
Trouvez les adresses des targets en utilisant le programme suivant :
Rque :
- les valeurs s'affichent dans le moniteur série
- il n'est pas nécessaire de comprendre le programme, ça viendra plus tard.
// --------------------------------------
// i2c_scanner
//
// Version 1
// This program (or code that looks like it)
// can be found in many places.
// For example on the Arduino.cc forum.
// The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
// Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26 2013
// V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
// by Arduino.cc user Krodal.
// Changes by louarnold removed.
// Scanning addresses changed from 0...127 to 1...119,
// according to the i2c scanner by Nick Gammon
// https://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
// As version 4, but address scans now to 127.
// A sensor seems to use address 120.
// Version 6, November 27, 2015.
// Added waiting for the Leonardo serial communication.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial); // Leonardo: wait for serial monitor
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknown error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for next scan
}