DSBasicによる自動運転デバッグ [自動運転]
(追記 現在DSBasic R0.3になっており、下記不具合(2)、(3)は解消しております)
やっぱり、F-modelsに行こうかどうか悩みましたが、半額セールで買うものが見つからないような気がしたので、今日は、昨日作ったレイアウトのデバッグをしていました。
使ったスケッチはDSBasic_20160714で、やっているうちにいくつか不具合があり、今日は自動運転は完成しませんでした。
不具合ですが、
(1)Arudino1.6.6でコンパイルできない。→1.6.9でOK
前は他のPCでAruino1.6.7でコンパイルしていたような気がするので、気がつきませんでしたが、1.6.6ではコンパイルできませんでした。static void ignore_blanks(void)がExternだかStaticだか。とでます。Arudino1.6.9にIDEを上げて無事コンパイルできるようになりました。
(2)SPD命令がおかしい→以前のもののようにすればOK。
中身を確認したら、前のVerではSetLocoSpeedExが呼ばれてて、これは0~1023のスピードを引数にするのですが、今回のS88用VerではSetLocoSpeedが呼ばれており、スピードの引数は0~100%のようです。ただし、内部の計算がArduinoのInt型なのに、計算内で32768を超えているため(Inspeed*1024)/100)、どうも動作がおかしいです。まあ、以前のものに戻しつつ、値チェックもする形になればよいかと思います。
ここまでやって、S88の動作を確認しました。
DSBasicのプログラムは以下です。
10 print gs8(0)
20 print gs8(1)
30 print gs8(2)
40 print gs8(3)
50 delay 300
60 cls
70 goto 10
で、OKでした。
DSCoreに直結しているためか、Delayをちゃんと入れてやらないと、S88自体の動きが速すぎて怪しいです。
次は要望ですが、S88は8ビットごとに取ってくるのですが、ビットAndやビットOr命令がないので、If文が扱いにくいです。弘前大のスケッチ tinybasic20160327vk.inoには、Not、And、Orが拡張されていたので、できたら付け加えてほしいです。(適当に付け加えたら、まあ動きました)
で、次ですが、これがちょっと私のプログラムを作るうえでは今のところ致命的な問題です。
(3)プログラムが256Byteしかロードできない?
4信号機で、各信号機のアクセサリアドレスが2つずつで計8つのビットをいじるのですが、(Nucky様のもともとのコンセプトは多分、閉塞区間で、アドレスを重複させるやり方なのでBit数は4に減らせると思いますが)、
1.S88の値を取ってきて
2.If文でどの信号かを判断し
3.各信号のビットを立てたり下したりする(4ビット分)
のですが、プログラムの動作が不安定で、セーブ、ロードすると暴動します。
もともと自由な領域が968Byteありますが、713Byteまでは普通にセーブ、ロードが可能ですが(多分ここら辺が256Byteの区切り)、711Byte(MEM命令で確認)ではプログラムをSave後、Loadし、Listでみると、DSBasic自体が暴走します。List命令で、プログラムと文字化けしたような文字列が流れ続けます・・・。
もうちょっと長いプログラムを書いてセーブ、ロードしたいです。
やっぱり、F-modelsに行こうかどうか悩みましたが、半額セールで買うものが見つからないような気がしたので、今日は、昨日作ったレイアウトのデバッグをしていました。
使ったスケッチはDSBasic_20160714で、やっているうちにいくつか不具合があり、今日は自動運転は完成しませんでした。
不具合ですが、
(1)Arudino1.6.6でコンパイルできない。→1.6.9でOK
前は他のPCでAruino1.6.7でコンパイルしていたような気がするので、気がつきませんでしたが、1.6.6ではコンパイルできませんでした。static void ignore_blanks(void)がExternだかStaticだか。とでます。Arudino1.6.9にIDEを上げて無事コンパイルできるようになりました。
(2)SPD命令がおかしい→以前のもののようにすればOK。
中身を確認したら、前のVerではSetLocoSpeedExが呼ばれてて、これは0~1023のスピードを引数にするのですが、今回のS88用VerではSetLocoSpeedが呼ばれており、スピードの引数は0~100%のようです。ただし、内部の計算がArduinoのInt型なのに、計算内で32768を超えているため(Inspeed*1024)/100)、どうも動作がおかしいです。まあ、以前のものに戻しつつ、値チェックもする形になればよいかと思います。
ここまでやって、S88の動作を確認しました。
DSBasicのプログラムは以下です。
10 print gs8(0)
20 print gs8(1)
30 print gs8(2)
40 print gs8(3)
50 delay 300
60 cls
70 goto 10
で、OKでした。
DSCoreに直結しているためか、Delayをちゃんと入れてやらないと、S88自体の動きが速すぎて怪しいです。
次は要望ですが、S88は8ビットごとに取ってくるのですが、ビットAndやビットOr命令がないので、If文が扱いにくいです。弘前大のスケッチ tinybasic20160327vk.inoには、Not、And、Orが拡張されていたので、できたら付け加えてほしいです。(適当に付け加えたら、まあ動きました)
で、次ですが、これがちょっと私のプログラムを作るうえでは今のところ致命的な問題です。
(3)プログラムが256Byteしかロードできない?
4信号機で、各信号機のアクセサリアドレスが2つずつで計8つのビットをいじるのですが、(Nucky様のもともとのコンセプトは多分、閉塞区間で、アドレスを重複させるやり方なのでBit数は4に減らせると思いますが)、
1.S88の値を取ってきて
2.If文でどの信号かを判断し
3.各信号のビットを立てたり下したりする(4ビット分)
のですが、プログラムの動作が不安定で、セーブ、ロードすると暴動します。
もともと自由な領域が968Byteありますが、713Byteまでは普通にセーブ、ロードが可能ですが(多分ここら辺が256Byteの区切り)、711Byte(MEM命令で確認)ではプログラムをSave後、Loadし、Listでみると、DSBasic自体が暴走します。List命令で、プログラムと文字化けしたような文字列が流れ続けます・・・。
もうちょっと長いプログラムを書いてセーブ、ロードしたいです。
2016-07-24 21:09
コメント(0)
トラックバック(0)
コメント 0