list p=12F1822 ; list directive to define processor #include ; processor specific variable definitions errorlevel -302 ; suppress message 302 from list file ; __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF ; __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_LO & _LVP_OFF __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_ON & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_ON & _BORV_HI & _LVP_ON ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;  ;;;;; ワンコインデコーダ6 for PIC12F1822 (ポイントデコーダ動作用) ;;;;; ;;;;; Web Nucky http://web.nucky.jp/ ;;;;; ;;;;; Copyright (C) 2007-2020 Nucky ;;;;; ;;;;; DCC Signal Analysis (0/1 Detection part) ;;;;; Original Programmed by T.Shimizu (Copyright 2007/6) ;;;;; http://www.dokidoki.ne.jp/home2/tohrus/marklin.html ;;;;; ;;;;; 使用PICマイコン PIC12F1822  内部発振4MHzモード ;;;;; ;;;;; 2020.07.26 Ver 0.9beta ワンコイン4用をベースに6用に改版 ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; ;;;;; DCC信号受信タイミング調整 標準値 0x07 ;;;;; ;;;;; 製作後DCC信号の受信に失敗する場合、 ;;;;; 赤/黒線の極性により受信動作が不安定な場合は、 ;;;;; 0x06-0x08(16進数)の間で設定を変えて試してみてください。 ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;#define CNT 0x08 #define CNT 0x07 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 入出力ピンの割り当て(定義) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #define DCC_IN PORTA,2 ; DCC信号入力 #define A_OUT1 PORTA,4 ; 回路A 出力1 #define A_OUT2 PORTA,5 ; 回路A 出力2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; CV初期値の設定(EEPROMへのデータ定義) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0xF000 ; ;----- 初期データ -------- CV値 ---------------------- de .129 ;CV1 アクセサリアドレス 1バイト目 de .248 ;CV2 アクセサリアドレス 2バイト目 de .005 ;CV3 出力作動時間 * 10ms de .001 ;CV4 出力動作保持設定 de .001 ;CV5 出力遅延時間 * 10ms de .127 ;CV6 PWM Duty de .094 ;CV7 Version Number de .156 ;CV8 Manufacturer ID is 156 CV値RESETに使用 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 変数の定義 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; cblock 0x20 TCNT1 ;DCC信号受信用カウント1 TCNT2 ;DCC信号受信用カウント2 DATA1 ;受信バイト1 DATA2 ;受信バイト2 DATA3 ;受信バイト3 DATA4 ;受信バイト4 DATA5 ;受信バイト5 DATA6 ;受信バイト6 DATA20 ;受信バイト2の下位1bitを0に A_ADR01 ;回路A 1バイト目 A_ADR02 ;回路A 2バイト目 MODE ;動作モード(出力保持) PWM_DATA ;PWM Duty ;CV01 ;2桁アドレス(16進数) ;CV02 ;スタート電圧 ;CV05 ;最高電圧 ;CV09 ;PWM機能設定 ;CV13 ;アナログ運転ファンクション設定 ;CV17 ;4桁アドレス(千、百の位:16進数) ;CV18 ;4桁アドレス(十、一の位:16進数) ;CV29 ;デコーダ機能設定 ;CV33 ;入換動力車標識モード ;DIR_REV ;CV29bit0を反映した方向制御 逆方向で1 正方向で0 ;DIR_FOR ;CV29bit0を反映した方向制御 逆方向で0 正方向で1 ;SPEED ;速度(PWM) ;F0_STATUS ;F0点灯条件 P_REG ;PAGEモード書き込み用変数1 D_REG ;PAGEモード書き込み用変数2 SM_STATUS ;サービスモード書き込み用STATUS DIRECT_TEMP ;DIRECTモード書き込み用変数 CVEEDATA ;EEPROM書き込み用一時変数 ;COMMAND ;命令分類用一時変数 ;W_TEMP ;wレジスタ退避 ;ST_TEMP ;STATUS退避 CNT1 ;TIMER用変数 CNT2 CNT3 TMR_CNT1 ;遅延用タイマ変数1 TMR_CNT2 ;遅延用タイマ変数2 TMR_CNT3 ;遅延用タイマ変数3 ;TEMP1 ;仮変数1 ;TEMP2 ;仮変数2 endc ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; PICマイコンの初期設定 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 0x00 ; CALL H'3FF' ; for 629,675 ; BSF STATUS,RP0 ; ; MOVWF OSCCAL ; GOTO MAINSTART ORG 0x04 ; RETFIE MAINSTART CLRF PORTA ; PORTA初期化 ; MOVLW B'00000111' ; コンパレータ使用しない(コンパレータピンはデジタルIO) ; MOVWF CMCON ; for 629,675 ; MOVWF CMCON0 ; for 683 ; BANKSEL WDTCON ; MOVLW B'00001000' ; WDT 16mS X ; MOVLW B'00001100' ; WDT 64mS ? ; MOVLW B'00001110' ; WDT 128mS OK ; MOVLW B'00010000' ; WDT 256mS OK ; MOVLW B'00010010' ; WDT 512mS OK ; MOVLW B'00010100' ; WDT 1S ; MOVLW B'00010110' ; WDT 2S 初期値 ; MOVWF WDTCON BANKSEL ANSELA CLRF ANSELA ; デジタルIO(AN機能を使用しない) BANKSEL OSCCON ; MOVLW B'01111010' ; CLOCK=16MHz ; MOVLW B'01110010' ; CLOCK=8MHz MOVLW B'01101010' ; CLOCK=4MHz MOVWF OSCCON BANKSEL TRISA MOVLW B'00001111' ; RA0-3を入力、RA4-5は出力とする MOVWF TRISA BANKSEL APFCON BSF APFCON,P1BSEL ; P1Bの機能をRA4に割りつける BSF APFCON,CCP1SEL ; CCP1/P1Aの機能をRA5に割りつける ; BANKSEL CCP1CON ; MOVLW B'00001100' ; PWM機能シングルを使用する ; MOVWF CCP1CON ; アクティブHigh BANKSEL CCP1CON MOVLW B'00001111' ; PWM機能シングルを使用する MOVWF CCP1CON ; アクティブLow BANKSEL CCPR1L ; PWM制御を0に CLRF CCPR1L BANKSEL PR2 MOVLW 0xFF ; PR2の最大値0xFF MOVWF PR2 BANKSEL T2CON MOVLW B'00000001' MOVWF T2CON MOVLB B'00000' ; BANK0 CLRF INTCON ;割り込みを禁止 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 変数初期化 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAIN ; CLRF PORTA ; PORTA初期化 BSF A_OUT1 ; PORTA初期化 BSF A_OUT2 ; CLRF SPEED ; SPEED = 0 CLRF SM_STATUS ; PageMode書き込みflagのクリア ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 速度制御 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;STEP000 ; CALL F0_CONTROL ; F0制御 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; DCCパケット読み込み処理 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STEP001 MOVLB B'00000' ; BANK0 CLRF DATA1 CLRF DATA2 CLRF DATA3 CLRF DATA4 CLRF DATA5 CLRF DATA6 CLRF TCNT1 CLRF TCNT2 CLRWDT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; プリアンブル検出 ("1"の14個連続を検出) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AA01 BTFSC DCC_IN GOTO AA05 BTFSC DCC_IN GOTO AA06 MOVLW 0x00 SUBWF TCNT1,W BTFSC STATUS,Z GOTO AA01 MOVLW CNT SUBWF TCNT1,W BTFSC STATUS,C GOTO AA07 INCF TCNT2,F MOVLW 0x0C ; 0x0C(14)bitの"1" SUBWF TCNT2,W BTFSC STATUS,Z GOTO STEP002 CLRF TCNT1 GOTO AA01 AA05 NOP NOP AA06 NOP CLRWDT INCF TCNT1,F GOTO AA01 AA07 CLRF TCNT1 CLRF TCNT2 GOTO AA01 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;     パケットスタートビット検出 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STEP002 CLRF TCNT1 CLRF TCNT2 BB01 BTFSC DCC_IN GOTO BB05 BTFSC DCC_IN GOTO BB06 MOVLW 0x00 SUBWF TCNT1,W BTFSC STATUS,Z GOTO BB01 MOVLW CNT SUBWF TCNT1,W BTFSC STATUS,C GOTO STEP003 CLRF TCNT1 GOTO BB01 BB05 NOP NOP BB06 NOP CLRWDT INCF TCNT1,F GOTO BB01 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 第1バイト読み込み ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STEP003 CLRF TMR1L ; パケットスタートビットを正常読み込みしたらTMR1を0に CLRF TMR1H ; (DCC信号がない場合、一定時間でアナログ制御をする為) CLRF TCNT1 CLRF TCNT2 BSF TCNT2,3 CC01 BTFSC DCC_IN GOTO CC05 BTFSC DCC_IN GOTO CC06 MOVLW 0x00 SUBWF TCNT1,W BTFSC STATUS,Z GOTO CC01 MOVLW CNT SUBWF TCNT1,W BTFSC STATUS,C GOTO CC08 RLF DATA1,F BSF DATA1,0 DECFSZ TCNT2,F GOTO CC09 GOTO CC20 CC09 CLRF TCNT1 GOTO CC01 CC05 NOP NOP CC06 NOP CLRWDT INCF TCNT1,F GOTO CC01 CC08 RLF DATA1,F BCF DATA1,0 DECFSZ TCNT2,F GOTO CC09 CC20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; データバイトスタートビット検出 (1→2) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STEP004 CLRF TCNT1 CLRF TCNT2 DD01 BTFSC DCC_IN GOTO DD05 BTFSC DCC_IN GOTO DD06 MOVLW 0x00 SUBWF TCNT1,W BTFSC STATUS,Z GOTO DD01 MOVLW CNT SUBWF TCNT1,W BTFSC STATUS,C GOTO STEP005 CLRF TCNT1 GOTO STEP001 DD05 NOP NOP DD06 NOP CLRWDT INCF TCNT1,F GOTO DD01 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 第2 バイト読み込み ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STEP005 CLRF TCNT1 CLRF TCNT2 BSF TCNT2,3 EE01 BTFSC DCC_IN GOTO EE05 BTFSC DCC_IN GOTO EE06 MOVLW 0x00 SUBWF TCNT1,W BTFSC STATUS,Z GOTO EE01 MOVLW CNT SUBWF TCNT1,W BTFSC STATUS,C GOTO EE08 RLF DATA2,F BSF DATA2,0 DECFSZ TCNT2,F GOTO EE09 GOTO EE20 EE09 CLRF TCNT1 GOTO EE01 EE05 NOP NOP EE06 NOP CLRWDT INCF TCNT1,F GOTO EE01 EE08 RLF DATA2,F BCF DATA2,0 DECFSZ TCNT2,F GOTO EE09 EE20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; データバイトスタートビット検出 (2→3) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STEP006 CLRF TCNT1 CLRF TCNT2 FF01 BTFSC DCC_IN GOTO FF05 BTFSC DCC_IN GOTO FF06 MOVLW 0x00 SUBWF TCNT1,W BTFSC STATUS,Z GOTO FF01 MOVLW CNT SUBWF TCNT1,W BTFSC STATUS,C GOTO STEP007 CLRF TCNT1 GOTO STEP001 FF05 NOP NOP FF06 NOP CLRWDT INCF TCNT1,F GOTO FF01 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 第三バイト読み込み ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STEP007 CLRF TCNT1 CLRF TCNT2 BSF TCNT2,3 GG01 BTFSC DCC_IN GOTO GG05 BTFSC DCC_IN GOTO GG06 MOVLW 0x00 SUBWF TCNT1,W BTFSC STATUS,Z GOTO GG01 MOVLW CNT SUBWF TCNT1,W BTFSC STATUS,C GOTO GG08 RLF DATA3,F BSF DATA3,0 DECFSZ TCNT2,F GOTO GG09 GOTO GG20 GG09 CLRF TCNT1 GOTO GG01 GG05 NOP NOP GG06 NOP CLRWDT INCF TCNT1,F GOTO GG01 GG08 RLF DATA3,F BCF DATA3,0 DECFSZ TCNT2,F GOTO GG09 GG20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; データバイトスタートビット検出 (3→4) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STEP008 CLRF TCNT1 CLRF TCNT2 HH01 BTFSC DCC_IN GOTO HH05 BTFSC DCC_IN GOTO HH06 MOVLW 0x00 SUBWF TCNT1,W BTFSC STATUS,Z GOTO HH01 MOVLW CNT SUBWF TCNT1,W BTFSC STATUS,C GOTO STEP081 CLRF TCNT1 GOTO CHK_ERR ; パケットエンドならエラー判別へ HH05 NOP NOP HH06 NOP CLRWDT INCF TCNT1,F GOTO HH01 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 第四バイト読み込み ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STEP081 CLRF TCNT1 CLRF TCNT2 BSF TCNT2,3 II01 BTFSC DCC_IN GOTO II05 BTFSC DCC_IN GOTO II06 MOVLW 0x00 SUBWF TCNT1,W BTFSC STATUS,Z GOTO II01 MOVLW CNT SUBWF TCNT1,W BTFSC STATUS,C GOTO II08 RLF DATA4,F BSF DATA4,0 DECFSZ TCNT2,F GOTO II09 GOTO II20 II09 CLRF TCNT1 GOTO II01 II05 NOP NOP II06 NOP CLRWDT INCF TCNT1,F GOTO II01 II08 RLF DATA4,F BCF DATA4,0 DECFSZ TCNT2,F GOTO II09 II20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; データバイトスタートビット検出 (4→5) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STEP082 CLRF TCNT1 CLRF TCNT2 JJ01 BTFSC DCC_IN GOTO JJ05 BTFSC DCC_IN GOTO JJ06 MOVLW 0x00 SUBWF TCNT1,W BTFSC STATUS,Z GOTO JJ01 MOVLW CNT SUBWF TCNT1,W BTFSC STATUS,C GOTO STEP083 CLRF TCNT1 GOTO CHK_ERR ;パケットエンドビット「1」を検出したらCHK_ERRへ JJ05 NOP NOP JJ06 NOP CLRWDT INCF TCNT1,F GOTO JJ01 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 第5バイト読み込み ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STEP083 CLRF TCNT1 CLRF TCNT2 BSF TCNT2,3 KK01 BTFSC DCC_IN GOTO KK05 BTFSC DCC_IN GOTO KK06 MOVLW 0x00 SUBWF TCNT1,W BTFSC STATUS,Z GOTO KK01 MOVLW CNT SUBWF TCNT1,W BTFSC STATUS,C GOTO KK08 RLF DATA5,F BSF DATA5,0 DECFSZ TCNT2,F GOTO KK09 GOTO KK20 KK09 CLRF TCNT1 GOTO KK01 KK05 NOP NOP KK06 NOP CLRWDT INCF TCNT1,F GOTO KK01 KK08 RLF DATA5,F BCF DATA5,0 DECFSZ TCNT2,F GOTO KK09 KK20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; データバイトスタートビット検出 (5→6) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STEP084 CLRF TCNT1 CLRF TCNT2 LL01 BTFSC DCC_IN GOTO LL05 BTFSC DCC_IN GOTO LL06 MOVLW 0x00 SUBWF TCNT1,W BTFSC STATUS,Z GOTO LL01 MOVLW CNT SUBWF TCNT1,W BTFSC STATUS,C GOTO STEP009 CLRF TCNT1 GOTO CHK_ERR ;パケットエンドビット「1」を検出したらCHK_ERRへ LL05 NOP NOP LL06 NOP CLRWDT INCF TCNT1,F GOTO LL01 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 第6バイト読み込み (最終バイト) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STEP009 CLRF TCNT1 CLRF TCNT2 BSF TCNT2,3 MM01 BTFSC DCC_IN GOTO MM05 BTFSC DCC_IN GOTO MM06 MOVLW 0x00 SUBWF TCNT1,W BTFSC STATUS,Z GOTO MM01 MOVLW CNT SUBWF TCNT1,W BTFSC STATUS,C GOTO MM08 RLF DATA6,F BSF DATA6,0 DECFSZ TCNT2,F GOTO MM09 GOTO MM20 MM09 CLRF TCNT1 GOTO MM01 MM05 NOP NOP MM06 NOP CLRWDT INCF TCNT1,F GOTO MM01 MM08 RLF DATA6,F BCF DATA6,0 DECFSZ TCNT2,F GOTO MM09 MM20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; DCCパケット エラーチェック ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CHK_ERR CLRWDT MOVF DATA1,W ; DATA1 -> W XORWF DATA2,W ; W XOR DATA2 -> W XORWF DATA3,W ; W XOR DATA3 -> W XORWF DATA4,W ; W XOR DATA4 -> W XORWF DATA5,W ; W XOR DATA5 -> W XORWF DATA6,W ; W XOR DATA6 -> W BTFSS STATUS,Z GOTO STEP001 ; 結果が0にならない(=エラー)ならSTEP001へ戻る ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; 第一バイトの判別 (アドレスの処理) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;00000000 (0) : Broadcast address ;00000001-01101111 (001-111): Multi-Function decoders with 7 bit addresses ;01110000-01111111 (112-127): Service Mode ;10000000-10111111 (128-191): Basic Accessory Decoders with 9 bit addresses and Extended Accessory Decoders with 11-bit addresses ;11000000-11100111 (192-231): Multi Function Decoders with 14 bit addresses ;11101000-11111110 (232-254): Reserved for Future Use ;11111111 (255) : Idle Packet ADRREAD ; 変数読み込み MOVLW .00 CALL EEPROM_READ MOVWF A_ADR01 MOVLW .01 CALL EEPROM_READ MOVWF A_ADR02 MOVLW .03 CALL EEPROM_READ MOVWF MODE MOVLW .05 CALL EEPROM_READ MOVWF PWM_DATA ; MOVF PWM_DATA,W ;;;;;;;;;;;;;;;;;; 反転モード 補数処理 ; SUBLW .255 ; MOVWF PWM_DATA MOVF DATA2,W ANDLW b'11111110' ; DATA2の7-1BITを抜き出し DATA20 へ MOVWF DATA20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 命令実行処理 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BANKSEL T2CON BSF T2CON,TMR2ON ; TMR2(PWM)スタート MOVLB B'00000' ; BANK0 A_ADR_CHK01 MOVF DATA1,W ; DATA1は回路A用アドレスと一致するか? XORWF A_ADR01,W BTFSS STATUS,Z GOTO CHK_DATA1 A_ADR_CHK02 MOVF DATA20,W ; DATA20は回路A用アドレスと一致するか? XORWF A_ADR02,W BTFSS STATUS,Z GOTO CHK_DATA1 CLRWDT call DLY_action ; 動作遅延処理へ CLRWDT A_T_C_CHK BTFSC DATA2,0 ; DATA2 bit0 は 1/0? GOTO A_C_CONT A_T_CONT ; 回路A t制御 ; BCF A_OUT2 CLRWDT CALL STOP_CONT NOP CLRWDT BANKSEL PSTR1CON BCF PSTR1CON,0 ; 逆転に設定 NOP BSF PSTR1CON,1 NOP BSF A_OUT2 NOP MOVLB B'00000' ; BANK0 ; MOVLW B'00001111' MOVFW PWM_DATA ;PWM制御に反映 BANKSEL CCPR1L MOVWF CCPR1L MOVLB B'00000' ; BANK0 BTFSS MODE,0 GOTO STEP001 CLRWDT CALL DLY_CONT CLRWDT BANKSEL CCPR1L ; PWM制御を0に CLRF CCPR1L MOVLB B'00000' ; BANK0 GOTO STEP001 A_C_CONT ; 回路A c制御 ; BCF A_OUT1 CLRWDT CALL STOP_CONT NOP CLRWDT BANKSEL PSTR1CON BCF PSTR1CON,1 ; 正転に設定 NOP BSF PSTR1CON,0 NOP BSF A_OUT1 NOP MOVLB B'00000' ; BANK0 ; MOVLW B'00001111' MOVFW PWM_DATA ;PWM制御に反映 BANKSEL CCPR1L MOVWF CCPR1L MOVLB B'00000' ; BANK0 BTFSS MODE,0 GOTO STEP001 CLRWDT CALL DLY_CONT CLRWDT BANKSEL CCPR1L ; PWM制御を0に CLRF CCPR1L MOVLB B'00000' ; BANK0 GOTO STEP001 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CHK_DATA1 COMF DATA1,W ; アイドルパケット? BTFSS STATUS,Z GOTO CHK_DATA1_2 ; CLRF SM_STATUS ; アイドルパケットならSM_STATUSクリアし GOTO STEP001 ; STEP001に戻る CHK_DATA1_2 MOVF DATA1,W ; ブロードキャストアドレスなら BTFSC STATUS,Z GOTO DCDR_CNT ; 停止制御 BTFSC DATA1,7 ; DATA1のbit7を確認し「0」なら次命令をスキップ GOTO CHK_LONGADR ; 4桁アドレスの確認処理へ ANDLW 0x70 ; サービスモードの確認へ XORLW 0x70 BTFSC STATUS,Z GOTO CHECK_SM CHK_ADR CLRF SM_STATUS ; PageMode書き込みflagのオールクリア ; MOVLW .28 ; CV29をEEPROMから読み込む ; CALL EEPROM_READ ; MOVWF CV29 ; BTFSC CV29,5 ; CV29のbit5で2桁アドレスが有効となっているかの確認 GOTO STEP001 ; 有効でないならSTEP001へ戻る ; MOVLW .00 ; 2桁アドレスの確認  第一バイトがCV01と一致か? (EEPROMのアドレスはCV番号-1) ; CALL EEPROM_READ ; XORWF DATA1,W ; BTFSS STATUS,Z ; GOTO STEP001 ; 不一致ならSTEP001へ ; GOTO DECODE ; 一致ならDECODE処理へ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; 4桁アドレスの処理 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CHK_LONGADR CLRF SM_STATUS ; PageMode書き込みflagのオールクリア ; MOVLW .28 ; CV29をEEPROMから読み込む ; CALL EEPROM_READ ; MOVWF CV29 ; BTFSS CV29,5 ; CV29のbit5で4桁アドレスが有効となっているかの確認 GOTO STEP001 ; 有効でないならSTEP001へ戻る ; MOVF DATA1,W ; addlw 0xff - .230 ; CV17の最高値は230である 231以上か?(data1 + .25 で桁上がり発生?) ; BTFSC STATUS,C ; GOTO STEP001 ; MOVLW .16 ;第一バイトがCV17と一致か? (EEPROMのアドレスはCV番号-1) ; CALL EEPROM_READ ; XORWF DATA1,W ; BTFSS STATUS,Z ; GOTO STEP001 ; MOVLW .17 ;第二バイトがCV18と一致か? (EEPROMのアドレスはCV番号-1) ; CALL EEPROM_READ ; XORWF DATA2,W ; BTFSS STATUS,Z ; GOTO STEP001 ; MOVF DATA3,W ; 4桁アドレスのとき、データをシフトする(後の処理を2桁アドレスと同じにする) ; MOVWF DATA2 ; MOVF DATA4,W ; MOVWF DATA3 ; MOVF DATA5,W ; MOVWF DATA4 ; DATA6はエラーチェックバイトのためシフトしない ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; 第二バイトの判別 (命令の処理) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;DECODE ; MOVF DATA2,W ; 命令判断処理 ; andlw B'11100000' ; DATA2の先頭3バイトで区別する ; MOVWF COMMAND ; XORLW B'00100000' ; アドバンスト動作命令 ; BTFSC STATUS,Z ; GOTO ADVANCE ; MOVF COMMAND,W ; XORLW B'10000000' ; ファンクション(機能)1グループ命令 ; BTFSC STATUS,Z ; GOTO FUNCTION1 ; MOVF COMMAND,W ; XORLW B'11100000' ; 動作モードCV命令 ; BTFSC STATUS,Z ; GOTO CV_Access ; MOVF COMMAND,W ; XORLW B'00000000' ; デコーダ、統括制御命令 ; BTFSC STATUS,Z ; GOTO DCDR_CNT ; MOVF COMMAND,W ; XORLW B'01000000' ; 速度方向命令(逆方向)(14,28ステップ)(未サポート) ; BTFSC STATUS,Z ; GOTO SPEEDDIRECTION ; MOVF COMMAND,W ; XORLW B'01100000' ; 速度方向命令(正方向)(14,28ステップ)(未サポート) ; BTFSC STATUS,Z ; GOTO SPEEDDIRECTION ; MOVF COMMAND,W ; XORLW B'10100000' ; ファンクション(機能)2グループ命令 ; BTFSC STATUS,Z ; GOTO FUNCTION2 ; GOTO STEP001 ; 予約(未使用命令) もしくは それ以外 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; 速度方向命令(逆、正方向)(14,28ステップ)処理 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;SPEEDDIRECTION ; GOTO STEP001 ; DCC信号読み取り ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; アドバンスト動作命令処理 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;ADVANCE ; GOTO STEP001 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; ファンクション(機能)1グループ命令 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;FUNCTION1 ; GOTO STEP001 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; ファンクション(機能)2グループ命令 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;FUNCTION2 ; GOTO STEP001 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; 動作モードCV命令 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CV_Access MOVLW B'11101100' ; CVのバイト書き込みのみサポート(内容確認、ビット操作は未サポート) SUBWF DATA2,W BTFSS STATUS,Z GOTO STEP001 ; 命令が一致しなければSTEP001へ MOVLW .07 ; 書き込み命令のCVはCV8か? XORWF DATA3,W BTFSC STATUS,Z GOTO CV_RESET ; CV8ならCV_RESETへ MOVF DATA4,W ; 書き込むデータをCVEEDATAに読み込み MOVWF CVEEDATA MOVF DATA3,W ; 書き込むアドレスをWに読み込み CALL EEPROM_WRITE GOTO MAIN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; サービスモード解析 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CHECK_SM ; アドレス112-127かサービスモードかのチェックを行う BTFSS SM_STATUS,0 ; リセットパケットは受信済みか? GOTO CHK_ADR ; アドレス112-127として2桁アドレス処理へ MOVF DATA4,F ; 3バイト命令(PAGEモード)か、4バイト命令(DIRECTモード)か? BTFSC STATUS,Z ; 4バイト目がゼロ(PAGEモード)ならZフラグ1。DIRECTモードならZフラグ0。 GOTO PAGE_MODE ; Zフラグが0なら、本命令をスキップ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; DIRECTモード ; ; CC = 01 Verify Byte ; CC = 11 Write Byte ; ; Long-preamble 0 0111CCAA 0 AAAAAAAA 0 DDDDDDDD 0 EEEEEEEE 1 ; DATA1 DATA2 DATA3 DATA4 ; ; CC = 10 Bit Manipulation ; ; Long-preamble 0 011110AA 0 AAAAAAAA 0 111KDBBB 0 EEEEEEEE 1 ; DATA1 DATA2 DATA3 DATA4 ; ; K = 0 Bit Verify , K = 1 Bit Write ; D = Bit Data ; BBB = Bit Position (000=bit0) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DIRECT_MODE ; Bit Manipulation / Verify / Write 判定 MOVF DATA1,W XORLW B'01111000' ; CC=10 Bit Manipulation BTFSC STATUS,Z GOTO DIRECT_BIT MOVF DATA1,W XORLW B'01110100' ; CC=01 Verify Byte BTFSC STATUS,Z GOTO DIRECT_VERIFY MOVF DATA1,W XORLW B'01111100' ; CC=11 Write Byte BTFSC STATUS,Z GOTO DIRECT_WRITE GOTO STEP001 DIRECT_BIT ; Bit Manipulation処理 BTFSC DATA3,4 ; K=0(Verify)次の命令をスキップ GOTO STEP001 ; MOVF DATA2,W ; DATA2で指定のCV読み込み CALL EEPROM_READ MOVWF DIRECT_TEMP ; DIRECT_TEMPにコピー CALL BIT_TBL ; サブルーチン呼び出し ANDWF DIRECT_TEMP,F ; CV保存値をビット位置でANDする BTFSS DATA3,3 ; BitData=「1」なら次命令をスキップ GOTO BIT0_CHK BIT1_CHK ; Bitが「1」かチェック MOVF DIRECT_TEMP,W ; ビット位置がゼロかのチェック BTFSS STATUS,Z CALL BASIC_ACK GOTO STEP001 BIT0_CHK ; Bitが「0」かチェック MOVF DIRECT_TEMP,W ; ビット位置がゼロでないことチェック BTFSC STATUS,Z CALL BASIC_ACK ; BASIC ACK 応答 GOTO STEP001 BIT_TBL ; サブルーチン ; 下位3ビットの数値からビット位置の特定 MOVLW 0x01 ; テーブルは0x100-0x1FF番地内に存在[確認修正要] MOVWF PCLATH MOVF DATA3,W ; DATA3 -> W ANDLW B'00000111' ; DATA3の下位3BITの抽出 ADDWF PCL,F RETLW B'00000001' ; 「0」のときBit「0」 RETLW B'00000010' ; 「1」のときBit「1」 RETLW B'00000100' ; 「2」のときBit「2」 RETLW B'00001000' ; 「3」のときBit「3」 RETLW B'00010000' ; 「4」のときBit「4」 RETLW B'00100000' ; 「5」のときBit「5」 RETLW B'01000000' ; 「6」のときBit「6」 RETLW B'10000000' ; 「7」のときBit「7」 DIRECT_VERIFY MOVF DATA2,W ; DATA2で指定のCV読み込み CALL EEPROM_READ SUBWF DATA3,W ; DATA3と比較する BTFSS STATUS,Z ; 一致Z=1 不一致Z=0 GOTO STEP001 ; 不一致なら読み込み継続 CLRF SM_STATUS ; ServiceMode完了 CALL BASIC_ACK ; BASIC ACK 応答 GOTO STEP001 ; DIRECT_WRITE ; cv8ならCV_default_WRITEへ MOVLW .07 ; CV8への処理か? (書き込み命令か?) XORWF DATA2,W BTFSS STATUS,Z ; 0x07ならスキップ GOTO DIRECT_WRITE2 MOVLW .08 ; 書込みの値は0x08か? XORWF DATA3,W BTFSS STATUS,Z GOTO CV_default_WRITE_END ; 0x08以外ならCV_default_WRITE_ENDへ GOTO CV_default_WRITE DIRECT_WRITE2 MOVF DATA3,W ; DATA3の内容をCVに書き込む MOVWF CVEEDATA ; MOVF DATA2,W ; DATA2 -> W CALL EEPROM_WRITE ; CLRF SM_STATUS ; DIRECTモード書込み完了 CLRWDT CALL BASIC_ACK ; BASIC ACK 応答 CLRWDT GOTO STEP001 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; PAGEモード ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PAGE_MODE BTFSS DATA1,2 ; BIT2が0ならDataRegister 0-3 GOTO DATA_REG ; BIE2=1ならスキップ BTFSC DATA1,1 ; BIT1が0ならBasicConfRegiかPagingRegister GOTO STEP001 ; Bit=0ならスキップ BTFSS DATA1,0 ; BIT1が 0ならBasicConfRegi 1ならPagingRegister GOTO BSC_CNF_REG ; BIT=1ならスキップ GOTO PAGE_REG ; PAGE_REG MOVF DATA2,W ; DATA2 -> W MOVWF P_REG ; W -> P_REG DECF P_REG,F ; P_REG - 1 -> P_REG BCF STATUS,C ; P_REG * 4 -> P_REG RLF P_REG ; BCF STATUS,C ; RLF P_REG ; BSF SM_STATUS,1 ; PageMode PageRegi読み込み済み CLRWDT CALL BASIC_ACK ; BASIC ACK 応答 GOTO STEP001 ; DATA_REG BTFSS SM_STATUS,1 ; SM_STATUSのBIT1が1なら処理継続、0ならSTEP001へ GOTO STEP001 ; BIT1=1ならスキップ MOVF DATA1,W ; DATA1 -> W ANDLW B'00000011' ; BIT0,1を取り出し ADDWF P_REG,W ; P_REGに加え、D_REGに代入 MOVWF D_REG ; cv8ならCV_default_WRITEへ MOVLW .07 ; CV8への処理か? (書き込み命令か?) XORWF D_REG,W BTFSC STATUS,Z GOTO PM_CV_RESET ; 8ならCV_default_WRITEへ BTFSS DATA1,3 ; WRITEモード? Verify? GOTO DATA_REG_VERIFY ; BIT3=1(Writeモード)ならスキップ DATA_REG_WRITE MOVF DATA2,W ; DATA2の内容をCVに書き込む MOVWF CVEEDATA ; MOVF D_REG,W ; D_REG -> W CALL EEPROM_WRITE ; CLRF D_REG CLRF SM_STATUS ; PageMode書込み完了 CLRWDT CALL BASIC_ACK ; BASIC ACK 応答 GOTO STEP001 ; DATA_REG_VERIFY MOVF D_REG,W ; D_REGで指定のCV読み込み CALL EEPROM_READ SUBWF DATA2,W ; DATA2と比較する BTFSS STATUS,Z ; 一致Z=1 不一致Z=0 GOTO STEP001 ; 不一致なら読み込み継続 CLRF D_REG ; 一致したらレジスタクリアしてACK処理 CLRF SM_STATUS ; PageMode書込み完了 CLRWDT CALL BASIC_ACK ; BASIC ACK 応答 GOTO STEP001 ; BSC_CNF_REG BTFSS SM_STATUS,1 ; SM_STATUSのBIT1が1なら書き込み、0なら書き込まない GOTO STEP001 ; BIT1=1ならスキップ BTFSS DATA1,3 ; WRITEモード? Verify? GOTO BSC_CNF_VERFY ; BIT3=1(Writeモード)ならスキップ BSC_CNF_WRITE MOVF DATA2,W ; DATA2の内容をCV29に書き込む MOVWF CVEEDATA ; MOVLW .28 ; CALL EEPROM_WRITE ; CLRF P_REG CLRF SM_STATUS ; PageMode書込み完了 CLRWDT CALL BASIC_ACK ; BASIC ACK 応答 GOTO STEP001 ; BSC_CNF_VERFY MOVLW .28 ; CV29の読み込み CALL EEPROM_READ SUBWF DATA2,W ; DATA2と比較する BTFSS STATUS,Z ; 一致Z=1 不一致Z=0 GOTO STEP001 ; 不一致なら読み込み継続 CLRF P_REG ; 一致したらレジスタクリアしてACK処理 CLRF SM_STATUS ; PageMode書込み完了 CLRWDT CALL BASIC_ACK ; BASIC ACK 応答 GOTO STEP001 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; デコーダ、統括制御命令 (一斉停止のみサポート) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DCDR_CNT MOVF DATA1,W ; 第1バイトが0x00、第2バイトが0x00なら XORWF DATA2,W ; デコーダリセット命令である BTFSS STATUS,Z ; Xorして0なら次命令をスキップ GOTO STEP001 BSF SM_STATUS,0 ; RESETパケット受信済みフラグセット ; CLRF SPEED ; 速度0、ファンクション出力0 制御 ; CLRF PORTA ; CLRF PORTC ; CLRF PORTA GOTO STEP001 ; 速度情報を反映したのちDCC信号の読み取り ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;; EEPROMの書き込み、読み込み (サブルーチン) CV設定をEEPROMに保存、読み出し ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EEPROM_WRITE ; 書き込みアドレスをWに、書き込みデータをCVEEDATAに CLRWDT BANKSEL EEADRL MOVWF EEADRL MOVLB B'00000' ; BANK0 MOVF CVEEDATA,W BANKSEL EEDATL MOVWF EEDATL BSF EECON1,WREN MOVLW 0x55 MOVWF EECON2 MOVLW 0xAA MOVWF EECON2 BSF EECON1,WR WRITE_WAIT BTFSC EECON1,WR GOTO WRITE_WAIT MOVLB B'00000' ; BANK0 RETURN EEPROM_READ ; 読み込みアドレスをWに、読み込んだデータをWへ BANKSEL EEADRL MOVWF EEADRL BSF EECON1,RD MOVF EEDATL,W MOVLB B'00000' ; BANK0 RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;; CV値のリセット PageMode の際 CV8書き込み命令の値は8か? ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PM_CV_RESET MOVLW .08 XORWF DATA2,W BTFSS STATUS,Z GOTO CV_default_WRITE_END ; 8以外ならCV_default_WRITE_ENDへ GOTO CV_default_WRITE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;; CV値のリセット CV8書き込み命令の値は8か? ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CV_RESET MOVLW .08 XORWF DATA4,W BTFSS STATUS,Z GOTO STEP001 ; 8以外ならSTEP001へ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;; CV値のリセット (サブルーチン) CV設定を初期状態にもどす ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CV_default_WRITE ;===== CV01 アクセサリアドレス 1バイト目 ==================================== MOVLW b'10000001' ; 初期値10000001 MOVWF CVEEDATA ; MOVLW .00 ; CALL EEPROM_WRITE; ;===== CV02 アクセサリアドレス 2バイト目 ==================================== MOVLW b'11111000' ; 初期値11111000 MOVWF CVEEDATA ; MOVLW .01 ; CALL EEPROM_WRITE; ;===== CV03 出力作動時間 0-255 ===================================== MOVLW .005 ; 初期値5 MOVWF CVEEDATA ; MOVLW .02 ; CALL EEPROM_WRITE; ;===== CV04 出力動作保持設定 0-1 ==================================== MOVLW b'00000001' ; 初期値1 MOVWF CVEEDATA ; MOVLW .03 ; CALL EEPROM_WRITE; ;===== CV05 出力遅延時間 0-255 ==================================== MOVLW .001 ; 初期値1 MOVWF CVEEDATA ; MOVLW .04 ; CALL EEPROM_WRITE; ;===== CV06 出力PWM Duty設定 0-255 ==================================== MOVLW .127 ; 初期値127 MOVWF CVEEDATA ; MOVLW .05 ; CALL EEPROM_WRITE; ;===== CV07 Version Number 094 ==================================== MOVLW .094 ; 初期値094 MOVWF CVEEDATA ; MOVLW .06 ; CALL EEPROM_WRITE ;;===== CV08 (Manufacturer ID is 156) ==================================== MOVLW .156 ; 初期値156 MOVWF CVEEDATA ; MOVLW .07 ; CALL EEPROM_WRITE; CV_default_WRITE_END CLRF P_REG BCF SM_STATUS,0 ; PageMode flagクリア(書込み完了) GOTO MAIN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Basic Acknowlegment ; 6mSec +-1mS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BASIC_ACK ; 回路A t制御 ; BCF A_OUT2 ; NOP CLRWDT BANKSEL PSTR1CON BCF PSTR1CON,0 ; 逆転に設定 NOP BSF PSTR1CON,1 NOP BSF A_OUT2 NOP MOVLB B'00000' ; BANK0 MOVLW B'00001111' ;PWM制御に50%Dutyを反映 BANKSEL CCPR1L MOVWF CCPR1L MOVLB B'00000' ; BANK0 CLRWDT CALL TIME1mS CALL TIME1mS CALL TIME1mS CALL TIME1mS CALL TIME1mS CALL TIME1mS CLRWDT BANKSEL CCPR1L ; PWM制御を0に CLRF CCPR1L MOVLB B'00000' ; BANK0 RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Timer Routine at 4MHz (1COMMAND=1uS) ; TIME10uS :10uSec ; TIME1mS :1mSec ; TIME60mS :60mSec ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TIME10uS ; 1+1+1+(1+2)*2-1+2=10 10uS=10Cycle NOP CLRWDT ; 1 MOVLW D'2' ; 1 MOVWF CNT1 ; 1 T_LP1 DECFSZ CNT1,F ; 1 OR 2 GOTO T_LP1 ; 2 RETURN ; 2 TIME1mS ; 1+1+(10+2+2)*71-1+1+2=998 1mS=1000Cycle MOVLW D'71' ; 1 MOVWF CNT2 ; 1 T_LP2 CALL TIME10uS ; 9 GOTO $+1 ; 2 DECFSZ CNT2,F ; 1 OR 2 GOTO T_LP2 ; 2 NOP CLRWDT ; 1 RETURN ; 2 ;TIME60mS ; 1+1+(998+2)*60-1+2=60003 60mS=60000Cycle ; MOVLW D'60' ; 1 ; MOVWF CNT3 ; 1 ;T_LP3 CALL TIME1mS ; 1998 ; DECFSZ CNT3,F ; 1 OR 2 ; GOTO T_LP3 ; 2 ; RETURN ; 2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;; ポイント制御出力タイマ (サブルーチン) 4MHz (1COMMAND=1uS) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DLY_CONT MOVLW .02 CALL EEPROM_READ ; MOVLW d'30' ; 300ms (= 10ms x 30) MOVWF TMR_CNT3 DLY_100 ; 10ms (= 1ms x 10) MOVLW d'10' MOVWF TMR_CNT1 DLP1 ; 1ms (= 5us x 200) MOVLW d'200' MOVWF TMR_CNT2 DLP2 NOP ; NOP CLRWDT DECFSZ TMR_CNT2,F GOTO DLP2 DECFSZ TMR_CNT1,F GOTO DLP1 DECFSZ TMR_CNT3,F GOTO DLY_100 RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;; ポイント制御開始タイマ (サブルーチン) 4MHz (1COMMAND=1uS) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DLY_action MOVLW .04 CALL EEPROM_READ ; MOVLW d'200' ; 1000ms (= 10ms x 100) MOVWF TMR_CNT3 DLY2_100 ; 10ms (= 1ms x 10) MOVLW d'10' MOVWF TMR_CNT1 D2LP1 ; 1ms (= 5us x 200) MOVLW d'200' MOVWF TMR_CNT2 D2LP2 NOP ; NOP CLRWDT DECFSZ TMR_CNT2,F GOTO D2LP2 DECFSZ TMR_CNT1,F GOTO D2LP1 DECFSZ TMR_CNT3,F GOTO DLY2_100 RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;; 貫通電流防止タイマ (サブルーチン) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STOP_CONT ; 100uS (=5x20) MOVLW d'20' MOVWF TMR_CNT2 STOP_DLP2 NOP ; 1 ; NOP ; 1 CLRWDT DECFSZ TMR_CNT2,F ; 1 OR 2 GOTO STOP_DLP2 ; 2 RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; 終了 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; END