PIC16F88にてアナログ入力の油温をLEDアレイ(10素子バー)にて表示させました。
ポイントは
①ダイナミック点灯にてポートの負荷電流をおさえること。
②各バーの輝度を合わせること。
③測定間隔は1sec程度とする。
ポイントは
①ダイナミック点灯にてポートの負荷電流をおさえること。
②各バーの輝度を合わせること。
③測定間隔は1sec程度とする。
LED点灯中にアナログデータの変換割込みがくると、そのバーだけ明るくなりすぎたので、表示ポートON時は割込み不使用にしました。
LISTP=PIC16F88
#INCLUDE P16F88.INC
__CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO
__CONFIG _CONFIG2 , _IESO_OFF & _FCMEN_OFF
;** macro **#INCLUDE P16F88.INC
__CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO
__CONFIG _CONFIG2 , _IESO_OFF & _FCMEN_OFF
MOVLFMACROL,FILE
MOVLWL
MOVWFFILE
ENDM
MOVFFMACROSRC,DST
MOVWFFILE
ENDM
MOVFSRC,W
MOVWFDST
ENDM
;**** Register 20H~7FH **MOVWFDST
ENDM
CNT1EQU20H;タイマー
CNT2EQU21H;タイマー
CNT3EQU22H;タイマー
CNT4EQU23H;タイマー
CNT5EQU24H;タイマー
OI_HEXEQU25H
BA_HEXEQU26H
FU_HEXEQU27H
N_FUELEQU28H
N_OILEQU29H
N_BATTEQU2AH
HYOUJIEQU2BH
TEMPEQU2CH
NTEMPEQU2DH
HYODNEQU2EH
HYOUPEQU2FH
NPORTEQU30H
WTEMPEQU31H
STEMPEQU32H
PCLATH_TEMPEQU33H
INTCUTEQU34H
INTCUT2EQU35H
;*** Bank1 A0h-EFh(80Bytes) *
ORG0;reset
GOTOPORT_INI
ORG4
GOTOINTRPT
INTRPT
GOTOINTRPT
MOVWFWTEMP
SWAPFSTATUS,W
CLRFSTATUS;先にバンク0
MOVWFSTEMP;
MOVFPCLATH,W
MOVWFPCLATH_TEMP
CLRFPCLATH
BTFSSINTCON,TMR0IF
GOTOPOPRTN
BCFINTCON,TMR0IF;TMR0 割り込みフラグリセット
;---FUEL LEVEL 入力電圧SWAPFSTATUS,W
CLRFSTATUS;先にバンク0
MOVWFSTEMP;
MOVFPCLATH,W
MOVWFPCLATH_TEMP
CLRFPCLATH
BTFSSINTCON,TMR0IF
GOTOPOPRTN
BCFINTCON,TMR0IF;TMR0 割り込みフラグリセット
DECFSZINTCUT2
GOTOPOPRTN
;*****電圧測定 16進数データ取得 *
BTFSSINTCUT,0
GOTOPOPRTN
FUELADS
GOTOPOPRTN
MOVLWB'10010001';RA2データ蓄積
MOVWFADCON0
CALLT10uS
CALLT10uS;蓄積待ち
BSFADCON0,GO;A/D変換開始
BTFSCADCON0,2
GOTO $-1
MOVFFADRESH,FU_HEX;16進データを保存
RLFINTCUT,F
;--OIL_TEMP 入力電圧------
MOVWFADCON0
CALLT10uS
CALLT10uS;蓄積待ち
BSFADCON0,GO;A/D変換開始
BTFSCADCON0,2
GOTO $-1
MOVFFADRESH,FU_HEX;16進データを保存
RLFINTCUT,F
BTFSSINTCUT,1
GOTOPOPRTN
TEMPADS
GOTOPOPRTN
MOVLWB'10011001';RA3データ蓄積
MOVWFADCON0
CALLT10uS
CALLT10uS;蓄積待ち
BSFADCON0,GO;A/D変換開始
BTFSCADCON0,2
GOTO $-1
MOVFFADRESH,OI_HEX;16進データを保存
RLFINTCUT,F
;---BaTT 入力電圧-------
MOVWFADCON0
CALLT10uS
CALLT10uS;蓄積待ち
BSFADCON0,GO;A/D変換開始
BTFSCADCON0,2
GOTO $-1
MOVFFADRESH,OI_HEX;16進データを保存
RLFINTCUT,F
BTFSSINTCUT,2
GOTOPOPRTN
BATTADS
GOTOPOPRTN
MOVLWB'10100001';RA4データ蓄積
MOVWFADCON0
CALLT10uS
CALLT10uS;蓄積待ち
BSFADCON0,GO;A/D変換開始
BTFSCADCON0,2
GOTO $-1
MOVFFADRESH,BA_HEX;16進データを保存
MOVLFB'00000001',INTCUT
MOVLFD'10',INTCUT2
POPRTN
MOVWFADCON0
CALLT10uS
CALLT10uS;蓄積待ち
BSFADCON0,GO;A/D変換開始
BTFSCADCON0,2
GOTO $-1
MOVFFADRESH,BA_HEX;16進データを保存
MOVLFB'00000001',INTCUT
MOVLFD'10',INTCUT2
SWAPFSTEMP,W
MOVWFSTATUS
SWAPFWTEMP,F
SWAPFWTEMP,W
RETFIE
;HHHH メインループはじめ HHHMOVWFSTATUS
SWAPFWTEMP,F
SWAPFWTEMP,W
RETFIE
PORT_INI;入出力モード初期設定
clrwdt
MOVWF TRISB ;PORTBの設定
CLRFPIE1
CLRFPIE2
MOVLWB'01101110';OSCILLATOR CONTROL
MOVWFOSCCON;Primary Oscllator
MOVLWB'01000000';Vref+=VDD Vref=Vss ADFM "1"
MOVWFADCON1;A/Dコンバータ1設定
BCF STATUS,RP0 ;Bank0に戻す
MOVLWB'00000000'
MOVWFT1CON;TMR1不使用
CLRFPIR1
CLRFPIR2
MOVLFB'10100000',INTCON
;*** メインプログラム ******
BSF STATUS,RP0 ;Bank1に切替え
MOVLWB'00011100';ANSEL アナログOFFの設定
;RA2,3,4 アナログセット
MOVWF ANSEL ;設定(TRISAより先に)
MOVLWB'00111100';PORT Aの設定 RA2,3,4,5
MOVWF ANSEL ;設定(TRISAより先に)
MOVWF TRISA ;設定
MOVLWB'00000000';PORT Bの設定MOVWF TRISB ;PORTBの設定
MOVLWB'10000111';*UPエッジ、分周比()
;OPTION_REG 1:128
MOVWFOPTION_REG;;OPTION_REG 1:128
CLRFPIE1
CLRFPIE2
MOVLWB'01101110';OSCILLATOR CONTROL
MOVWFOSCCON;Primary Oscllator
MOVLWB'01000000';Vref+=VDD Vref=Vss ADFM "1"
MOVWFADCON1;A/Dコンバータ1設定
BCF STATUS,RP0 ;Bank0に戻す
MOVLWB'00000000'
MOVWFT1CON;TMR1不使用
CLRFPIR1
CLRFPIR2
MOVLFB'10100000',INTCON
BSFPORTA,0
BSFPORTA,1
MAINLOOP
BSFPORTA,1
MOVFFU_HEX,W
CALLHEX10
MOVWFN_FUEL
MOVFOI_HEX,W
CALLHEX10
MOVWFN_OIL
MOVFBA_HEX,W
CALLHEX10
MOVWFN_BATT
;*** LEDアレイCOM選択 ****CALLHEX10
MOVWFN_FUEL
MOVFOI_HEX,W
CALLHEX10
MOVWFN_OIL
MOVFBA_HEX,W
CALLHEX10
MOVWFN_BATT
;---- COM1 ON
BCFPORTA,0
BSFPORTA,1
MOVFN_FUEL,W
CALLLEDHYO
BSFPORTA,0
BSFPORTA,1
;---- COM2 ON
BSFPORTA,1
MOVFN_FUEL,W
CALLLEDHYO
BSFPORTA,0
BSFPORTA,1
BSFPORTA,0
BCFPORTA,1
BTFSSPORTA,5
GOTOCOM2_BA
MOVFN_OIL,W
GOTOCOM2_JP
COM2_BAMOVFN_BATT,WBCFPORTA,1
BTFSSPORTA,5
GOTOCOM2_BA
MOVFN_OIL,W
GOTOCOM2_JP
COM2_JPCALLLEDHYO
BSFPORTA,0
BSFPORTA,1
GOTOMAINLOOP
;***16進数データを10段階にする***BSFPORTA,1
GOTOMAINLOOP
HEX10MOVWFTEMP
clrfNTEMP
AAHMOVLWD'25'
SUBWFTEMP;f-W
BTFSSSTATUS,C;cは正なら1
GOTO$+3
INCFNTEMP,F
GOTOAAH
MOVFNTEMP,W
RETURN
;***表示制御(ダイナミック点灯)***BTFSSSTATUS,C;cは正なら1
GOTO$+3
INCFNTEMP,F
GOTOAAH
MOVFNTEMP,W
RETURN
HYOJI
BCFINTCON,TMR0IE;割り込み中止
BTFSCHYOUP,1
BSFPORTA,7
CALLT1ms
BCFPORTA,7
BTFSCHYOUP,0
BSFPORTA,6
CALLT1ms
BCFPORTA,6
BTFSCHYODN,7
BSFPORTB,7
CALLT1ms
BCFPORTB,7
BTFSCHYODN,6
BSFPORTB,6
CALLT1ms
BCFPORTB,6
BTFSCHYODN,5
BSFPORTB,5
CALLT1ms
BCFPORTB,5
BTFSCHYODN,4
BSFPORTB,4
CALLT1ms
BCFPORTB,4
BTFSCHYODN,3
BSFPORTB,3
CALLT1ms
BCFPORTB,3
BTFSCHYODN,2
BSFPORTB,2
CALLT1ms
BCFPORTB,2
BTFSCHYODN,1
BSFPORTB,1
CALLT1ms
BCFPORTB,1
BTFSCHYODN,0
BSFPORTB,0
CALLT1ms
BCFPORTB,0
BSFINTCON,TMR0IE;割り込み復帰
RETURN
;10段階数値を10ヶのLEDで表示BTFSCHYOUP,1
BSFPORTA,7
CALLT1ms
BCFPORTA,7
BTFSCHYOUP,0
BSFPORTA,6
CALLT1ms
BCFPORTA,6
BTFSCHYODN,7
BSFPORTB,7
CALLT1ms
BCFPORTB,7
BTFSCHYODN,6
BSFPORTB,6
CALLT1ms
BCFPORTB,6
BTFSCHYODN,5
BSFPORTB,5
CALLT1ms
BCFPORTB,5
BTFSCHYODN,4
BSFPORTB,4
CALLT1ms
BCFPORTB,4
BTFSCHYODN,3
BSFPORTB,3
CALLT1ms
BCFPORTB,3
BTFSCHYODN,2
BSFPORTB,2
CALLT1ms
BCFPORTB,2
BTFSCHYODN,1
BSFPORTB,1
CALLT1ms
BCFPORTB,1
BTFSCHYODN,0
BSFPORTB,0
CALLT1ms
BCFPORTB,0
BSFINTCON,TMR0IE;割り込み復帰
RETURN
LEDHYO
MOVWFTEMP
CLRFHYODN
CLRFHYOUP
MOVFTEMP,W
BTFSCSTATUS,Z
GOTORETEND
HYOBBBSFSTATUS,C
CLRFHYODN
CLRFHYOUP
MOVFTEMP,W
BTFSCSTATUS,Z
GOTORETEND
RLFHYODN,F;左シフト
BTFSCSTATUS,C
RLFHYOUP,F;左シフト
DECFSZTEMP,F
GOTOHYOBB
RETENDCALLHYOJI
BTFSCSTATUS,C
RLFHYOUP,F;左シフト
DECFSZTEMP,F
GOTOHYOBB
RETURN
;---- タイマー ----T10uS;1クロックサイクル1/4MHz*4=1usec
MOVLWH'02'
MOVWFCNT1
DECFSZCNT1,F;2+(1+2)*2-1=7
GOTO$-1
GOTO$+1;7+2=9
RETURN;(9+1)=10usec
T1ms
MOVWFCNT1
DECFSZCNT1,F;2+(1+2)*2-1=7
GOTO$-1
GOTO$+1;7+2=9
RETURN;(9+1)=10usec
MOVLWd'199'
MOVWFCNT1
goto$+1
DECFSZCNT1,F;2+(1+2+2)*199-1=996
GOTO$-2
goto$+1;996+2=998
nop;998+1
RETURN;(999+1)=1msec
END
MOVWFCNT1
goto$+1
DECFSZCNT1,F;2+(1+2+2)*199-1=996
GOTO$-2
goto$+1;996+2=998
nop;998+1
RETURN;(999+1)=1msec
END