PIC16F88を 使った4桁デジタル電圧計10ビットADコンバーター 

フラッシュ:4kワード
RAM:368バイト
EEPROM:256バイト
クロック:最大20MHz
10ビットADコンバータ内蔵
PWM(CCP),USART,コンパレータ,SSP機能

FREEのアセンブラ、Cコンパイラ、BASICなどが提供されています。

PICは4クロックで1命令を実行します。20MHzの場合は1秒間に5M回の命令を実行することになります。もの凄いスピードで普通に使うには十分なス ピードです。下記のような7セグLEDの表示にはダイナミック点灯を使いますが、100回書き換えるとして4桁で400回、5M/500としても各回に 10000ステップも実行できます。

 

プログラムはアセンブラで作成。

5VとGNDを繋ぐだけで残り16ピン全てをIOに使えます。

7セグLEDはSL-1063-50  ジャンク 1個32円か53円

基板サイズ 33*38o   PICは250円 全部でも500円以下で出来そうです。

JWCADで基板設計      JWCADのCADDATA

NCVCで読込後Gコードを出力(F7)しま す。これで切削と穴あけのGコードができます。

Gコードを使ってMACH3と自作CNCで基板切削と穴あけをします。

まずは切削DATA      次に穴あけDATA


05/09/04    
組み立てました。PIC16F88 です。反省少々小さくまとめすぎました。

超簡単な回路図   クロックは内蔵を利用、

基板面の状況 電源ICは寝かせて電解コンデンサーも背の低いものを使って、 全体を薄く作ったほうが、使い勝手が良さそうです。

電子工作の実験室趣味の電気工作ALLdeta を参考にしました。

ソフトのバグが有る様で動きません。これからバグ取してみます。ソフトは苦手で!!!

基板設計しただけで組み立ててありません。まだミスもあるかもしれません。まだ参考にしないように

10ビットADコンバータで電圧測定→2進数を10進数4桁に変換→10進数を7セグに変換→4桁を高速に切替えて表示→繰返


05/09/11 PICの焼き直し10回位  とりあえず完成 MPLAB SIMを使って悩みました。英語は 良く分からん

0から20Vまで3.5桁の直流電圧計です。10ビットA/Dですので20mVピッチです。 消費電流90mA

10Vの桁は0の場合は非表示にしました。

テスターとPICの違いは計測スピードです。一般にテスターは毎秒3回位、 PICは約100uSですので毎秒10000回です。



2008/06/05
ソフトがほしいとのリクエストがありました。
3年も前に作った物で記憶も確かでありませんがUPします。
20Vフルスケール4桁電圧計です。
参考にしてください。

;ファイル名:VM.asm    ()内はピン番号 2005/10/00  JA0BAS
;    TLG2140        カソードコモンLED
;          0123456789AB
;               43 21
;              EABFCGD.
    LIST        P=PIC16F88    ; プロセッサの種別指定
    INCLUDE        <P16F88.INC>    ; インクルードファイルの指定
__CONFIG  _CONFIG1, _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO & _PWRTE_ON   
__CONFIG  _CONFIG2, _IESO_OFF & _FCMEN_OFF
COUNT        EQU    H'20'    ; ループカウンタ
hen1b        EQU    H'21'    ; 変換したい値(16ビット。変換後は壊れる)
hen1a        EQU    H'22'    ;〜下位
hen2b        EQU    H'23'    ;
hen2a        EQU    H'24'    ;〜下位
hen3e        EQU    H'25'    ;10進格納場所(5バイト)
hen3d        EQU    H'26'
hen3c        EQU    H'27'
hen3b        EQU    H'28'
hen3a        EQU    H'29'    ;〜下位
srlc1        EQU    H'2A'    ; カウンタ
srwk1        EQU    H'2B'    ; 一時余
k0        EQU    H'2C'    ;桁位置

    ORG    0        ; プログラムの開始番地の指定
    goto    start
    org    4
    goto      start
