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の作品 ゲストブック