;******************************************************
; サーボセンター      << PIC12F675 >> Nakasige-Tosikazu
; Version 2.00
;
; 2007/03/19
;******************************************************
;======================================================
;;発振器を４MHz
;- input -
#DEFINE     P_UP        GPIO,0      ;GP0 = UPｽｲｯﾁ
#DEFINE     P_NEUTRAL   GPIO,1      ;GP1 = NEUTRALｽｲｯﾁ
#DEFINE     P_DOWN      GPIO,2      ;GP2 = DOWNｽｲｯﾁ

;- output -
#DEFINE     P_DRIVE     GPIO,4      ;GP4 = サーボドライブ
#DEFINE     P_LED       GPIO,5      ;GP5 = 状態LED
;                       
    LIST        P=PIC12F675
    INCLUDE     "P12F675.INC"
;
CB = _CPD_OFF               ;データEEPROMもプログラム・メモリも
CB &= _CP_OFF               ;コード・プロテクトしない
CB &= _BODEN_ON             ;ブラウンアウト・リセットを使う
CB &= _MCLRE_OFF            ;MCLRリセットを使わない
CB &= _PWRTE_ON             ;パワーアップ・タイマを使う
CB &= _WDT_ON               ;ウォッチドッグ・タイマを使う
CB &= _INTRC_OSC_NOCLKOUT   ;内部発振器を使う
    __CONFIG CB             ;3FFF -> 3='11'BANDGAP
    __IDLOCS H'0200'        ;バージョン2.00
;
;----------------------
; Data Define
;----------------------
    CBLOCK          H'20'
            W_TEMP,S_TEMP   ;コンテキストを保存する
            C_T0IF          ;タイマ0オーバーフロー回数を数える
            C_TIM1          ;遅延タイマカウンタ
            C_TIM2          ;遅延タイマカウンタ
            C_TIM3          ;遅延タイマカウンタ
            C_UP            ;UP位置
            C_NT            ;NEUTRAL位置
            C_DW            ;DOWN位置
            C_FLG           ;0001=設定中 0010=稼働中
            C_OUT           ;出力用変数
            C_INTR          ;割込み回数カウンタ
            C_PWM           ;PWM幅
            C_DATA          ;EEPROM書き込みデータ
            C_LEDSW         ;LED点滅用カウンタ
            C_TEMP          ;汎用変数
    ENDC
;======================================================
;  Start program
;======================================================
;START
        ORG     H'0'        ;0番地スタート
        CALL    H'3FF'      ;内部発振器をキャリブレーションする
        BSF     STATUS,RP0
        MOVWF   OSCCAL
        GOTO    MAIN
;
        ORG     H'4'        ;4番地スタート
        GOTO    INTR        ;割り込み処理
;
;======================================================
;  SubRoutines
;======================================================
;----------------------
;  WedgeIn   Subroutine
;----------------------
INTR
        ; ----- レジスタ保存 -----
        MOVWF   W_TEMP      ;Wレジスタ待避
        SWAPF   STATUS,W    ;STATUS取り出し
        MOVWF   S_TEMP      ;STATUS待避 
        ; ----- 割込み設定 -----
        ; (2ms) 2000ｶｳﾝﾄ/8 = 250
        ; TMROはｱｯﾌﾟｶｳﾝﾀなので 255-250=5
        BCF     INTCON,T0IE ;タイマ割込みフラグクリア
        MOVLW   D'5'        ;カウント値ロード
        MOVWF   TMR0        ;TMR0へ出力
        BCF     INTCON,T0IF ;ｵｰﾊﾞｰﾌﾛｰフラグクリア
INTR010
        ; ----- 割込み中処理 -----
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        ; ----- インターバルを14msにする -----
        DECFSZ  C_INTR,F    ;カウントダウン
        GOTO    INTRend     ;まだ14msでない
INTR020
        ; ----- 出力計算 -----
        CALL    CALK        ;ＰＷＭ幅計算
        ; ----- ＰＷＭ出力 -----
        CALL    PWM         ;ＰＷＭ出力
INTR030
        ; ----- カウンタクリア -----
        MOVLW   D'7'        ;7を代入2msX7=14ms
        MOVWF   C_INTR      ;割込み回数カウンタ
