人気ブログランキング |

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

<   2015年 06月 ( 17 )   > この月の画像一覧

A/D変換した値をちょっとグラフにしてみた。

【Cプログラム】
10 main() {
20 unsigned char a[35]={8,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};
25 int c,d,i;
26 unsigned char r;
27 int x=0;
28 clrscr();

30 outport(0x60,1);
40 outport(0x61,1);
50 INIT:c=10;d=0;i=-1;
60 READ:i++;
70 if(a[i]==99) goto INIT;
90 outport(0x62,(a[i] & 0xFE);
100 if((a[i] & 1)==0) goto READ;
120 r= inport(0x62);
140 if(c==10) goto NEXT;
150 if(r==1) d+=(1<<c);
160 if(c==0) pset(x++,d/22,1);x=(x<144)*x;
170 NEXT:c--;
180 goto READ;
190 }
a0034780_21313284.jpg

可変抵抗にしてみたんだけどね。
by k1segawa | 2015-06-02 21:32 | ポケコン | Comments(0)
Cでも組んでみた。
BASIC配列化プログラムに似せて書いてある。

【Cプログラム】
10 main() {
20 unsigned char a[35]={8,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};
25 int c,d,i;
26 unsigned char r;

30 outport(0x60,1);
40 outport(0x61,1);
50 INIT:c=10;d=0;i=-1;
60 READ:i++;
70 if(a[i]==99) goto INIT;
90 outport(0x62,(a[i] & 0xFE);
100 if((a[i] & 1)==0) goto READ;
120 r= inport(0x62);
140 if(c==10) goto NEXT;
150 if(r==1) d+=(1<<c);
160 if(c==0) printf("%d\n",d);
170 NEXT:c--;
180 goto READ;
190 }
大文字のジャンプ先ラベルやgoto命令を残した。BASICなら配列Aと変数Aは別物なのだが、Cはそうもいかないので変数Aは r に置換。8,12,は1拍に直して、「<<」はタグの制限で全角にしてある。

実行した結果は、BASICの10倍くらい。

あと配線図も以下に示す。
a0034780_2131549.jpg

MCP3002は部品図になかったので足の数が同じICで代替。(左がICの凹みがある方)
(6/8訂正:抵抗の繋ぐピンを5→4ピンに修正。赤丸の所。プルダウン抵抗になっていなかった)
by k1segawa | 2015-06-02 01:23 | ポケコン | Comments(0)
BASICプログラムを配列化してみたけどあまりスピードは変わらない。READが遅いと思ったがそんなことはなかったという事。ついでにCS=HIにするのを最後2拍にしたのを1拍にしたが、悪いことは起きなかった。DATA文の最後の「8,12,」は不要という事で。

【BASIC配列化プログラム】
10:*MAIN DIM A(34):I=0
20:REM POKE &H60,1,1
30:OUT &H60,1
40:OUT &H61,1
45:*DATA READ A(I):IF A(I)<>99 THEN I=I+1:GOTO *DATA
50:*INIT C=10:D=0:I=-1
60:*READ I=I+1
70:IF A(I)=99 GOTO *INIT
80:REM POKE &H62,(A(I) AND &HFE)
90:OUT &H62,(A(I) AND &HFE)
100:IF (A(I) AND 1)=0 GOTO *READ
110:REM A= PEEK &H62
120:A= INP &H62
130:REM NullBit SKIP
140:IF C=10 GOTO *NEXT
150:IF A=1 THEN D=D+(2^C)
160:IF C=0 PRINT D
170:*NEXT C=C-1
180:GOTO *READ
190:*RESTORE
200:DATA 8,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
by k1segawa | 2015-06-01 23:24 | ポケコン | Comments(0)

エンジニアあるある(6/1)

こちらのエンジニアあるあるサイト様、
Dr.きたみりゅうじの“IT業界の勘違い”クリニック
が色々深くて哀しいw
a0034780_19192852.jpg
「SEって、家庭を大事にしないよね?」、「SEって、ひとり言が多くてコワくない?」、「SEって、IT業界以外に転職すると価値ないよね?」とか、最後のは本当にそう思ってたわ~
(上記サイト様のイメージは著作権を考えて読めない程度に縮小してあります)
by k1segawa | 2015-06-01 19:21 | Comments(0)
こちらのポケコンの資料を見ると、モータ制御やライントレースの方法と合わせてポケコンに繋ぐ簡単な回路が載っている。いずれこちらにも手を出すのかもしれないが、中盤以降のDownloadというボタンをクリックしてPDFを読むと、ソフト屋さんが学ぶべき基本の電子回路が載ってていいかもしれない。(それでも本当の初心者より私のようにプルダウンとか勉強した者が読まないとわからないと思う)

ポケコン搬送車?サイト様
a0034780_18394823.jpg

動画は写真をクリックするとmpgファイルがダウンロードされるので、Windows Playerで再生可。
by k1segawa | 2015-06-01 18:41 | ポケコン | Comments(0)
こちらにポケコンのイメージでBAD Appleを作った方がいらっしゃって、すごいな~と思って紹介。
Movie data in one PNG image
a0034780_1843961.jpg

もちろん同じことを本当にポケコンでやろうとすると、解像度やスピードの点で頑張らないといけないが、こうやって最近?のネタで取り上げられているのを見るのはうれしい限り。
再生は液晶画面でクリック後、何かのキーを押す。
元々はこちらのサイト様の作ったページ。
ポケコンで Bad Apple !! - Simple Inspiration
by k1segawa | 2015-06-01 18:08 | ポケコン | Comments(0)
プログラム完成!

【BASICプログラム】
10:*MAIN
20:REM POKE &H60,1,1
30:OUT &H60,1
40:OUT &H61,1
50:*INIT C=10:D=0
60:*READ READ A
70:IF A=99 RESTORE *RESTORE:GOTO *INIT
80:REM POKE &H62,(A AND &HFE)
90:OUT &H62,(A AND &HFE)
100:IF (A AND 1)=0 GOTO *READ
110:REM A= PEEK &H62
120:A= INP &H62
130:REM NullBit SKIP
140:IF C=10 GOTO *NEXT
150:IF A=1 THEN D=D+(2^C)
160:IF C=0 PRINT D
170:*NEXT C=C-1
180:GOTO *READ
190:*RESTORE
200:DATA 8,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,8,12,99

REM文のPOKE,PEEKはPC-E5,U系のためのもの。REM文をはずしたら対応するOUT/INPにREM文を付加すること。
Z80系 PC-E2,14系,G8,G85系がOUT/INP(システムバス入出力)命令を、11ピンに対してもサポートしている事(アドレス60H辺りも可能)を前提にしている。(ひょっとするとG8系はミニI/Oしかサポートしていない?そうならコマンド書式が違うし、そもそも入力3ピン、出力3ピンが異なる。もしくはE2系は命令自体がない可能性も)

まあそういう心配があるからずっと前のプログラムでは5バイト程度のマシン語を使ったのだが。それはたぶんG8系なら大丈夫と思いたい。

【解説】
10:メイン
20:E5系用
30:11ピンをパラレルポートに設定する
40:4ピン(最下位ビット)のみ入力、それ以外は出力に設定
50:初期化。Cは入力ビットのビット位置に合わせた重み(2のn乗)のカウンタ、
Dは最終入力データ(アナログ値):0-1023(2^10ビット)まで示す。
ここでは5V入れてるので5*(D/1024)Vを示す。まあ変化すれば何でもいいんだけど。
60:データリード(1CLK毎の各ピンへの出力設定値)
70:データ末尾を検出したらデータを先頭に戻して初期化へ
80:E5系用
90:4ピン用のデータの最下位ビットを除いたビットにしてから、4ピン以外へ出力。
100:4ピン用のデータの最下位ビットが立っていなければ以下の処理をスキップ
110:E5系用
以下4ピン用の処理(最下位ビットが立っていればそれは4ピンから読み込むタイミングなので)
120:パラレルポートから読込みAにセット
(設定で4ピンのみ入力に設定しているので実質4ピンのON/OFFしか読み込まれない)
130:次がNullBitの処理であることを示すコメント
140:重みのカウンタがまだ10ならそれはNullBitなのでNEXTへ飛ぶ(わざわざ10にした理由)
150:Aが1(ON)ならB9-B0のいずれかなので重みCで累乗して、Dへ加算。
160:重みCが0になったら10ビット全て処理したのでDを表示。
170:*NEXT 重みCを減算
180:データリードへ戻る
190:*RESTORE
200:データ列(末尾に99付加)

まあ自分でも読み返しづらいとは思うが、備忘録的なものとしてはこんなものかな。
最初4ピンと5ピンの結線を間違ったのは秘密だ。

これでCDSを手でさえぎったりすると800台から400台に変化するのでうまくいってるようだ。

youtube:ポケコンによるA/D変換
a0034780_12225044.jpg

(6/8訂正:動画では修正していないが実体配線図(fritzing)のプルダウン抵抗を5→4ピンに直した)
【応用】
このA/D変換入力に赤外線センサーや超音波距離センサー、温度湿度気圧センサー、CH1も使って(コマンドをCH0/1変わりばんこに送って)2次元傾きセンサーやタッチパネル(電圧で測るもの)を繋いだりすれば夢は膨らむ。

まあREADが遅いので配列化したり、Cに置き換えればもうちょっと早くなるだろう。
早くし過ぎてもタイミングチャートのMINを越えなければいい。

それにラズパイやArduinoでは何でもシリアル通信やSPI通信のライブラリを使ってしまって、ブラックボックス化しているが、これなら素のGPIO制御だけで出来ているので、回路をどんなマイコンに持っていってもインプリメント可能。(ラズパイでもArduinoでもAVRだろうがライブラリは最低限のPIN OUTPUT/INPUTだけでいい)
by k1segawa | 2015-06-01 11:24 | ポケコン | Comments(0)