Cours:TPS 2103 tp positionnementMoteur
Révision datée du 13 avril 2023 à 20:49 par Bjacquot (discussion | contributions)
Pensez à mettre sur la 1ère ligne de votre code : // Compiler: Avrgcc device: nomDuMicrocontroleur
Sommaire
Asservissement en position du moteur CC
Esclave (target) i2c
sans registres
On donne les exemples suivant pour qu'un µcontroleur atmegaxxx se comporte comme un esclave i2c (pas de notion de registres)
// Include the required Wire library for I2C
#include <Wire.h>
const int8_t i2cAddress = 0x1A;
// !!! variable utilisée dans une interruption => volatile
volatile uint16_t valPotar;
void setup() {
// Start the I2C Bus as Slave on address i2cAddress
Wire.begin(i2cAddress);
// fonction à exécuter lorsqu'on doit envoyer des données au master
Wire.onRequest(requestEvent);
}
void requestEvent()
{
Wire.write(valPotar>>2);
}
void loop() {
valPotar=analogRead(A0);
}
|
// Include the required Wire library for I2C
#include <Wire.h>
const int8_t i2cAddress = 9;
void setup() {
DDRD=0xFF;
// Start the I2C Bus as Slave on address i2cAddress
Wire.begin(i2cAddress);
// fonction à exécuter lorsque le master nous envoie des données
Wire.onReceive(receiveEvent);
}
void receiveEvent(int nbBytes)
{
PORTD=Wire.read();
}
void loop()
{
}
|
avec registres
// Include the required Wire library for I2C
#include <Wire.h>
const uint8_t i2cAddress = 9;
const uint8_t nbRegistres=6;
const uint8_t pinLeds[nbLeds]={3,5,6,9,10,11};
uint8_t registres[nbLeds]={0,0,0,0,0,0};
void setup()
{
for(uint8_t i=0;i<nbLeds;i++)
{
pinMode(pinLeds[i],OUTPUT);
analogWrite(pinLeds[i],ledsValue[i]);
}
// Start the I2C Bus as Slave on address
Wire.begin(i2cAddress);
// fonction à exécuter lors de la réception des données envoyées par le master
Wire.onReceive(receiveEvent);
}
void receiveEvent(int nbBytes)
{
// la 1ère valeur reçue correspond au numéro de registre
uint8_t numRegistre=Wire.read();
for (int i=0;i<nbBytes-1;i++)
{
// les valeurs suivantes correspondent aux valeurs des registres
uint8_t value=Wire.read();
if (numRegistre<nbRegistres)
{
registres[numRegistre]=value;
analogWrite(pinLeds[numRegistre],value);
}
// on passe automatiquement au registre suivant
numRegistre++;
}
}
void loop() {
}
|
// Include the required Wire library for I2C
#include <Wire.h>
const uint8_t i2cAddress = 0x1A;
// variables utilisées dans des interruptions
volatile uint8_t numRegistre=0;
volatile uint16_t valPotar[4];
void setup() {
// Start the I2C Bus as Slave on address
Wire.begin(i2cAddress);
// la transmission commence par un envoi du numéro de registre par le master
// on indique la fonction à exécuter pour obtenir le numéro de registre
Wire.onReceive(receiveEvent);
// fonction à exécuter pour envoyer des données au master
Wire.onRequest(requestEvent);
}
void receiveEvent(int nbBytes)
{
numRegistre=Wire.read();
while(Wire.available()) // slave may send less than requested
{
Wire.read(); // receive a byte as character
}
}
void requestEvent()
{
Wire.write(valPotar[numRegistre]>>2);
if (numRegistre<4) numRegistre++; else numRegistre=0;
}
void loop() {
for (uint8_t i=0;i<4;i++) valPotar[i]=analogRead(A0+i);
_delay_ms(100);
}
|