(1)初期化
;---------------------------------------------------------------
; 割込制御設定:TMR0 割込許可 ;INTCON Initialize Data
;---------------------------------------------------------------
S_INTC EQU B'10100000' ;TMR0 Onry
; |||||||+GPIF x:Port Change Interrupt Flag bit
; ||||||+ INTF x:GP2/INT External Interrupt Flag bit
; |||||+- T0IF x:TMR0 Over Flow Flag
; ||||+-- GPIE 0:Disables the GPIO port change interrupt
; |||+--- INTE 0;Disables the GP2/INT external interrupt
; ||+---- T0IE 1:Enables the TMR0 interrupt
; |+----- PEIE 0:Disables all peripheral interrupts
; +------ GIE 1:Enables all unmasked interrupts
;
;---------------------------------------------------------------
; TMR0 制御設定 ;TMR0/WDT Control
;---------------------------------------------------------------
;S_OPTF EQU B'00000000' ;Pre Scaler=TMR0(1/2)
; |||||+++------ WDT =000:1/1, 001:1/2, 010:1/4
; |||||+++------ TRM0=000:1/2, 001:1/4, 010:1/8
; ||||+--------- Pre Scaler 0:TMR0(1/2) 1:WDT(1/1)
; |||+---------- T0SE 0:L-->H, H-->L
; ||+----------- T0SC 0:Int Clock
; |+------------ 0=INTEDG:falldown
; +------------- /GPIO Pul Up 0:Enable
;---------------------------------------------------------------
; TMR0 プリセット値
;---------------------------------------------------------------
; ;TMR0 Pre Set Value 256-(T*F/P)=ccc
; ;F:4MHz, P:1, T:208uS (256-208)+18=66
; ;18:オーバーヘッド補正値
;---------------------------------------------------------------
;(4, 8, 16倍クロック相当の)割込間隔を条件アセンブルで切替える方法
;---------------------------------------------------------------
S_RESO EQU 8 ;8(分割) アセンブル条件セット
;
;S_RESO EQU 4 8 16
;TMR0 周期 832uS 416uS 208uS
;20mSタイマカウント値
;S_T02S EQU 24 48 96
;Pre Scaler設定 TMR0:1/4 TMR0:1/2 WDT(1/1)
;S_OPTF EQU B'00000001' B'00000000' B'00001000'
;
;---------------------------------------------------------------
IF S_RESO==4 ;
;S_TMR0 EQU (42:受信できない) 48,54,60 (66:文字化け)
S_TMR0 EQU 54 ;F:4MHz, P:1, T:208uS (256-208)+6=54
S_T02S EQU 24
S_OPTF EQU B'00000001' ;Pre Scaler=TMR0:1/4
ENDIF
;
IF S_RESO==8
;S_TMR0 EQU (42:受信できない) 48,54,60 (66:先頭文字化け)
S_TMR0 EQU 54 ;F:4MHz, P:2, T:416uS (256-208)+6=54
S_T02S EQU 48
S_OPTF EQU B'00000000' ;Pre Scaler=TMR0:1/2
ENDIF
IF S_RESO==16
;S_TMR0 EQU (48:受信できない) 54,60,66 (72:先頭文字化け)
S_TMR0 EQU 60 ;F:4MHz, P:1, T:208uS (256-208)+12=60
S_T02S EQU 96
S_OPTF EQU B'00001000' ;Pre Scaler=WDT(TMR0:1/1)
ENDIF
;---------------------------------------------------------------
; 初期化処理
;---------------------------------------------------------------
INIT CLRF INTCON
; ;TMR0/WDT Control
BCF STATUS,RP0
MOVLW B'00000000' ;Init GPIO
MOVWF GPIO
MOVLW B'00000111' ;Comp NotUse
MOVWF CMCON
;
MOVLW B'00001111' ;GPIO(0:out 1:in)
BSF STATUS,RP0
MOVWF TRISIO ;TRIS GPIO
;
MOVLW B'00000000' ;WPU (1:Pull-Up)
MOVWF WPU ;Week Pull Up
;
BCF STATUS,RP0
MOVLW B'00110000' ;Init GPIO
MOVWF GPIO
;-------------------------------;A/D
MOVLW B'00000001'
; || |||+------;1:ADON
; || ||+-------;0:GO/1:DONE
; || ++--------;00:AN0,,,11:AN3
; |+------------;0:VDD,1:VREF
; +-------------;0:LJst,1:RJst
MOVWF ADCON0
;
BSF STATUS,RP0
MOVLW B'00010111'
; GP |||4210
; |||++++------;ANS3:ANS0 (1:AN, 0:DI/O)
; +++----------;ADCS:001 (8TOSC 4MHz:2.0uS)
MOVWF ANSEL
;
;-------------------------------; INTCON Initialize
BSF STATUS,RP0
MOVLW S_OPTF ;TMR0 Pre Scaler / WDT Initialize
MOVWF OPTREG ;OPTION Register
BCF STATUS,RP0
MOVLW S_TMR0 ;TMR0 Pre Set
MOVWF TMR0
;
MOVLW S_INTC ;INTCON Set
MOVWF INTCON ;
;---------------------------------------------------------------
; その他ワークエリアの初期化など
; CLRF xxxxxx
; .... ......
;---------------------------------------------------------------
RETURN ;Initialize end
(2)割込処理
ORG 0x004 ;Interrupt vector
;===============================================================
; Interrupt Service
;===============================================================
;---------------------------------------------------------------
; ;save register
;---------------------------------------------------------------
PUSH MOVWF W_WREG ;Save W reg.
SWAPF W_WREG,1
SWAPF STATUS,0 ;Get status
MOVWF W_STAT ;Save it
MOVF FSR,W ;Save SFR
MOVWF W_FSR_
;
;---------------------------------------------------------------
; Interrupt source analize
;---------------------------------------------------------------
BCF STATUS,RP0 ;BANK0
BTFSS INTCON,T0IF ;TMR0 Over Flow ?
GOTO INIINT ;init
;
;---------------------------------------------------------------
; TMR0 Service 416uS 毎割込
;---------------------------------------------------------------
;S_TMR0 EQU 66 ;0x42 F:4MHz, P:2, T:416uS (256-208)+18=66
;S_TMR0 EQU 63 ;0x3F F:4MHz, P:2, T:416uS (256-208)+15=63
;S_TMR0 EQU 57 ;0x39 F:4MHz, P:2, T:416uS (256-208)+ 9=57
;
INTRTC
MOVF S_TMR0,W ;TMR0 data (from EEPROM)
; MOVLW S_TMR0 ;TMR0 Pre Set
MOVWF TMR0
;
BCF INTCON,T0IF ;clr int flag
;
;---------------------------------------------------------------
; ;RX data input
;---------------------------------------------------------------
; ;RX status _________
; WTRSTS,0 ;RX Busy flag _________ RX Busy ______
; WTRSTS,1 ;RX Done flag ______ ______
; ; (read)____________ Done
;---------------------------------------------------------------
BTFSC WTRSTS,0 ;
GOTO INTRX1 ; RX Busy
; ;not RX Busy
; ;---------- bit 0 process ------
BTFSC GPIO,3 ;RX Start Bit Check
GOTO INTTX0 ; not Start
; ; Start
;---------------------------------------------------------------
BTFSC WTRSTS,1 ;RX Over run Err Check
GOTO INTRX9 ; Over run Err(not read)
;
; MOVLW 16 ;---------- Start bit process --
MOVLW 8 ;---------- Start bit process --
;****** MOVF C_CLKC,W
MOVWF WRXCC_
BCF STATUS,C
RRF WRXCC_,F ;1/2:half bit time set
MOVLW 0xF0
ANDWF WTRBC_,F ;Clear RX bit count
BSF WTRSTS,0 ;RX Busy set
GOTO INTTX0
;
INTRX9 BSF WTRSTS,2 ;RX Over run Err Flag set
BSF WTRSTS,1 ;RX Done Flag set
BCF WTRSTS,0 ;RX Busy flag reset
GOTO INTTX0
;
INTRX1 DECFSZ WRXCC_,F ;---------- 1 bit time counter -
GOTO INTTX0 ;WRXCC_><0
; ; =0
; MOVLW 16 ;---------- Start bit process --
MOVLW 8 ;---------- Start bit process --
;****** MOVF C_CLKC,W
MOVWF WRXCC_
; ;---------- bit 0-9 process ----
MOVF WTRBC_,W ;WTRBC_,3:0 RX bit count
ANDLW 0x0F
SUBLW 8 ;8-(W)
BTFSC STATUS,C
GOTO INTRXR ;8 >= count
; ;8(9)< count
; ;1BYTE input conplete
MOVF WRXDT_,W
MOVWF WRXDTB ;set RX buffer
CLRF WRXDT_
BCF WTRSTS,3 ;RX Frameing Err Flag
BCF WTRSTS,2 ;RX Over run Err Flag
BSF WTRSTS,1 ;RX Done Flag set
BCF WTRSTS,0 ;RX Busy flag reset
MOVLW 0xF0
ANDWF WTRBC_,F ;Clear RX bit count
; ;-------------------------------
BTFSC GPIO,3 ;RX Stop Bit Check
GOTO INTTX0 ;Stop Bit:1 OK
BSF WTRSTS,3 ;RX Frameing Err
; ;-------------------------------
GOTO INTTX0
;
INTRXR BSF STATUS,C
BTFSS GPIO,3 ; ---> C
BCF STATUS,C
RRF WRXDT_,F ;C ---> WRXDT_ 1bit input
INCF WTRBC_,F
;
;---------------------------------------------------------------
; ;TX data output
;---------------------------------------------------------------
INTTX0
BTFSC WTRSTS,5
GOTO INTTX9 ;TX Done
; ; Start
BTFSC WTRSTS,4 ;
GOTO INTTXB ;TX Busy
; ; not Busy
; ; =0
; MOVLW 16 ;---------- clk counter set(1st)
MOVLW 8 ;---------- clk counter set(1st)
;****** MOVF C_CLKC,W
MOVWF WRXCC_
; ;---------- Start bit process --
BSF WTRSTS,4 ;TX Busy flag set
MOVLW 0x0F
ANDWF WTRBC_,F ;Clear TX bit count
GOTO INTTXL ;0 count [Start Bit ---> Lo]
;
INTTXB DECFSZ WTXCC_,F ;---------- 1 bit time counter -
GOTO INTTX9 ;WTXCC_><0
; ; =0
; MOVLW 16 ;---------- clk counter set(1st)
MOVLW 8 ;---------- clk counter set(1st)
;****** MOVF C_CLKC,W
MOVWF WTXCC_
;
SWAPF WTRBC_,W ;WTRBC_,7:4 TX bit count
ANDLW 0x0F
SUBLW 10 ;10-(W)
BTFSS STATUS,Z
GOTO INTTXT ;10><(W)
; ;10= (W)
; ;---------- TX Done ------------
BSF GPIO,4 ;keep Hi
BSF WTRSTS,5 ;TX Done flag set
BCF WTRSTS,4 ;TX Busy flag reset
GOTO INTTX9
;
INTTXT SWAPF WTRBC_,W ;WTRBC_,7:4 TX bit count
ANDLW 0x0F
SUBLW 9 ;9-(W)
BTFSC STATUS,Z
; ;9 count [Stop Bit ---> Hi]
GOTO INTTXH ;---------- Stop bit process ---
; ;9><(W)
BSF STATUS,C
RRF WTXDT_,F ;1 ---> [7]---[0] ---> C
BTFSC STATUS,C
GOTO INTTXH ;Hi
; ;Lo
INTTXL BCF GPIO,4 ;output Lo, [Start Bit]
GOTO INTRTZ
;
INTTXH BSF GPIO,4 ;output Hi, [Stop Bit]
;
INTRTZ MOVLW 0x10
ADDWF WTRBC_,F ;INC TX bit count
INTTX9
;
;【その他 208uS(or 416uS)毎の割込み処理】
; A/D変換のチャンネル切替・変換開始・データ読取・平均化 など
;
;---------------------------------------------------------------
; superviser process ;Timer process
;---------------------------------------------------------------
;
;WT_02S EQU 0x2B ;Timer count 20mS 208uSx96=20mS
; 416uSx48=20nS
;WT_SEC EQU 0x2C ; // // 1 Sec x50=1Sec
;WT_MIN EQU 0x2D ; // // 1 Min x60=1Min■■■未使用■■■
;WT_HUR EQU 0x2E ; // // 1 Hur x60=1Hur■■■未使用■■■
;W_SEC_ EQU 0x2F ;OFF Delay timer
;W_HUR_ EQU 0x30 ;Chage timer
;---------------------------------------------------------------
INTRT1
DECFSZ WT_02S,F ;20mS Timer
GOTO PULL ;not 0
; MOVLW 96 ;TM0=208uS
MOVLW 48 ;TM0=416uS
MOVWF WT_02S
;-------------------------------;(20mS) Interval Process
;
;【20mS毎の割込み処理】
; スイッチのチャタリングキャンセル処理
; スイッチの長押し判定処理
; LED・ブザーの点滅・吹鳴のパターン生成処理
;
INT004
;
;---------------------------------------------------------------
DECFSZ WT_SEC,F ;1Sec Timer
GOTO PULL
MOVLW 50
MOVWF WT_SEC
;-------------------------------;(1S) Interval Process
;
;
;【1秒毎の割込み処理:起動処理、LED・ブザー処理など】
;
;
;---------------------------------------------------------------
; DECFSZ WT_MIN,F ;1Min Timer
; GOTO PULL
; MOVLW 60
; MOVWF WT_MIN
;-------------------------------;(1M) Interval Process
;
;---------------------------------------------------------------
; DECFSZ WT_HUR,F ;1Hur Timer
; GOTO PULL
; MOVLW 60
; MOVWF WT_HUR
;-------------------------------;(1H) Interval Process
;
;---------------------------------------------------------------
GOTO PULL
;
;---------------------------------------------------------------
; ;Restore register
;---------------------------------------------------------------
INIINT MOVLW S_INTC ;init
MOVWF INTCON
PULL MOVF W_FSR_,W ;Restore FSR
MOVWF FSR
SWAPF W_STAT,0 ;Restore status
MOVWF STATUS
SWAPF W_WREG,0 ;Restore W reg.
RETFIE
;---------------------------------------------------------------
; End of Interrupt Service
;---------------------------------------------------------------
(3)通信処理
1 通信処理サンプル
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
(4)モニター
1 モニターサンプル
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0