INTRend
        ; ----- レジスタ復帰 -----
        SWAPF   S_TEMP,W    ;STATUSを戻す
        MOVWF   STATUS      ;
        SWAPF   W_TEMP,F    ;Wレジスタを戻す
        SWAPF   W_TEMP,W
        BSF     INTCON,T0IE ;タイマ割込み許可
        RETFIE              ;割込み許可リターン
;----------------------
;CALK Subroutine
;----------------------
CALK
        ; ----- 設定モードか稼働モードか判断 -----
        BTFSS   C_FLG,0     ;フラグが１(B'00000001')だったらスキップで設定ﾓｰﾄﾞ
        GOTO    CALK500     ;フラグが１以外は稼働モードと判断
CALK100
        ; ----- 設定モード処理 -----
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        ; ----- LED表示(早い点滅) -----
        INCF    C_LEDSW,F   ;LED点滅用カウンタに＋１
        BTFSC   STATUS,Z    ;カウントUPがＯＫならばスキップ
        GOTO    CALK110     ;LEDトグル処理
        GOTO    CALK200     ;続行
CALK110
        ; ----- LEDトグル処理 -----
        BTFSS   P_LED       ;LED点灯(１ならばスキップ)
        GOTO    CALK120     ;LED消灯なので
        BCF     P_LED       ;トグルしてLED消灯する
        MOVLW   D'251'      ;255-250=5 (5X14ms=70ms)
        MOVWF   C_LEDSW     ;C_LEDSWがｵｰﾊﾞｰﾌﾛｰするのに5回分
        GOTO    CALK200
CALK120
        BSF     P_LED       ;トグルしてLED点灯する
        MOVLW   D'251'      ;255-250=5 (5X14ms=70ms)
        MOVWF   C_LEDSW     ;C_LEDSWがｵｰﾊﾞｰﾌﾛｰするのに5回分
CALK200
        ; ----- スイッチの判断 -----
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        BTFSS   P_UP        ;UPｽｲｯﾁが放されていれば(１だったら)スキップ 
        GOTO    CALK210     ;UPボタンが押された
        BTFSS   P_DOWN      ;DOWNｽｲｯﾁが放されていれば(１だったら)スキップ 
        GOTO    CALK220     ;DOWNボタンが押された
        GOTO    CALK900     ;ボタンは押されたなかったのでそのまま
CALK210
        ; ----- UPボタンが押された -----
        DECF    C_OUT,F     ;中立位置を１つUP側に
        ; ----- EEPROM用データのチェック -----
        MOVF    C_OUT,W     ;出力用変数を
        MOVWF   C_TEMP      ;汎用変数に代入
        CALL    NT_CHECK    ;ﾃﾞｰﾀが範囲内か検証
        MOVF    C_TEMP,W    ;汎用変数を
        MOVWF   C_OUT       ;出力用変数に代入
        GOTO    CALK900     ;完了
CALK220
        ; ----- DOWNボタンが押された -----
        INCF    C_OUT,F     ;中立位置を１つDOWN側に
        ; ----- EEPROM用データのチェック -----
        MOVF    C_OUT,W     ;出力用変数を
        MOVWF   C_TEMP      ;汎用変数に代入
        CALL    NT_CHECK    ;ﾃﾞｰﾀが範囲内か検証
        MOVF    C_TEMP,W    ;汎用変数を
        MOVWF   C_OUT       ;出力用変数に代入
        GOTO    CALK900     ;完了
;
CALK500
        ; ----- 稼働モード処理 -----
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        ; ----- LED表示(点灯) -----
        BSF     P_LED       ;LED点灯する
        ; ----- スイッチの判断 -----
        BTFSS   P_UP        ;UPｽｲｯﾁが放されていれば(１だったら)スキップ 
        GOTO    CALK510     ;UPボタンが押された
        BTFSS   P_DOWN      ;DOWNｽｲｯﾁが放されていれば(１だったら)スキップ 
        GOTO    CALK520     ;DOWNボタンが押された
        BTFSS   P_NEUTRAL   ;NEUTRALｽｲｯﾁが放されていれば(１だったら)スキップ 
        GOTO    CALK530     ;NEUTRALボタンが押された
        GOTO    CALK900     ;ボタンは押されたなかったのでそのまま
CALK510
        ; ----- UPボタンが押された -----
        DECF    C_OUT,F     ;出力位置を１つUP側に
        MOVF    C_UP,W      ;C_UPをWORKへ代入
        SUBWF   C_OUT,W     ;C_OUT-C_UP=W 
        BTFSS   STATUS,C    ;ＯＫならば（C_OUTが多ければ）スキップ
        INCF    C_OUT,F     ;C_OUT+1=C_OUT １つ足して戻す
        GOTO    CALK900     ;完了
