Arduinoを試してみることにした
sw_operationプログラムのデバッグで苦労した
Raspi-PICcoloはPic-coloのRaspi搭載モデルです。
秋月電子のRaspi用ユニバーサル基板にRaspi-PICcoloを組んでみました。
これを使って、プログラムの試作を進めています。
先ずは基本のLチカプログラムから、これはすんなり動いて次はSW操作プログラムです。タクトSWの短押し一回で1点灯、短押し二回で2点灯、長押し一回で1秒間隔の点滅、長押し二回で2秒間隔の点滅を繰り返すというものです。動いたように見えたのですが・・・途中で動作が止まってしまいます。ちょっと嫌な不具合です。orz
いつもなら、PICkit3でプログラムの動作を追いかける所です。しかし、ここはPICkit3に頼らず、Raspi-PICcoloだけでデバッグできることを示さなければなりません。
しかし、何をどうすれば良いのか?PIc-coloに加えたいデバッグ機能が色々でてきましたが・・・
SW操作プログラムのベースはLチカプログラムです。先ずはLチカプログラムに戻って、そこに追加した機能を順番に試してみることにしました。
MainループのLED制御は初期状態では1点灯の反復です。これはLチカプログラムとほとんど同じなのですが、念のため確認しておきます。問題なし。
次は10msインターバルで行う、SWの状態読み取りです。これも問題なし。最後に残ったSW操作の判定処理・・・ん、不具合再現!
不具合箇所が絞られました。ソースコードを見直します。
100msインターバルでSW操作の判定を行っているのですが・・・ あ!
中でdi()ei()を使う関数をms_timer割り込みの中から呼び出していました。orz
関数の呼び出しをMainループに移すと・・・
ビンゴ~
動きました。SW操作プログラムの完成です。
やれやれ
commPortのclose処理で苦労した
Pic-coloは、COMMポートがオープンできない場合はPICとの通信は行わず、SettingメニューでCOMMポートの指定が修正されて、ポートがオープンできた場合にPICとの通信を始めます。
ここまでは、良いのですが問題はCOMMポートが複数ある場合です。一方のCOMMポートを開いた後に、SettingメニューでCOMMポートの指定が変更された場合、現在開いているCOMMポートをクローズしてから、新しく指定されたCOMMポートをオープンすることになります。ところが・・・何故かclose関数から戻ってこないのです。orz
ネット上にもrxtxのclose処理で困っている方が大勢いるようです。
”こうすると良い”という記事を見つけたのですが・・・
> serialPort.removeEventListener();
> serialPort.close();
https://marc.info/?l=rxtx&m=123544269723586&w=2
駄目でした。
諦め半分で、暫くジタバタして・・・
ん!出来た?
ReceiveThreadとSendThreadの停止を待ち、portのInputStreamとOutputStreamをcloseしてからportをcloseしたら、上手く行きました!
(パチパチパチ~)
コードはこんな感じです。
-------------------------------
private class CloseThread implements Runnable {
public void run() {
try {
thread_break = true; <== ReceiveThread、SendThreadの順に停止させる
while( !st_break ) <== SendThreadの停止を待つ
{
try {
sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(Comm.class.getName()).log(Level.SEVERE, null, ex);
}
}
out.close();
in.close();
port.close();
} catch (IOException ex) {
Logger.getLogger(Comm.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
close処理をThread化したのは、close処理を始めた後もメイン・ループからステータス受信のコマンドを出させるためです。それによって、ReceiveThreadとSendThreadが走り、whileループから抜けます。
やれやれ。
pickleでPICに書き込んでみた
pickleという、RaspiでPICの書き込みを行うプログラムがあることをご存知でしょうか?これです(↓)。
projects:pickle - wiki.kewl.org
lvpにも対応していて、5V電源があればPIC16F1788に書き込むことができます。
その存在は前から知っていたのですが、積極的に使ってみようと考えたのは、今回が初めてです。今まではPICkit3を使っていたので、使う必要がなかったのです。
Piccoloコンソール(JAVAプログラム)とPIccoloデバッガー(PICプログラム)はどちらも複製可能なので、Piccoloデバッガーの複製機能を積極的にアピールして、広めようという作戦です。¥(^_^)
で、Raspi-Piccoloの試作でPICへの書き込み機能を試してみました。
最初コマンドが良く分からなくでジタバタしましたが、ようやく使えるようになりました。
コマンドの操作はこんな感じです。
> p14 select PIC16F1788 lvp erase eeprom
> p14 select PIC16F1788 lvp program *****.hex
『Raspi-Piccolo』は通常版とZIFソケットを付けたFree版の二種類を用意しようと考えています。
構造体名が見つからない
Pic-coloは、readelfの出力を解析して変数のアドレスやサイズなどの情報を取得しています。今までは、(便宜上)全ての変数をバイト型の配列と見なして表示してきたのですが、もっと見やすい形式に整える作業に着手しました。
これまでは v_int BASE e803 だった
それを v_int int 0x3e8 1000 と表示するようにしました。
構造体も表示を改善しようとして、問題に気付きました。
typedef struct
{
I2C_TR_QUEUE_ENTRY *pTrTail; // tail of the queue
I2C_TR_QUEUE_ENTRY *pTrHead; // head of the queue
I2C_TR_QUEUE_STATUS trStatus; // status of the last transaction
uint8_t i2cDoneFlag; // flag to indicate the current
uint8_t i2cErrors; // keeps track of errors
} I2C_OBJECT ;
static I2C_OBJECT i2c_object;
変数(i2c_object )がstructure_typeだということは分かるのですが、構造体名(I2C_OBJECT)が見つかりません。orz
実は、構造体情報の出力は2種類( Abbrev Numberが5と21)あって、そのうちAbbrev Numberが5の方は構造体名が出力されないのらしいです。”I2C_OBJECT”という文字列が有るのかgrepで調べてみたですが、そもそもelfファイルに出力されていません。orz
readelfのオプション云々の問題では無さそうです。
何故、そんなことになっているのか?
?????????(<==暫く、悩んでみた)
ググッてみても、分かりません。
?????????(<==もう一度、悩んでみた)
考えてみても、分かりません。
どうすれば良いのか?
???(<==比較的簡単に結論が出た)
やれることからやる!
Abbrev Numberが21の方だけ先に処置することにしました。
Abbrev Numberが5の対策は、そのうちに見つかるかもしれません。
最後まで残ったときは、力任せにlstファイルを解析して、構造体名を取得することだってできるのですから。
Pic-colo開発の試練はまだまだ続きそうです。
Pic-coloの回路図を描いた
当初は、Raspi-Picという名称を考えていました(I2C接続を考えていた)。途中からUSBシリアル変換ICを搭載してUART接続することにしました。その結果、RaspiだけでなくPCにも接続できるようになったので、名称を”Pic-colo”に改めました。今後はブログのカテゴリを”プロジェクトPic-colo”にします。
”プロジェクトPic-colo”の最初の成果物として、Piccolo-16F1938の回路図を描きました。X-talを付けるかどうか迷ったのですが、折角USBシリアル変換ICから3.3Vが出力されるので、それを生かして付けることにしました。
ほぼ、当初構想通りの回路に仕上がりました。(パチパチパチ~)
ジャンパーの設定でPICの電源電圧を切り替えられる(5Vと3.3V)ようにしてみましたが、このまま行くかどうか思案中です。 USBシリアル変換ICの3.3V出力は50mAしか取れないので、ちょっと中途半端な気もするのです。3.3Vは外部電源から供給する方が良いかなぁ・・・
このあと、一度試作してからパターンを起こします。電源電圧を切り替えの件はそれまでお預け!
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
『なんだ、Arduino互換機じゃないか!』そう、思われた方もいらっしゃると思います
(<== Arduino UNOそっくりの回路だということは認めます)が違います!
Pic-coloは、PICの学習、プログラム開発、アプリケーションの実行環境を目指して、開発しています。そこの所、お間違えの無きようお願い申し上げます。
Bugfixは一歩ずつ
正常系の動作を少しずつ組み込んで、ようやくLチカプログラムが動くようになりました。ほっとしたのもつかの間、今度は異常系のバグが顔をだすようになりました。
バグの一つ目は、COM PORTの設定を/dev/ttyUSB0から/dev/tttiUSB1に切り替えようとしたら出来なかった、というものです。調べてみると、PORT設定機能がきちんと組み込まれていませんでした。orz
バグの二つ目は、割り込みハンドラが定義されていないプログラムをLoadしようとして、Null Stringのデコードでエラーになって機能停止した、というものです。Lチカはタイマー割り込みを使うプログラムだったので、このバグに気付きませんでした。
PORT設定の不具合は、他の方にプログラム動作を説明している最中に発覚したので参りました。(;_;)
皆、こうして強くなって行くんだ!
うん。