PIC 16F88のIOピン9本を使って7セグ LED9桁を表示する

まずは回路図
9桁表示してもIOピンがまだ7本も余っています。



旋盤で作る天体機材の
PIC・AVR 入門 掲示板の中でノンノさんが発言されたのに刺激を受けてゴールデンウィークに数日悩んで実験して見ました。
NKさん が解説されています。
IOIOさんのHPで追試 されてCとAVRで動きまし た。
私はPIC 16F88 で実験して見ました。


CNCで基板作成




秋月の10個100円のアノードコモンLEDを使いました。


部品は何もありません



悩むこと数日
やっと表示できました。
電流制限抵抗680オームですが電流20mA流れていません。300オーム位の方が良いかも!!
少々暗いです。
アセンブラーのリストは後日UPします。
とりあえず動いた報告です。

08/05/07
追記
シンクロで電流測定したところ各セグメント点灯時4mA流れています。平均では少なくなりますのでもう少し電流流せます。
470オーム位がベストか!!
だだし8を表示しDPも点灯させると4*8=32mA 25mAの規格オーバーします。消灯している時間もあるのでokだと思います。
フローラインから32mA流れ出て他のPORTから32mA流れ込みこの場合の総電流は+するのか相殺するのか?良くわかりません
最終的には各桁にTRを入れて電流upの必要を感じます。


配列変数(間接アドレッシング)
ユーザーが意識してRAMをいじる必要があります。
FSRにアドレスSETするとINDFに間接的にRAMの内容が出てきます。
    movlw    20H            ;RAMの先頭アドレス
    addwf    K_POS,W     ;K_POS分だけポインタを進める
    movwf    FSR           ;アドレスをセット
    movf    INDF,W         ;FSR番地からDATA取得
こんな感じで擬似的に配列操作できます。

繰返処理(FOR文)
    movlw    5H          ;回数SET        
    movwf    COUNT    
LOOP
  処理
    DECFSZ  COUNT、F     
    goto     LOOP

今回のSOTFで悩んだこと
 当初 (PORTBの0ビットを1にする)
    KPOS   EQU   30H
    MOVLW   0H
    MOVWF   KPOS
    BSF   PORTB,KPOS
実行するとerrです。このような使い方は誤りです。
 BSF   PORTB,0 では無く BSF   PORTB,30H  が実行されてしまいます。中身ではなく定義値がセットされます。
 仕方なくBITセットには IORWF を使いました。
 フロービットの確認には ANDWF を使って他のビットをマスクして確認しました。

08/05/15
PIC 16F88 を使用した 9ピンで9桁表示  アノードコモン7セグLED用 08/05/06
       list      p=16F88  
        #include <p16F88.inc>
   __CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _WDT_OFF & _INTRC_IO & _PWRTE_ON   
   __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
  DI0        EQU    20H    ;9桁7seg データ
  DI1        EQU    21H
  DI2        EQU    22H
  DI3        EQU    23H
  DI4        EQU    24H
  DI5        EQU    25H
  DI6        EQU    26H
  DI7        EQU    27H
  DI8    EQU    28H
  S_DAT     EQU    29H
  K_POS    EQU    2AH    ;桁位置
  K_BP    EQU    2BH
  TW    EQU    2CH
  FL    EQU    0H    ;floating line PORTA,0

       org    0
        goto    start
        org    4
    goto    start
TABLE  ;K_POS値をPCLに+しでJMP,データを持ってretする
     ANDLW    B'00001111'    ;下位4ビット
    ADDWF     PCL,F
     RETLW     b'00111111'     ;0    3F    C0
     RETLW     b'00000110'    ;1    06
     RETLW     b'01011011'    ;2    5A
     RETLW     b'01001111'    ;3    4F     A
     RETLW     b'01100110'    ;4    66    F B
     RETLW     b'01101101'    ;5    6D     G
     RETLW     b'01111101'    ;6    7D    E C
      RETLW     b'00000111'    ;7    07     D
     RETLW     b'01111111'    ;8    7F
     RETLW     b'01101111'    ;9    6F    90
    RETLW    B'01110111'    ;Code A
    RETLW    B'01111100'    ;Code b
    RETLW    B'00111001'    ;Code C
    RETLW    B'01011110'    ;Code d
    RETLW    B'01111001'    ;Code E
    RETLW    B'01110001'    ;Code F