CALK520
        ; ----- DOWNボタンが押された -----
        INCF    C_OUT,F     ;出力位置を１つDOWN側に
        MOVF    C_OUT,W     ;C_OUTをWORKへ代入
        SUBWF   C_DW,W      ;C_DW-C_OUT=W 
        BTFSS   STATUS,C    ;ＯＫならば（C_DOWNが多ければ）スキップ
        DECF    C_OUT,F     ;C_OUT-1=C_OUT １つ引いて戻す
        GOTO    CALK900     ;完了
CALK530
        ; ----- NEUTRALボタンが押された -----
        MOVF    C_NT,W      ;NEUTRAL位置
        MOVWF   C_OUT       ;出力用の変数に代入
CALK900
        RETLW   0
;----------------------
;PWM Subroutine
;----------------------
PWM                         ;860us+(C_OUT*5us)=PWM幅
        CLRWDT
        MOVF    C_OUT,W     ;出力用変数を
        MOVWF   C_PWM       ;PWM幅に代入
        BSF     P_DRIVE     ;レジスタを１にしてPWMの立上り
        CALL    TIM99       ;860us
PWMLP
        NOP                 ;このループを5usにする
        NOP                 ;例えば860us+(5X128)=1500us/中立
        DECFSZ  C_PWM,F     ;レジスタの減算をし結果が０ならスキップ
        GOTO    PWMLP       ;C_PWMが０になるまでループ
        BCF     P_DRIVE     ;レジスタを０にしてPWMの立下がり
        RETLW   0
;----------------------
;NUETRAL Subroutine
;----------------------
NT_CHECK
        ; ----- EEPROM用データのチェック -----
                            ;下限検査
        MOVLW   D'100'      ;100をWORKへ代入
        SUBWF   C_TEMP,W    ;C_TEMP-100=W 
        BTFSS   STATUS,C    ;ＯＫならば（C_TEMPが多ければ）スキップ
        GOTO    UNDERSET    ;ｴﾗｰ 中立下限の100をSET
                            ;上限検査
        MOVLW   D'100'      ;100をWORKへ代入
        ADDWF   C_TEMP,W    ;C_TEMP+100=W 
        BTFSC   STATUS,C    ;ＯＫならば（C_TEMPが少なければ）スキップ
        GOTO    UPPERSET    ;ｴﾗｰ 中立上限の155をSET
        GOTO    NT_END      ;完了
UNDERSET
        ; ----- 中立下限の100を強制SET -----
        MOVLW   D'100'      ;100をWORKへ代入
        MOVWF   C_TEMP      ;汎用変数に代入
        GOTO    NT_END      ;完了
UPPERSET
        ; ----- 中立上限の155を強制SET -----
        MOVLW   D'155'      ;155をWORKへ代入
        MOVWF   C_TEMP      ;汎用変数に代入
        GOTO    NT_END      ;完了
NT_END
        RETLW   0
;----------------------
;EEPROM Read Subroutine
;----------------------
EEPROM_LOAD
        ; ----- EEPROMから読み込み -----
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        MOVLW   0x00        ;EEPROM 00h
        CALL    EEP_READ    ;EEPROM READ
        MOVWF   C_UP        ;UP位置
        MOVLW   0x01        ;EEPROM 01h
        CALL    EEP_READ    ;EEPROM READ
        MOVWF   C_NT        ;NEUTRAL位置
        MOVLW   0x02        ;EEPROM 02h
        CALL    EEP_READ    ;EEPROM READ
        MOVWF   C_DW        ;DOWN位置
        RETURN              ;完了
;----------------------
EEP_READ
        ;----- EPPROM から読み込み -----
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        BSF     STATUS,RP0  ;Bank 1
        MOVWF   EEADR       ;Address to read
        BSF     EECON1,RD   ;EE Read
        MOVF    EEDATA,W    ;Move data to W
        BCF     STATUS,RP0  ;Bank 0
        RETURN              ;W=EEPROM DATA
