;--------------------------------------------------------------------- ; USB電力インジケータ(電流量に応じて10個のLEDをフラッシュ) ; ; 2013.9.24 naka ; 1. I/Oポート ; ; (1). 出力ポート ; GP0-2,5: LEDに繋ぐ ; (2). 入力ポート ; GP4/AN3: 電圧降下測定(AD変換) ; ; 2. 光り方 ; ; 電流量(シャント抵抗による電圧降下を測定)に応じて、 ; LEDの光の流れる速さが変わる。 ; ; LED 0 1 2 3 4 5 6 7 8 9 ; ・▲●○○○○○○○ ; →流れる方向 ; ; 先頭のLEDは明るく、2番目はその半分、3番目はさらに半分の明るさ ; として残光を表現。明るさはソフトでのPWMで制御している。 ; ; 3. 電圧降下測定 ; ; VDDをリファレンスとして、シャント抵抗(40mΩ)後の電圧を測定。 ; ・AD変換は10ビット(1,024)精度なので5V/1024=約0.005V単位で測定可能 ; ・測定可能な最小電流単位 0.005V/0.04Ω=0.125A ; ・2A流れたとき 2/0.125=16(AD変換時のVDDとの差の値) ; ; ちなみに1A時の電圧降下は1A*0.04Ω=0.04Vで電源供給にはほとんど影響 ; しない。ACアダプタの電圧降下の方が大きい。 ; ;--------------------------------------------------------------------- LIST P=PIC12F675 INCLUDE "P12F675.INC" __CONFIG _CPD_OFF & _CP_OFF & _BODEN_ON & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT ERRORLEVEL -302 ;アセンブル時のバンク警告メッセージ抑制 ;--------------------------------------------------------------------- ; マクロ定義 ;--------------------------------------------------------------------- BANK0 MACRO BCF STATUS,RP0 ;BANK0に切り替える ENDM BANK1 MACRO BSF STATUS,RP0 ;BANK1に切り替える ENDM ;--------------------------------------------------------------------- ; 変数レジスタの定義 ;--------------------------------------------------------------------- CNT EQU 20H ; カウンタ CNT1 EQU 21H ; WAIT用カウンタ CNT2 EQU 22H ; WAIT用カウンタ LED_NO EQU 23H ; 点灯するLED番号(0〜9) LEDBUF EQU 24H ; LED表示バッファ(24-26H) LEDCNT EQU 27H ; 割り込みで表示するLED番号カウンタ PATADDR EQU 28H ; 表示パターンのアドレスカウンタ PATCNT EQU 29H ; 表示パターンの表示繰り返しカウンタ TMP EQU 2AH ; 一時作業用 DROPVLT EQU 2BH ; 電圧降下(125mV単位) FLWAIT EQU 2CH ; FLASHウエイト時間 SUMVLT EQU 2DH ; ドロップ電圧(平均値を出すための積算値) CHKCNT EQU 2EH ; 電圧測定のタイミングカウンタ ; 256us毎の割り込み50回に1回測定し、16回測定して平均を出す ; 256us x 50 x 16 = 0.2048s 毎に平均値がでる SUMCNT EQU 2FH ; 積算のカウント PWMCNT EQU 30H ; 疑似PWMのためのカウンタ(0〜3で変化) BKUPW EQU 40H ; 割り込み待避用 BKUPS EQU 41H ; 割り込み待避用 BKUPFR EQU 42H ; 割り込み待避用 BKUPPCL EQU 43H ; 割り込み待避用 ; ;--------------------------------------------------------------------- ; リセット・割り込み ;--------------------------------------------------------------------- ORG 00H ; リセット時の飛び込み先 RESET GOTO START ; 初期設定へ ; ;--------------------------------------------------------------------- ; 割り込み処理でダイナミック表示を行う。 ; LEDBUFの0ビット目から順次表示(1回の割り込みで1ビット分) ;--------------------------------------------------------------------- ORG 04H ; 割り込み時の飛び込み先 INTRUPT ;レジスタ待避 MOVWF BKUPW ;バックアップ(Wレジ) SWAPF STATUS,W ;バックアップ(STATUSレジ) MOVWF BKUPS MOVF FSR,W ;バックアップ(FSRレジ) MOVWF BKUPFR MOVF PCLATH,W ;バックアップ(PCLATHレジ) MOVWF BKUPPCL ; BCF INTCON,T0IF ;割り込みフラグリセット ; ; 点灯するLEDの明るさを確認 ; MOVF LEDCNT,W ; LED番号 CALL LEDBRT ; 0,1,2,4が返る SUBWF PWMCNT,W ; PWMCNT - 明るさ > 0 なら点灯 BTFSS STATUS,C GOTO DISP GOTO UNDISP ; DISP MOVF LEDCNT,W MOVWF LED_NO ; 表示番号をLED_NOへ ; ; LED表示 ; CLRF GPIO MOVF LED_NO,W CALL TABLE_TRIS BSF STATUS,RP0 ; bank1 切り替え MOVWF TRISIO BCF STATUS,RP0 ; bank0に戻す MOVF LED_NO,W CALL TABLE_IO MOVWF GPIO ; GOTO NEXTBIT ; UNDISP CLRF GPIO ; LED非表示 ; NEXTBIT INCF PWMCNT,W ANDLW H'03' MOVWF PWMCNT BTFSS STATUS,Z GOTO CHKVOLT ; INCF LEDCNT,F ; 次の割り込みに備え、カウントアップ MOVF LEDCNT,W SUBLW D'10' BTFSC STATUS,Z CLRF LEDCNT ; ; CHKVOLT ; 電圧測定 INCF CHKCNT,F MOVF CHKCNT,W SUBLW D'50' ; 割り込み50回に1回測定 BTFSS STATUS,Z GOTO RSTREG CLRF CHKCNT CALL CHKVOL ; 電圧測定 ADDWF SUMVLT,F ; INCF SUMCNT,F MOVF SUMCNT,W SUBLW D'16' ; 測定回数(16回)チェック BTFSS STATUS,Z GOTO RSTREG CLRF SUMCNT CALL AVEVOL ; 平均の電圧降下(電流)を計算 CALL SETSPEED ; 電圧降下値をフラッシュ速度に変換 ; RSTREG ;レジスタ復元 MOVF BKUPPCL,W ;復元(PCLATHレジ) MOVWF PCLATH MOVF BKUPFR,W ;復元(FSRレジ) MOVWF FSR SWAPF BKUPS,W ;復元(STATUSレジ) MOVWF STATUS SWAPF BKUPW,F ;復元(Wレジ)LED_NO SWAPF BKUPW,W ; RETFIE ;割り込みから復帰 ; ;--------------------------------------------------------------------- ; 初期設定 ;--------------------------------------------------------------------- START BCF INTCON,GIE ; 全割込み禁止 BANK1 CALL 3FFH ; 内部OSCのキャリブレーションデータ MOVWF OSCCAL ; OSCCALレジスタにセット MOVLW B'00111000' ; 内部osc(ADCS2-0:011), MOVWF ANSEL ; AN3をアナログ,GP0-2をデジタルI/O MOVLW H'6F' MOVWF TRISIO ; ポートを入力設定 ;割り込みタイマーセット MOVLW H'88' ; プリスケーラを使わない MOVWF OPTION_REG ; clock4MHz -> 1Mcycle ; 1Mcycle/256=3,906Hz(=256usec毎) ; 割り込み4回でひとつのLEDを点灯 ; 明るい :割り込み4回とも点灯 ; 少し暗い:割り込み4回のうち2回のみ点灯 ; 暗い :割り込み4回のうち1回のみ点灯 ; LED 10個x4回なので3,906/40=96Hzとなりチラチラしない BANK0 ; MOVLW B'10001100' ; ADFM:right/1, VCFG:VDD/0, CHS:ch3/11 MOVWF ADCON0 ; MOVLW B'00000111' ; GP0-2をデジタルI/Oに設定 MOVWF CMCON ; デフォルトはコンパレータ ; CLRF LEDCNT ; LEDカウンタクリア CLRF LEDBUF ; LEDバッファクリア CLRF LEDBUF+1 ; LEDバッファクリア CLRF LEDBUF+2 ; LEDバッファクリア ; CLRF CHKCNT CLRF SUMCNT CLRF SUMVLT CLRF DROPVLT CLRF PWMCNT ; ;--------------------------------------------------------------------- ; メイン ;--------------------------------------------------------------------- MAIN BSF INTCON,T0IE ; タイマー0割り込みイネーブル BSF INTCON,GIE ; 割り込み許可 ; MAINLP MOVF DROPVLT,F ; 電圧降下が0ならLEDはフラッシュしない BTFSS STATUS,Z GOTO FLASHON CALL NOFLASH GOTO MAINLP FLASHON CALL FLASH GOTO MAINLP ; ;--------------------------------------------------------------------- ; I/Oパターン ;--------------------------------------------------------------------- TABLE_IO CLRF PCLATH ADDWF PCL,F RETLW B'00000001' ; LED 0 RETLW B'00000010' ; LED 1 RETLW B'00000010' ; LED 2 RETLW B'00000100' ; LED 3 RETLW B'00000100' ; LED 4 RETLW B'00100000' ; LED 5 RETLW B'00000001' ; LED 6 RETLW B'00000100' ; LED 7 RETLW B'00000001' ; LED 8 RETLW B'00100000' ; LED 9 ; TABLE_TRIS CLRF PCLATH ADDWF PCL,F RETLW B'00111100' ; LED 0 RETLW B'00111100' ; LED 1 RETLW B'00111001' ; LED 2 RETLW B'00111001' ; LED 3 RETLW B'00011011' ; LED 4 RETLW B'00011011' ; LED 5 RETLW B'00111010' ; LED 6 RETLW B'00111010' ; LED 7 RETLW B'00011110' ; LED 8 RETLW B'00011110' ; LED 9 ; ;--------------------------------------------------------------------- ; Wレジ値をビット位置にデコード ;--------------------------------------------------------------------- DECBIT CLRF PCLATH ADDWF PCL,F DECBIT1 RETLW B'00000001' ;0 RETLW B'00000010' ;1 RETLW B'00000100' ;2 RETLW B'00001000' ;3 RETLW B'00010000' ;4 RETLW B'00100000' ;5 RETLW B'01000000' ;6 RETLW B'10000000' ;7 ; ;--------------------------------------------------------------------- ; LED番号からLEDBUFの値(明るさ)を取り出す(0,1,2,4) ;--------------------------------------------------------------------- LEDBRT BCF STATUS,C RLF LEDCNT,W ; LED番号を2倍しジャンプ先アドレスに変換 CLRF PCLATH ADDWF PCL,F ; CALL LEDNO_0 GOTO LEDBRT_1 CALL LEDNO_1 GOTO LEDBRT_1 CALL LEDNO_2 GOTO LEDBRT_1 CALL LEDNO_3 GOTO LEDBRT_1 CALL LEDNO_4 GOTO LEDBRT_1 CALL LEDNO_5 GOTO LEDBRT_1 CALL LEDNO_6 GOTO LEDBRT_1 CALL LEDNO_7 GOTO LEDBRT_1 CALL LEDNO_8 GOTO LEDBRT_1 CALL LEDNO_9 LEDBRT_1 MOVWF TMP SUBLW D'3' BTFSC STATUS,Z INCF TMP,F MOVF TMP,W RETURN ; LEDNO_0 MOVF LEDBUF,W ANDLW B'00000011' ; LEDNO = 0 RETURN ; LEDNO_1 MOVF LEDBUF,W ANDLW B'00001100' ; LEDNO = 1 MOVWF TMP BCF STATUS,C RRF TMP,F RRF TMP,W RETURN ; LEDNO_2 SWAPF LEDBUF,W ANDLW B'00000011' ; LEDNO = 2 RETURN ; LEDNO_3 SWAPF LEDBUF,W ANDLW B'00001100' ; LEDNO = 3 MOVWF TMP BCF STATUS,C RRF TMP,F RRF TMP,W RETURN ; LEDNO_4 MOVF LEDBUF+1,W ANDLW B'00000011' ; LEDNO = 4 RETURN ; LEDNO_5 MOVF LEDBUF+1,W ANDLW B'00001100' ; LEDNO = 5 MOVWF TMP BCF STATUS,C RRF TMP,F RRF TMP,W RETURN ; LEDNO_6 SWAPF LEDBUF+1,W ANDLW B'00000011' ; LEDNO = 6 RETURN ; LEDNO_7 SWAPF LEDBUF+1,W ANDLW B'00001100' ; LEDNO = 7 MOVWF TMP BCF STATUS,C RRF TMP,F RRF TMP,W RETURN ; LEDNO_8 MOVF LEDBUF+2,W ANDLW B'00000011' ; LEDNO = 8 RETURN ; LEDNO_9 MOVF LEDBUF+2,W ANDLW B'00001100' ; LEDNO = 9 MOVWF TMP BCF STATUS,C RRF TMP,F RRF TMP,W RETURN ; ;--------------------------------------------------------------------- ; 平均電圧を計算(積算値を16で割る) ;--------------------------------------------------------------------- AVEVOL SWAPF SUMVLT,W ANDLW H'0F' MOVWF DROPVLT CLRF SUMVLT RETURN ; ;--------------------------------------------------------------------- ; 電圧降下値(電流値)をフラッシュ速度(Wait時間)に変換 ; 電流が小さいとゆっくりフラッシュし、大きいと速くフラッシュする。 ;--------------------------------------------------------------------- SETSPEED MOVF DROPVLT,W ANDLW H'0F' ; 15でリミッタ CALL SPEEDDT MOVWF FLWAIT RETURN SPEEDDT CLRF PCLATH ADDWF PCL,F ; 電圧降下(mV) RETLW D'200' ; 0 RETLW D'180' ; 1 RETLW D'145' ; 2 RETLW D'120' ; 3 RETLW D'101' ; 4 RETLW D'85' ; 5 RETLW D'72' ; 6 RETLW D'60' ; 7 RETLW D'50' ; 8 RETLW D'41' ; 9 RETLW D'33' ; 10 RETLW D'25' ; 11 RETLW D'18' ; 12 RETLW D'11' ; 13 RETLW D'5' ; 14 RETLW D'1' ; 15 RETURN ;--------------------------------------------------------------------- ; 電圧測定 ; AD変換の参照電圧はVDDなので、VDDと同じなら1023(12bit) ; 1023とAD変換値の差が電圧効果分(1023=5V -> 1=約5mV) ; 電流=電圧/抵抗 ... 5mV/40mΩ=125mA ; 最大2Aとすると、2,000mA/125mA=16 ... 16段階 ;--------------------------------------------------------------------- CHKVOL CLRF ADRESH ; A/D変換結果 CLRF ADRESL ; A/D変換結果 ; BSF ADCON0,0 ; A/Dオン CALL W100US ; 100us待ち BSF ADCON0,1 ; A/D変換開始 BTFSC ADCON0,1 ; A/D変換が終わるまでループ GOTO $-1 ; ; ; 1023 - 測定値 を計算 (1023=H'3FF') ; 電位差は最大16程度なので下位8ビットの差でOK BANK1 MOVF ADRESL,W ; 測定結果 BANK0 SUBLW H'FF' ; Wにドロップ電圧を持ってリターン ; VDD=H'FF'なので差がドロップ電圧 ; RETURN ; ;--------------------------------------------------------------------- ; Waitルーチン(注)割り込みが入るので下記時間にはならない ;--------------------------------------------------------------------- W100US ; 約100usec MOVLW D'32' MOVWF CNT1 W100USLP DECFSZ CNT1,F GOTO W100USLP RETURN ; WAIT1MS ;1ミリ秒(998usec) CALLと合わせて1.000ms MOVLW D'248' ;1cycle MOVWF CNT1 ;1cycle W1MSLP NOP ;1cycle*248 DECFSZ CNT1,F ;1cycle*247+2cycle GOTO W1MSLP ;2cycle*247 GOTO $+1 ;2cycle NOP ;1cycle RETURN ;2cycle ; WFLASH MOVF FLWAIT,W ;1cycle MOVWF CNT2 ;1cycle WFLASHLP CALL WAIT1MS DECFSZ CNT2,F GOTO WFLASHLP RETURN ;--------------------------------------------------------------------- ; フラッシュしない ;--------------------------------------------------------------------- NOFLASH MOVLW B'00000001' MOVWF LEDBUF CLRF LEDBUF+1 CLRF LEDBUF+2 RETURN ;--------------------------------------------------------------------- ; 表示パターン1 ;--------------------------------------------------------------------- FLASH MOVLW D'13' ; LEDの表示パターン数 MOVWF CNT ; ループカウント設定 CLRF PATADDR ; パターンアドレス FLASHLP CALL PAT1DT MOVWF LEDBUF INCF PATADDR,F CALL PAT1DT MOVWF LEDBUF+1 INCF PATADDR,F CALL PAT1DT MOVWF LEDBUF+2 INCF PATADDR,F ; CALL WFLASH DECFSZ CNT,F GOTO FLASHLP RETURN ; PAT1DT MOVLW H'01' MOVWF PCLATH MOVF PATADDR,W ADDWF PCL,F ; 疑似PWMで1灯あたり4回の割り込みで点灯 ; 明るい:4回共オン 定義値3 = '11' ; 中間:2回だけオン 2 = '10' ; 暗い:1回だけオン 1 = '01' ; ; bit意味 xx xx xx xx ; LED 4 3 2 1 ; bit意味 xx xx xx xx ; LED 8 7 6 5 ; bit意味 -- -- xx xx ; LED 10 9 RETLW B'00000011' ; RETLW B'00000000' ; RETLW B'00000000' ; ; RETLW B'00001110' ; RETLW B'00000000' ; RETLW B'00000000' ; ; RETLW B'00111001' ; RETLW B'00000000' ; RETLW B'00000000' ; ; RETLW B'11100100' ; RETLW B'00000000' ; RETLW B'00000000' ; ; RETLW B'10010000' ; RETLW B'00000011' ; RETLW B'00000000' ; ; RETLW B'01000000' ; RETLW B'00001110' ; RETLW B'00000000' ; ; RETLW B'00000000' ; RETLW B'00111001' ; RETLW B'00000000' ; ; RETLW B'00000000' ; RETLW B'11100100' ; RETLW B'00000000' ; ; RETLW B'00000000' ; RETLW B'10010000' ; RETLW B'00000011' ; ; RETLW B'00000000' ; RETLW B'01000000' ; RETLW B'00001110' ; ; RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00001001' ; ; RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000100' ; ; RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000000' ; ; ;--------------------------------------------------------------------- END ;--------------------------------------------------------------------- ; 終わり ;---------------------------------------------------------------------