相変わらずarduinoの実験中です。
やはりどう考えてもアセンブラで組んだロジックが
疑わしい気がするので、2台のarduino両方をarduino
の言語でスケッチを組んで繋いでみました。
スケッチを以下に挙げます。
例によって不等号は全角に変換してあります。
送信側はこれ。
#include <Wire.h>
#define TWIslave 0x20 //TWI address of slave
int out_data[] = {'a','b','c','d','e','f','g','h','j','k','l','m','n','o','p','q'};
void setup() {
// initialize uart & TWI
Serial.begin(9600);
Serial.println("initializing TWI"); //init message
delay(500);
Wire.begin(); // join to the TWI as bus-master
Serial.println("finished initializing TWI"); //init message
delay(500);
}
void loop(void)
{
int i;
//
// write to TWI slave
//
for (i=0;i<16;i++){
Wire.beginTransmission(TWIslave); //send a address to TWIslave with write mode
Wire.send((byte)out_data[i]);
Wire.endTransmission();
}
delay(3000);
}
受信側はこれ。
#include <Wire.h>
volatile int r_data[16];
volatile int num;
void receive_from_twi(int n)
{
while (Wire.available() )
{
r_data[num] = Wire.receive();
num++;
}
}
void setup()
{
num = 0;
Serial.begin(9600);
Wire.begin(0x20);
Wire.onReceive(receive_from_twi);
}
void loop()
{
if (num == 16){
int i;
for (i=0;i<16;i++){
Serial.print(r_data[i],BYTE);
}
num = 0;
}
}
実行してみたら、やはり想定した通りに動きました。
各スケッチの内容ですが、送信側は'a'~'q'の16文字
を1バイトずつ間髪居れずに送信し、3秒空けてまた
同じ処理を繰り返す、という内容。
受信側は、1バイト受信データが来るごとに内部メモリ
にストックしていき、16バイト溜まったらその内容を
UARTに出力します。
単純な処理ですが、マスターからスレーブにデータを
送受信し、データの迷子や重複が生じないことは
確認できました。特に、送信側処理に問題が無さそうな
ことが確認できました。
ひとまずこれらのスケッチで上手く行っていることを
考慮すると、アセンブラで組んだ受信処理が上手く
機能していない可能性が高いようです。
アセンブラで組んだプログラムはシミュレーターで
それなりにちゃんと動いていたんだけどなぁ。
何が悪いんだろう?もう一度AVR-studioの
シミュレーター使って確かめてみよう…
本当はやはりシリアルモニターやシリアルアナライザで
通信内容を眺められればいいんだけどなぁ…
|