start    goto init_
init_       
    movlw    D'2'    ;TEST 0-9まで試験表示
    movwf    DI0
    movlw    D'3'
    movwf    DI1
    movlw    D'4'
    movwf    DI2
    movlw    D'5'
    movwf    DI3
    movlw    D'6'
    movwf    DI4
    movlw    D'7'
    movwf    DI5
    movlw    D'8'
    movwf    DI6
    movlw    D'9'
    movwf    DI7
    movlw    D'0'
    movwf    DI8
    bsf    STATUS,RP0    ;BANK1
    MOVLW    b'01110000'    ;内蔵クロック 8MHz
    MOVWF    OSCCON   
    clrf    ANSEL        ;デジタル   
    movlw    b'00000111'    ;コンパレーターoff
    movwf    CMCON
    MOVLW    b'11111111'    ;初期設定入力 all in
    MOVWF    TRISA   
    MOVWF    TRISB
    BCF    STATUS,RP0    ;BANK0
    MOVLW    b'00000001'    ;0桁目の位置
    MOVWF    K_BP
    CLRF    K_POS
WAIT   
    MOVLW    0FFh
    MOVWF    TW   
    DECFSZ    TW,F        ;TW-1
    GOTO    $-1
LEDof                ;規定値 全IN 全消灯
    CLRF    PORTB
    bsf    STATUS,RP0    ;BANK1
    movlw    b'11111111'    ;1=inMODE  LEDoff
    movwf    TRISB
    bsf    TRISA,FL    ;RA0 1=INにする LEDoff
    BCF    STATUS,RP0    ;BANK0
    MOVF    K_POS,W

KETA    SUBLW    D'8'        ;8桁目か
    BTFSC    STATUS,Z
    GOTO    K_8        ;8桁目のみfloat lineを使わない別処理
K_ETC
    movlw    20H        ;DATAの先頭アドレス
    addwf    K_POS,W        ;K_POS分だけポインタを進める
    movwf    FSR        ;アドレスをセット
    movf    INDF,W        ;FSR番地から表示DATA取得
     CALL       TABLE        ;7SEG DATA に変換
    MOVWF    S_DAT        ;7SEG DATA 保管
    MOVF    K_BP,W        ;float lineの位置
    ANDWF    S_DAT,W        ;フロービット確認
    BTFSS    STATUS,Z    ;必要ならfloat lineをLowにする
    GOTO    PASET        ;発光
OUT_SEG   
    MOVF    K_BP,W        ;
    IORWF    PORTB,F        ;発光桁をon アノード側をHiに
    IORWF    S_DAT,F        ;発光桁をon Hiにするポートを出力に設定する
    COMF    S_DAT,W        ;反転 消灯するポートを入力、無接続(Hiインピーダンス)に設定
    bsf    STATUS,RP0    ;BANK1
    MOVWF    TRISB        ;SEG DATA SET
    BCF    STATUS,RP0    ;BANK0

    MOVF    K_POS,W        ;DP を点灯
    SUBLW    D'0'        ;0桁目DPを点灯
    BTFSC    STATUS,Z
    GOTO    DP
    SUBLW    D'3'        ;3桁目DPを点灯
    BTFSC    STATUS,Z
    GOTO    DP
    SUBLW    D'6'        ;6桁目DPを点灯
    BTFSC    STATUS,Z
    GOTO    DP
NE
    INCF    K_POS        ;桁+1
    BCF    STATUS,C
    RLF    K_BP        ;桁位置+1
    GOTO    WAIT
