Aliで10個50円前後、eBayでも80円前後からある。もちろん送料込。アマゾンでは、ぐっと上がって@30円ぐらい。
シリアル-パラレル変換ICなので、ちょっとポート本数を稼ぎたい用途に数が出るのだろう……などと良心的解釈をしていたのだが、「全数不良品だった、偽物かも」という声も聞く。
心配になったので、カソードコモンの7セグメントLED(7セグ、7SEG)を点灯させ、動作を確認してみた。
コントロールの主体は、いつものPIC12F675。これに74HC595を接続し、その先にLEDをつなげる。テスト基板は、ナイトライダーのを流用した。
LEDはパラ接続になっているので、教科書的には正しくない。現実世界ではワンパッケージに入っているLEDたちは特性が似ているはずなので、まとめてしまって抵抗1本でやっつけた。
電流は分流されるため、表示パターンによって明るさが変わってしまう。輝度調整はソフト側で行うこととした。
PICを動かすプログラムは、末尾に添付する。MPLAB X上でMPASMでアセンブル、PICkit3で書き込んだ。
ICSPではないので、PICkit3側から電源供給をする。その際、電源電圧は4.75V程度にしておく。
プログラムの大まかな流れとしては……
・表示パターンを約10ms間点灯させ、その中で明るさ調整も行う。
・上記を50回繰り返し、約0.5s表示させる。
・次のパターンに移行して最初に戻る。最終パターンを終えたなら初期パターンで最初に戻る。
……という無限ループになる。
抵抗1本で全部のLEDを担うため、LEDたち全体で3mA程度消費、とみなせる。これでも十分明るい。
LEDの明るさは、電流と点灯時間におおむね比例するので、分流されて減った分は点灯時間を延ばして補償する。ドット1点のときに対し、全点灯時には8倍長く点けている。
時間待ちループなどは、クロックレベルで見ると正確ではないが、実用上差し支えないので誤差の範囲とする。
以下に映像を貼っておく。
1000fpsでの撮影は、CASIO High-Speed EXILIM EX-10による。とっくに廃盤で、もはや法外な値段でしか手に入らないのがつらい。
1000fps映像では、チカチカと点灯時間調整をしている様子が見て取れる。
とりあえず10個購入中3個で確認し、問題なく動作した。このICはeBayで購入したものになる。
74HC595の動作チェック
PIC12F675に使ったプログラムは以下の通り。
全機能使うように、ちょっと余計な分岐も含まれる。
HC595のQA~QHは、LEDを実際にドライブする。一部消えるなど表示がおかしければここを疑う。
SI、SCK、RCKはパターン転送に使われる。正常な文字表示にならなければ、これらが正常でないことになる。
SCLR、RCKは、全消灯時のパターン設定に使われる。全消灯ができなければ、これらがおかしい。
Gは輝度調整に使われる。どんなパターンを表示しても明るさが一定になるように調整しているので、そうならなければここがおかしい。
QH'はQHと同じ内容が出力される。ただし、RCKやGに影響されない。QH(ドット)が点かないパターンのときは、シリアル転送時に押し出されたデータで微妙に光る。QHが点くパターンのときは、ほぼ常時点灯している。
;HC595_test.asm
;2019 K-ichi
#include p12f675.inc
radix dec
#define config_data1 _CPD_OFF&_CP_OFF&_BODEN_ON&_MCLRE_OFF
#define config_data2 _PWRTE_OFF&_WDT_OFF&_INTRC_OSC_NOCLKOUT
__config config_data1 & config_data2
Table equ 0x20
wCnt equ 0x5a
dsp10msTmp equ 0x5b
dsp10msCnt equ 0x5c
dsp10msBitCnt2 equ dsp10msCnt
dsp10msBitCnt equ 0x5d
mainCnt equ 0x5e
dspNum equ 0x5f
SI equ GP0
RCK equ GP1
SCK equ GP2
nSCLR equ GP4
nG equ GP5
org 0
goto start
nop
nop
nop
; org 4
nop
start
clrf INTCON ;all interrupt disable
movlw b'100000'
movwf GPIO ;LED init.
bsf STATUS,RP0
call h'3ff'
movwf OSCCAL ;OSC calibration
clrf ANSEL ;all digital
clrf TRISIO ;all output
bcf STATUS,RP0
movlw b'00000111'
movwf CMCON ;comparator off
; bsf GPIO,nG ;LED off
; nop
; bcf GPIO,nSCLR
; nop
bsf GPIO,RCK
nop
bcf GPIO,RCK ;LED init.
nop
bsf GPIO,nSCLR
ldt macro p,d
movlw d
movwf Table+p
endm
ldt 0,0x3f
ldt 1,0x06
ldt 2,0x5b
ldt 3,0x4f
ldt 4,0x66
ldt 5,0x6d
ldt 6,0x7d
ldt 7,0x27
ldt 8,0x7f
ldt 9,0x6f
ldt 10,0x77
ldt 11,0x7c
ldt 12,0x58
ldt 13,0x5e
ldt 14,0x79
ldt 15,0x71
ldt 16,0x80
ldt 17,0x00 ;all OFF
ldt 18,0xff ;all ON
ldt 19,0x00
main
clrf dspNum
main2 ;20types LED display
movlw 50
movwf mainCnt
mainLoop ;10ms*50times, brightness controlled display
movf dspNum,w
call dsp10ms
decfsz mainCnt,f
goto mainLoop
incf dspNum,f
movf dspNum,w
addlw -20
btfss STATUS,Z
goto main2
goto main
dsp10msAllOff ;use nSCLR when LED all OFF
bcf GPIO,nSCLR
clrf dsp10msBitCnt
bsf GPIO,nSCLR
goto dsp10msDsp
dsp10ms
addlw Table
movwf FSR
movf INDF,w
btfsc STATUS,Z
goto dsp10msAllOff
movwf dsp10msTmp ;use SI and SCK
movlw 8
movwf dsp10msCnt
clrf dsp10msBitCnt ;b'1' counter
dsp10msLoop
rlf dsp10msTmp,f
btfss STATUS,C
goto dsp10msClr
incf dsp10msBitCnt,f
bsf GPIO,SI
goto dsp10msClr+2
dsp10msClr
bcf GPIO,SI
nop
bsf GPIO,SCK
nop
bcf GPIO,SCK
decfsz dsp10msCnt,f
goto dsp10msLoop
dsp10msDsp
movf dsp10msBitCnt,w
sublw 9
movwf dsp10msBitCnt2 ;=(8-dsp10msBitCnt)+1 --> OFF time+1
incf dsp10msBitCnt,f ;=( dsp10msBitCnt)+1 --> ON time+1
bsf GPIO,RCK ;use RCK
nop
bcf GPIO,RCK
nop
bcf GPIO,nG ;use nG, brightness controll
goto dsp10msOnLoop+1
dsp10msOnLoop
call wait
decfsz dsp10msBitCnt,f
goto dsp10msOnLoop
bsf GPIO,nG
goto dsp10msOffLoop+1
dsp10msOffLoop
call wait
decfsz dsp10msBitCnt2,f
goto dsp10msOffLoop
return
wait ;wait about 1.3ms
clrf wCnt
wLoop
goto $+1
decfsz wCnt,f
goto wLoop
return
end
0 件のコメント:
コメントを投稿
.