tablenum    addwf    pcl,1          ;cycle3
;                    CGD-FBAE      7segment のA〜F
    retlw    b'10101111'    ;letter 0     RB7(13)=C
    retlw    b'10000100'    ;letter 1     RB6(12)=G   
    retlw    b'01100111'    ;letter 2     RB5(11)=D   
    retlw    b'11100110'    ;letter 3     RB4(10)=.
    retlw    b'11001100'    ;letter 4     RB3(09)=F
    retlw    b'11101010'    ;letter 5     RB2(08)=B
    retlw    b'11101011'    ;letter 6     RB1(07)=A
    retlw    b'10000110'    ;letter 7     RB0(06)=E   
    retlw    b'11101111'    ;letter 8
    retlw    b'11101110'    ;letter 9       A
    retlw    b'11001111'    ;letter A      ____   
    retlw    b'11101001'    ;letter B    F|    | B
    retlw    b'00101011'    ;letter C     |_G__|
    retlw    b'11100101'    ;letter D    E|    | C
    retlw    b'01001011'    ;letter F     |____|
    retlw    b'01000000'    ;letter -     D   
    return
start
    call    init
start1    ;call    time
    call    adstart
    call    taihi        ;結果退避hen1->hen2
    call    adstart        ;2回目計測
    call    add16        ;平均を表示するチラツキ軽減hen1+20->hen1
    call    hexdec16    ;16ビット数値を10進数5桁のBCD値に変換
    call    out7seg        ;LED表示
    goto    start1        ;繰返

;  入出力ピン初期化
init    BCF     INTCON,GIE      ;割り込み禁止
    BSF    STATUS,RP0    ; Bank 1 へ切替
    MOVLW    B'01000000'    ;クロック 1MHz
    MOVWF    osccon   
    MOVLW    B'00000000'    ;PortB 出力モードに設定
    MOVWF    TRISB   
    MOVLW    B'00101001'    ;PortA PortAモードIN=RA0,RA3,RA5
    MOVWF    TRISA   
    MOVLW    B'10000000'    ;結果右詰
    MOVWF    ADCON1   
    MOVLW    B'00000001'    ;RA0のみアナログ
    MOVWF    ansel   
    bsf    option_reg,NOT_RBPU
    BCF    STATUS,RP0    ; Bank 0 へ戻す
    MOVLW    B'00000001'    ;/2 CH0 設定, A/D on
    MOVWF    ADCON0   
    MOVLW    B'00000100'    ;初期値4桁set
    movWf    k0   
    movLW    B'00000000'    ;7seg off
    movwf    porta
    return

ADSTART
    BTFSC    ADCON0,GO    ; GO が 0 だったらループから抜ける
    GOTO    $-1        ; GO が 1 だったらループする
    MOVF    ADRESH,W    ; A/D データ上位(データは右詰)
    MOVWF    hen1b        ;hen1b(上位) A/D 結果を出力
    BSF    STATUS,RP0    ; Bank 1 へ切替
    MOVF    ADRESL,W    ; A/D データ下位
    BCF    STATUS,RP0    ; Bank 0 へ戻す
    MOVWF    hen1a        ; hen1a(下位) A/D 結果を出力
    BSF    ADCON0,GO        ;次のA/Dスタート
    return       
out7seg
    decfsz    k0,f        ;-1 結果0でスキップ
    goto     ko0        ;0以外は次へ
    bsf    k0,2        ;0の場合は初期値4桁set
ko0    movf    k0,w
    addwf    PCL,f
    nop
    goto    ko1        ;1の場合
    goto    ko2
    goto    ko3
    goto    ko4
    goto     start
ko1    movf    hen3a,w         ;1桁目10進数取得
    call    kom        ;7seg変換set
    bsf    porta,1        ;LED on(18)
    return
ko2    movf    hen3b,w        ;2桁目10進数取得
    call    kom        ;7seg変換set
    bsf    porta,2        ;LED on(1)
    return
ko3    movf    hen3c,w        ;3桁目10進数取得
    call    kom        ;7seg変換set
    bsf    porta,4        ;LED on(4)
    return
ko4    movf    hen3d,w        ;4桁目10進数取得
    btfsc    status,z        ;w<>0 スキップ
    return            ;w=0 表示せず終了
    call    kom        ;7seg変換set
    bsf    porta,6        ;LED on(15)
    return
kom    call    tablenum    ;7segDATA変換
    clrf    porta        ;LED off
    movwf    portb        ;7seg出力
    return
        ;16ビット(2バイト)数値を10進数5桁のBCD値に変換する
        ;引き数は hen1b(上位),hen1a(下位) の2バイト
        ;結果は hen3e,hen3d,hen3c,hen3b,hen3a(下位の数)に得られる。
