<   2015年 03月 ( 11 )   > この月の画像一覧

ポケコン PC-G850Vで電子回路工作(3/31)

どうやらまだよくわかっていないようだった。
電源と直結するのはいいとして、OFF(Low,0)にするのはただスイッチをOFFにするだけではだめらしい。
a0034780_633454.png
このようにGNDとつなぐらしい。なるほどだから前の回路図は「トグルスイッチ」なのか。
そして上記のようにポケコン側も内部ではきっとこうなっているだろうという予想図を描いてある(独自解釈)。
スイッチのON/OFFと信号のON/OFFは逆になっている(負論理というやつで、押すとGNDと繋がるので0、離すと5Vと繋がるので1)が、なるほどこれなら見慣れたトランジスタ回路のスイッチングという機能だ。
もちろん今ならTTLは下のCMOSのトランジスタだろうが、結局ポケコンへの信号ON/OFFはトランジスタ回路へのベース信号の入力なんだとすれば、5VとGNDに繋ぐ意味も分かる。LEDのON/OFFで描いてあるがもちろんポケコンへの何らかの入力なのだから仕事としてはディスプレイへの数字表示(1/0)でもいいわけだ。
これってプルアップ抵抗ってやつ?じゃあプルダウン抵抗の形式もある?それはON/OFFが正論理になるのかな?トランジスタ回路なら2つ電池のパターンもあるからそれはつまりポケコンの電源を使わない外部電源での回路駆動という事か?その時のポケコンの5Vは使わなければ未結線でもいいのか?つまり外部電源1個のみという事か?
まだまだ謎は尽きないな~
a0034780_199168.png
a0034780_1992585.jpg

[PR]
by k1segawa | 2015-03-31 06:34 | ポケコン | Comments(0)

ポケコン PC-G850Vで電子回路工作(3/28)

いよいよINPUTに手を出す。
今まではポケコンから出力するばかりで、ポケコンへ入力はやっていなかった。
なぜかというと、ポケコンに電気を入れる?と壊すような気がしたから(ガクブル)。

きっと電気電子が得意な方にはわからないと思うが、なんで抵抗を入れるのかとか電流が何アンペアまでOKとか、ピンと来ないのだ。だから今まではポケコンから信号を出す方しかやっていなかった。

でもそろそろINPUTもやらないと、デジタル回路とはいえ、0Vと5Vと見なされる信号をポケコンのピンに入力しなければ、ON/OFFも受け取れない。

標準(汎用)ロジックICを使った回路の作成を目標にしてるけど、確か74HCXXXXシリーズはC-MOS(TTLではない)のはず。すると、OFF(Low,0)と見なされるのは前のページにもあるように0-1.5V(5Vの30%)、ON(Hi,1)は3.5-5V(5Vの70%)。

簡単に言うと、VCC(+5V)の2ピンと信号入力ピン(もちろんポート設定で入力モードにしてね)の4~11ピンの8ピンのどれかと繋ぐとON(Hi,1)になり、GND(0V)の3ピンと信号入力ピンを繋ぐとOFF(Low,0)になる。

でもでもここで素人の私はすごく怖い。きっと直接繋いじゃいけないんだよね?
でも上の0Vと5Vを直結すると壊れるんだよね?信号入力ピンって何Vなの?
そんなレベルです。でインターネットを探す。

のりつぐのメモ様の所にPC-E200(Z80系)の回路があった。
これによると切り替えスイッチで、ON/OFFを切り替える回路がある。
まさにこれ。
こちらの回路によると、
a0034780_8105291.jpg
のように抵抗100kΩを間にはさめば信号入力ピン(ここでは6 Xin(Di2))と3ピン(GND)を繋いでもいいらしい。

おー、100kΩをはさめばいいのかー
馬鹿な私は「タクトスイッチ」で100kΩと3ピンと4ピンをつないで、
次のようにコマンドを打つ。

OUT &H60,1
(11ピンを入出力パラレルポートに設定:0がデフォルトで、2はシリアル-つまりサイト様のイメージ)
OUT &H61,1
(11ピンのうち4ピンを入力(4ピンは最下位ビットなので1)に、その他は出力(0)に設定)
INP &H62
(4ピンの値を読む)

おおっと危ない危ない。INPじゃなかったらまずいよ。今まではOUTだけど、OUTだと出力だよ?入力だって言ってるのに電気を出力しちゃダメだよ。ここも気を付けないと。(最初にINP &H62,Aとやって画面に0.(改行)98.(改行)と出たのは秘密だ)

OUT/INP命令はPC-G85系以降のBASICでサポートかな?なかったらPC-E5系ならPEEK/POKEで直接、PC-E2系やPC-G8系なら面倒だがBASICプログラム+マシン語の前回のプログラムを参考にして、Z80命令でIN命令を追加したりして作って欲しい。いやたぶんZ80系ポケコンは全てBASICでOUT/INP命令サポートしてると思うけど念の為。

で、INP &H62を「タクトスイッチ」を押しつつ、実行。ん?0のままだ。押さなくても0。
回路を見直す。6ピンと3ピンであるGNDと、2ピンのVCC(5V)の切り替えだ。
あちゃー、「トグルスイッチ」なのね。一生懸命4(6の代わり)-3ピンを繋いでた。
するとONにするには、4-2ピンを繋ぐんだ。
でもそっちの抵抗は22kΩって書いてある。なぜ?
全然わからない。きっと抵抗が少ないって事は流れる電流も大きいのだから、少ない電流ならいいんじゃないか?と勝手に判断して100kΩで4-2ピンを「タクトスイッチ」で繋ぐ。

