since 2007.8 by K-ichi


動作確認用回路
中華通販ではエレキものが安い。数が出る汎用品はその傾向が強いようで、ロジックICのHC595あたりは特に安い。
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 件のコメント:

コメントを投稿

.

関連記事


この記事へのリンク by 関連記事、被リンク記事をリストアップする」記事

ブログ アーカイブ