hexdec16        movlw    srlc1        ;格納場所初期値
        movwf    fsr        ;4h=fsr
        call    devide        ;最下位変換
        call    devide
        call    devide
        call    devide
        call    devide        ;最上位変換
        return
devide                    ;÷10サブルーチン (10で除算)
        movlw    d'16'        ;16ビットくり返し
        movwf    srlc1
        clrf    srwk1
devide0    bcf    status,c        ;キャリフラグのクリア
        rlf    hen1a,f
        rlf    hen1b,f
        rlf    srwk1,f
        movlw    b'11110110'
        addwf    srwk1,w
        btfsc    status,c
        movwf    srwk1
        btfsc    status,c
        incf    hen1a,f
        decfsz    srlc1,f
        goto    devide0
        decf    fsr,f        ;4h=fsr
        movf    srwk1,w
        movwf    indf        ;余り (0h=indirect)
        return

add16    movf    hen2a,w        ;チラツキ軽減の為2回計測し平均表示
    addwf    hen1a,f
    btfsc    status,c
    incf    hen1b,f
    movf    hen2b,w
    addwf    hen1b,f
    return
taihi
    movf    hen1a,w        ;結果退避
    movwf    hen2a
    movf    hen1b,w
    movwf    hen2b
    return
TIME                ;一定時間待つ
    MOVLW    H'12'        ;
    MOVWF    COUNT        ;
    DECFSZ    COUNT,F        ;
    GOTO    $-1        ;
    return
    END

良いと思いますが、どれが最終リストか分からなくなってしまいました。
MPLAB で使って見ました。

上記のDisable case sensiltivity にチェックをつけないと大文字、小文字を区別されてerrが出ます。
とりあえずokになったので良いでしょう。
バグがあったら連絡してください。
そのまま焼く方のHEXファイルです。
なおプリント基板パターンの都合で7セグLEDの結線を変更してあります。
picの良いところです。ソフトで使い易い様にどうにでもなる。回路図ソースに合わせて変更してありません。
ソースリストのほうが優先です。
   RB7(13)=C
   RB6(12)=G   
   RB5(11)=D   
   RB3(09)=F
   RB2(08)=B
   RB1(07)=A
   RB0(06)=E   
電流計の場合はソース違います。電圧計の回路で組立ててください。
DPの表示はソースをサボっています。
DPは表示位置固定で表示LEDのDPを500Ωで5V電源につないでください。
RAポートはRA0のみADコンバーターに使用しています。
桁表示ポートもソースリスト優先です。
RA1 2 4 6 を使っています。気に入らない場合はソースリスト変更してください。
RA1が0.01Vの桁です。
RA5は入力専用でOUTに使えません RA3は外部基準電圧を使うときのため未使用です。
このソースを使ってHEXファイルを作ってあります。
RA0に5Vが入力されるとソフトで4倍して20Vの表示をしています。
したがって電圧を1/4にして入力する必要があります。
200Vにする場合は1/40にして入力しDP位置変更してください。
正確には10ビットですから1024*2=20.48Vまで表示できます。
基準電圧に7805の5V出力を使っているため、(5Vを1024分割して測定します)
高精度を求める場合には別途基準電圧ICを使ってください
最終的にはVRで分圧比を微調整して正しい電圧が表示されるよう調整して完成です。
次に作るときは
ソースの変更が必要ですが、電流あまり流れないので最近の高輝度LEDを使用してTRは不要です。
回路は超簡単!!! 
PICのすごい技術です。

2008/07/13
アノードコモンのソフトも欲しいとの話がありましたので手直ししました。
基板はCNCで切削して、まずは回路図 PIC16F88

7セグLEDはSL-1063-50  ジャンク 1個32円を使いました
LED接続は表示面正面から見て
上の左側から
D-A-B-F-G-C
下の左側から
10Vの桁-1Vの桁-小数点の桁-100mVの桁-10mVの桁-g表示です。

;ファイル名:VMA.asm    ()内はピン番号 JA0BAS 08/07/10 アノードコモン
    LIST        P=PIC16F88    ; プロセッサの種別指定
    INCLUDE        <P16F88.INC>    ; インクルードファイルの指定