こえーよー、と思いつつタクトスイッチを押しながらINP &H62と押す。

画面に1と出る。(画像は押してないけど、押しながら撮影した)
a0034780_844820.jpg
たったこれだけの事なのに全然わかっていなかった。ポケコンに入力するって0Vとつないだり、5Vとつないだり、そして抵抗の値も違うんだな。勉強になります。
a0034780_1910027.png

[PR]
by k1segawa | 2015-03-28 08:48 | ポケコン | Comments(0)

ポケコン PC-G850Vで電子回路工作(3/22)

前回はタイミングチャートの説明をしたが、
最初はあんなに詳しく一から考えたわけじゃない。
まずなんでデータAがCLKとずれてるのかな?じゃあCLKの立上がりの前で1かな?続けて1かな?
じゃあ次のCLKの準備だから立下りで1かな?おーうまくいった。じゃあこれを1CLK毎に繰返せばいいのか~
でも本当にそれでいいのかな?理屈は?という風にあとから詳細はついてきたのだ。

なんかひどく難しくなってしまっていたが、要はそういう事だ。

で今回は出来上がったデータを表にしてきれいにまとめた。
a0034780_16545097.png
上のうすい青の表が数字1~0までのDATA文。4,6,4,6,...と続いている。下の濃い青の表が各数字毎をビットで現したもの。数字1だけ5pin、6pinを表示しているが、それ以降は4pinだけを表示。
一番下にgoogleシートでの関数の式をメモしてある。

今度はそれを実際のタイミングチャートにするとどうなるか示している。
a0034780_17334662.png

最初の表と横に揃えた方が分かり易かったのだが、ちょっと幅が窮屈なのでこうして縦に分けた。
上のLED表示はそれぞれの1片がa~hで、隣は数字の1の場合、2の場合を示している。ここでhは使われていない。
そして列10~12は、LEDの場所と相当するICの出力ピンを示している。ちょうどその下のタイミングチャートとも縦を揃えている。
そして列13以降がタイミングチャートで、0(Low)を灰色にして1(Hi)を目立たせるようにしている。
1の場合、LEDのcとbに相当するQFとQGのピンがONになるようにCLKの立上がり前から立上った後まで(立下り直後から立下り後直前まで)を1(Hi)にしている。以下同様。最後に式もメモ。(ダミーはどこに行ったって?最初のCLKの2回分DATA(A)がLOWになっている所がダミー。8回CLKで送ることで、7セグで必要な7つのデータからはみ出して使われない。)

やっぱり最初からこうやって考えたわけでなく、うまくいったから、じゃあ信号はどうなの?って考えてまとめたらこうなっていたというわけ。あとづけ。でも前のもそうだけど、ここに備忘録として残しておけば、次に考える時には、まずこの表から考えてデータを作れるから、1.どの出力ピンがどのLEDを光らせるのか、2.そのLEDは数字のどの部分に当たるのか、3.そして出力ピンはシフトレジスタでどの順番のデータに当たるのか、という風に整理し1、2、3の順で当てはめて考えればいい。まめにメモ取ることは頭の整理になるだけでなく、後から忘れた事を思い出す手助けになるのだから。

【Cプログラム】

main() {
char a[190]={
4,6,4,6,4,6,4,6,4,6,4,6,5,7,5,7,98
4,6,5,7,4,6,5,7,5,7,5,7,4,6,5,7,98
4,6,5,7,4,6,5,7,4,6,5,7,5,7,5,7,98
4,6,4,6,5,7,5,7,4,6,4,6,5,7,5,7,98
4,6,5,7,5,7,5,7,4,6,5,7,5,7,4,6,98
4,6,5,7,5,7,5,7,5,7,5,7,5,7,4,6,98
4,6,5,7,4,6,4,6,4,6,4,6,5,7,5,7,98
4,6,5,7,5,7,5,7,5,7,5,7,5,7,5,7,98
4,6,5,7,5,7,5,7,4,6,5,7,5,7,5,7,98
4,6,5,7,5,7,4,6,5,7,5,7,5,7,5,7,98,99
};
int p;

foqen("pio","a+");
pioset(0);
p=0;
read:
if(a[p] == 98){
wait(3000);
}
else if(a[p] == 99){
p=0;
goto read;
}
pioput(a[p++]);
goto read;
}
wait(t) {
for(;t>0;t--);
}

[PR]
by k1segawa | 2015-03-22 17:14 | ポケコン | Comments(0)

ポケコン PC-G850Vで電子回路工作(3/21)

前回の数字を作り出すデータの仕組みをタイミングチャートを見ながら解説。
a0034780_23501663.png
CLKとデータAだけにした。

ちょっと見づらくなってしまったが、元のフィットホームページ様のタイミングチャートと見比べてほしい。
a0034780_15545886.jpg