DP
    bsf    STATUS,RP0    ;BANK1
    BCF    TRISB,7        ;DP SEG をOUT SET 点灯
    BCF    STATUS,RP0    ;BANK0
    GOTO    NE

PASET                ;float lineを発光させる処理
    BCF    PORTA,FL    ;RA0=L
    bsf    STATUS,RP0    ;BANK1
    BCF    TRISA,FL    ;RA0 0=OUT 発光
    BCF    STATUS,RP0    ;BANK0
    GOTO    OUT_SEG
K_8   
    movf    28h,W        ;28h番地から8桁目の表示DATA取得
     CALL       TABLE        ;7SEG DATA に変換
    MOVWF    S_DAT        ;一時保管 8桁目はfloating lineをつかわない
    CLRF    PORTB        ;BはL出力
    BSF    PORTA,FL    ;RA0 発光桁をon 8桁目のアノードをHiにする
    bsf    STATUS,RP0    ;BANK1
    BCF    TRISA,FL    ;RA0 OUT
    BCF    STATUS,RP0    ;BANK0
    COMF    S_DAT,W        ;反転 消灯するポートを入力無接続(Hiインピーダンス)に設定
    bsf    STATUS,RP0    ;BANK1
    MOVWF    TRISB        ;SEG DATA SET
    BCF    STATUS,RP0    ;BANK0
    CLRF    K_POS        ;NEXT 0桁
    MOVLW    b'00000001'    ;0桁目の位置
    MOVWF    K_BP
    GOTO    WAIT        ;NEXT
         end
プログラムにバグがあった場合は連絡お願いします。

08/05/16
PORTBの8ピンのみを使用し8桁表示 カソードコモン7セグLED用
PORTAは全てフリーです。
Fカウンターなどを作るときに楽になります。

回路は同じようなものですが、PORTBの8ピンのみを使用して8桁表示です。
秋 月の7セグLED 赤色2文字(アノードコモン)(4個入)100円 
 の様な2文字のタイプを表示機に使用する場合は偶数桁のほうが設計しやすいと思います。



ただし片面基板ではパターン設計が難しくジャンパーだらけになってしまいます。
仕方なくラッピングで配線しました。



基板をCNCで作成 100*50o 



組み立て完了 部品はPIC 16F88  カソードコモン7セグLED



電流制限抵抗470オーム 発光効率も良くだいぶ明るくなりました。
6の数字のBがうっすらと点灯しています。?何が原因か
ソフトにバグが残っているかも!!

少々脱線


100円ショップ ダイソーから購入した物  2個で105円です。
CNCに固定するのにちょうど良いパーツです。

08/05/17


バグ取りました。総電流30mA AからFも表示できます。
意味はありませんがデモ用に1からFまで流れるように表示するようにしました。
室内はokですが、屋外使用も考えるとtrを入れて電流増やした方が良いと思います。

 ; 8-Digit 8-Pin Kカソードコモン LED 08/05/18 JA0BAS 流れ16進表示 
       list      p=16F88  
        #include <p16F88.inc>
   __CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _WDT_OFF & _INTRC_IO & _PWRTE_ON   
   __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
  S_DAT     EQU    30H
  K_POS    EQU    31H    ;桁位置
  K_BP    EQU    32H
  O_DAT    EQU    33H
  TC    EQU    34H
  TW    EQU    35H
  W_TEMP    EQU    36H
  ST_TEMP    EQU    37H
  WT    EQU    38H
       org    0
        goto    start
    org    4
    goto      INTR    ;Initialize