__CONFIG  _CONFIG1, _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO & _PWRTE_ON   
__CONFIG  _CONFIG2, _IESO_OFF & _FCMEN_OFF
COUNT        EQU    H'20'    ; ループカウンタ
hen1b        EQU    H'21'    ; 変換したい値(16ビット。変換後は壊れる)
hen1a        EQU    H'22'    ;〜下位
hen2b        EQU    H'23'    ;
hen2a        EQU    H'24'    ;〜下位
hen3e        EQU    H'25'    ;10進格納場所(5バイト)
hen3d        EQU    H'26'
hen3c        EQU    H'27'
hen3b        EQU    H'28'
hen3a        EQU    H'29'    ;〜下位
srlc1        EQU    H'2A'    ; カウンタ
srwk1        EQU    H'2B'    ; 一時余
k0        EQU    H'2C'    ;桁位置
    ORG    0        ; プログラムの開始番地の指定
    goto    start
    org    4
    goto      start
tablenum    addwf    pcl,1          ;cycle3
;                    GC-EDABF      7segment のA〜F
    retlw    b'10100000'    ;letter 0     RB7(13)=G
    retlw    b'10111101'    ;letter 1     RB6(12)=C
    retlw    b'01100001'    ;letter 2     RB5(11)=-
    retlw    b'00110001'    ;letter 3     RB4(10)=E
    retlw    b'00111100'    ;letter 4     RB3(09)=D
    retlw    b'00110010'    ;letter 5     RB2(08)=A
    retlw    b'00100010'    ;letter 6     RB1(07)=B
    retlw    b'10111001'    ;letter 7     RB0(06)=F
    retlw    b'00100000'    ;letter 8
    retlw    b'00110000'    ;letter 9
start
    call    init
start1    ;call    time
    call    adstart
    call    taihi        ;結果退避hen1->hen2
    call    adstart        ;2回目計測
    call    add16        ;平均を表示するチラツキ軽減hen1+20->hen1
    call    hexdec16    ;16ビット数値を10進数5桁のBCD値に変換
    call    out7seg        ;LED表示
    goto    start1        ;繰返
;  入出力ピン初期化
init    BCF     INTCON,GIE      ;割り込み禁止
    BSF    STATUS,RP0    ; Bank 1 へ切替
    MOVLW    B'01000000'    ;クロック 1MHz
    MOVWF    osccon   
    MOVLW    B'00000000'    ;PortB 出力モードに設定
    MOVWF    TRISB   
    MOVLW    B'00000001'    ;PortA PortAモードIN=RA0
    MOVWF    TRISA   
    MOVLW    B'10000000'    ;結果右詰
    MOVWF    ADCON1   
    MOVLW    B'00000001'    ;RA0のみアナログ
    MOVWF    ansel   
    bsf    option_reg,NOT_RBPU
    BCF    STATUS,RP0    ; Bank 0 へ戻す
    MOVLW    B'00000001'    ;/2 CH0 設定, A/D on
    MOVWF    ADCON0   
    MOVLW    B'00000100'    ;初期値4桁set
    movWf    k0   
    movLW    B'01001110'    ;7seg off
    movwf    porta
    return
ADSTART
    BTFSC    ADCON0,GO    ; GO が 0 だったらループから抜ける
    GOTO    $-1        ; GO が 1 だったらループする
    MOVF    ADRESH,W    ; A/D データ上位(データは右詰)
    MOVWF    hen1b        ;hen1b(上位) A/D 結果を出力
    BSF    STATUS,RP0    ; Bank 1 へ切替
    MOVF    ADRESL,W    ; A/D データ下位
    BCF    STATUS,RP0    ; Bank 0 へ戻す
    MOVWF    hen1a        ; hen1a(下位) A/D 結果を出力
    BSF    ADCON0,GO        ;次のA/Dスタート
    return       
out7seg
    decfsz    k0,f        ;-1 結果0でスキップ
    goto     ko0        ;0以外は次へ
    bsf    k0,2        ;0の場合は初期値4桁set
ko0    movf    k0,w
    addwf    PCL,f
    nop
    goto    ko1        ;1の場合
    goto    ko2
    goto    ko3
    goto    ko4
    goto     start
ko1    movf    hen3a,w         ;1桁目10進数取得
    call    tablenum    ;7segDATA変換
    bsf    porta,3        ;off
    movwf    portb        ;7seg出力
    bcf    porta,6        ;LED on(15)
    return