;
;----------------------
;EEPROM Write Subroutine
;----------------------
EEPROM_REWRITE
        ; ----- EEPROM書込データの計算 -----
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        BCF     INTCON,GIE  ;全体割込み禁止;
        MOVF    C_TEMP,W    ;出力用変数を
        MOVWF   C_NT        ;C_NTに代入
        ; ----- UP位置の計算 -----
        MOVLW   D'100'      ;5OOus分(5X100)
        SUBWF   C_TEMP,W    ;C_TEMP-100=W
        MOVWF   C_UP        ;C_UPに代入
        ; ----- DOWN位置の計算 -----
        MOVLW   D'100'      ;5OOus分(5X100)
        ADDWF   C_TEMP,W    ;C_TEMP+100=W
        MOVWF   C_DW        ;C_DWに代入
        ; ----- EEPROMへ書き込み -----
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        MOVF    C_UP,W      ;UP位置
        MOVWF   C_DATA      ;UP位置
        MOVLW   0x00        ;EEPROM 00h
        CALL    EEP_WRITE   ;EEPROM WRITE
        MOVF    C_NT,W      ;NEUTRAL位置
        MOVWF   C_DATA      ;NEUTRAL位置
        MOVLW   0x01        ;EEPROM 01h
        CALL    EEP_WRITE   ;EEPROM WRITE
        MOVF    C_DW,W        ;DOWN位置
        MOVWF   C_DATA      ;DOWN位置
        MOVLW   0x02        ;EEPROM 02h
        CALL    EEP_WRITE   ;EEPROM WRITE
        RETURN              ;完了
;----------------------
EEP_WRITE
        ;----- EPPROM へ書き込み -----
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        BSF     STATUS,RP0  ;Bank 1
        MOVWF   EEADR       ;Address to read
        MOVF    C_DATA,W    ;書き込むデータ
        MOVWF   EEDATA      ;Move Data to EEDATA
        BSF     EECON1,WREN ;Enable write
        BCF     INTCON,GIE  ;Disable INTs
        MOVLW   H'55'       ;Unlock write
        MOVWF   EECON2      ;
        MOVLW   H'AA'       ;
        MOVWF   EECON2      ;
        BSF     EECON1,WR   ;Start the write
        BCF     EECON1,WREN ;Disable write
        BTFSC   EECON1,WR   ;Wait for write
        GOTO    $-1         ; to complete
      ;;;BSF     INTCON,GIE  ;Enable INTS
        BCF     STATUS,RP0  ;Bank 0
        RETURN              ;
;
;----------------------
;200ms Timer Subroutine
;----------------------(200,683us)
TIM02
        MOVLW   D'232'      ;232回
        MOVWF   C_TIM1      ;ここまでで２サイクル
TIM02LP
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        CALL    TIM99       ;860us
        DECFSZ  C_TIM1,F    ;このループは1000サイクル
        GOTO    TIM02LP     ;2+860*232-1=199,552us
        RETLW   0           ;200msec
;----------------------
;860us Timer Subroutine
;----------------------(859us)
TIM99
        MOVLW   D'214'      ;214回
        MOVWF   C_TIM2      ;ここまでで２サイクル
TIM99LP
        NOP
        DECFSZ  C_TIM2,F    ;このループは4サイクル
        GOTO    TIM99LP     ;2+4*214-1=857
        RETLW   0           ;857+2=859*1usec=859usec