①のオレンジの所が元の図でクロックがLowになった時で、それに対応する①の青い所が、データAがHiになっている事を示している。
②の黄色の所が元の図でクロックがHiになった時で、それに対応する②の青い所が、データAがHiになっている事を示している。
③のオレンジ+薄オレンジの所が元の図でクロックがLowになった時で、それに対応する③の青い所が、データAがHiになっている事を示している。

ちょっと戻るが、①が半端な長さだったのが、仮に④の点線のようだったと考えれば、長さは同じになる。
つまり、クロックがLow,Hi,Lowと変化している間に、それに対応するデータAはHi,Hi,Hiになっている。

これはCLKのLow→Hi(立上がり)になる前から、データAをあらかじめHiにしているという事なのか?(①の所)
なぜCLKとデータAがLow,Hi,Lowでぴったり一緒にON/OFFしてはだめなのか?
その方が簡単ジャン?と思うのだが、この立上がりというのは実際はまっすぐ上に立上るのではなくて、ある期間かけてゆっくり坂を上るようにLow→Hiになる(現実は急に0から5Vに上がるのは自然ではないという事)のだ。

【Wikiより】
a0034780_16174694.png
【Wiki終り】

その期間どの時刻にICがクロックをHiにしたと考えるかは、使う側には正確にはわからないのである。
そうするとあらかじめ坂の手前でデータAをHiにしておいて、坂を上り切るまでHiにしておけば、ICは坂を上っている間いつでもデータAを取りに行けることになりICはデータAがHiになった事を検出できるというわけだ。
a0034780_16274659.png


だからデータAをHiと認識させるためには、クロックの立上がりの前後でHiにしてやる必要があるのだ。

【参考:Wikiより】
a0034780_1618661.png
【Wiki終り】

となっており、74HC164(CMOS)では、0-(0.3*Vdd)=0.3*5V=0-1.5VをLow、0.7*5=3.5 3.5-5VをHiとみなしている。

もちろんこのタイミングチャートではデータAがクロックよりちょっと前に変化しているように描いてあるから、立上がりで検出するんだなとわかるのであって、逆にクロックが下がる少し前に変化しているように描いてあれば、立下りで検出するんだなという事になり、それに合わせてデータAを変化させてやらなければならない。

データAがHiと書いてあった上の表現は実はHiではなくLowでもよい。HiかLowのどちらかの値がデータAの値として検出されるのだ(そりゃそうだ)。だからデータAの部分はクロックのように上に凸になっているのではなく四角で書かれている。QAも同じ。(またCLKだけが坂になっているのではなく、データAももちろん坂になっているのだ)

またICはQAピンを、CLKがHiになったタイミングで、データAの値にしている。

これをクロックがHi→Lowになっている間に繰返している。
じゃあ、CLKがLowになった時はどうするのか?何でもいいように思うが、Lowになった時は同じように、次のデータAをHiにする準備としてHiにしておかなければならないのだ。つまり1CLK毎に繰返しているのだ。(またHiと書いてあるがLowでもいい)
これが元の図と違うところだ。
a0034780_1151221.png
それぞれ矢印の間にA,B,Cをずらした形となっている。

つまりクロックがLow→Hiになる際にデータAをHi,Hiのように同じ値にするのだ。

本当はもっと正確にクロックが立上る前後だけデータAをHiにすればいいはずだし、逆に変なところでデータAがHiになっている(たとえばクロックの立下りで)とおかしくなるかもしれないのだ。ICの種類やタイミングがシビアなものの場合は。

でもこの場合は、ポケコンが自分でクロック信号を作っている「同期用クロック」というやつなので、クロックの幅も全然ゆっくりだし、自分で決められるので別にクロックといってもHiとLowで同じ長さになっている必要もない。
で、ICもクロックがHi→Lowになる間にデータAがHiとからLowに変化してしまっていても、うまくいくようだ。
つまり立下り中にデータAが変化しても問題ない。

こんな大雑把な動きでは本当にシビアなタイミングチャートは正しく動かないが、今回はこれでうまく動いている。
この数字を作るデータ列はろくに調べずに実際にやってみてうまくいったに過ぎず、簡易的なものである。だがこれでBASICはうまくいったし、数字を表示する処理には十分だった。

簡易的なのだが、一応理屈は以上のように考えてやっている。

タイミングチャートは、こんな感じで試行錯誤することが多いんじゃないかな。
正解に近い処理はあるかもしれないが、すべて誤差範囲。ハードって100%完璧で動いている訳じゃないのが、最近分かってきたのできっとこういう適材適所?実利優先?みたいな考えでやっているのだろう。

【まとめ】
クロックの立上がりの前後でデータAの値をキープするように信号ピンをON/OFFしてやればよい。
立下りでは特に気にする必要はない。
なので立下り直後~立下り直前までデータAの値をキープすればよい。
[PR]
by k1segawa | 2015-03-21 23:43 | ポケコン | Comments(0)

ポケコン PC-G850Vで電子回路工作(3/16)

もう一度74HC164で7セグ点灯させる回路について、きちんと数字を点灯させる事について考えた。
1.BASIC→C
2.タイミングチャート再検討によるデータの修正
3.タイミングチャート再検討による回路の修正(結局修正不要)

