人気ブログランキング | 話題のタグを見る

ポケコン 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で数字表示
 ポケコン PC-G850Vで電子回路工作(3/16)_a0034780_2310468.png

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