人気ブログランキング |

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

2015年 06月 07日 ( 3 )

念の為BASICでも構造化してみた。構造化はPC-G8系?G85系からなので、PC-E5系はPC-E650とPC-U6000だけかな。

前回のCプログラムを直す形にしたので、PEEK、POKE文によるPC-E5系のINP/OUTの代替命令は残していない。

【構造化BASICでのSPI通信によるA/D変換】
DIM A(33):I=0:X=-1

CLS
OUT &H60,1
OUT &H61,1

REPEAT
READ A(I):I=I+1
UNTIL A(I-1)=99

WHILE 1

C=10:D=0:I=0
WHILE A(I)<>99
OUT &H62,(A(I) AND &HFE)
IF (A(I) AND 1)<>0 THEN
A= INP &H62
IF C<>10 THEN
IF A=1 THEN D=D+(2^C)
IF C=0 THEN
W= INT (D/8)
IF X<>W THEN
LINE(X-(X<W),0)-(W-(X>W),15),X,BF
X=W
ENDIF
ENDIF
ENDIF
C=C-1
ENDIF
I=I+1
WEND
WEND
DATA 0,2,6,2,6,0,4,2,6,0,5,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,8,12,99
INTは関数なのでマニュアルの先頭に載っている。ただし、Cのintとは負の値の扱いが異なるのでFIX(こちらはBASICの命令)が本来正しい。まあ負の値を取らないのでCに字面だけ合わせてあるが。(X<W)の論理値は、Cの場合の真の値(1)と異なり-1なので符号を逆にしてある。またLINE文はX=XOR、BF=長方形塗りつぶしで、XとBFの間のパターンは省略している。あとREPEAT-UNTILやWHILEなので制御変数Iの初期値や判定が微妙に違うので(太文字)注意。

やっぱり実行すると遅い。Cプログラムと同時にメモリに存在できるので切り替えて実行するとよくわかる。

でもBASICも構造化するとループの範囲や意図が分かり易いし、なによりポケコンの狭い画面でも、横はタブを1にして書くと、Cと違ってセミコロンがない分、何とか収まるし、中かっこでなくENDIFやWENDなので縦も対応が分かり易い。ポケコン上でデバッグしやすい。(Cは一度ノートに書いて入力し机上デバッグする方がいい-画面狭いので)

おしいな~。これでBASICコンパイラがついてれば構造化BASICならプログラムの入門には最適だな。
だれかPC-E5系のBASICコンパイラBASCOM(BASC102)の構造化BASICへの移植してくれないかな~

【独り言・・・】
ソフト屋さんなので、入れ子構造が見やすい(BASICやCで育った人)と感じるが、ハード屋さんは前の構造化しない方のプログラムの方が見やすいのだろうな~。BASICに限るが、一行一行見て理解する形だと、GOTOのラベルの方が、単なるブロックの}やENDIFより意味がすぐわかるから。全体を見渡すよりべたっとしたリストを好む気がする。もちろん慣れの問題もあると思うが。Cも入れ子構造があまりに深いとわかりづらいから程度問題か。
Cで書いていても、ソフト屋さんは、for、whileのなるべく単純な制御構造に当てはめようと問題自体の分割やアルゴリズムを簡素なものにできないか再検討をするが、ハード屋さんのソースはどこかそういうループに特殊な脱出条件を追加したまま複雑化している気がする。きっとそこまで手間をかけるかどうかなんだろう。
by k1segawa | 2015-06-07 23:44 | ポケコン | Comments(0)
センサーを付け替える前にちょっとビジュアライゼーション。

アナログ入力を表現するのに、動的な棒グラフでキャッチ―にしてみた。