1は数字を表示するのに、AND回路を加えて7個の信号が出力されるのを待ってLEDそれぞれをONにするようにし、ONにしたら次にその数字を書換えるまで保持する回路を追加して完成と考えていたのだが、よく考えたら保持しなくても表示している数字に上書きすればいいんじゃないか?それもBASICなら遅いからCで一瞬で書換えればちらつくかもしれないけど、大丈夫なんじゃ?そこでさらに考えたらわざわざ揃ってからLEDをONにしなくても、早ければ7個の信号を1つずつ送っていても一瞬で点灯するように見えるんじゃないか?という事でCで表示する事にした。
実際WAITを無くしデータ0の消灯を無くし99になったら繰り返すのではなく、無限ループするようにしてみたら予想通りだった。(8を表示)

【Cプログラム】
main() {
char a[25]={7,5,7,5,7,5,7,5,7,5,7,5,7,5,7,5,99};
int p;

foqen("pio","a+");
pioset(0);
p=0;
read:
if(a[p] == 99){
loop:
goto loop;
}
pioput(a[p++]);
goto read;
}
コンパイルも一瞬で、無限ループもONキーでBREAK出来る。(Cなのにw)
CソースだからPC-G850シリーズしか出来ない事になってしまうが、まあZ80系なら頑張ればSDCCでも出来るから(11ピンの繋ぎ替えが面倒だが)良しとする。

2はCソースにしてから数字のパターンデータを作ろうと何回も試したのだが、どうもうまくいかない。単独でLEDの1片をONにする事は出来るのだが、ある場所をOFFにしようとすると全体が消灯してしまっていた。
再度前のタイミングチャートをもう一度精密に考える。BASICでクルクル回るパターンは7,4,6,5,6,5,6,5,6,5,6,5,6,5,99だったのだが、タイミングチャートは点線で示されるクロックの立上がりの少し前からデータAが1になっている。これは正確にいうと7,4の前に5になるべきでは?それに6,5と繰返しているが5という事はデータAを毎回1にしている事になるが、最初の5,7,4でデータAの初期値を1にセットした後はクロックで勝手にシフトしてくれるはず。なら1に毎回する必要はないのでは?という事で6,5は6,4にする。
この確認はBASICで70:DATA 5,7,4,6,4,6,4,6,4,6,4,6,4,6,4,99としてもクルクル回るので確認した。

3はBASICのクルクルでない方のソースで7,5がなんで7ピンしか使ってないのに8回送るのかよくわかっていないので、クルクル(は7回)のソースで1組分6,4を増やしたり減らしたりして実験。増やしてからTRONでトレースONにしてステップ実行すると先頭に戻った所で一回かくっとなり、減らすと先頭に戻った時に2つのLEDが点灯してしまった。タイミングチャートをもう一度見直してたらQA~QGまでを7セグに結線していないのにQHがあるためにもう1シフトさせないと8ビットシフトは完了しない。じゃあ8回シフトすると?最後にQA~QGに出力されるデータはBからH(タイミングチャートの記号で)。あれ?Aは?今の結線だとQA~QGに出てくるデータはBからH。欲しいのはAからG(Hは何でもいい)。AからGが出力されるのはQB~QH。配線を変更しないと取れないデータだ。QA~QGでB~Hで作ってもいいがそれだとAがダミーデータになる。
なんだ、全然出来てなかったな。B~Hでデータを出力するようデータを設定するのか。Aはダミーか。
あと、先頭ダミーを0にするのに、4,6にし、最後立下りは先頭に戻るのでいらない。

8回送った後、最初のLED(a)が点灯するソース
【Cプログラム】
main() {
char a[25]={4,6,5,7,4,6,4,6,4,6,4,6,4,6,4,6,99};
int p;

foqen("pio","a+");
pioset(0);
p=0;
read:
if(a[p] == 99){
loop:
goto loop;
}
pioput(a[p++]);
goto read;
}
元クルクル回るソースは7回しかシフトしていなかったので8回に修正(4,6を追加)。そしてAがダミーなので先頭の4,6がダミー。
データの部分だけ書換えると、数字の7は4,6,5,7,4,6,4,6,4,6,4,6,5,7,5,7,99。最後の4はクロック立下りなので関係なく、その前の4,6がクロック立上がりの前後。あらかじめ4でLOWから6でHIになるので、4の時からデータを1にしてやらないと6の時点では間に合わないので4,6→5,7にする。LED(a)の後なので99を越して後ろの2つのデータを5,7にする。
1:4,6,4,6,4,6,4,6,4,6,4,6,5,7,5,7
2:4,6,5,7,4,6,5,7,5,7,5,7,4,6,5,7
3:4,6,5,7,4,6,5,7,4,6,5,7,5,7,5,7
4:4,6,4,6,5,7,5,7,4,6,4,6,5,7,5,7
5:4,6,5,7,5,7,5,7,4,6,5,7,5,7,4,6
6:4,6,5,7,5,7,5,7,5,7,5,7,5,7,4,6
7:4,6,5,7,4,6,4,6,4,6,4,6,5,7,5,7
8:4,6,5,7,5,7,5,7,5,7,5,7,5,7,5,7
9:4,6,5,7,5,7,5,7,4,6,5,7,5,7,5,7
0:4,6,5,7,5,7,4,6,5,7,5,7,5,7,5,7
となる。
だいぶ綺麗になった。

BASICで一度確認してみた。

