LIST p=12f629 INCLUDE "p12f629.inc" __CONFIG _BODEN_ON & _CP_OFF & _WDT_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; ;;;;; 簡易DCC アクセサリデコーダを作ろう! Ver 0.91 2009.09.28 ;;;;; ;;;;; Web Nucky http://web.nucky.jp ;;;;; ;;;;; Copyright (C) 2007-2009 Nucky ;;;;; ;;;;; DCC Signal Analysis (0/1 Detection part) & FET Bridge ;;;;; Original by T.Shimizu (Copyright 2007/6) ;;;;; http://www.dokidoki.ne.jp/home2/tohrus/marklin.html ;;;;; ;;;;; 使用PICマイコン PIC16F629  内部発振4MHzモード ;;;;; ;;;;; 2009.05.15 Ver 0.9  初版作成 ;;;;; 2009.10.17 Ver 0.91  DCC信号受信タイミング調整 標準値変更 0x07 ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; ;;;;; DCC信号受信タイミング調整 標準値 0x07 ;;;;; ;;;;; 製作後DCC信号の受信に失敗する場合は0x06〜0x08(16進数)の間で ;;;;;  設定を変えて試してみてください。 ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #define CNT 0x07 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 入出力ピンの割り当て(定義) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #define PROG_IN GPIO,0 ; プログラムジャンパー入力 #define A_OUT GPIO,1 ; 回路A出力(FET用) #define B_OUT GPIO,2 ; 回路B出力(FET用) #define DCC_IN GPIO,3 ; DCC信号入力 #define B_LEDOUT GPIO,4 ; 回路B出力(LED用) #define A_LEDOUT GPIO,5 ; 回路A出力(LED用) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 初期値の設定(EEPROMへのデータ定義) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0x2100 ; ;----- 初期データ -------- CV値 ---------------------- de b'10000001' ; 回路A 1バイト目 001 de b'11111000' ; 回路A 2バイト目 de b'10000001' ; 回路B 1バイト目 002 de b'11111010' ; 回路B 2バイト目 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 変数の定義 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 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バイト目 B_ADR01 ;回路B 1バイト目 B_ADR02 ;回路B 2バイト目 TEMP1 ;仮変数1 TEMP2 ;仮変数2 PRGMODE ;プログラムモード変数 CVEEDATA ;EEPROM書き込み用一時変数 endc ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; PICマイコンの初期設定 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 0x00 CALL H'3FF' BSF STATUS,RP0 MOVWF OSCCAL GOTO MAINSTART ORG 0x04 RETFIE MAINSTART BCF STATUS,RP0 CLRF GPIO ; GPIO初期化 MOVLW 0x07 MOVWF CMCON ; コンパレータ使用しない(GP2-0はデジタルIO) BSF STATUS,RP0 ; バンク1に切り替え ; CLRF ANSEL ; デジタルIO(AN機能を使用しない) ; MOVLW 0x60 ; CLOCK=4MHz ; MOVWF OSCCON MOVLW B'00001001' ; GP0 GP3を入力、それ以外は出力とする MOVWF TRISIO ; MOVLW b'01111111' ; GP0のみウィークプルアップ ; MOVWF OPTION_REG ; MOVLW b'00000001' ; MOVWF WPU BCF STATUS,RP0 ; バンク0に切り替え CLRF INTCON ;割り込みを禁止 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; プログラムモード初期設定 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CLRF PRGMODE BTFSC PROG_IN ; プログラムジャンパの状態を読み込み GOTO STEP001 MOVLW 0x01 MOVWF PRGMODE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; DCCパケット読み込み処理 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STEP001 CLRF DATA1 CLRF DATA2 CLRF DATA3 CLRF DATA4 CLRF DATA5 CLRF DATA6 CLRF DATA20 CLRF TCNT1 CLRF TCNT2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; プリアンブル検出 ("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 NOP 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 NOP INCF TCNT1,F GOTO BB01 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 第1バイト読み込み ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STEP003 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 NOP 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 NOP 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 NOP 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 NOP 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 NOP 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 NOP 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 NOP 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 NOP 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 NOP 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 NOP 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 NOP INCF TCNT1,F GOTO MM01 MM08 RLF DATA6,F BCF DATA6,0 DECFSZ TCNT2,F GOTO MM09 MM20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; DCCパケット エラーチェック ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CHK_ERR 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 BTFSS DATA1,7 ; アクセサリデコーダアドレス以外はDCC信号読取へ戻る GOTO STEP001 BTFSC DATA1,6 GOTO STEP001 MOVF DATA2,W ANDLW b'11111110' ; DATA2の7-1BITを抜き出し DATA20 へ MOVWF DATA20 MOVF PRGMODE,F ; プログラムモードの判別 BTFSS STATUS,Z ; GOTO PRG_SQ ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 変数読み込み ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ADRREAD MOVLW .00 CALL EEPROM_READ MOVWF A_ADR01 MOVLW .01 CALL EEPROM_READ MOVWF A_ADR02 MOVLW .02 CALL EEPROM_READ MOVWF B_ADR01 MOVLW .03 CALL EEPROM_READ MOVWF B_ADR02 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 命令実行処理 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; A_ADR_CHK01 MOVF DATA1,W ; DATA1は回路A用アドレスと一致するか? XORWF A_ADR01,W BTFSS STATUS,Z GOTO B_ADR_CHK01 A_ADR_CHK02 MOVF DATA20,W ; DATA20は回路A用アドレスと一致するか? XORWF A_ADR02,W BTFSS STATUS,Z GOTO B_ADR_CHK01 A_T_C_CHK BTFSC DATA2,0 ; DATA2 bit0 は 1/0? GOTO A_C_CONT A_T_CONT BCF A_OUT ; 回路A t制御 NOP BCF A_LEDOUT GOTO STEP001 A_C_CONT BSF A_OUT ; 回路A c制御 NOP BSF A_LEDOUT GOTO STEP001 B_ADR_CHK01 MOVF DATA1,W ; DATA1は回路B用アドレスと一致するか? XORWF B_ADR01,W BTFSS STATUS,Z GOTO STEP001 B_ADR_CHK02 MOVF DATA20,W ; DATA20は回路B用アドレスと一致するか? XORWF B_ADR02,W BTFSS STATUS,Z GOTO STEP001 B_T_C_CHK BTFSC DATA2,0 ; DATA2 bit0 は 1/0? GOTO B_C_CONT B_T_CONT BCF B_OUT ; 回路B t制御 NOP BCF B_LEDOUT GOTO STEP001 B_C_CONT BSF B_OUT ; 回路B C制御 NOP BSF B_LEDOUT GOTO STEP001 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;; アドレス書き込み処理 読み込んだアドレスEEPROMに保存 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PRG_SQ PG_CHK_D1 MOVF DATA1,W XORWF TEMP1,W BTFSC STATUS,Z GOTO PG_CHK_D2 MOVF DATA1,W MOVWF TEMP1 GOTO ADRREAD PG_CHK_D2 MOVF DATA20,W XORWF TEMP2,W BTFSC STATUS,Z GOTO PGM_SQ_CHK MOVF DATA20,W MOVWF TEMP2 GOTO ADRREAD PGM_SQ_CHK MOVF PRGMODE,W ; PRGMODE=1ならCOUNTUPへ XORLW 0x01 ; BTFSC STATUS,Z ; GOTO COUNTUP ; MOVF PRGMODE,W XORLW 0x02 ; PRGMODE=2ならA_EEWRITEへ BTFSC STATUS,Z ; GOTO A_EEWRITE ; MOVF PRGMODE,W XORLW 0x03 ; PRGMODE=3ならB_ADR_CHKへ BTFSC STATUS,Z ; GOTO B_ADR_CHK ; MOVF PRGMODE,W XORLW 0x04 ; PRGMODE=4ならB_EEWRITEへ BTFSC STATUS,Z ; GOTO B_EEWRITE ; MOVF PRGMODE,W MOVLW 0x00 ; PRGMODE= 0〜4以外なら強制的に0を代入 MOVWF PRGMODE ; GOTO ADRREAD ; A_EEWRITE MOVF TEMP1,W ; MOVWF CVEEDATA ; MOVLW .00 ; CALL EEPROM_WRITE ; MOVF TEMP2,W ; MOVWF CVEEDATA ; MOVLW .01 ; CALL EEPROM_WRITE ; GOTO COUNTUP B_ADR_CHK MOVF DATA1,W XORWF A_ADR01,W BTFSS STATUS,Z GOTO COUNTUP B_ADR2_CHK MOVF DATA20,W XORWF A_ADR02,W BTFSS STATUS,Z GOTO COUNTUP MOVLW 0x02 MOVWF PRGMODE GOTO ADRREAD B_EEWRITE MOVF TEMP1,W ; MOVWF CVEEDATA ; MOVLW .02 ; CALL EEPROM_WRITE ; MOVF TEMP2,W ; MOVWF CVEEDATA ; MOVLW .03 ; CALL EEPROM_WRITE ; GOTO COUNTUP COUNTUP MOVLW 0x01 ; PRGMODE + 1 -> PRGMODE ADDWF PRGMODE,F ; GOTO ADRREAD ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;; EEPROMの書き込み、読み込み (サブルーチン) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EEPROM_WRITE ; 書き込みアドレスをWに、書き込みデータをCVEEDATAに BSF STATUS,RP0 MOVWF EEADR BCF STATUS,RP0 MOVF CVEEDATA,W BSF STATUS,RP0 MOVWF EEDATA BSF EECON1,WREN MOVLW 0x55 MOVWF EECON2 MOVLW 0xAA MOVWF EECON2 BSF EECON1,WR WRITE_WAIT BTFSC EECON1,WR GOTO WRITE_WAIT BCF STATUS,RP0 RETURN EEPROM_READ ; 読み込みアドレスをWに、読み込んだデータをWへ BSF STATUS,RP0 MOVWF EEADR BSF EECON1,RD MOVF EEDATA,W BCF STATUS,RP0 RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; 終了 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; END