TABLE  ;K_POS値をPCLに+しでJMP,データを持ってretする
     ANDLW    B'00001111'    ;下位4ビット
    ADDWF     PCL,F
     RETLW     b'00111111'     ;0    3F    C0
     RETLW     b'00000110'    ;1    06
     RETLW     b'01011011'    ;2    5A
     RETLW     b'01001111'    ;3    4F     A
     RETLW     b'01100110'    ;4    66    F B
     RETLW     b'01101101'    ;5    6D     G
     RETLW     b'01111101'    ;6    7D    E C
      RETLW     b'00000111'    ;7    07     D
     RETLW     b'01111111'    ;8    7F
     RETLW     b'01101111'    ;9    6F    90
    RETLW    B'01110111'    ;A
    RETLW    B'01111100'    ;b
    RETLW    B'01011000'    ;C
    RETLW    B'01011110'    ;d
    RETLW    B'01111001'    ;E
    RETLW    B'01110001'    ;F
start    goto init_
init_       
    CALL    DSET
    bsf    STATUS,RP0    ;BANK1
    MOVLW    b'01100000'    ;内蔵クロック 4MHz
    MOVWF    OSCCON   
    clrf    ANSEL        ;デジタル   
    movlw    b'00000111'    ;コンパレーターoff
    movwf    CMCON
    MOVLW    b'11111111'    ;初期設定入力 all in
    MOVWF    TRISB
    BSF    PIE1,TMR1IE ;TMRオーバーフロー割込許可
    BCF    STATUS,RP0    ;BANK0
    MOVLW    b'00110000'
    MOVWF    T1CON     ;T CONレジスタ プリスケーラ1:8
    BCF    T1CON,T1OSCEN
    BCF    T1CON,TMR1CS    ;int osc
    BSF    INTCON,PEIE ;周辺割込の許可
    BSF    INTCON,GIE ;全体割込の許可
    BSF    T1CON,TMR1ON ;TMRのTMR ONビットをセット カウント開始
    MOVLW    b'00000001'    ;0桁目の位置
    MOVWF    K_BP
    CLRF    K_POS
WAIT   
    DECFSZ    TW,F        ;TW-1
    GOTO    $-1
LEDof                ;規定値 全IN 全消灯
    bsf    STATUS,RP0    ;BANK1
    movlw    b'11111111'    ;1=inMODE  LEDoff
    movwf    TRISB
    BCF    STATUS,RP0    ;BANK0
    CLRF    PORTB
    CLRF    O_DAT
    MOVF    K_POS,W
    SUBLW    D'7'        ;7桁目か
    BTFSC    STATUS,Z
    GOTO    K_7        ;7桁目のみfloat lineを使わない別処理
K_ETC
    movlw    20H        ;DATAの先頭アドレス
    addwf    K_POS,W        ;K_POS分だけポインタを進める
    movwf    FSR        ;アドレスをセット
    movf    INDF,W        ;FSR番地から表示DATA取得
     CALL       TABLE        ;7SEG DATA に変換
    MOVWF    S_DAT        ;7SEG DATA 保管
    MOVF    K_BP,W        ;float lineの位置
    IORWF    O_DAT,F        ;発光桁を強制的に1にするon K側をLに
    COMF    O_DAT,F
    ANDWF    S_DAT,W        ;1の部分素通りマスク
    BTFSS    STATUS,Z    ;必要ならfloat lineをHにする
    BSF    S_DAT,7        ;RB7 0=OUT 発光
    MOVF    K_BP,W        ;float lineの位置
    IORWF    S_DAT,F
    COMF    S_DAT,F        ;反転させ
    MOVF    O_DAT,W
    MOVWF    PORTB
    MOVF    S_DAT,W
    bsf    STATUS,RP0    ;BANK1
    MOVWF    TRISB        ;SEG DATA SET
    BCF    STATUS,RP0    ;BANK0
    INCF    K_POS        ;桁+1
    BCF    STATUS,C
    RLF    K_BP        ;桁位置+1
    GOTO    WAIT
