Comunicazione I2c

Ciao a tutti, voglio realizzare una comunicazione master slave utilizzando la tecnica i2c e la libreria Wire, volevo chiedere , se dallo slave acquisisco un dato di dimensione int. come faccio a inviarlo byte per byte al master?

Un int puoi dividerlo in 2 byte con LByte = INT%256; HByte = INT/256; e per ritornare alla INT: INT= HByte*256+LByte;

oppure usi le funzioni http://arduino.cc/en/Reference/LowByte http://arduino.cc/en/Reference/HighByte e per creare il INT dai 2 BYTE: http://arduino.cc/en/Reference/WordCast

Ciao Uwe

Suggerisco l'uso delle funzioni citate al posto dei metodi basati sulle operazioni matematiche di divisione perché l'Arduino non le supporta in hardware. Meglio lowByte/highByte/word perché sono basate su macro che operano a livello di bit, quindi molto più veloci e leggere da eseguire.

Grazie mille a entrambi:)

leo72:
matematiche di divisione perché l’Arduino non le supporta in hardware.

Vero, però quello è il modo “sbagliato” per scomporre un intero in due byte :slight_smile:
Il modo giusto, in C, è questo :

int a;
byte LowB,HighB;

LowB = a;
HighB = a >> 8;

Assegnare un intero ad un byte comporta che in questo ci vanno solo i primi otto bit del valore per effetto del casting, shiftare verso destra di otto bit è l’equivalente di dividere per 265 pertanto nel byte ci vanno solo gli otto bit superiori, tutte e due le operazioni richiedono solo due cicli macchina ciascuna.
Per passare da due byte ad un intero si fa il procedimento opposto:

int a;
byte LowB,HighB;

a = (int) HighB << 8;
a +=LowB;

leo72: Suggerisco l'uso delle funzioni citate al posto dei metodi basati sulle operazioni matematiche di divisione perché l'Arduino non le supporta in hardware. Meglio lowByte/highByte/word perché sono basate su macro che operano a livello di bit, quindi molto più veloci e leggere da eseguire.

Ringrazio ancora per l aiuto, ma ora mi si pone un altro problema, non riesco a inviare i 2byte separati. Qualche aiuto? cioè riesco a inviare solo 1 byte nello sketch l altro è come se non lo inviassi. P.S. uso la funzione wire.write 2volte. una per byte. è corretto?

Andrebbe visto lo sketch sia lato master che lato slave.