ホーム

2010/6/17(VerUP)http://tax.ehoh.net/18f14/

デジタルパネルメーター(電圧計)20Vスケールの自作(4桁)
48MHzクロック USB付の PIC18F14K50  でも作ってみました。

秋月で@200です。これからは値段も変わらないので機能が多いPIC18Fシリーズを使いましょう。

ICマイコン PIC18F14K50−I/P
■20ピン USB2.0インターフェース内蔵
■USBインターフェース用256バイトRAM内蔵
■フラッシュ 16kバイト
■データメモリー 768バイト
■I/O 17 ※内1ピン(MCLR)は、インプット専用
電圧測定のための基準電圧(FVR)を内蔵しています。1.024Vです。これを4倍して4.096Vを基準にしています。
PIC入門の電子工作・デジタル電圧計を作ってみませんか?
PICの書き込み機が最初に必要です。別ページのPICKIT2クローン(互換機)を先に作ってください。

回路図
 
CNCでプリント基板作成、

基板の大きさは30*30mmです。

もちろんユニバーサル基板でもできます。

これ以上簡単にはできません。

基準電圧IC内臓のため5Vの定電圧回路は省略です。

LEDは4桁のA〜Gまでを並列に接続します。ダイナミック点灯と言います。

4桁を順番に表示していますが、人間の目には常時点灯しているように見えます。

 

部品は殆ど有りません。抵抗、TRはチップ部品使用のため基板側です。

電流制限抵抗は100Ωを使いました。この状態で全電流70mA位いです。表示も十分明るいです。

内臓のADコンバーターは10ビットです。つまり1024分割です。

2倍して2048(20V)まで表示できるようにASMアセンブラーでSOFTを組んで有ります。

下のリストをコピーしてMPLABでアセンブルしてください。PICへの書き込みは自作のPICKIT2を使いました。

書き込みにはPGD(19),PGC(18).VPP(4).VDD(1).VSS(20)の5本のピンが必要です。片まっているので8Pソケットで足ります。

10Vの桁は10V未満の入力時は表示を消しました。

完成後20.00Vの電圧を入力してVRを調整し表示も20.00Vになるようにしてください。

写真でご覧のとおりシンプルになりました。


 
ソフト作成
クロックは内蔵の1MHzを使いました。

複雑です。図をじっくり眺めて設定しないと動きません。


7SEG LED はアノードコモンです。

AD測定クロックは専用内蔵発振器(FRC)600KHzを使用/使用クロックに左右されず測定できます。

まず基準電圧の指定をします。Vref-はGNDに、Vref+はFVRに、ADFMで右詰め指定

CHSで入力PIN(9チャンネル使えます)を選択、ADONで回路を起動

GOで測定開始です。結果はADRESレジスターに入っています。

コマンドは従来のPIC16FとPIC18Fシリーズは結構変わっています。     
CONFIGの設定方法
DATAテーブルの使用方法(特にPCが2ステップです)
MOVFF 命令外が追加されて使いやすい
バンク切替が不要
TMR0が16ビットに

条件JAMP命令が増加

機能が多いためCONFIG設定が非常に多くなっています。プログラムの半分は初期設定です。

複雑で分かりにくいですが、P18F14K50.INCファイルの中のコメントを参考にして下さい。

;ファイル名:VM.ASM	()内はピン番号 JA0BAS 10/06/17 アノードコモン
	LIST	P=PIC18F14K50
	INCLUDE	"P18F14K50.INC"

	CONFIG USBDIV = OFF	;USB CLOCK SELECTION BIT
	CONFIG MCLRE =  OFF	;MCLR PIN ENABLE BIT
	CONFIG	IESO =  OFF	;Internal/External Oscillator Switchover bit
	CONFIG	FCMEN = OFF	;Fail-Safe Clock Monitor Enable bit
	CONFIG 	FOSC = IRC	;OSCILLATOR SELECTION BITS
	CONFIG	PWRTEN = ON	;Power-up Timer Enable bit
	CONFIG 	PLLEN = OFF 	;X PLL ENABLE BIT(OSCILLATOR MULTIPLIED BY 4)
	CONFIG 	PCLKEN = OFF 	;PRIMARY CLOCK ENABLE BIT
	CONFIG	BOREN = OFF	;Brown-out Reset Enable bits
	CONFIG	LVP =   OFF	;Single-Supply ICSP Enable bit
	CONFIG 	CPUDIV=NOCLKDIV	;CPU SYSTEM CLOCK SELECTION BIT
	CONFIG	CP0 = OFF	;Code Protection bit
	CONFIG	CP1 = OFF	;Code Protection bit
	CONFIG	CPD = OFF	;Data EEPROM Code Protection bit
	CONFIG	CPB = OFF	;Boot Block Code Protection bit
	CONFIG	WDTEN = OFF	;Watchdog Timer Enable bit
	CONFIG HFOFST = OFF,STVREN = OFF,BBSIZ = OFF,XINST = OFF
	CONFIG EBTR0 = OFF,EBTR1 = OFF,EBTRB = OFF

COUNT	EQU	H'20'	; ループカウンタ
HEN1B	EQU	H'21'	; 変換したい値(16ビット。変換後は壊れる)
HEN1A	EQU	H'22'	;〜下位
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'	; 一時余
TEMP	EQU	H'2D'
WT	EQU	H'2E'

	ORG	0H
	GOTO	START
	ORG	8H
	GOTO	START
	ORG	18H
	GOTO	START
TABLENUM
	ANDLW	B'00001111'	;下位4ビット有効
	MOVWF	TEMP		;SAVE
	MOVF	PCL,W		;PCLATU,PCLATHにPCコピー
	RLNCF	TEMP,W		;X2
	ADDWF	PCL,F		;ADD TO PC REG