K_7   
    movf    27h,W        ;27h番地から7桁目の表示DATA取得
     CALL       TABLE        ;7SEG DATA に変換
    MOVWF    S_DAT        ;7SEG DATA 保管
    BSF    O_DAT,7        ;発光桁を強制的に1にするon K側をLに
    COMF    O_DAT,7
    BSF    S_DAT,7        ;RB7 0=OUT 発光
    COMF    S_DAT,F        ;反転させ
    MOVF    O_DAT,W
    MOVWF    PORTB
    MOVF    S_DAT,W
    bsf    STATUS,RP0    ;BANK1
    MOVWF    TRISB        ;SET
    BCF    STATUS,RP0    ;BANK0
    CLRF    K_POS        ;NEXT 0桁
    MOVLW    b'00000001'    ;0桁目の位置
    MOVWF    K_BP
    GOTO    WAIT        ;NEXT
INTR     ;割込処理
PUSH    MOVWF    W_TEMP        ;Wレジスタ待避
    SWAPF    STATUS,W    ;STATUS取出
    MOVWF    ST_TEMP        ;STATUS待避
    BCF    PIR1,TMR1IF    ;オーバーフローフラグのクリア
    BSF    STATUS,RP0    ;BANK1
    BSF    PIE1,TMR1IE    ;オーバーフロー割込許可
    BCF    STATUS,RP0    ;BANK0
    CALL    DSET
pop    SWAPF    ST_TEMP,W    ;STATUSを戻す
    MOVWF    STATUS   
    SWAPF    W_TEMP,F    ;Wレジスタを戻す
    SWAPF    W_TEMP,W
    RETFIE        ;割込を許可してリターン
DSET
    movlw    20H        ;DATAの先頭アドレス
    MOVWF    FSR        ;
    MOVF    INDF,W        ;20Hの内容
    MOVWF    WT        ;退避
L2
    MOVLW    0FH        ;MAX 0FH
    SUBWF    WT,W
    BTFSC    STATUS,C
    CLRF    WT
    INCF    WT,F
    MOVF    WT,W
    MOVWF    INDF
    MOVLW    28H        ;MAX 28H
    SUBWF    FSR,W
    BTFSC    STATUS,C
    RETURN
    INCF    FSR,F
    GOTO    L2

         end

各セグメントは10分の1の時間しか発光していないので電流100mA位流せば超高輝度になりますが
PICのポートの電流制限25mAですのでそこで我慢すると
3V/0.025=120オームになります。
全体で0.025*7=0.175mA
電流制限抵抗120オームにして作りましょう!

08/05/18

もっと明るく光らせたくカソードにTRを入れて見ました。
電流制限抵抗は100オームです。


組み立てて下記です。
写真ではわかり難いですが、明るくはなっています。
500mAのTRを付けたのですが、総電流50mAしか流れません。
200mA流れてもらいたいのですが、計算が合いません?



そこでシンクロでPIC 16f88 のピン電圧を見て見ました。
シンクロ画面の写真は始めて取ったのでぼけていますが、露出は手動設定にしないと!!



縦軸目盛1Vです。一番下のラインが0V発光桁の時です。
中間のラインが発光時のセグメント出力電圧1.5V位しかありません。
電流制限抵抗不要です。0オームでok
PICはピンから電流を取出すと急激に電圧が下がるようです。
と言うことは明るくするためにはアノードコモンのLEDを使ってPICピンは吸込みで設計しないと高輝度にはできない結論でした。
実験して見ないとわかりません。吸込ませたら電圧上がったりして!!!

08/05/19

電流を取出した場合の状況です。
25mA流すと最大1.5Vまで電圧が下がります。
普通LEDは1.9V位の電圧ありますから電流制限抵抗付けなくても適当な電流に収束します。


電流を吸込ませた場合の状況
こちらはまあまあ使えそうです。



上記はVDD 5Vの場合です。
3Vで使用の場合は非常に悪くなります。


これでは10mA位しか流れ出てきません。
HIOUT端子をグランドにショートしても破壊されない!!

ところで上記の回路の例では電源電圧2.4Vでも正常に動いています。
電流は50mAから3mAに減少  LEDは暗いところでないと見えません。

home  CNCの構想   CNCの製作  CNCのSOFT    CNCの作品    ゲストブック