#1 2020-12-24 14:06:07

0z0n
Учасник
Зареєстрований: 2019-02-10
Повідомлень: 20

i2c передача 8 чисел

Помогите плиз взят пример:
Мастер прием:

#include <Wire.h>
int result1 = 2;
int result2 = 2;
int result3 = 2;
int result4 = 2;

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

void loop() {
  Wire.requestFrom(8, 8);    // request 6 bytes from slave device #8

  while (Wire.available()) { // slave may send less than requested
   result1 = Wire.read ();
   result1 <<= 8;
   result1 |= Wire.read ();
   
   result2 = Wire.read ();
   result2 <<= 8;
   result2 |= Wire.read ();
   
   result3 = Wire.read ();
   result3 <<= 8;
   result3 |= Wire.read ();
   
   result4 = Wire.read ();
   result4 <<= 8;
   result4 |= Wire.read ();
 
      Serial.print(result1);Serial.print("  ");Serial.print(result2);Serial.print("  ");Serial.print(result3);Serial.print("  ");Serial.println(result4);
 
  }

  delay(500);
}

Слейв отдача:

#include <Wire.h>
    int value1 = -12350;  // ie. 0x04 0xD2
    int value2 = -1350; 
    int value3 = 2350;     
    int value4 = 12350; 

void setup() {
  Wire.begin(8);                // join i2c bus with address #8
  Wire.onRequest(requestEvent); // register event
}

void loop() {
  delay(100);
  value1 = value1 + 1 ;
  value2 = value2 + 1 ;
  value3 = value3 + 1 ;
  value4 = value4 + 1 ;
}

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
  Wire.write (highByte (value1));   
  Wire.write (lowByte (value1)); 
  
  Wire.write (highByte (value2));   
  Wire.write (lowByte (value2));

  Wire.write (highByte (value3));   
  Wire.write (lowByte (value3)); 

  Wire.write (highByte (value4));   
  Wire.write (lowByte (value4)); 
  // as expected by master
}

Переделал отдачу

for (int i = 0; i < 8; i++) {  
  Wire.write (highByte (myInts[i]));   
  Wire.write (lowByte (myInts[i])); 
}
}

Прием:

void WareReadSlave() {  // request 8 bytes from slave device #8
Wire.requestFrom(8, 8);

while (Wire.available()) { // slave may send less than requested

   myInts1 = Wire.read ();
   myInts1 <<= 8;
   myInts1 |= Wire.read ();

   myInts2 = Wire.read ();
   myInts2 <<= 8;
   myInts2 |= Wire.read ();

   myInts3 = Wire.read ();
   myInts3 <<= 8;
   myInts3 |= Wire.read ();
 
   myInts4 = Wire.read ();
   myInts4 <<= 8;
   myInts4 |= Wire.read ();
 
   myInts5 = Wire.read ();
   myInts5 <<= 8;
   myInts5 |= Wire.read ();

   myInts6 = Wire.read ();
   myInts6 <<= 8;
   myInts6 |= Wire.read ();

   myInts7 = Wire.read ();
   myInts7 <<= 8;
   myInts7 |= Wire.read ();

   myInts8 = Wire.read ();
   myInts8 <<= 8;
   myInts8 |= Wire.read ();

}  
}

В последних четырех значениях билиберда.
Как изменить код. Подскажите?

Неактивний

#2 2020-12-24 14:26:57

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 414

Re: i2c передача 8 чисел

Wire.requestFrom(8, 16);

Неактивний

#3 2020-12-24 14:33:59

0z0n
Учасник
Зареєстрований: 2019-02-10
Повідомлень: 20

Re: i2c передача 8 чисел

Honey пише:

Wire.requestFrom(8, 16);

Пасиб огромное

А вот здесь на 16 менять не надо в операции сравнения?

   myInts1 = Wire.read ();
   myInts1 <<= 8; /// 16 здесь не надо?
   myInts1 |= Wire.read ();

Неактивний

#4 2020-12-24 14:50:06

0z0n
Учасник
Зареєстрований: 2019-02-10
Повідомлень: 20

Re: i2c передача 8 чисел

Получилось. Пасиб!

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму