「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



相変わらず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の
シミュレーター使って確かめてみよう…

本当はやはりシリアルモニターやシリアルアナライザで
通信内容を眺められればいいんだけどなぁ…



コメント ( 0 )




ここ数日、2台のarduinoでTWIの通信テストを
しています。
また今もちょこっと続きをしてみました。

1台はarduinoのIDEでデータ送信をする
スケッチを書き、それをアセンブラで書いた
プログラムを書き込んだもう1台のarduino
側で受信し、受信したデータをUARTで
表示するという処理をしています。

arduino-IDEで書いたスケッチは単純
ですし、アセンブラ側のプログラムは
シミュレータで動かしてみたところ思った
とおり動いているのですが、実機で動かすと
上手く動きません。

なんとなくそれっぽいデータは流れているん
ですが、tera term画面上に表示される
文字列がなんだかおかしい…
データの個数が…


うーん、なんとなくTWI上を流れている
データの内容がおかしい気もするし、
そうでは無い気もするし…

やはり通信内容を直接アナライザで拾わ
ないと、これ以上の原因追求はなかなか
難しいなぁ…。

いずれにしてもやはり、実機デバッグの環境が
無いとこういう時には厳しいなぁ。

JTAGICE-mkⅡにしても、
シリアルアナライザにしても、その手の
機器を使わずにテストをするっていうこと
自体は「本来形」じゃぁないからなぁ…

USARTやSPIは操作が簡単だから
机上デバッグでもある程度絞り込んで
いけると思うんだけど、TWIともなると
やっぱりアナライザが欲しくなるなぁ…。

完璧な機能とまでは行かなくても、ネコロジー
にTWIの簡易アナライザ、もしくはバスモニタ
程度の機能はつけてみようかな?

当然PC側ソフトでの対応が必要になるわけですが、
VBであまりゴチャゴチャしたプログラム組むのは
好きじゃないしなぁ。VBのIDEは、ちょっとした
プログラム作るにはいいんだけど、長いプログラム
組むにはなんだか使い難いしなぁ。

うーん。
なんだかんだで、PICkitシリアルアナライザ
が一番安いのかな?そもそもこれって、単なる
モニタとしてつかえるのかな?



コメント ( 0 )