;              	  -GFEDCBA  	7SEGMENT のA〜F 
	RETLW	B'00111111'	;LETTER 0 	
	RETLW	B'00000110'	;LETTER 1 	
	RETLW	B'01011011'	;LETTER 2 	
	RETLW	B'01001111'	;LETTER 3 	
	RETLW	B'01100110'	;LETTER 4 	
	RETLW	B'01101101'	;LETTER 5 	
	RETLW	B'01111101'	;LETTER 6 	
	RETLW	B'00000111'	;LETTER 7 	   
	RETLW	B'01111111'	;LETTER 8
	RETLW	B'01101111'	;LETTER 9       A
	RETLW	B'01110111'	;LETTER A      ____	
	RETLW	B'01111100'	;LETTER B    F|    | B
	RETLW	B'00111001'	;LETTER C     |_G__|
	RETLW	B'01011110'	;LETTER D    E|    | C
	RETLW	B'01110001'	;LETTER F     |____|
	RETLW	B'01000000'	;LETTER - 	D	
	RETURN
START
	CALL	INIT
S1	CALL	ADSTART
	CALL	HEXDEC16	;16ビット数値を10進数5桁のBCD値に変換
	CALL	OUT7SEG		;LED表示
	GOTO	S1		;繰返

;  入出力ピン初期化
INIT	BCF     INTCON,GIE      ;割り込み禁止
	MOVLW	B'00110010'	;クロック 1MHZ INTOSC
	MOVWF	OSCCON	
	MOVLW	B'00000000'	;PORTB 出力モードに設定 
	MOVWF	TRISB	
	MOVLW	B'11111111'	;初期値 
	MOVWF	PORTB		;7SEG OFF
	MOVLW	B'00000000'	;PORTC 出力モードに設定 
	MOVWF	TRISC	
	MOVLW	B'11111111'	;初期値 
	MOVWF	PORTC		
	MOVLW	B'11111111'	;PORTA 入力モード
	MOVWF	TRISA	
	MOVLW	B'00001101'	;00CHS0011,ADON
	MOVWF	ADCON0	
	MOVLW	B'00001000'	;0000PVCFG10NVCFG00
	MOVWF	ADCON1	
	MOVLW	B'10111111'	;ADFM1,ACCQT111ADCS111(FRC)
	MOVWF	ADCON2	
	MOVLW	B'10110000'	;FVR*4
	MOVWF	REFCON0	
	clrf	ANSELH
	MOVLW	B'00000100'	;RA4,AN3のみアナログ
	MOVWF	ANSEL	
	BSF	INTCON2,RABPU	;PULL_UP/OFF
	RETURN

ADSTART
A1	BTFSC	ADCON0,GO	;GO が 0 だったらループから抜ける
	GOTO	A1		;GO が 1 だったらループする
	MOVFF	ADRESH,HEN1B	;A/D データ上位(データは右詰)
	MOVFF	ADRESL,HEN1A	;A/D データ下位
	BSF	ADCON0,GO	;次のA/Dスタート
	BCF	STATUS,C	;2倍する
	RLCF	HEN1A,F
	RLCF	HEN1B,F
	RETURN
OUT7SEG
	MOVF	HEN3A,W	 	;1桁目10進数取得
	CALL	KOM		;7SEG変換SET
	BCF	PORTB,4		;LED ON
	MOVF	HEN3B,W		;2桁目10進数取得
	CALL	KOM		;7SEG変換SET
	BCF	PORTB,5		;LED ON
	MOVF	HEN3C,W		;3桁目10進数取得
	CALL	KOM		;7SEG変換SET
	BCF	PORTB,6		;LED ON
	MOVF	HEN3D,W		;4桁目10進数取得
	BTFSC	STATUS,Z	;W<>0 スキップ
	RETURN			;W=0 表示せず終了
	CALL	KOM		;7SEG変換SET
	BCF	PORTB,7		;LED ON
	RETURN
KOM	DECFSZ	WT
	GOTO	KOM
	CALL	TABLENUM	;7SEGDATA変換
	XORLW	H'FF'		;反転
	MOVWF	PORTC		;7SEG出力
	MOVLW	B'11111111'	;初期値 
	MOVWF	PORTB		;7SEG OFF
	RETURN
	;16ビット(2バイト)数値を10進数5桁のBCD値に変換
	;引き数は HEN1B(上位),HEN1A(下位) 
	;結果は HEN3E,HEN3D,HEN3C,HEN3B,HEN3A(下位)
HEXDEC16
	MOVLW	SRLC1		;格納場所初期値
	MOVWF	FSR0L		;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	;Cフラグのクリア
	RLCF	HEN1A,F
	RLCF	HEN1B,F
	RLCF	SRWK1,F
	MOVLW	B'11110110'	;10BCD
	ADDWF	SRWK1,W
	BTFSC	STATUS,C
	MOVWF	SRWK1
	BTFSC	STATUS,C
	INCF	HEN1A,F
	DECFSZ	SRLC1,F
	GOTO	DEVIDE0
;	DECF	FSR0L,F		;FSR
	MOVF	POSTDEC0     ;
	MOVF	SRWK1,W
	MOVWF	INDF0		;余り (INDIRECT)
	RETURN

	END


2010/11/05 上記プログラムにバグあり 修正しました。
2進/10進変換がうまくいっていませんでした。
FSRを減算するところがダメなようです。
新しい命令でPOSTDEC0を代わりに実行しました。
読み出し後-1します。
追試して頂きました。

綺麗に配線されています。

ハンダ付けの練習教材です。

バッチリ動作OK