ko2    movf    hen3b,w        ;2桁目10進数取得
    call    tablenum    ;7segDATA変換
    bsf    porta,2
    movwf    portb        ;7seg出力
    bcf    porta,3        ;LED on(2)
    return
ko3    movf    hen3c,w        ;3桁目10進数取得
    call    tablenum    ;7segDATA変換
    bsf    porta,1
    bsf    porta,6        ;4桁スキップの場合
    movwf    portb        ;7seg出力
    bcf    porta,2        ;LED on(1)
    return
ko4    movf    hen3d,w        ;4桁目10進数取得
    btfsc    status,z    ;w<>0 スキップ
    return            ;w=0 表示せず終了
    call    tablenum    ;7segDATA変換
    bsf    porta,6        ;off
    movwf    portb        ;7seg出力
    bcf    porta,1        ;LED on(18)
    return
        ;16ビット(2バイト)数値を10進数5桁のBCD値に変換する
        ;引き数は hen1b(上位),hen1a(下位) の2バイト
        ;結果は hen3e,hen3d,hen3c,hen3b,hen3a(下位の数)に得られる。
hexdec16        movlw    srlc1        ;格納場所初期値
        movwf    fsr        ;4h=fsr
        call    devide        ;最下位変換
        call    devide
        call    devide
        call    devide
        call    devide        ;最上位変換
        return
devide                    ;÷10サブルーチン (10で除算)
        movlw    d'16'        ;16ビットくり返し
        movwf    srlc1
        clrf    srwk1
devide0    bcf    status,c        ;キャリフラグのクリア
        rlf    hen1a,f
        rlf    hen1b,f
        rlf    srwk1,f
        movlw    b'11110110'
        addwf    srwk1,w
        btfsc    status,c
        movwf    srwk1
        btfsc    status,c
        incf    hen1a,f
        decfsz    srlc1,f
        goto    devide0
        decf    fsr,f        ;4h=fsr
        movf    srwk1,w
        movwf    indf        ;余り (0h=indirect)
        return
add16    movf    hen2a,w        ;チラツキ軽減の為2回計測し平均表示
    addwf    hen1a,f
    btfsc    status,c
    incf    hen1b,f
    movf    hen2b,w
    addwf    hen1b,f
    return
taihi
    movf    hen1a,w        ;結果退避
    movwf    hen2a
    movf    hen1b,w
    movwf    hen2b
    return
TIME                ;一定時間待つ
    MOVLW    H'12'        ;
    MOVWF    COUNT        ;
    DECFSZ    COUNT,F        ;
    GOTO    $-1        ;
    return
    END
(すみません 08/8/6 バグがありました 修正しました)
そのまま焼く方のHEXファイルです。
この回路はダイナミック点灯を使って一度に発光するのは1桁のみの方法を使っています。
高速に切り替えて目の残像効果で全桁表示しているように見えます。
したがって4桁の場合は1/4の時間しか発光していないことになります。
高輝度でない7セグの場合、電流を十分に流してやらないと暗いことになります。
ピーク電流100mA位流すこともあります。これで平均25mA
PICのIOピンは電流容量25mAですからこれ以上にすると回路複雑になってメリットがありません。
9桁表示のページの実験のとおり流れ出しはPIC苦手のようですのでアノードコモン を使って吸込みで使うと良いようです。
アノードには7SEG全部点灯の時は25mA*7=175mAも流れますのでPICでは電流が多すぎて処理できずTRを使って処理します。
TRは当初手元に転がっていた2SA844を使って組立てました。
規格は 日立 RF用 SiEP -100mA 380hfe です。
各セグメント10mAも流して十分光ると思ったのですが、電流流れません。
直流電流増幅率は電流により大幅に変動します。
例えば一般の2SA1015で も  IC2 mAで 70- 400   IC150 mA で 最低25 と大幅に変わっています。
150mAで25とするとベースに6mAも流さないといけないことになります。
ベースの抵抗は1Kを使う必要があります。
使った2SA844はRF用と言うこともあって50mA位しか電流流れず、暗くて見にくい結果になりました。
仕方ないので2SA696という 三菱 RFPA用-500mA規格のTRに変更しました。
ベース抵抗は1K LEDの制限抵抗は100オームにしました。
これでちょうど各セグメントPICの規格25mA流れます。
100オーム25mAで2.5V LED 約2V TR外約0.5V で 合計5V になり計算合います。 
全点灯の時175mA この古い発光効率の悪い7セグLEDでぎらぎら光ります。
やはりTRは規格ぎりぎりで使うのには効率悪いです。
PICのADはIC内に基準電圧を持っていないので外部ICで作成して入力するか、電源電圧5Vを基準電圧にすることになります。
今回は電源電圧を基準電圧にしていますので5Vが変動すると測定電圧も誤差が出てきます。
7805等の定電圧ICも電 流や熱等により10mVの単位になると結構変動しています。
1の表示と8の表示では流れる電流も0.1A以上も変動します。
これで電圧が10mV変わると測定値もちらつきます。
変動を抑えるため5V電源回路の電解コンデンサーもなるべく大容量のものを使ってください。
PIC16F88があったので使っていますが、秋月で見るとPIC16F818 が10ビットAD付きで最安値200円のようです。
次回はPIC16F818にします。

