;--------------------------------------------------------------------- ; フラッシャ(10個のLEDをフラッシュ) ; ; 2010.12.17 naka ; (1). 出力ポート ; GP0-2,5: LEDに繋ぐ ; (2). 入力ポート ; GP3: 流れるパターン切り替え ; GP4/AN3: フラッシュ速度(0〜5VをAD変換) ;--------------------------------------------------------------------- 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-25H, 25Hは下位2ビットのみ使用) LEDCNT EQU 26H ; 割り込みで表示するLED番号カウンタ PATADDR EQU 27H ; 表示パターンのアドレスカウンタ PATCNT EQU 28H ; 表示パターンの表示繰り返しカウンタ ADDATH EQU 29H ; A/D変換の測定結果(上位) FLWAIT EQU 2AH ; FLASHウエイト時間 ; BKUPW EQU 30H ; 割り込み待避用 BKUPS EQU 31H ; 割り込み待避用 BKUPFR EQU 32H ; 割り込み待避用 BKUPPCL EQU 33H ; 割り込み待避用 ; ;--------------------------------------------------------------------- ; リセット・割り込み ;--------------------------------------------------------------------- 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 ;割り込みフラグリセット ; ; LEDBUFのLEDCNTビット目を調べ、点灯するか判断 ; MOVLW LEDBUF ; LEDBUFアドレス MOVWF FSR BTFSC LEDCNT,3 ; LEDCNT>8以上ならFSR+1 INCF FSR,F ; FSR+1 ; MOVF LEDCNT,W ANDLW H'07' ; 下位ビット取り出し CALL DECBIT ; ビット位置に変換 ANDWF INDF,W BTFSC STATUS,Z ; 0以外なら表示 GOTO UNDISP ; 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 LEDCNT,F ; 次の割り込みに備え、カウントアップ MOVF LEDCNT,W SUBLW D'10' BTFSC STATUS,Z CLRF LEDCNT ; 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'80' ; プリスケーラを1:2にする MOVWF OPTION_REG ; 約2Kヘルツで割り込みが入るはず ; clock4MHz -> 1Mcycle ; 1Mcycle/256/2=1,953Hz(=512sec毎) ; LED 10個なので195Hz毎に全てを表示する。 BANK0 ; MOVLW B'00001100' ; ADFM:left/0, 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バッファクリア ; ;--------------------------------------------------------------------- ; メイン ;--------------------------------------------------------------------- MAIN BSF INTCON,T0IE ; タイマー0割り込みイネーブル BSF INTCON,GIE ; 割り込み許可 ; MAINLP CALL CHKVOL ; 電圧測定 BTFSC STATUS,Z ; 0V(0.2V未満)ならフラッシュしない GOTO MAINLP CALL SETSPEED ; フラッシュ速度設定 ; BTFSS GPIO,3 ; 方向スイッチ確認 GOTO DIRLEFT CALL PAT1 ; 右に流れる(LED0→LED9) GOTO MAINLP DIRLEFT CALL PAT2 ; 左に流れる(LED0←LED9) 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 ; ;--------------------------------------------------------------------- ; 電圧値をフラッシュ速度(Wait時間)に変換 ; 95 - (電圧レジスタ値 / 4)をWAITカウントとする ; 95 - 5V(255)/4 → 32ms ; 95 - 3V(153)/4 → 57ms ; 95 - 1V( 51)/4 → 83ms ;--------------------------------------------------------------------- SETSPEED BCF STATUS,C ; 電圧値を1/4 RRF ADDATH,F ; 1/2 BCF STATUS,C RRF ADDATH,W ; 1/2 SUBLW D'95' MOVWF FLWAIT RETURN ;--------------------------------------------------------------------- ; 電圧測定 ;--------------------------------------------------------------------- CHKVOL CLRF ADRESH ; A/D変換結果 ; BSF ADCON0,0 ; A/Dオン CALL W100US ; 100us待ち BSF ADCON0,1 ; A/D変換開始 BTFSC ADCON0,1 ; A/D変換が終わるまでループ GOTO $-1 ; ; MOVF ADRESH,W ; A/D変換結果を格納(上位8ビットのみ使用) MOVWF ADDATH ; Zフラグ保持 ; 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 ;--------------------------------------------------------------------- ; 表示パターン1 ;--------------------------------------------------------------------- ORG H'0100' PAT1 MOVLW D'11' ; LEDの表示パターン数 MOVWF CNT ; ループカウント設定 CLRF PATADDR ; パターンアドレス PAT1LP CALL PAT1DT MOVWF LEDBUF INCF PATADDR,F CALL PAT1DT MOVWF LEDBUF+1 INCF PATADDR,F CALL WFLASH DECFSZ CNT,F GOTO PAT1LP RETURN ; PAT1DT MOVLW H'01' MOVWF PCLATH MOVF PATADDR,W ADDWF PCL,F RETLW B'00000001' ; 8ビット使用 RETLW B'00000000' ; 下位2ビットのみ使用 RETLW B'00000011' ; RETLW B'00000000' ; RETLW B'00000111' ; RETLW B'00000000' ; RETLW B'00001111' ; RETLW B'00000000' ; RETLW B'00011111' ; RETLW B'00000000' ; RETLW B'00111111' ; RETLW B'00000000' ; RETLW B'01111111' ; RETLW B'00000000' ; RETLW B'11111111' ; RETLW B'00000000' ; RETLW B'11111111' ; RETLW B'00000001' ; RETLW B'11111111' ; RETLW B'00000011' ; RETLW B'00000000' ; RETLW B'00000000' ; ; ;--------------------------------------------------------------------- ; 表示パターン2 ;--------------------------------------------------------------------- PAT2 MOVLW D'11' ; LEDの表示パターン数 MOVWF CNT ; ループカウント設定 CLRF PATADDR ; パターンアドレス PAT2LP CALL PAT2DT MOVWF LEDBUF INCF PATADDR,F CALL PAT2DT MOVWF LEDBUF+1 INCF PATADDR,F CALL WFLASH DECFSZ CNT,F GOTO PAT2LP RETURN ; PAT2DT MOVLW H'01' MOVWF PCLATH MOVF PATADDR,W ADDWF PCL,F RETLW B'00000000' ; RETLW B'00000010' ; RETLW B'00000000' ; RETLW B'00000011' ; RETLW B'10000000' ; RETLW B'00000011' ; RETLW B'11000000' ; RETLW B'00000011' ; RETLW B'11100000' ; RETLW B'00000011' ; RETLW B'11110000' ; RETLW B'00000011' ; RETLW B'11111000' ; RETLW B'00000011' ; RETLW B'11111100' ; RETLW B'00000011' ; RETLW B'11111110' ; RETLW B'00000011' ; RETLW B'11111111' ; RETLW B'00000011' ; RETLW B'00000000' ; RETLW B'00000000' ; ; ;--------------------------------------------------------------------- END ;--------------------------------------------------------------------- ; 終わり ;---------------------------------------------------------------------