;
;======================================================
;  Main Routine
;======================================================
MAIN
;----------------------
; Initialize Routine
;----------------------
INIT
        ; ----- 初期設定 -----
        BSF     STATUS,RP0  ;STATUSレジスタのRP0ビットを１に
                            ;してBank1(Page1)に切替える     【BSF】 ｆ レジスタの指定ビットを１にする
        MOVLW   B'01010010' ;タイマ0に命令クロックを1:8して入力する
        MOVWF   OPTION_REG  ;ｳｲｰｸﾌﾟﾙｱｯﾌﾟON WDTのTimeOutは18ms
        MOVLW   B'00000111' ;ｳｲｰｸﾌﾟﾙｱｯﾌﾟGP0,1,2をON GP4,5をOFF
        MOVWF   WPU         ;ｳｲｰｸﾌﾟﾙｱｯﾌﾟON WDTのTimeOutは18ms
        MOVLW   B'00001111' ;GP0,1,2,3入力にする
        MOVWF   TRISIO      ;GP4,5ピンを出力にする
        MOVLW   B'00110000' ;GP0/1/2/3ピンをアナログ入力モード解除
        MOVWF   ANSEL       ;A/D変換クロックはFrc(内部RC発振)
        BCF     STATUS,RP0  ;Bank0(Page0)に戻る             【BCF】 ｆ レジスタの指定ビットを０にする 
        MOVLW   B'00000111' ;GP2/1/0 をデジタルI/Oに設定
        MOVWF   CMCON       ;CMCON = CM0/CM1/CM2 ON (COMPARATOR OFF)
       ; ----- 初期クリア -----
        CLRF    TMR0        ;タイマ0の内容を0にする
        CLRF    C_T0IF      ;T0IFの内容を0にする
        CLRF    C_TIM1      ;遅延タイマカウンタ
        CLRF    C_TIM2      ;遅延タイマカウンタ
        CLRF    C_TIM3      ;遅延タイマカウンタ
        CLRF    C_UP        ;UP位置
        CLRF    C_NT        ;NEUTRAL位置
        CLRF    C_DW        ;DOWN位置
        CLRF    C_FLG       ;0001=設定中 0010=稼働中
        CLRF    C_OUT       ;出力用変数
        CLRF    C_PWM       ;PWM幅
        CLRF    C_DATA      ;EEPROM書き込みデータ
        MOVLW   D'7'        ;7を代入2msX7=14ms
        MOVWF   C_INTR      ;割込み回数カウンタ
        MOVLW   D'248'      ;255-248=7 (7X14ms=98ms)
        MOVWF   C_LEDSW     ;LED点滅用カウンタがｵｰﾊﾞｰﾌﾛｰするのに5回分
        CLRF    C_TEMP      ;汎用変数
        CLRF    GPIO        ;とりあえずLOW
;----------------------
; Procedure Routine
;----------------------
PROC
      CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        ; ----- 割込み設定 -----
        ; (2ms) 2000ｶｳﾝﾄ/8 = 250
        ; TMROはｱｯﾌﾟｶｳﾝﾀなので 255-250=5
        MOVLW   D'5'        ;カウント値ロード
        MOVWF   TMR0        ;TMR0へ出力
        BCF     INTCON,T0IF ;ｵｰﾊﾞｰﾌﾛｰフラグクリア
        BSF     INTCON,T0IE ;タイマ割込み許可
    ;;;BSF     INTCON,GIE  ;全体割込み許可;
        BCF     INTCON,GIE  ;全体割込み禁止;
        ; ----- 初期値モードか設定モードか稼動モードか判断 -----
                            ;UPｽｲｯﾁとDOWNｽｲｯﾁが同時に押されていれば設定ﾓｰﾄﾞ
        CALL    TIM02       ;約200ms(意味のない遅延)
        BTFSC   P_UP        ;UPｽｲｯﾁが押されていれば(０だったら)スキップ 
        GOTO    KADOU       ;稼動モード
        BTFSC   P_DOWN      ;DOWNｽｲｯﾁが押されていれば(０だったら)スキップ 
        GOTO    KADOU       ;稼動モード
        BTFSC   P_NEUTRAL   ;NEUTRALｽｲｯﾁが押されていれば(０だったら)スキップ 
        GOTO    SETEEP      ;設定モード
        GOTO    DEFAULT     ;初期値設定モード
DEFAULT
        ; ===== 初期値設定モード =====
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        ; ----- EEPROMへ書き込み -----
        MOVLW   D'28'       ;UP位置
        MOVWF   C_DATA      ;UP位置
        MOVLW   0x00        ;EEPROM 00h
        CALL    EEP_WRITE   ;EEPROM WRITE
        MOVLW   D'128'      ;NEUTRAL位置
        MOVWF   C_DATA      ;NEUTRAL位置
        MOVLW   0x01        ;EEPROM 01h
        CALL    EEP_WRITE   ;EEPROM WRITE
        MOVLW   D'228'      ;DOWN位置
        MOVWF   C_DATA      ;DOWN位置
        MOVLW   0x02        ;EEPROM 02h
        CALL    EEP_WRITE   ;EEPROM WRITE
DEFAULT_LED
        ; ----- LED表示(遅い点滅) -----
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        BSF     P_LED       ;LED点灯
        CALL    TIM02       ;約200ms(遅延)
        BCF     P_LED       ;LED消灯
        CALL    TIM02       ;約200ms(遅延)
        ; ----- ｽｲｯﾁを放すまで待つ -----
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        BTFSS   P_UP        ;UPｽｲｯﾁが放されていれば(１だったら)スキップ 
        GOTO    DEFAULT_LED ;待つ
        BTFSS   P_DOWN      ;DOWNｽｲｯﾁが放されていれば(１だったら)スキップ 
        GOTO    DEFAULT_LED ;待つ
        BTFSS   P_NEUTRAL   ;NEUTRALｽｲｯﾁが放されていれば(１だったら)スキップ 
        GOTO    DEFAULT_LED ;待つ
        ; ----- 稼働モードへ -----
        GOTO    KADOU       ;稼働モード