08/08/04
超高速で何回も計測しているためデジタルの境界などで表示がちらつきます。
そこでテスターと同じように毎秒数回の計測に変更しました。
まあ好みでお願いします。

;ファイル名:VMA.asm    ()内はピン番号 JA0BAS 08/08/02改 アノードコモン
    LIST        P=PIC16F88    ; プロセッサの種別指定
    INCLUDE        <P16F88.INC>    ; インクルードファイルの指定
    __CONFIG  _CONFIG1, _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO & _PWRTE_ON   
    __CONFIG  _CONFIG2, _IESO_OFF & _FCMEN_OFF
COUNT        EQU    H'20'    ; ループカウンタ
hen1b        EQU    H'21'    ; 変換したい値(16ビット。変換後は壊れる)
hen1a        EQU    H'22'    ;〜下位
hen2b        EQU    H'23'    ;
hen2a        EQU    H'24'    ;〜下位
hen3e        EQU    H'25'    ;10進格納場所(5バイト)
hen3d        EQU    H'26'
hen3c        EQU    H'27'
hen3b        EQU    H'28'
hen3a        EQU    H'29'    ;〜下位
srlc1        EQU    H'2A'    ; カウンタ
srwk1        EQU    H'2B'    ; 一時余
k0        EQU    H'2C'    ;桁位置
TC        EQU    H'2D'
    ORG    0        ; プログラムの開始番地の指定
    goto    start
    org    4
    goto      start
tablenum    addwf    pcl,1          ;cycle3
;                    GC-EDABF      7segment のA〜F
    retlw    b'10100000'    ;letter 0     RB7(13)=G
    retlw    b'10111101'    ;letter 1     RB6(12)=C
    retlw    b'01100001'    ;letter 2     RB5(11)=-
    retlw    b'00110001'    ;letter 3     RB4(10)=E
    retlw    b'00111100'    ;letter 4     RB3(09)=D
    retlw    b'00110010'    ;letter 5     RB2(08)=A
    retlw    b'00100010'    ;letter 6     RB1(07)=B
    retlw    b'10111001'    ;letter 7     RB0(06)=F
    retlw    b'00100000'    ;letter 8
    retlw    b'00110000'    ;letter 9
   
start    call    init
start1    DECFSZ    TC,F
    GOTO    NEXT
    MOVLW    d'32'        ;32回に1回計測する
    MOVWF    TC
    call    adstart
    call    taihi        ;結果退避hen1->hen2
    call    adstart        ;2回目計測
    call    add16        ;平均を表示するチラツキ軽減hen1+20->hen1
    call    hexdec16    ;16ビット数値を10進数5桁のBCD値に変換
NEXT    call    out7seg        ;LED表示
    goto    start1        ;繰返

;  入出力ピン初期化
init    BCF     INTCON,GIE      ;割り込み禁止
    BSF    STATUS,RP0    ; Bank 1 へ切替
    MOVLW    B'01010000'    ;クロック 2MHz
    MOVWF    OSCCON
    MOVLW    B'00000000'    ;PortB 出力モードに設定
    MOVWF    TRISB   
    MOVLW    B'00000001'    ;PortA PortAモードIN=RA0
    MOVWF    TRISA   
    MOVLW    B'10000000'    ;結果右詰
    MOVWF    ADCON1   
    MOVLW    B'00000001'    ;RA0のみアナログ
    MOVWF    ansel   
    bsf    option_reg,NOT_RBPU
    BCF    STATUS,RP0    ; Bank 0 へ戻す
    MOVLW    B'00000001'    ;/2 CH0 設定, A/D on
    MOVWF    ADCON0   
    MOVLW    B'00000100'    ;初期値4桁set
    movWf    k0   
    movLW    B'01001110'    ;7seg off
    movwf    porta
    MOVLW    B'00000001'
    MOVWF    TC
    return