【全機種共通BASICプログラム】
10:REM GOTO *MAIN
20 POKE &H100,&H3E,0,&HD3,0,&HC9:GOTO *MAIN
30:*PIO POKE &H101,V,&HD3,Z:CALL &H100:RETURN
40:*MAIN REM POKE &H60,1,0:GOTO *READ
50 Z=&H60:V=1:GOSUB *PIO
60:Z=&H61:V=0:GOSUB *PIO
70:*READ READ A
80:IF A=98 THEN WAIT 30:PRINT
90:IF A=99 THEN RESTORE *RESTORE:GOTO *READ
100:REM POKE &H62,A:GOTO *READ
110:Z=&H62:V=A:GOSUB *PIO
120: GOTO *READ
130:*RESTORE
140:DATA 4,6,4,6,4,6,4,6,4,6,4,6,5,7,5,7,98
150:DATA 4,6,5,7,4,6,5,7,5,7,5,7,4,6,5,7,98
160:DATA 4,6,5,7,4,6,5,7,4,6,5,7,5,7,5,7,98
170:DATA 4,6,4,6,5,7,5,7,4,6,4,6,5,7,5,7,98
180:DATA 4,6,5,7,5,7,5,7,4,6,5,7,5,7,4,6,98
190:DATA 4,6,5,7,5,7,5,7,5,7,5,7,5,7,4,6,98
200:DATA 4,6,5,7,4,6,4,6,4,6,4,6,5,7,5,7,98
210:DATA 4,6,5,7,5,7,5,7,5,7,5,7,5,7,5,7,98
220:DATA 4,6,5,7,5,7,5,7,4,6,5,7,5,7,5,7,98
230:DATA 4,6,5,7,5,7,4,6,5,7,5,7,5,7,5,7,98,99

WAIT文が無くて最速でもこのくらい。ジャンプ先のラベルにBASICの予約語と同じ名前を使えるからちょっと戸惑うか(*READなど)。途中のREM文を外せばPC-E5系、PC-U系でも使える。あと全機種と大風呂敷を広げたが、大丈夫かな。
末尾の98は各文字毎にWAIT 30止まって、99で最初に戻る。LEDの1本1本がシフトして数字を作っていくのが目に見える。Cなら一瞬。

youtube:ポケコン シフトレジスタをBASICで数字表示
a0034780_2310468.png

[PR]
by k1segawa | 2015-03-17 22:44 | ポケコン | Comments(0)

ポケコン PC-G850Vで電子回路工作(初心者の回路図の意味のとらえ方) (3/15)

前回、7セグのLEDがクルクル回る回路を作ってから、追加でそれぞれの信号をAND回路に入れて、もう一方に全てのLEDにデータを送ったタイミングで0/1すると、数字が表示できるな~と考えて、じゃあ次の数字を表示するのに今の数字(信号)を保持しておかないと、毎回消灯しなくてはいけないと思い、今回の信号を記憶する回路「フリップフロップ」に行きついた。(図はNo.1がオリジナルで、図No.2~4の順に途中失敗しながら考えました)

今回は基本のRSフリップフロップを実験。(最初にDフリップフロップをやって挫折した)まずは電池で駆動させてみる。CyberWorkShop Webpage 電脳工作室様 の このページより、回路図を作成。
a0034780_1984643.png
図 回路図No.1~4

No.1の回路がサイト様の正しい回路図です。最初にこれをブレッドボードに組んでスイッチAを押すと上のLEDが、スイッチBを押すと下のLEDが点灯する事を確認した。
(ICチップの14番ピンがVCC(ポケコンで2ピン)で7番ピンがGND(3ピン)という事も回路図では省略されてます。さらに74HC00がないのでICはピン配置が同じだけの代用品)
a0034780_218088.png
No.1の配線

次にポケコンに直すと、スイッチを置き換えればいいのかなと考え、図のNo.2のように配線した(配線図は省略)。BASICでダイレクトに、OUT &H60,1 OUT &H61,0 OUT &H62,1(4ピンを1)と打ってみる。が、上下逆に点灯する。4ピンを1にすると下のLEDがON、5ピンを1(OUT &H62,2)にすると上がONになる。

おかしいな~と思い、ピンの出力が反転してるのかと思い、3ピンと4ピンに抵抗を挟んでLEDを繋いだが、そんな事はなかった。もしかして4ピンは+の電圧を出すのだから図のNo.3(配線図省略)が正しいのかと思ったら、まったく動かない。最初っから両方ON。

んん~?さっぱりわかってない。もう一度サイト様のオリジナルの回路図を見て、回路が間違っていないことを確認してたら、上のボタンがセット(!R)、下のボタンがリセット(!S)と書いてあった。あれ?セットはわかるけどRS-FFで上はリセット、下はセットじゃないのかな、と考えて回路をよく見たら、スイッチを押すとマイナスに繋がる。その時は0だから押すと0?押さないと1?そうか、だから上に抵抗100kΩでプラスに繋がっているのか。
Rが反転されているから、点線で囲った全体として見ればRだが、このスイッチだけ見るとON(1)すると0だから!R(反転を示す)という事なのか~