SETEEP
        ; ===== 設定モード =====
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        ; ----- ｽｲｯﾁを放すまで待つ -----
        BTFSS   P_UP        ;UPｽｲｯﾁが放されていれば(１だったら)スキップ 
        GOTO    SETEEP      ;待つ
        BTFSS   P_DOWN      ;DOWNｽｲｯﾁが放されていれば(１だったら)スキップ 
        GOTO    SETEEP      ;待つ
        ; ----- EEPROMから読み込み -----
        CALL    EEPROM_LOAD ;EEPROMから読込 C_UP C_NT C_DW に代入
        ; ----- 中立位置にする -----
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        MOVF    C_NT,W      ;NEUTRAL位置
        MOVWF   C_OUT       ;出力用の変数に代入
        ; ----- 割込み許可 -----
        BSF     INTCON,GIE  ;全体割込み許可;
        ; ----- 中立位置になるまで待つ -----
        CALL    TIM02       ;約200ms(中立位置になるまで待つ)
SET_LOOP
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        MOVLW   B'00000001' ;設定中フラグ
        MOVWF   C_FLG       ;割込中処理で使用
        ; ----- NEUTRALボタンが押された -----
        BTFSC   P_NEUTRAL   ;NEUTRALｽｲｯﾁが押されていれば(０だったら)スキップ 
        GOTO    SET_LOOP    ;C_OUTのPWMが割込で出力されている
        ; ----- NEUTRALボタンが長押されているか検証 -----
        MOVLW   D'6'        ;200msX6回=1.2秒
        MOVWF   C_TIM3      ;カウンタに代入
SET_OUT
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        BTFSS   P_NEUTRAL   ;NEUTRALｽｲｯﾁが押されていれば(１だったら)スキップ 
        GOTO    SET_LOOP    ;NEUTRALｽｲｯﾁが押されていない
        CALL    TIM02       ;約200ms(遅延)
        DECFSZ  C_TIM3,F    ;減算をし結果が０ならスキップ
        GOTO    SET_OUT     ;まだ6回に達しない
EECHECK
        ; ----- EEPROM用データのチェック -----
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        MOVF    C_OUT,W     ;出力用変数を
        MOVWF   C_TEMP      ;汎用変数に代入
        CALL    NT_CHECK    ;ﾃﾞｰﾀが範囲内か検証
        MOVF    C_TEMP,W    ;汎用変数を
        MOVWF   C_OUT       ;出力用変数に代入
        ; ----- EEPROM書込 -----
        MOVF    C_OUT,W     ;出力用変数を
        MOVWF   C_TEMP      ;汎用変数に代入
        BCF     INTCON,GIE  ;全体割込み禁止;
        CALL    EEPROM_REWRITE  ;書き込み
        BSF     INTCON,GIE  ;全体割込み許可;
KADOU
        ; ===== 稼動モード =====
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        MOVLW   B'00000010' ;稼動中フラグ
        MOVWF   C_FLG       ;割込中処理で使用
        ; ----- EEPROMから読み込み -----
        CALL    EEPROM_LOAD ;EEPROMから読込 C_UP C_NT C_DW に代入
        ; ----- 中立位置代入 -----
        MOVF    C_NT,W      ;NEUTRAL位置
        MOVWF   C_OUT       ;出力用の変数に代入
        ; ----- 割込み許可 -----
        BSF     INTCON,GIE  ;全体割込み許可;
;----------------------
; Loop Routine
;----------------------
MAIN_LOOP
        CLRWDT              ;ｳｫｯﾁﾄﾞｯｸﾀｲﾏ ｸﾘｱ
        MOVLW   B'00000010' ;稼動中フラグ
        MOVWF   C_FLG       ;割込中処理で使用
        ;-- 2ms割込を７回でPWM出力 --
        GOTO    MAIN_LOOP
;
;----------------------
; initialize eeprom locations
        ORG 0x2100
        DE  D'28', D'128', D'228'
;----------------------
        END
