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 件のコメント:
コメントを投稿
.