【正解】
だから点線で囲った部分全体をスイッチとみなして置き換えるNo.4が正しい回路になる。
かつ0になるとONになる負論理なので、0を1にするインバータ(NOT回路)を加えるとサイト様のNo.1と同じ動きになる。ソフトだけで行うなら、OUT &H62,3が信号1,5をクリア、OUT &H62,2が信号1番ピンをセット、OUT &H62,1が信号5番ピンをセットという事になる。
a0034780_218239.png
No.4の配線

【反省】
よくポケコン壊さなかったな~。抵抗が入っているとプルアップとかプルダウンとかいう余り重要でない機能かと思ってたけど、違ったみたい。でも確かにNo.1のようにしないと、プッシュスイッチを押した時に確実に0/1にならないな(プラス側にプッシュスイッチを繋ぐようにすれば?と考えたけど、それだと押した時にマイナス(GND)の方が抵抗が0だからそっちに流れる。ああ抵抗もマイナスの方へ移動すればいいのか。でもどのくらいの抵抗?)。切り替えスイッチで+と―を切り替えればいいのかもしれないけど、それだとまずいのかな?そうしたら、プッシュスイッチだけ置き換えようとは思わなかっただろう。でもきっとこう書くのが定石なのだろうし、RをON/OFFという意味を切り替えスイッチではうまく表現できないし。点線部分全体で信号ON/OFFか、メモメモ。

【独り言・・・】
基本(回路図の意味)がわかってないと回路図ひとつポケコンに繋げないな(今回は失敗を繰り返さない意味も含めて、電子工作の初心者がどういう風に考えているか、順を追って記録しておく)。省略されている記述も多いし、お約束事もあるし、初心者がハマるはずだ。ソフトでも16進数や関数が何者であるか仕様書にはわざわざ書かないからそのレベルなんだろう。でも16進数や関数は入門書にはちゃんと章立てして書いてあるが、省略する事やこういうお約束事?定石?は本には書いてない。最近の学問だからソフトはきっちりしていてプログラマーをたくさん作れるけど、ハードは経験とか一子相伝のワザとかで、体系的に育てられないからな~。
ソフトは性能向上の恩恵を受けて、基本的な事はツールや高機能化・抽象化で、どんどん新しい物を習得してその応用で作っていく事が大事になり、基本はわからなくてもツールや言語の使い方をたくさん覚えるのが役に立つ早道になるが、ハードは新しい製品を作ったり、新しい部品を使ったりするためには、なおさら基礎が大事と言われる。基礎から離れられないのがハードかもしれない。そういう違いがあるようだ。
[PR]
by k1segawa | 2015-03-15 19:38 | ポケコン | Comments(0)

ポケコン PC-G850Vで電子回路工作 (3/13)

一旦ハードの工作は簡単な方へ戻って、前回入手したジャンク7セグLEDがちゃんと使えるか確認。ついでに数字を作ってみる。

【繋ぎ方】
ポケコン3~10番ピン(青い文字)で直接パラレル接続する。3番ピンはGND。抵抗は1KΩ。煩雑に描いてあるけど、単に抵抗を入れて繋いだだけ。赤い四角の所が、裏返しになった7セグのピンの刺さる所。(3と4が未結線)
a0034780_17553477.jpg
そして数字を作ってみる。Google Sheetで。
a0034780_1932065.jpg
【左の絵】
ポケコンの4番ピンが、7セグの右上のLEDに繋がっている事を示す

62H番地のポートに書込んだ数値のビット0が、4番ピンに相当する事から、

【右の絵】
ビット0が1になる数値だった場合、そこのLEDがONになるという事を示す

丁寧に書くとこういう感じ。そしてシートのような計算をして、数字のデータを作っているのだ。LEDやポケコンのピンが変われば値も変わるけど計算方法は同じ。ビットの考え方とか、一回こういうのをやって自分メモとして残しておけば応用が利く。まあ面倒だと感じるか、自由にコントロールできると考えるかは人による。(1ケタの7セグでルーレットのようにクルクル回す事もできるわけだし)

もしかして電子回路も、丁寧に電圧や抵抗値を計算すれば基本の法則でわかるはずなのかな。(→自分)

【BASICプログラム】
PC-E2系、PC-8系のZ80 CPUで共通に動くようにINP/OUT命令もパラレルコマンドも使わない。PC-E5系はREMをはずせばそのままで動くようにした。
2:REM GOTO *MAIN
3:'マシン語書込み
4:POKE &H100,&H3E,0,&HD3,0,&HC9:GOTO *MAIN
8:'マシン語サブルーチン
9:*PIO POKE &H101,V,&HD3,Z:CALL &H100:RETURN
10:*MAIN REM POKE &H60,1,0:GOTO *LOOP
15:Z=&H60:V=1:GOSUB *PIO:Z=&H61:V=0:GOSUB *PIO
20:*LOOP READ A
30:IF A=99 THEN RESTORE 70:GOTO *LOOP
40:REM POKE &H62,A:GOTO *SLEEP
45:Z=&H62:V=A:GOSUB *PIO
50:*SLEEP WAIT 60:PRINT
60:GOTO *LOOP
70:DATA 3,109,103,83,118,126,35,127,119,63,0,99

