Странная проблема с мастером I2C TWI

vbogom
Offline
Зарегистрирован: 17.03.2013

Здравствуйте!
Решил попробовать шину I2C. Эксперемент проводил в Proteus 7.7 SP2
Использую схему:

 

Для мастера (левая ардуина) использую следующий код:







#include <Wire.h>
byte m1=56;

byte val = 50;

void setup() {
  Serial.begin(9600); 
  Wire.begin();
}


void loop() {
   m1=val;
   Wire.beginTransmission(m1); 
                               
   Wire.write(val);            
   byte res = Wire.endTransmission();
   Serial.print(m1);
   Serial.print("   ");
   Serial.print(res);
   Serial.print("   ");
   Serial.println(val);
   val++;      
   if(val == 255)
   {
     val = 0;   
   }
   delay(200);
}

Для слейва:







#include <Wire.h>
byte pin=0;
const byte max1=56;
void setup()
{
  pinMode(13, OUTPUT);
  Wire.begin(max1);                // join i2c bus with address #4
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop()
{
  digitalWrite(13, pin);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  pin=!pin;
  while(1 < Wire.available()) // loop through all but the last
  {
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer
}

При таком коде мастера передача работает корректно:

Но если убрать строку из кода для мастера:



m1=val;

(передаем 56 слейву), то уже не работает:

Подскажите, как такое может быть, где ошибка.

vbogom
Offline
Зарегистрирован: 17.03.2013

Что, никто не работал с I2C. Просто какая-то странная ошибка. Как может быть такое, чтобы если адрес устройства меняю в цикле, то работает. А если он строго заданный, то не работает. Или это ошибка эмуляции.