【ポケコンによるSPI通信(A/D変換)】
main() {
unsigned char a[34]={0,2,6,2,6,0,4,2,6,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,8,12,99};
int c,d,i;
unsigned char r;
int x=-1;int w;

clrscr();
outport(0x60,1);
outport(0x61,1);

do {

c=10;d=0;i=-1;
do {
outport(0x62,(a[i] & 0xFE);
if((a[i] & 1)!=0) {
r=inport(0x62);
if(c!=10) {
if(r==1)
d+=(1<<c);
if(c==0) {
w=(int)(d/8);
if(x!=w) {
line(x+(x<w),0,w+(x>w),15,2,0xFFFF,2);
x=w;
}
}
}
c--;
}
} while(a[i++]!=99);
} while(1);
}
最初のCS=HIの8は要らないみたいなのでデータから削除。d(アナログ値)をx方向で表現。(0,0)-(アナログ値,15)の長方形の伸び縮みで表す。/8≒1024/144(最大x座標)。wは内部計算を少なくするため。
xは前回のx座標。line文は後ろ3つが2=XOR、0xFFFF=塗り潰しパターン全て、2=長方形塗り潰しを示す。(x<w)は論理値が真なら1、偽なら0を利用。<、>はブログの制限で全角。

youtube:ポケコン SPI通信でアナログ入力
a0034780_2125019.jpg


processingみたいにデザインに凝ると単なるデータもありがたみが増す。昔のNECのPCの画面がジャン=フランソワ・ミレーの絵画「落穂拾い」だったようなもの。
by k1segawa | 2015-06-07 21:10 | ポケコン | Comments(0)
今までポケコンで、以下のようなデータの入出力を色々やった。
1.デジタル出力
2.デジタル入力
3.アナログ入力

1番はよくあるLEDを光らせるやつ。
応用としてシフトレジスタを使って1ポートで7セグを点灯させた。
少ない出力ピンで多くの信号を制御する。
デジタル出力であとやってないのはLEDをPWM制御で調光することかな。

2番はスイッチのON/OFFを読み取るやつ。
基本だが、プルアップ・プルダウン抵抗を理解しないと進めない。
応用としてパラレル-シリアル変換ICからの複数スイッチの入力など。
少ない入力ピンでたくさんの信号を受け取れるようにする。

3番はA/D変換ICの入力。
アナログ値を入力するのに、MCP3002というICで、電圧値をデジタル入力に変換して取り込む。
ポケコンでSPI通信ができることが分かったのが収穫。
応用としてタッチパネルや複数のセンサー切り替えや無線によって遠隔地のデータを取り込んだり。

次にI2Cをやろうとしたが、双方向インターフェースというのが必要だった。
SPIは単方向の信号つまり入力か出力に特化したピンでやり取りするのだが、
I2Cは1個のピン?で入力も出力もこなさなければならない。いわゆるバスってやつだ。
ポケコンにもPC-G850Vにはバスが出ていて、命令もシステムバス命令で用意されているが、まだ11ピンしか使ったことがないので敷居が高い。
どうにかできないかと調べていたら、こちらのサイト様にGPIOで出来るようなことが書いてあった。

2.3.4.1. GPIO初期化関数
【以下引用】
ここで注意したいのは、ポートを出力として設定するタイミングです。
今回接続するLCDモジュールは、R/WがHレベルになると、データバス
(DB0-DB7)からデータが出力されます。このときマイコン側もピンが
出力設定になっていると、電気的にショートしてマイコンや
LCDモジュールが破壊されてしまう危険があります。
 例えばマイコン側の出力ピンがHレベルになっている場合には、
マイコン内部でピンが+電源に接続されています。
そしてモジュール側でピンがLレベルになっている場合には、
そのピンは-電源に接続されています。
そうするとこれらのピンが接続されてしまうと、結局は、
+電源と-電源が直接に接続されたのと同じになってしまうのです。
 そのためマイコン側のポートを出力として設定する前には、
LCDモジュール側を確実に入力に設定(R/WをLレベルにする)
しておく必要があります。
 なおこの問題はLCDのモジュールに限ったことではなく、
データの出力と入力を兼用するデバイス全般との接続において注意
すべきポイントです。
【ここまで】

ずっと入出力兼用のピン設定がないか考えていたが、入出力モードを切り替えて使えばいいらしい。
ただプルアップや何かの信号がモード切替のタイミングでHIにならないように、回路設計と相手機器をコントロールしないといけないみたい。

うん。敷居が高いな。SPIができるようになったのだから、I2Cはとりあえずおいておこう。
まだ外部電源の実験やアナログ入力の応用も手広く残っているし。
by k1segawa | 2015-06-07 17:16 | ポケコン | Comments(0)