フォト
無料ブログはココログ

« CDP1802 | トップページ | 類人猿分類公式マニュアル2.0 <人間関係に必要な知恵はすべて類人猿に学んだ> »

2015年10月13日 (火)

IchigoJam(6) <4桁時計ダイナミック表示>

IchigoJamで4桁時計を作った。( IchigoJam(5) (2015/9/24))

 スタティック表示だから、大した苦労もなく作れた。使った表示器はHDSP0760(Latch+Decoder+Driver+LED)という表示器で一般的ではない。

 普通の7セグLEDを使って、ダイナミック表示でもできるのではと思い立ったので早速作ってみた。

 4511(BCD-to-Seven Segment Latch/Decoder/Driver)と74HC139(2-4Decoder)の組み合わせはわかりやすい。

Ichigoclockd

 IchigoJamのOUT1~OUT7(LED)でLEDのa~gを駆動すると 4511(7SegDecoder)は 省略できそうだ。

Ichigoclockd2

 桁ドライブには74HC4017(JohnsonCounter)を使う。

 74HC4017(JohnsonCounter)はカウントパルスが入力されると、順番にQ0~Qnに"H"が出力される。上の回路では、Q4をRESETに繋いであるので、Q0→Q1→Q2→Q3→Q0→Q1・・・のように循環して出力される。 "H"が出力された桁に、OUT1~OUT7に数字のパターンを出力すると4桁表示できる。

 74HC4017のデータシートによると出力電流は25mAなので、コモン側のドライバを省略してみる。CD4017は出力電流が取れないのでドライブ用のトランジスタが必要だ。(点線の中の図)

 a~gまでの全てのセグメントが点灯した場合は、それぞれのセグメントに25mA/7≒3.6mA流れることになる。最近のLEDは3.6mAも流すと室内では十分な明るさで光る。 しかし、それはスタティック表示の場合だ。

 4桁のダイナミック表示なので、点灯している時間は全体の1/4だから、平均電流は3.6mA/4=0.9mAだ。さすがに0.9mAは少ないなあ。でも、トランジスタのドラバを入れると部品が増えるしなあ...まあやってみよう。

 IchigoJamの出力はOUT1~OUT7で、これをLEDのa~gに使うと、74HC4017のカウントパルスに使える出力がないので、D1,D2,R8でORを構成してカウントパルスを作る。

 OUT2,OUT3は7セグLEDの"b","c"に繋がっている。この7セグLEDはアノードコモンだからOUT1~OUT7(LED)に出力するパターンは

: gfedcba
0 : 1 0 0 0 0 0 0 : #40
1 : 1 1 1 1 0 0 1 : #79
2 : 0 1 0 0 1 0 0 : #24
3 : 0 1 1 0 0 0 1 : #30
4 : 0 0 1 1 0 0 1 : #19
5 : 0 0 1 0 0 1 0 : #12
6 : 0 0 0 0 0 1 0 : #02
7 : 1 1 1 1 0 0 0 : #78
8 : 0 0 0 0 0 0 0 : #00
9 : 0 0 1 0 0 0 0 : #10

"b","c"をよく見ると、"0"~"9"のどのパターンを表示したときでも、"b","c"どちらかが"0"である。そして、"b"はD1、"c"はD2を経由してHC4017の13ピンに繋がっているので、表示中は、HC4017の13ピン CKE は"L"になる。

 隣の桁を表示する前に、一旦、OUT1~OUT7を全て"H"(OUT #FF )にすると、HC4017の CKE は"H"になる。

 そして、次の桁の数字を表示したときに再び"L"に戻るので、カウンターが進みLEDの次の桁に"H"が供給され、同時にOUT1~OUT7(a~g)に数字のパターンが出力されているので、無事次の桁に数字が表示される。

 つまり、次の桁の数字を表示する前に、OUT #FF を実行すればよい。(170行)

プログラムは↓こんな感じ。

1 'IchigoJam 4Digit clock / dynamic lighting
2 'Aug. 2015 / Yoshi
3 GOSUB 700

100 'Main loop
100 T=TICK(): IF BTN()=1 GOSUB 600 ELSE B=0
110 IF R=1 AND V<T GOTO 170
120 IF T<N GOTO 170
130  N=(N+D)&#7FFF: IF N<T THEN R=1 ELSE R=0
140  GOSUB 800: M=M+1: IF M<60 GOTO 160
150  M=0: H=H+1: IF 24<=H THEN H=0
160  [0]=[10+H/10]: [1]=[10+H%10]: [2]=[10+M/10]: [3]=[10+M%10]
170 I=I+1: OUT F: OUT [I&3]
190 IF X=1 GOSUB 1000
200 GOTO 100

600 'Button push
600 IF B=0 THEN B=T
610 IF E+B<T THEN END
620 IF T<B+K GOTO 640
630  D=J: N=TICK(): GOTO 680
640 IF D<>J GOTO 660
650  D=V: N=TICK()+D: GOTO 680
660 IF T<>B+J GOTO 680
670  D=V: N=TICK():
680 RETURN

700 'Initialize
700 [10]=#40: [11]=#79: [12]=#24: [13]=#30: [14]=#19
710 [15]=#12: [16]=#02: [17]=#78: [18]=#00: [19]=#10
730 V=3610: ' X=0
740 J=40: K=J*5: E=J*25
750 Z=0: F=#FF: R=0: D=V: N=D
760 H=23: M=50: [0]=[12]: [1]=[13]: [2]=[15]: [3]=[10]
770 VIDEO 0: CLT

800 'Align Digit
800 FOR I=0 TO 3
810  OUT F: OUT 0: IF IN(1)=1 THEN I=3
820 NEXT
830 RETURN

1000 'Send serial
1000 ? CHR$(13); H/10; H%10; ":"; M/10; M%10;
1010 RETURN

時計をダイナミック表示するプログラムは、メインルーチンで、

  • 時間の計測
  • 時刻のカウントアップ(分は60進数、時は24/12進数)
  • ボタンの取得
  • 時刻あわせ処理

を行い。表示には割り込みを使うと、メインルーチンの処理が重くなってもチラつかない。

 IchigoJam BASICは割り込みが使えないので、全てメインルーチンで処理しなくてはならない。時刻のカウントアップは処理が増えるのでチラつくが、60秒に1回しか実行しないので気にならないだろう。また、ボタンを押すと、時刻あわせ処理が実行されるのでループ1回の処理時間が長くなりチラつく。 常時ボタンを押しているわけではないので良しとしよう。

 こんな感じ↓
Ichigoclockdynamic

↑リンク先にAVI (http://yoshi-s.cocolog-nifty.com/cpu/files/IchigoClockDynamic.avi)

 BASICは遅いという先入観があって、本当にダイナミック表示できるのだろうかと思っていたが、それほどチラつきもなくできてしまった。CortexM0 48MHzだから当然か?

 8x8マトリクスLEDもIchigoJamだけで表示できそうな気がしてきたが、出力ポートが足りない。

 OUT 8、OUT 9で入力ポートが出力ポートになればいいのになあ。

と書いたら、Ver1.1 beta 6でIN 1~IN 4がOUT 8~OUT 11に割り当て可能になったようだ。


« CDP1802 | トップページ | 類人猿分類公式マニュアル2.0 <人間関係に必要な知恵はすべて類人猿に学んだ> »

CPUボード」カテゴリの記事

IchigoJam」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/577514/62450590

この記事へのトラックバック一覧です: IchigoJam(6) <4桁時計ダイナミック表示>:

« CDP1802 | トップページ | 類人猿分類公式マニュアル2.0 <人間関係に必要な知恵はすべて類人猿に学んだ> »