;********************************************************************************************* ; MPLABアセンブラ用 Ver2(16F628A用) H18.3.12 10:00 ; ; ; 【 機 能 】 SE3P車速信号処理プログラム ;  1) 内部オシレート4MHz使用 ; 2) 車速信号のパルス数カウント処理(16bitカウンター:10〜180kmh判定可能) ; 3) 車速信号ノイズ除去は3回の最大パルス数(最小回転数)を使用することにより除去 ; 4) ;         5) ; ; 【 履 歴 】 ; ; 【 P I C 】 PIC16F628A用 ; ; 【 基 板 】 IGf信号 + 7セグ×2 + PB×2 Ver1 ; ; 【 言 語 】 MPLAB用アセンブル + マクロ使用(pic_macro3.asmを使用) ; ; 【 I/Oピン 】 PIC16F62x/62xA → #include設定を変更することにより使用可能対象PIC ;   ------------ ; 7セグ 1の位のGND制御 =|RA2 RA1|= (NON) ; 7セグ 10の位のGND制御 =|RA3 RA0|= --150Ω-7セグ ; (10kPullDown)--PB1 - =|RA4 RA7|= --150Ω-7セグ ; (10kPullDown)--PB2 - =|RA5 RA6|= --150Ω-7セグ ; Vss- in =|Vss Vdd|= Vdd+ in ; 車速信号入力 - =|RB0 RB7|= --150Ω-7セグ ; (NON) - =|RB1 RB6|= --150Ω-7セグ * RA5/MCLRピンはRA5 ; LED1 -- 120Ω -- =|RB2 RB5|= --150Ω-7セグ * RA7/OSC1ピンはRA7 ; LED2 -- 120Ω -- =|RB3 RB4|= --150Ω-7セグ * RA6/OSC2ピンはRA6 ; ------------ ;********************************************************************************************* ; CONFIG設定(PIC16F62xA) LIST p=16F628A,R=DEC ;使用PICはPIC16F628A,デフォルトは10進数 #include ;16F628Aインクルード #include ;マクロファイルをインクルード __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _BODEN_OFF & _CP_OFF & _DATA_CP_ON ;変数宣言 tim0 EQU 020H ; wait用変数1 tim1 EQU 021H ; wait用変数2 tim2 EQU 022H ; wait用変数3 seg7msec EQU 023H ; 7セグダイナミック点灯時間 nzRed EQU 024H ; ノイズリダクション回数 SPplus_sv EQU 025H ; (不使用) div1b EQU 02AH ; 割られる数上位8bit  div1a EQU 02BH ; 割られる数下位8bit div2b EQU 02CH ; 割る数上位8bit div2a EQU 02DH ; 割る数下位8bit div3b EQU 02EH ; 答え上位8bit div3a EQU 02FH ; 答え下位8bit div4b EQU 030H ; 余り上位8bit div4a EQU 031H ; 余り下位8bit divl1 EQU 032H ; 内部計算用1 divl2 EQU 033H ; 内部計算用2 diverr EQU 034H ; 割る数=0時のエラー(エラー時はdiverr=1をセット) SP_H EQU 035H ; 車速信号上位8bitカウント数保持変数 SP_L EQU 036H ; 車速信号下位8bitカウント数保持変数 E_DATA EQU 037H ; EEPROM書込データ一時保持変数 E_ADRS EQU 038H ; EEPROMデータ開始アドレス SPmax_H EQU 039H ; 3回での最大パルス数上位8bit保管変数(ノイズ信号除去用) SPmax_L EQU 03AH ; 3回での最大パルス数下位8bit保管変数(ノイズ信号除去用) max_cnt EQU 03BH ; ノイズ処理カウント数 pluscnt EQU 03CH ; 車速パルス取得数カウンター PBcnt EQU 03DH ; 設定表示用カウンタ segNo EQU 03EH ; 7セグ表示用変数 segCnt EQU 03FH ; 7セグ表示用繰返しカウンター SetCnt EQU 040H ; 7セグ表示用繰返しカウンター segNo10 EQU 041H ; 7セグ10の位退避変数 segNo1 EQU 042H ; 7セグ1の位退避変数 PB2cnt EQU 043H ; PB2押下数カウンター prm1a EQU 044H ; 変換したい値(1バイト。変換後は壊れる) prm3c EQU 045H ; 10進格納場所(3バイト)上位 prm3b EQU 046H prm3a EQU 047H ; 〜下位 srlc1 EQU 048H ; カウンタ(サブルーチンで使用) srwk1 EQU 049H ; 一時余り格納場所(サブルーチンで使用) ;固定値宣言 #DEFINE P10 PORTA,0 ;7セグ10pin #DEFINE DIP PORTA,1 ;7セグDIP #DEFINE SEGtr_1 PORTA,2 ;7セグ1の位 #DEFINE SEGtr_10 PORTA,3 ;7セグ10の位 #DEFINE PB1 PORTA,4 ;PB1 #DEFINE PB2 PORTA,5 ;PB2 #DEFINE P1 PORTA,6 ;7セグ1pin #DEFINE P8 PORTA,7 ;7セグ8pin #DEFINE SP_P PORTB,0 ;車速信号(5vパルス) #DEFINE LED1 PORTB,2 ;LED1 #DEFINE LED2 PORTB,3 ;LED2 #DEFINE P5 PORTB,4 ;7セグ5pin #DEFINE P4 PORTB,5 ;7セグ4pin #DEFINE P3 PORTB,6 ;7セグ3pin #DEFINE P2 PORTB,7 ;7セグ2pin org 00h goto start ;リセット時にはSTARTへ org 04h goto start1 ;割込時にはSTART1へ ;************************************************************************************** ; リセット時処理 start set_port TRISA,00110000b ; PORTA,4,5pin=入力 set_port TRISB,00000011b ; PORTB,0pin=入力 clrf PORTA ; PORTAクリア clrf PORTB ; PORTBクリア port_DIG ; ポートAをデジタルに設定 start1 call LED_Allreset clrf SetCnt clrf PBcnt ; PBcntクリア clrf pluscnt ; pluscntクリア clrf segNo clrf segNo10 clrf segNo1 goto read_EEPROM start2 clrf SetCnt call LED_Allreset goto main ;*************************************************************************************** ; メイン処理 main call Seg7_on snb PB1 call setting_mode call SP_main ; PB1押下なし→パルス測定へ goto main ;*************************************************************************************** ;車速信号取込+パルス数計算処理 SP_main call Seg7_on clrf pluscnt ;車速パルス取得数カウンターのクリア clrf SP_H ;車速パルスカウンタークリア clrf SP_L ;車速パルスカウンタークリア sb SP_P ;車速信号チェック(RB0) goto main ;車速信号が無い場合、mainへ goto SP_cnt0 ;車速信号取得した場合、パルス計算処理へ SP_main2 nop return ;--------------------------------------------------------------------------------------- ;設定車速パルス間のカウンター(SP_cnt*は40us) ;パルス取得〜終了までのカウント SP_cnt0 cje_fl pluscnt,1,SP_chk ; 設定パルス到達後はSP_chkへ inc pluscnt ; 取得パルス数+1 goto SP_cnt11 ; 時間合わせのためSP_cnt11へ SP_cnt1 nop nop nop ; 時間合わせの修正用nop nop nop nop SP_cnt11 incFW SP_H,SP_L ; SPカウンタ+1(16bit) call wait40us_4MHz ; 40us待機(実質call〜ret=27us) snb SP_P ; 車速信号有→SP_cnt1、無→SP_cnt2 goto SP_cnt1 goto SP_cnt2 ;パルス終了〜取得までのカウント SP_cnt2 nop nop nop ; 時間合わせの修正用nop nop nop nop incFW SP_H,SP_L ; 車速カウンタ+1(16bit) call wait40us_4MHz ; 40us待機(実質call〜ret=27us) snb SP_P ; 車速信号有→SP_cnt0、無→繰返し goto SP_cnt0 goto SP_cnt2 ;-------------------------------------------------------------------------------- ;【 4MHz用】パルス測定タイマー(基準40usecのOFF時間) : 完成版(Call〜ret=27.0us) ;-------------------------------------------------------------------------------- wait40us_4MHz nop nop mov_fl tim0,2 wa30_4MHz mov_fl tim1,2 wa31_4MHz djnz tim1,wa31_4MHz djnz tim0,wa30_4MHz return ;--------------------------------------------------------------------------------------- ;車速信号をnzRed設定回取得での最大値使用処理(ノイズ信号除去処理) ; 取得車速信号nzRed設定回数での最大値を正常パルス数と判断する ; (ノイズ信号での回転数計算は最小になるはず・・・) SP_chk call Seg7_on inc max_cnt ;収集回数カウンタ+1 cje_fl max_cnt,1,max1SP ;1回目の処理へ cje_ff max_cnt,nzRed,maxlastSP ;最終回はLED点灯処理準備へ goto max2SP ;2〜最終前は前回との比較処理へ goto SP_main ; 異常の場合はメインへ戻す ;--------------------------------------------------------------------------------------- ;最大車速信号判定処理 max1SP mov_ff SPmax_H,SP_H ;1回目取得パルス数上位8bitをセット mov_ff SPmax_L,SP_L ;1回目取得パルス数下位8bitをセット goto SP_main max2SP cja_ff SPmax_H,SP_H,SP_main ;前回上位>今回上位 → 前回使用 cje_ff SPmax_H,SP_H,max2SP_d0 ;前回上位=今回上位 → 下位bit比較へ cja_ff SP_H,SPmax_H,max2SP_d1 ;前回上位<今回上位 → 今回をセット goto SP_main max2SP_d0 cja_ff SPmax_L,SP_L,SP_main ;前回下位>今回下位 → 前回使用 mov_ff SPmax_L,SP_L ;前回下位≦今回下位 → 今回をセット goto SP_main max2SP_d1 mov_ff SPmax_H,SP_H ;今回取得パルス数上位8bitをセット mov_ff SPmax_L,SP_L ;今回取得パルス数下位8bitをセット goto SP_main maxlastSP cja_ff SPmax_H,SP_H,SP_Set ;前回上位>今回上位 → 前回使用しLED点灯へ cje_ff SPmax_H,SP_H,maxlastSP_d0 ;前回上位=今回上位 → 下位bit比較へ cja_ff SP_H,SPmax_H,maxlastSP_d1 ;前回上位<今回上位 → 今回をセット goto SP_main maxlastSP_d0 cja_ff SPmax_L,SP_L,SP_Set ;前回下位>今回下位 → 前回使用しLED点灯へ mov_ff SPmax_L,SP_L ;前回下位≦今回下位 → 今回をセット goto SP_Set ;LED点灯へ maxlastSP_d1 mov_ff SPmax_H,SP_H ;今回取得パルス数上位8bitをセット mov_ff SPmax_L,SP_L ;今回取得パルス数下位8bitをセット goto SP_Set SP_Set mov_ff SP_H,SPmax_H ;最大パルス数上位8bitをセット mov_ff SP_L,SPmax_L ;最大パルス数下位8bitをセット clrf max_cnt ;パルス収集回数カウンタリセット call Seg7_on call SP_7SEG_cal ; 判定処理終了後はSP_main2へ goto main ;--------------------------------------------------------------------------------------- ; 速度の7セグ表示 SP_7SEG_cal call cal_palus ; 車速の計算 mov_ff prm1a,div3a call hexdec8 ; BCD変換の計算 mov_ff segNo10,prm3b ; BCD変換の10の位をsegNo10 mov_ff segNo1,prm3a ; BCD変換の1の位をsegNo1 call Seg7_on ; 7セグ表示へ goto main return ;--------------------------------------------------------------------------------------- ;8ビット(1バイト)数値を10進数3桁のBCD数値に変換する ;引き数は prm1a の1バイト ;結果は prm3c,prm3b,prm3a に得られる。 hexdec8 movlw srlc1 ;格納場所初期値 movwf 4h ;4h=fsr call devide_hexdec ;最下位変換 call devide_hexdec call devide_hexdec ;最上位変換 return devide_hexdec ;÷10サブルーチン (10で除算) movlw 8 ;8ビットくり返し movwf srlc1 clrf srwk1 devide0_hexdec bcf 3h,0 ;キャリフラグのクリア rlf prm1a,1 rlf srwk1,1 movlw b'11110110' addwf srwk1,0 btfsc 3h,0 movwf srwk1 btfsc 3h,0 incf prm1a,1 decfsz srlc1,1 goto devide0_hexdec decf 4h,1 ;4h=fsr movf srwk1,0 movwf 0h ;余り (0h=indirect) return ;--------------------------------------------------------------------------------------- ; 16bitの割算 ; 車速パルス数から速度計算 cal_palus mov_fl div1b,08ah ;基準時間40us( HEX(8a48) = DEC(35400) ) mov_fl div1a,048h mov_ff div2b,SP_H mov_ff div2a,SP_L call div16 ;割算実施( 解 = div3b,a 余 = div4b,a ) return ;16bit割算 div16 movlw 10h ; movwf divl1 ; movf div2a,0 ; movwf div4a ; movf div2b,0 ; movwf div4b ; di1601 rlf div4a,1 ;1bit左シフト rlf div4b,1 ;1bit左シフト btfsc 3h,0 ;Cフラグ確認 goto di1602 ;割る数の上位ビット位置検索 decfsz divl1,1 ; goto di1601 ; movlw 1 ; movwf diverr ;割る数 = 0 → エラー return di1602 clrf div3a ;解セット用変数クリア clrf div3b ; clrf div4a ;ワーク用変数クリア clrf div4b ; movlw 10h ; movwf divl2 ; movf divl1,0 ; subwf divl2,1 ;残ループ数 di1603 bcf 3h,0 ;Cフラグ = 0 rlf div1a,1 ; rlf div1b,1 ; rlf div4a,1 ; rlf div4b,1 ; decfsz divl1,1 ;割られる数を初期位置までシフト goto di1603 ; di1604 ;現位置での減算が可否確認 movf div2b,0 ; subwf div4b,0 ; btfss 3h,0 ; goto di1606 ; movf div4b,0 ; subwf div2b,0 ; btfss 3h,0 ; goto di1605 ; movf div2a,0 ; subwf div4a,0 ; btfss 3h,0 ; goto di1606 ; di1605 movf div2a,0 ; subwf div4a,1 ;ワークから下位を引く btfss 3h,0 ;Cフラグ = 1 → skip decf div4b,1 ;上位 -1 movf div2b,0 ; subwf div4b,1 ;ワークから上位を引く bsf 3h,0 ;Cフラグ = 1 goto di1607 ; di1606 bcf 3h,0 ;Cフラグ = 0 di1607 rlf div3a,1 ;Cフラグの内容を解にシフト rlf div3b,1 ; movf divl2,1 ;divl2 = 0 の確認 btfsc 3h,2 ; goto di1608 ;最下位まで処理したなら終了 decf divl2,1 ;bit位置を1つ下げる(右へ) bcf 3h,0 ;Cフラグ = 0 rlf div1a,1 ;ワークへ1bit左シフト rlf div1b,1 ; rlf div4a,1 ; rlf div4b,1 ; goto di1604 ; di1608 clrf diverr ;正常終了 return ;************************************************************************************** LED_Allreset mov_fl segNo10,0 mov_fl segNo1,0 bcf SEGtr_10 bcf SEGtr_1 bcf P1 bcf P2 bcf P3 bcf P4 bcf P5 bcf P8 bcf P10 call Seg7_on return ;*************************************************************************************** ; 7セグ数値表示ルーティン ;--------------------------------------------------------------------------------------- Seg7_on cje_fl segNo10,0,Seg7_on1 bsf SEGtr_10 bcf SEGtr_1 mov_ff segNo,segNo10 call seg_on mov_ff tim0,seg7msec call wait1ms_4MHz Seg7_on1 bcf SEGtr_10 bsf SEGtr_1 mov_ff segNo,segNo1 call seg_on mov_ff tim0,seg7msec call wait1ms_4MHz exit_Seg7_on nop return seg_on cje_fl segNo,0,seg_0 cje_fl segNo,1,seg_1 cje_fl segNo,2,seg_2 cje_fl segNo,3,seg_3 cje_fl segNo,4,seg_4 cje_fl segNo,5,seg_5 cje_fl segNo,6,seg_6 cje_fl segNo,7,seg_7 cje_fl segNo,8,seg_8 cje_fl segNo,9,seg_9 cje_fl segNo,16,seg_16 cje_fl segNo,32,seg_32 cje_fl segNo,64,seg_64 seg_on_end nop return seg_0 bsf P1 bsf P2 bcf P3 bsf P4 bsf P5 bsf P8 bsf P10 goto seg_on_end seg_1 bcf P1 bcf P2 bcf P3 bcf P4 bcf P5 bsf P8 bsf P10 goto seg_on_end seg_2 bsf P1 bcf P2 bsf P3 bsf P4 bsf P5 bcf P8 bsf P10 goto seg_on_end seg_3 bsf P1 bcf P2 bsf P3 bcf P4 bsf P5 bsf P8 bsf P10 goto seg_on_end seg_4 bcf P1 bsf P2 bsf P3 bcf P4 bcf P5 bsf P8 bsf P10 goto seg_on_end seg_5 bsf P1 bsf P2 bsf P3 bcf P4 bsf P5 bsf P8 bcf P10 goto seg_on_end seg_6 bsf P1 bsf P2 bsf P3 bsf P4 bsf P5 bsf P8 bcf P10 goto seg_on_end seg_7 bsf P1 bsf P2 bcf P3 bcf P4 bcf P5 bsf P8 bsf P10 goto seg_on_end seg_8 bsf P1 bsf P2 bsf P3 bsf P4 bsf P5 bsf P8 bsf P10 goto seg_on_end seg_9 bsf P1 bsf P2 bsf P3 bcf P4 bsf P5 bsf P8 bsf P10 goto seg_on_end seg_16 bsf P1 ;(A) bsf P2 bsf P3 bsf P4 bcf P5 bsf P8 bsf P10 goto seg_on_end seg_32 bsf P1 ;(C) bsf P2 bcf P3 bsf P4 bsf P5 bcf P8 bcf P10 goto seg_on_end seg_64 bcf P1 ;(d) bcf P2 bsf P3 bsf P4 bsf P5 bsf P8 bsf P10 goto seg_on_end ;************************************************************************************** ;************************************************************************************** ;************************************************************************************** ; 設定モード処理 setting_mode bcf LED1 ; LED1消灯 bcf LED2 ; LED2消灯 snb PB1 ; PB1の押下確認 call PB1_check ; PB1押下あり→押下内容確認へ snb PB2 ; PB2の押下確認 call PB2_check ; PB2押下あり→押下内容確認へ cje_fl PBcnt,1,seg7msec_on ; 1 = 7セグダイナミック点灯時間 cje_fl PBcnt,2,nzRed_on ; 2 = ノイズリダクション数 call tim40ms_4MHz ; 40ms待機 goto setting_mode ;--------------------------------------------------------------------------------------- ; PB1ボタン処理 PB1_check call tim40ms_4MHz ; 40ms待機(チャタリング防止) sb PB1 ; PB1押下確認 goto setting_mode ;  PB1押下無し→設定モードへ call tim1sec_4MHz snb PB1 goto write_EEPROM inc PBcnt ; PBcntカウンタ数による表示内容分岐 PBcnt1 cje_fl PBcnt,1,seg7msec_on ; 1 = 7セグダイナミック点灯時間 cje_fl PBcnt,2,nzRed_on ; 2 = ノイズリダクション数 cje_fl PBcnt,3,clrPB ; 3 = 1に戻す処理 return clrPB mov_fl PBcnt,1 ; PBcntクリア goto PBcnt1 ;--------------------------------------------------------------------------------------- ; PB2ボタン処理 PB2_check call tim40ms_4MHz ; 20ms待機(チャタリング対策) sb PB2 ; PB2押下確認 goto setting_mode ; PB2押下無し→設定モードへ cje_fl PBcnt,1,seg7msec_up ; 1 = 7セグダイナミック点灯時間 cje_fl PBcnt,2,nzRed_up ; 2 = ノイズリダクション数 return ;--------------------------------------------------------------------------------------- ; 7セグダイナミック点灯up処理 seg7msec_up inc seg7msec ; seg7msec = seg7msec + 1 call tim40ms_4MHz ; 40ms待機(チャタリング対策) cje_fl seg7msec,10,seg7msec_clr ; if seg7msec = 10 then seg7msec_up2 call seg7msec_on ; else LCD表示処理へ goto setting_mode seg7msec_clr mov_fl seg7msec,1 ; seg7msecの初期化(=1) goto seg7msec_up2 ;--------------------------------------------------------------------------------------- ; ノイズリダクション設定処理 nzRed_up inc nzRed ; nzRed = nzRed + 1 call tim40ms_4MHz ; 40ms待機(チャタリング対策) cje_fl nzRed,8,nzRed_clr ; if nzRed = 8 then nzRed_up2 call nzRed_on ; else LCD表示処理へ goto setting_mode nzRed_clr mov_fl nzRed,3 ; nzRedの初期化(=3) goto nzRed_up2 ;*************************************************************************************** ; 7セグダイナミック点灯時間表示 seg7msec_on bsf SEGtr_10 bcf SEGtr_1 mov_ff segNo,seg7msec call seg_on call tim100ms_4MHz call tim100ms_4MHz call tim100ms_4MHz cje_fl SetCnt,1,seg7msec_on3 goto setting_mode seg7msec_on3 nop return ;--------------------------------------------------------------------------------------- ; ノイズリダクション設定表示 nzRed_on bcf SEGtr_10 bsf SEGtr_1 mov_ff segNo,nzRed call seg_on call tim100ms_4MHz call tim100ms_4MHz call tim100ms_4MHz cje_fl SetCnt,1,nzRed_on3 goto setting_mode nzRed_on3 nop return ;-------------------------------------------------------------------------------- ;【 4MHz用】10ms測定サブルーチン(測定時間=10ms×tim0) 4MHz : 1サイクル=1.0us ;-------------------------------------------------------------------------------- wait10ms_4MHz wa20_4MHz mov_fl tim1,23 ;23 9.966ms wa21_4MHz mov_fl tim2,143 ;143 wa22_4MHz djnz tim2,wa22_4MHz djnz tim1,wa21_4MHz djnz tim0,wa20_4MHz return ;-------------------------------------------------------------------------------- ;【 4MHz用】100ms測定サブルーチン(測定時間=100ms×tim0) 4MHz : 1サイクル=1.0us ;-------------------------------------------------------------------------------- LEDwait100ms_4MHz LED20_4MHz mov_fl tim1,230 ;230 99.66ms LED21_4MHz mov_fl tim2,143 ;143 LED22_4MHz djnz tim2,LED22_4MHz djnz tim1,LED21_4MHz djnz tim0,LED20_4MHz return ;--------------------------------------------------------------------------------- ;【 4MHz用】遅延タイマー(40msecのOFF時間) ;--------------------------------------------------------------------------------- tim40ms_4MHz mov_fl tim0,4 call wait10ms_4MHz return ;--------------------------------------------------------------------------------- ;【 4MHz用】遅延タイマー(100msecのOFF時間) ;--------------------------------------------------------------------------------- tim100ms_4MHz mov_fl tim0,10 call wait10ms_4MHz return ;--------------------------------------------------------------------------------- ;【 4MHz用】遅延タイマー(1secのOFF時間) ;--------------------------------------------------------------------------------- tim1sec_4MHz mov_fl tim0,100 call wait10ms_4MHz return ;-------------------------------------------------------------------------------- ; 【 4MHz】1ms測定サブルーチン(測定時間=1ms×tim0) 4MHz : 1サイクル=1us ;-------------------------------------------------------------------------------- wait1ms_4MHz wa01ms_4M mov_fl tim1,6 ;6 1ms wa11ms_4M mov_fl tim2,33 ;33 wa12ms_4M djnz tim2,wa12ms_4M djnz tim1,wa11ms_4M djnz tim0,wa01ms_4M return ;--------------------------------------------------------------------------------- ; EEPROMから各設定データの取得処理 ;--------------------------------------------------------------------------------- read_EEPROM clrf E_ADRS call EEPROM_read ; データ取得処理 mov_ff seg7msec,E_DATA ; seg7msecにセット inc E_ADRS ; 読込アドレス+1 call EEPROM_read ; データ取得処理 mov_ff nzRed,E_DATA ; nzRedにセット mov_fl SetCnt,1 call seg7msec_on call nzRed_on goto start2 return ;--------------------------------------------------------------------------------- ; EEPROMデータ読出(定型処理:PIC16F62x,62xA用) ;--------------------------------------------------------------------------------- EEPROM_read movf E_ADRS,0 ; w = E_ADRS bsf STATUS,RP0 ; page1切替 movwf EEADR ; EEADR = w bsf EECON1,RD ; 読込許可 movf EEDATA,0 ; w = EEDATA bcf STATUS,RP0 ; page0切替 movwf E_DATA ; E_DATA = w return ;--------------------------------------------------------------------------------- ; 各設定データのEEPROMへの書込処理 ;--------------------------------------------------------------------------------- write_EEPROM clrf E_ADRS ; 書込アドレスリセット mov_ff E_DATA,seg7msec ; E_DATA = seg7msec call EEPROM_write ; EEPROMへrev100書込み inc E_ADRS ; 書込アドレス+1 mov_ff E_DATA,nzRed ; E_DATA = nzRed call EEPROM_write ; EEPROMへgain_p書込み clrf PBcnt ; PBcnt = 0 mov_fl SetCnt,1 goto read_EEPROM goto start2 return ;--------------------------------------------------------------------------------- ; EEPROMデータ書込(定型処理:PIC16F62x,62xA用) ;--------------------------------------------------------------------------------- EEPROM_write movf E_DATA,0 ; w = 書込データ bsf STATUS,RP0 ; page1切替 movwf EEDATA ; EEDATA = w bcf STATUS,RP0 ; page0切替 movf E_ADRS,0 ; w = E_ADRS bsf STATUS,RP0 ; page1切替 movwf EEADR ; EEADR = w bsf EECON1,WREN ; 書込許可 movlw 55h ; (定型処理) movwf EECON2 ;   〃 movlw 0aah ;   〃 movwf EECON2 ;   〃 bsf EECON1,WR ; 書込終了確認フラグ eewait btfsc EECON1,WR ; 書込み終了待ちloop goto eewait ; 書込未終了→書込終了待ち bcf EECON1,WREN ; 書込不許可 bcf STATUS,RP0 ; page0切替 return ;--------------------------------------------------------------------------------- ;EEPROM初期値の宣言のテスト ; 7セグ表示時間 = 2msec ; ノイズred    = 3 org 2100h de 2,3 end