; 内部クロックを使用する   LEDを点滅させる * ; * ; 20msから50ms位のタイマにより全体のコントロールを行う * ; 基準時間単位の割り込み処理の中で,各タイマーのカウントアップ入力のチェックなどを行う * ; 明から暗になってから所定の時間をカウントする タイマー  約2時間 * ; 人を検出して点滅を強化する期間  モーションセンサーが検出してから  数分 * ; 点滅の切り替えの時間           0.1Sから数秒                     * ; 基準クロックは 内蔵の基準クロックを使用するのでオーダーの範囲の正確さでよいとする          * ; * ;********************************************************************** ; Filename: pic12f683.asm * ; Date: 2006/10/26 * ; File Version: v2.1 * ; Author: Y.Kanzaki * ;********************************************************************** list p=12F683 ; list directive to define processor #include ; processor specific variable definitions errorlevel -302 ; suppress message 302 from list file __CONFIG _FCMEN_ON & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT ;***** VARIABLE DEFINITIONS w_temp EQU 0x70 ; variable used for context saving status_temp EQU 0x71 ; variable used for context saving t_work1 equ 22h control equ 23h ; b0 明暗のコントロールビット 1 暗い 0 明るい ; b2 ステータスビット   1  フル   0 セーブ mlpc equ 24h ; メインの処理のループカウンタ lpc equ 25h ; 初期のテストモードのループカウンタ lpc2 equ 26h ; センサー検出時の処理のループカウンタ cword equ 27h ; LED点灯の制御ワード onword equ 28h ; LEDの点灯をオンにする制御ワード ontimep equ 29h ; LEDの点灯時間をセットする oftimep equ 2Ah ; LEDの消灯時間をセットする ;********************************************************************** ORG 0x000 ; processor reset vector goto main ; go to beginning of program ORG 0x004 ; interrupt vector location ; movwf w_temp ; save off current W register contents ; movf STATUS,w ; move status register into W register ; movwf status_temp ; save off contents of STATUS register ; isr code can go here or be located as a call subroutine elsewhere ; movf status_temp,w ; retrieve copy of STATUS register ; movwf STATUS ; restore pre-isr STATUS register contents ; swapf w_temp,f ; swapf w_temp,w ; restore pre-isr W register contents ; retfie ; return from interrupt ; ; 1)PIC12F863の初期設定ルーチン main bcf STATUS,RP0 ; バンク0を選択 clrf GPIO ; 汎用出力を全て0 bsf T1CON,T1CKPS1 ; プリスケーラ 11 1:8 内部クロック4MHz/4 bsf T1CON,T1CKPS0 ; プリスケーラの設定を完了 bcf T1CON,TMR1CS ; タイマー1 ソースクロック は内部クロックを設定 bsf STATUS,RP0 ; バンク1を選択 movlw 00AH ; GP1,GP3は入力 movwf TRISIO ; 汎用IOの出力,入力に設定 movlw 088h ; 10001000    b7=1 コンパレータ オン movwf VRCON ; 1/2Vddで比較 bcf STATUS,RP0 ; バンク0を選択 ; day or naight check CMCON0 00000100 movlw 04h ; GPIO1以外デジタルIOに設定 movwf CMCON0 ; コマンドの書き込み GPIO1はコンパレータ入力 clrf CMCON1 ; CMCON1 00hに設定 ; 2)初期テスト処理ルーチン  movlw 0Ah movwf lpc ; lpc はループカウンタ loop bsf GPIO,0 bsf GPIO,5 ; GPIO0以外は点滅を繰り返す bsf GPIO,2 ; bsf GPIO,4 ; btfss CMCON0,6; 1 Vin+>Vin- 暗くなると1になる bcf GPIO,0 ; 暗くないので GPIOをLにして消灯 btfsc CMCON0,6; 0 明るいと次をスキップする bsf GPIO,0 ; 暗いとこの処理を行い GPIO0を点灯する call delay btfss CMCON0,6; 暗くなるのをチェック bcf GPIO,0 btfsc CMCON0,6 bsf GPIO,0 call delay ; テスト時間として待ち時間を設ける bcf GPIO,2 ; GPIO2 off bcf GPIO,4 ; GPIO4 off bcf GPIO,5 ; GPIO5 off btfss CMCON0,6; 1 Vin+>Vin- 暗くなると1になる bcf GPIO,0 ; 暗くないので GPIO0をLにして消灯 btfsc CMCON0,6; 0 明るいと次をスキップする bsf GPIO,0 ; 暗いとこの処理を行い GPIO0を点灯する call delay btfss CMCON0,6; 暗くなるのをチェック bcf GPIO,0 btfsc CMCON0,6 bsf GPIO,0 call delay ; テスト時間として待ち時間を設ける decfsz lpc,1 ; goto loop ; lpcにセットした回数繰り返す ; 明るさチェックの設定,LED点灯等のテストがここまで ; 3)メイン処理ループ ここの処理を繰り返す mlp: movlw d'10' ; このループを繰り返す間にセンサーが検出しなければセーブモードになる movwf mlpc ; ループカウンタにセット この値でセーブモードに入る時間を制御できる lp2: bcf GPIO,0 ; 各出力をクリアして LEDを消灯 bcf GPIO,2 ; bcf GPIO,4 ; bcf GPIO,5 ; btfss CMCON0,6; 明るさのチェック 1 で暗い call light ; 明るいときの処理へ btfsc CMCON0,6; 再度明るさのチェック 0 で明るい call dark ; 暗いときの処理へ btfss GPIO,3 ; センサーのチェック 1 でなし call senser ; 人が検出されたときの処理へ movf oftimep,w; offの時間を取り出す call deln ; 設定された時間 待つ btfss CMCON0,6; 明るさのチェック 1 暗い call light ; 0 で明るいときの処理 btfsc CMCON0,6; 0 で明るい call dark ; 暗いときの処理 bsf onword,0; 点灯するビットをセット bsf onword,2;  bsf onword,4; bsf onword,5; movf cword,w ; 点灯制御ワードを取り出す andwf onword,w; 点灯データ作成 movwf GPIO ; 点灯制御 btfss GPIO,3 ; センサーのチェック call senser ; 0の場合検出時の点滅処理に  movf ontimep,w;  call deln ; Wに指定した時間のタイマー処理 decfsz mlpc,1 ; goto lp2 ; bcf control,2; セーブモードに入る goto mlp ; 4) センサー検出時処理ルーチン senser movlw 30h ; センサーで検出されたときの処理  movwf lpc2 ; ここに設定する値で強化された点滅時間の長さが決まる bsf control,2; フルモードに入る 暗いとき lp3 movlw 3h ; 早すぎる場合はこの値を増やす call deln bcf GPIO,2 bcf GPIO,4 bcf GPIO,5 bcf GPIO,0 movlw 3h call deln bsf GPIO,0 bsf GPIO,5 bsf GPIO,2 bsf GPIO,4 decfsz lpc2,1 goto lp3 ; セーブモードに入る回数はmlpcで決まる movlw d'250' ; d'250'250回点滅を中に ; movwf mlpc ; 人を検出しないとセーブモード return ; 5) 暗いときのパラメータ設定処理 dark movlw 3Fh ; 全LEDを点灯 btfss control,2 ; セーブモードの時 movlw 01h ; cwordの値で制御する movwf cword ; 点灯するLEDのビットを1にすると増加できる movlw 15h ; LEDの点灯時間の値,大きくすると長くなる btfss control,2 ; セーブモードのチェック movlw 02h ; セーブモードのときの点灯時間  movwf ontimep movlw 15h btfss control,2 ; セーブモードのとき消灯時間を長くする movlw 30h movwf oftimep bsf STATUS,RP0 ; バンク1を選択 ヒステリシス設定のため movlw 089h ; 10001001    b7=1 コンパレータ オン movwf VRCON ; 1/2Vddで比較 bcf STATUS,RP0 ; バンク0を選択; movlw 89h bsf control,0 return ; 6) 明るいときのパラメータ設定処理 light movlw 01h ; 明るいときLEDの点灯を少なくするため movwf cword movlw 30h ; 消灯時間を長く設定している movwf oftimep movlw 02h movwf ontimep ; 点灯時間を短くする bsf STATUS,RP0 ; バンク1を選択 movlw 087h ; 10000111    b7=1 コンパレータ オン movwf VRCON ; 1/2Vddで比較 bcf STATUS,RP0 ; バンク0を選択 bcf control,0 return ; 7) 時間町の処理ルーチン delay movlw 20h deln movwf t_work1 ; 約0.6秒のタイマー rep2 bcf T1CON,TMR1ON movlw d'236' ; 236*256+221 movwf TMR1H ;  movlw d'221' movwf TMR1L ; おおよそ0.1秒のタイマーになる bcf PIR1,TMR1IF bsf T1CON,TMR1ON rep1 btfss PIR1,TMR1IF ; 計時完了をチェック goto rep1 decfsz t_work1,F ; 指定した回数完了か? goto rep2 return END ; directive 'end of program'