2

Dueだけに当てはまるかどうかわからない興味深い問題があります。2つのArduinoATMegasでI2Cをテストするためのリソースがありません。ここに問題があります:

私には2つのDueがあります。マスターには後で使用されるイーサネットシールドがあります。現在、マスターとスレーブを簡単に区別するために使用されています。I2Cは機能していますが、セットアップは次のとおりです。マスターに接続されたDueのDC「ラウンド」入力に接続された1つの12Vバッテリー:3.3VとGNDが2つのボード間で相互に接続されています:スケッチをアップロードするための1つのUSBケーブル。

マスターからUSBを取り外してスレーブにスケッチをアップロードすると、12 DCのため、USBが接続されていないフェーズの間、両方のボードがオンのままになります。スケッチがアップロードされ、USBはシリアル監視のためにスレーブ側に留まります。

問題:12Vバッテリーがマスターに修正されていない場合。USBのプラグが抜かれた段階では、両方のボードがオフになります。同じスケッチをスレーブにアップロードすると、シリアルモニターは、スレーブが情報を受信して​​いないことを示します。

I2Cのセットアップとスケッチのアップロードが競合していると思います。どうすればこの問題を解決できるので、常に会費に電力を供給する必要はありません。これが12Vバッテリー電源で動作しているコードです。

/**************************************************************************************************
  MASTER
****************************************************************************************************/
#include <Wire.h>

byte ISend[4];

void setup()
{
   Wire1.begin(); // join i2c bus (address optional for master)
   intToByteA((unsigned long)72992);
}

void loop()
{ 
   Wire1.beginTransmission(4); // transmit to device #4
   for(int i = 0; i < 4; i++)
   {
      Wire1.write(ISend[i]);
   } 
   Wire1.endTransmission();
   delay(500); 
}

void intToByteA(unsigned long num)
{
   for (int i = 0; i < 4; i++)
   {
      ISend[i] = (byte)((num >> (8 * i)) & 0xFF);
   }
}

/*********************************************************************************************/


/************************************************************************************************
 SLAVE
*************************************************************************************************/
#include <Wire.h>

byte IReceive[4];

void setup()
{
  Wire1.begin(4);                // join i2c bus with address #4
  Wire1.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop()
{
  delay(223);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  unsigned long test = 11;
  for(int i = 0; i < 4; i++)
  {
     IReceive[i] = Wire1.read();
  } 
  test = byteAToInt();
  Serial.println(test);
}

unsigned long byteAToInt()
{
  unsigned long temp = 0;
  for (int i = 0; i < 4; i++)
  {
     temp += (((unsigned long)IReceive[i]) << (8 * i));
  }
  return temp; 
}
4

0 に答える 0