; ; ; ; list p=12f675 ; list directive to define processor #include ; processor specific variable definitions errorlevel -302 ; suppress message 302 from list file CB = _CP_OFF ;プログラムのコードプロテクト CB &= _CPD_OFF ;データEEPROMのコードプロテクト CB &= _BODEN_ON ;ブラウンアウトリセット CB &= _MCLRE_OFF ;外部リセット入力ピン(GP3) CB &= _WDT_ON ;ウォッチドッグタイマ CB &= _PWRTE_ON ;パワーアップタイマー CB &= _INTRC_OSC_NOCLKOUT ;内部発信器 __CONFIG CB ;***** VARIABLE DEFINITIONS w_temp EQU 0x20 ; variable used for context saving status_temp EQU 0x21 ; variable used for context saving w_tmp1 EQU 0x22 ;wait用 w_tmp2 EQU 0x23 w_tmp3 EQU 0x24 w_tmp4 EQU 0x25 w_tmp5 EQU 0x26 w_tmp10 EQU 0x30 w_tmp11 EQU 0x31 w_tmp12 EQU 0x32 w_tmp13 EQU 0x33 w_tmp14 EQU 0x34 c_tmp1 EQU 0x51 t_mode EQU 0x52 ;********************************************************************** ORG 0x000 ; processor reset vector goto init ; 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 init ; 内部のクロックを使う場合のキャリブレーションデータのセット call 0x3FF ; retrieve factory calibration value bsf STATUS,RP0 ; set file register bank to 1 movwf OSCCAL ; update register with factory cal value bcf STATUS,RP0 ; set file register bank to 0 ;GPIOの初期化 bcf STATUS,RP0 ;バンク0 clrf GPIO ;GPIOリセット movlw b'00000111' ; movwf CMCON ;コンパレータをoff(00000111)に bsf STATUS,RP0 ;バンク1 clrf ANSEL ;デジタルI/Oモードにする movlw b'00001000' ; movwf TRISIO ;3ピンを入力にする bcf STATUS,RP0 ;バンク0に戻す ; 変数の初期化 clrf w_tmp1 clrf w_tmp2 clrf w_tmp3 clrf w_tmp4 clrf w_tmp5 movlw d'10' movwf w_tmp5 clrf w_tmp10 clrf w_tmp11 clrf w_tmp12 clrf w_tmp13 clrf w_tmp14 clrf c_tmp1 clrf t_mode ;******************************** ; ; メイン ; ;******************************** main call check_puls ;入力信号のチェック call flash1 ;フラッシュ1 call brake ;ブレーキ call blinker ;ハザード clrwdt ;ウォッチドッグタイマーのリセット goto main ;******************************** ; ; ブレーキランプ ; ;******************************** brake btfsc t_mode,2 ;スロットルモードをチェックして goto brake_off ;第2ビットが1ならブレーキoff brake_on bsf GPIO,GP5 ;ブレーキon return brake_off bcf GPIO,GP5 ;ブレーキoff return ;******************************** ; ; ハザードランプ ; ;******************************** blinker btfsc t_mode,2 ;スロットルモードをチェックして goto blinker_flash1 ;第2ビットが1ならフラッシュモードへ incfsz w_tmp12,f ;第2ビットが0ならカウント開始 goto $+2 incf w_tmp13,f ; movlw d'200' subwf w_tmp13,w btfss STATUS,C goto blinker_flash ;200以下ならフラッシュモードへ movlw d'200' ;それ以上ならハザードモードへ movwf w_tmp13 ;オーバーフローしないように100に固定 ;ハザードモード incfsz w_tmp10,f return incf w_tmp11,f movlw d'75' subwf w_tmp11,w btfss STATUS,C return clrf w_tmp11 movlw b'00000100' ;2ビットをトグル xorwf GPIO,f ;して return blinker_flash1 clrf w_tmp12 clrf w_tmp13 blinker_flash incfsz w_tmp10,f return bcf GPIO,GP2 incf w_tmp11,f movlw d'50' subwf w_tmp11,w btfss STATUS,C return bsf GPIO,GP2 movlw d'55' subwf w_tmp11,w btfsc STATUS,C clrf w_tmp11 return ;________________________________________________________________ ; フロント点滅用サブルーチン flash1 incfsz w_tmp1,f ;w_tmp1++して0以外なら return ;戻る incf w_tmp2,f ;w_tmp2++して movlw d'6' ;6 = 点滅間隔(256*6) subwf w_tmp2,w ;を引いて btfss STATUS,C ;それ以下なら return ;戻る clrf w_tmp2 ;それ以上なら movlw d'0' subwf w_tmp4,w btfsc STATUS,Z ;0なら goto flash1_led1 ;led1のトグル movlw d'2' subwf w_tmp4,w btfsc STATUS,Z ;2なら goto flash1_led2 ;led2のトグル goto flash1_off ;それ以外なら flash1_led1 movlw b'00000001' ;2ビットをトグル xorwf GPIO,f ;して incf w_tmp3,f ;w_tmp3++ goto flash1_flash flash1_led2 movlw b'00000010' ;1ビットをトグル xorwf GPIO,f ;して incf w_tmp3,f ;w_tmp3++ goto flash1_flash flash1_off bcf GPIO,GP0 bcf GPIO,GP1 movlw d'2' subwf w_tmp3,f flash1_flash movlw d'4' ;4 = 交代間隔 = 明・滅・明・滅 subwf w_tmp3,w btfss STATUS,C return ;戻る clrf w_tmp3 ;交代 incf w_tmp4,f ;w_tmp4++ movlw d'4' ;4ならリセットする subwf w_tmp4,w btfsc STATUS,Z clrf w_tmp4 return ;________________________________________________________________ ; パルスのチェック check_puls btfss GPIO,GP3 ;GP3がoffなら 2(2) return clrf c_tmp1 ;カウント0 1(3) check_puls_loop bsf GPIO,GP4 ;1(1) nop ;1(2) nop ;1(3) nop ;1(4) nop ;1(5) nop ;1(6) incf c_tmp1,f ;1(7) c_tmp1++ btfsc GPIO,GP3 ;GP3がonなら 1(8) goto check_puls_loop ;2(10) ;信号が短ければキャンセル ;信号は100〜200 movlw d'80' subwf c_tmp1,w btfss STATUS,C goto check_puls bcf GPIO,GP4 ;周波数によって挙動を変更 movlw d'160' subwf c_tmp1,w btfsc STATUS,C goto t_high ;160以上なら movlw d'140' subwf c_tmp1,w btfsc STATUS,C goto t_neutral ;140以上なら goto t_low ;140より下なら t_low movlw b'00000001' movwf t_mode return t_neutral movlw b'00000010' movwf t_mode return t_high movlw b'00000100' movwf t_mode return ;________________________________________________________________ ; initialize eeprom locations ORG 0x2100 DE 0x00, 0x01, 0x02, 0x03 END ;directive 'end of program'