ADSTART
    BTFSC    ADCON0,GO    ; GO が 0 だったらループから抜ける
    GOTO    $-1        ; GO が 1 だったらループする
    MOVF    ADRESH,W    ; A/D データ上位(データは右詰)
    MOVWF    hen1b        ;hen1b(上位) A/D 結果を出力
    BSF    STATUS,RP0    ; Bank 1 へ切替
    MOVF    ADRESL,W    ; A/D データ下位
    BCF    STATUS,RP0    ; Bank 0 へ戻す
    MOVWF    hen1a        ; hen1a(下位) A/D 結果を出力
    BSF    ADCON0,GO    ;次のA/Dスタート
    return       
out7seg
ko1    movLW    B'01001110'    ;7seg off
    movwf    porta
    movf    hen3a,w         ;1桁目10進数取得10mV
    call    tablenum    ;7segDATA変換
    movwf    portb        ;7seg出力
    bcf    porta,6        ;LED on(15)
    CALL    TIME
ko2    movLW    B'01001110'    ;7seg off
    movwf    porta
    movf    hen3b,w        ;2桁目10進数取得100mV
    call    tablenum    ;7segDATA変換
    movwf    portb        ;7seg出力
    bcf    porta,3        ;LED on(2)
    CALL    TIME
ko3    movLW    B'01001110'    ;7seg off
    movwf    porta
    movf    hen3c,w        ;3桁目10進数取得1V
    call    tablenum    ;7segDATA変換
    movwf    portb        ;7seg出力
    bcf    porta,2        ;LED on(1)
    CALL    TIME
ko4    movLW    B'01001110'    ;7seg off
    movwf    porta
    movf    hen3d,w        ;4桁目10進数取得10V
    btfsc    status,z    ;w<>0 スキップ
    return            ;w=0 表示せず終了
    call    tablenum    ;7segDATA変換
    movwf    portb        ;7seg出力
    bcf    porta,1        ;LED on(18)
    CALL    TIME
    return

        ;16ビット(2バイト)数値を10進数5桁のBCD値に変換する
        ;引き数は hen1b(上位),hen1a(下位) の2バイト
        ;結果は hen3e,hen3d,hen3c,hen3b,hen3a(下位の数)に得られる。
hexdec16    movlw    srlc1        ;格納場所初期値
        movwf    fsr        ;4h=fsr
        call    devide        ;最下位変換
        call    devide
        call    devide
        call    devide
        call    devide        ;最上位変換
        return
devide                    ;÷10サブルーチン (10で除算)
        movlw    d'16'        ;16ビットくり返し
        movwf    srlc1
        clrf    srwk1
devide0    bcf    status,c        ;キャリフラグのクリア
        rlf    hen1a,f
        rlf    hen1b,f
        rlf    srwk1,f
        movlw    b'11110110'
        addwf    srwk1,w
        btfsc    status,c
        movwf    srwk1
        btfsc    status,c
        incf    hen1a,f
        decfsz    srlc1,f
        goto    devide0
        decf    fsr,f        ;4h=fsr
        movf    srwk1,w
        movwf    indf        ;余り (0h=indirect)
        return

add16    movf    hen2a,w        ;チラツキ軽減の為2回計測し平均表示
    addwf    hen1a,f
    btfsc    status,c
    incf    hen1b,f
    movf    hen2b,w
    addwf    hen1b,f
    return
taihi
    movf    hen1a,w        ;結果退避
    movwf    hen2a
    movf    hen1b,w
    movwf    hen2b
    return
TIME                ;一定時間待つ
    DECFSZ    COUNT,F        ;1/1M*4*256*2
    GOTO    $-1        ;
    DECFSZ    COUNT,F        ;1/1M*4*256*2
    GOTO    $-1        ;
    return

    END


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