マシン語は以前のページのままで、E5系のPOKE文もそのまま。3,8行目はポケコンでは漢字は入らないし、打ち込む必要はない。Z80系のマシン語領域確保の手順も以前のページと同じ。*はラベルですが、使えない機種もあるのかな?その場合はPIOは9、MAINは10、LOOPは20、SLEEPは50にしてください。あとパラレルなのでポケコンの電池を食うので、実行しない時は3番ピン(GND)を抜いておくと節約になります。(ポケコンをOFFにしても常時流れているので使わない時も)+5の行がE5系になります。
動画は1,2,3,...とカウントアップし最後0になって一回消灯、を繰り返します。

Youtube:ポケコンLED表示
a0034780_19125810.jpg

あとブラウザはWindows8.1のgoogle chromeで確認しています。

ついでにこのプログラムを利用して、数字を好きな順に表示する処理を追加しておきます。

【追加プログラム(続けて打ち込む)】
100:RESTORE 70:ERASE B:DIM B(10)
110:FOR C=1 TO 10
120:READ A:B(C MOD 10)=A
130:NEXT
140:INPUT D$
150:FOR C=1 TO LEN(D$)
160:Y=ASC(MID$(D$,C,1))
162:H=Y-48:V=B(H)
170:REM POKE &H62,V:GOTO 180
175:Z=&H62:GOSUB *PIO
180:WAIT 20:PRINT
190:NEXT
200:GOTO 140

【実行】
最初にRUNで実行し、適当なタイミングでONキーでBREAKします。エラーをCLSキーで消して続けてGOTO 100と打ち、実行します。
?が表示されるので987654などと入力し、RETURNキーを押すと、数字がその順に表示され、入力待ちに戻ります。

【解説】
BREAK後にGOTO 100する事によって、マシン語書込みとパラレルポートの準備が実行されたままになります。
RESTORE命令は70行目のDATA文を先頭から読むよう設定するためです。
ERASE命令はGOTOだとDIMが再宣言になるので1度クリアするためです。
MODは余りを求める関数で、INPUTはこのBASICの制限で最大7文字です。
DIM命令は0から10までの11個確保されます。

WAIT時間はG850Vの時間ですので調整が必要です。170行目はE5系用の命令です。REMを外せば動くはず。またGOTOではなく前の部分を改造すればRUNで動くようにも出来ます。

【結論】
今回は汎用ロジックICを制御する前に、やっておくべきソフト屋さん側の7セグ制御処理(パラレルの場合)を書いた事になるのかな。
シリアルで送るのならビット列は数字123と表示する場合、シートのビットの総和の所を見て1100000,10110110,1110110(先頭ビットから送る)になるという事。
プログラムはその確認のため。追加プログラムはちょっと凝ってみた感じ?いやいや~キャラクタ表示時のサブルーチン処理でしょうね。
[PR]
by k1segawa | 2015-03-13 19:05 | ポケコン | Comments(0)

ポケコン PC-G850Vで電子回路工作(3/12)

よく探したらPC-E2系とPC-G8系はどうかわからないけどPC-G85系は、OUT命令とINP命令があるのね。
なら簡単です。OUT &H60,1 OUT &H61,0 OUT &H62,Aでマシン語、サブルーチンも必要ない。
パラレルコマンドがいらないくらい簡単。
これだけだと短いので一つ。
どこかでVSだと、8MHzで動かすのが、OUT &H67,1(デフォルトは0?)と書いてあったが、このプログラムでは逆に遅くなった。なぜ?
もう一つ。IPLとFLAGとSHELLがROMにあると書いてあるサイトがあったけど、G系でもデバイスドライバが使えるの?なんかチップドライバⅢという11ピンに繋げる拡張メモリボードを作れば利用価値があるように思えた。

昨日は千石のジャンク7セグのピン配置を調べてた。
LSD10014と書いてある。
a0034780_2134024.png

雑すぎる。
[PR]
by k1segawa | 2015-03-12 21:35 | ポケコン | Comments(0)

ポケコン PC-G850V(E200,G800のZ80系ポケコン)で電子回路工作 (3/8)

BASICにパラレルポートコマンド(OPEN"PIO:",PIOSET,PIOPUT)が無いZ80系ポケコンの事を考えて、11ピンを直接I/Oアクセスするように変更。PEEK、POKEではメモリしか触れずI/Oには届かないので、OUT命令を持つZ80マシン語で簡単なユーザ関数を作る。POKE COM様のZ80命令一覧より、

【Z80系ポケコン共通マシン語プログラム】
LD A,n          ・・・・・・  3E n            7     2    A←n
OUT (n),A ・・・・・・ D3 n 11 2 (n)←A
RET ・・・・・・ C9 10 1 PC←(SP)+
【SC62015/61860(ESR-L/H)系ポケコンの場合】
たった5バイトなので、シャープ独自のCPU E500系にも簡単に直せるはず、と思ったらメモリマップドI/Oなのかな?(魔法使いの森様青木充さんの「ポケコン裏技大辞典」より)。だったらPOKEで直接書き換えられるのか。だから元々0ページにI/Oがあるのね。
11ピンのI/Oのアドレスは、秋日和様の「ぽけこんのほん1」によると全機種共通らしいので、マシン語プログラムさえ合わせれば動く、っていうかPOKE文で済む。

【I/Oマップ】
60H・・・11ピンをパラレルポートとして準備(=1:シリアルは2)
61H・・・ピンの入出力を決める(オール出力=0)
62H・・・ピンへの出力データ(ピン4,5,6,..の順でビット0,1,2...)

