デジタルパネルメーター(電圧計)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クローン(互換機)を先に作ってください。
基板の大きさは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になるようにしてください。
写真でご覧のとおりシンプルになりました。
複雑です。図をじっくり眺めて設定しないと動きません。
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