【BASIC+Z80マシン語プログラム】
1:' マシン語書込み
2:POKE &H100,&H3E,0,&HD3,0,&HC9:GOTO 10
4:' マシン語サブルーチン
5:*PIO POKE &H101,V,&HD3,Z:CALL &H100:RETURN
6:' メイン
10:’ OPEN "PIO:":PIOSET 0
15:Z=&H60:V=1:GOSUB *PIO:Z=&H61:V=0:GOSUB *PIO
20:READ A
30:IF A=99 THEN RESTORE 70:GOTO 20
40:’ PIOPUT A
45:Z=&H62:V=A:GOSUB*PIO
50:WAIT 3:PRINT
60:GOTO 20
70:DATA 7,5,7,5,7,5,7,5,7,5,7,5,7,5,7,5,0,99

【マシン語領域確保】
方法は手動だが、各ポケコンごとに違うのかな?
G850Vでは以下の通り。
*MON
*USER01FF
(100H-1FFH確保)

デフォルトなのでいらないかもしれない。間違えないように打込めばRUNで実行。

【解説】
2:マシン語を100Hから5バイト書込み。
5:サブルーチンPIO。ポート番号と値をメモリに書込み(命令の自己書換え)して、マシン語コール。
10:元のBASIC文(REMなので特にいらないがGOTOで飛んでくるので)
15:OUT 60H,1とOUT 61H,0になるよう値を設定。サブルーチン呼出し。
20:READ文
30:99なら再読み込み
40:元のBASIC文
45:OUT 62H,Aになるよう値を設定。サブルーチン呼出し。
(以下同じ)

【もうちょっと詳しく】
2は、LD A,n:アキュムレータAという計算用レジスタに値nをロード(代入)。OUT (n),A:nで示されるI/OアドレスにAの値を書込む。RET:BASICというか呼出し元に戻る。
5は、マシン語の呼出しサブルーチン。(Zがアドレス、Vが値。POKE文1個で済ますよう&HD3は冗長です)
10以降は+5した行がBASICとマシン語の対応となっている。
前のプログラムに2,5,15,45を追加して10,40がREMになっただけで全く同じ。
REM文と入替えてもそのままで動くようにした。

WAIT行を削除しても、本体がBASICなので早くはならないけど、これでE200やG800系の人も同じソースで実行できる。アキュムレータAはBASICレベルで保証しないと動かないほどアレでないので、PUSHもいらないみたい。
E500系のマシン語を作ってBASICで書き換える部分(5行目)を調整すればE500系でも共通になるかな、と思ったらメモリマップドI/Oなら直接書き換えればいいのか。2、5は要らず、15:POKE &H60,1,0 45:POKE &H62,Aで良さそう。(PC-14系やUI-6系もE5系)

【以下メモ・・・(従来インターフェースとの差)】
ここまで考えてやるなら、BASICのPRINT#でSIO出力を使ってその代りピンアサインは固定でやってもいいかもしれないが、通信パラメータを決めとかないと文字化けしてしまうし、設定によってはDR、CTSのピンに何らかの結線で信号を回してやらないといけないから、前提が増えてしまう?それにMAX 入力=3、出力=3。G850になってパラレルコマンドがサポートされ、BASICからでも8ピン使えるが、PRINT#やプリンタ出力にLLPRINTとかにすればE200やE500、G8系でも共通だからね。入出力も3口あればシリアル―パラレル変換ICかませばいい。マシン語で速度が必要になった時シリアルの速度がネックになったかもしれないが、ポケコンでそこまでシビアなタイミングを要求せず、マイコンやコントローラにやらせていたのでしょう。解析が進みパラレルポートとしてアクセスするとE5系はPOKE文一つでI/Oアクセス出来そうだが、Z80系はマシン語が必要だし、何よりCPU毎に変更が必要。ハード屋さんならソフトをシンプルにし、ソフト屋さんならハードの見通しをすっきりさせたいと思う。ハード屋さんはインターフェースをシリアルで使って制限はハードで工夫し、ソフト屋さんはパラレルを直接出せた方が簡単と思ってしまうのかも。もちろんハード勉強中なのでシリパラで行きますが。
[PR]
by k1segawa | 2015-03-08 15:26 | ポケコン | Comments(0)

ポケコン PC-G850V で 電子回路工作 (3/7)

ブレッドボードで作っているので、そのイメージもアップしてみる。
fritzingで作成。
a0034780_17111078.jpg

(6/8訂正:7セグへの抵抗の結線が間違っていた。赤矢印の所)
回路図と比べるとやっぱり煩雑。もっと良いつなぎ方があるか試行錯誤したが実際とできるだけ同じにする方針に落ち着く。
fritzingはこの結線を元に自動で基板を起こす事もでき、実物を残すときは便利かも。ブレッドボードは便利だけど、再現する時に困るのでこうやってイメージを残すしかないがこれを作る手間もバカにならない。いや回路図さえあればその通り繋げばいいのだけれど。
汎用ロジックICと7セグは適当なのがなかったのでピン配置だけ同じものを代用。実際は74HC164、7セグはカソードコモンで以下のような配線。a0034780_18471658.jpga0034780_1851442.jpg
[PR]
by k1segawa | 2015-03-07 18:53 | ポケコン | Comments(0)