;******************************************************************************************
;  風速計サンプル
;   Project      :
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H18.05.01
;   History      :
;******************************************************************************************
;  (1)Descript I/O 
;      GP1 : Input (RS)
;      GP2 : Output(TX)
;      GP5 : パルス入力 
;******************************************************************************************
	LIST	P=PIC12F683,ST=OFF,R=DEC
	INCLUDE	"P12F683.inc"	;標準ヘッダ定義ファイル
	__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF 
;
IODAT	EQU	20H
SENDLP	EQU	21H
SENDWAT	EQU	22H
RECLP	EQU	23H
RECWAT	EQU	24H
MSGCNT	EQU	25H
CNT	EQU	26H
CNT0	EQU	27H
CNT1	EQU	28H
CNT2	EQU	29H
DAT0	EQU	2AH
DAT1	EQU	2BH
DAT2	EQU	2CH
DAT3	EQU	2DH
COU0	EQU	2EH
COU1	EQU	2FH
COU2	EQU	30H
COU3	EQU	31H
OVER	EQU	32H
INTWRG	EQU	33H
INTSTS	EQU	34H
ITRCOU	EQU	35H
LPRPM	EQU	36H
CHCNT	EQU	37H
CHCNT1	EQU	38H

	ORG	0		; プログラムスタート
	GOTO	START
	ORG	4		; 割込み処理
	MOVWF	INTWRG		; W-REGの値を保存
	SWAPF	STATUS,W	; STATUSレジスタの値を保存
	MOVWF	INTSTS		; STATUSレジスタの値を保存
;
	MOVLW	H'9E'		; *TMR1
	MOVWF	TMR1H		; *TMR1
	MOVLW	H'58'		; *TMR1
	MOVWF	TMR1L		; *TMR1
;
;
	CALL	CNTITR
;
;
	SWAPF	INTSTS,W	; STATUSレジスタの値を復元
	MOVWF	STATUS		; STATUSレジスタの値を復元
	MOVFW	INTWRG		; W-REGレジスタの値を復元
	BCF	PIR1,TMR1IF	; *割込みフラグをリセット
	RETFIE
;
START
;  1.特殊レジスタの設定
;  (1)内部OSCの設定
	BSF	STATUS,RP0	; BANK1を選択
	BSF	OSCCON,6	; 8MHzを設定
	BSF	OSCCON,5	; 8MHzを設定
	BSF	OSCCON,4	; 8MHzを設定
;  (2)ポートの設定
	BCF	STATUS,RP0	; BANK0を選択
	MOVLW	07H		; BANK0でデジタルIO設定
	MOVWF	CMCON0		; BANK0でデジタルIO設定
;	CLRF	GPIO		; BANK0でポート初期化
	BSF	STATUS,RP0	; BANK1を選択
	CLRF	ANSEL		; BANK1でデジタルIO初期化
	MOVLW	B'111011'	; BANK1でPORT設定
	MOVWF	TRISIO		; BANK1でPORT設定
;
	BCF	STATUS,RP0	; BANK0を選択
; 2.変数初期設定
;   (1)送信フラグを初期化
	BSF	GPIO,2	
;   (2)カウンタを初期化
	CALL	INITCOU
	CLRF	ITRCOU		;
;   (3)デモを表示
	CALL	DEMO1
;
;  2.割込みタイマーを設定
	CALL	SETTIM
;  3.処理本体
MAIN
; (1)Hを待つ
MAIN1
	CALL	CHTIM	; チャッターリング防止タイマー
	BTFSS	GPIO,5	; ビットデータがLの時	
	GOTO	MAIN1
; (2)Lを待つ
MAIN2
	CALL	CHTIM	; チャッターリング防止タイマー
	BTFSC	GPIO,5	; ビットデータがHの時	
	GOTO	MAIN2
; (3)カウントアップ
	CALL	CNTRPM	; RPMで算出（羽の枚数は4枚で計算）
;
	GOTO	MAIN

;******************************************************************************************
;   Function Name : SETTIM
;   Title         : 割込みタイマーを設定
;   Input         : 
;   Output        : 
;******************************************************************************************
SETTIM
	BCF	STATUS,RP0	; BANK0を選択
	MOVLW	B'00110001'	; ×Bit7(0):Timer1 gate is not inverted
				; *Bit6(0):Timer1 is on
				; *Bit5,4(11):1:16 Prescale Value
				; *Bit3(0)LP osc is enabled for Timer1 colck
				; *Bit2(0):This bit is ignored (<==Bit1)
				; *Bit1(0):Internal clock(Fosc/4) 
				; *Bit0(1):Enable Timer1
	MOVWF	T1CON
	BCF	CMCON1,T1GSS	; *Not use
	MOVLW	H'9E'		; *TMR1
	MOVWF	TMR1H		; *TMR1
	MOVLW	H'58'		; *TMR1
	MOVWF	TMR1L		; *TMR1
	CLRF	ITRCOU		;
	BCF	PIR1,TMR1IF	; *割込みフラグをリセット
	BSF	INTCON,GIE	; *Grobal Interrupt Ebable (->1)      ※Total
	BSF	INTCON,PEIE	; *Peripheral Interrupt Ebable (->1)  ※Timer etc.
	BSF	STATUS,RP0	; BANK1を選択
	BSF	PIE1,TMR1IE	; *Timer1 Interrupt Ebable (->1)      ※Timer1
	BCF	STATUS,RP0	; BANK0を選択
	RETURN

;******************************************************************************************
;   Function Name : CNTITR
;   Title         : 割込みタイマー分周用10進カウンタ
;                   １秒毎に処理を行なう
;   Input         : 
;   Output        : 
;******************************************************************************************
CNTITR
; (1)タイマー割込み処理
	MOVLW	H'01'
	ADDWF	ITRCOU,F	; 0桁目10進カウンタ(0aで桁上げ)
	MOVFW	ITRCOU
	XORLW	H'0A'		; 0A
	BTFSS	STATUS,Z
	RETURN			; １０でないなら何もしない	
; (2)１秒毎に次の処理を行なう
	MOVLW	' '
	CALL	SEND
	CALL	SETDN
	CALL	DATOUT
	MOVLW	'['
	CALL	SEND
	MOVLW	'r'
	CALL	SEND
	MOVLW	'p'
	CALL	SEND
	MOVLW	'm'
	CALL	SEND
	MOVLW	']'
	CALL	SEND
	CALL	INITCOU
; (3)割込み設定
	CLRF	ITRCOU	
	MOVLW	H'9E'		; *TMR1
	MOVWF	TMR1H		; *TMR1
	MOVLW	H'58'		; *TMR1
	MOVWF	TMR1L		; *TMR1
	RETURN

;******************************************************************************************
;   Function Name : SETDN
;   Title         : カウンタ変数の代入
;   Input         : 
;   Output        : 
;******************************************************************************************
SETDN
	MOVFW	OVER
	XORLW	H'00'
	BTFSS	STATUS,Z
	GOTO	SETDN1
;
	MOVFW	COU0
	IORLW	H'30'
	MOVWF	DAT0
	MOVFW	COU1
	IORLW	H'30'
	MOVWF	DAT1
	MOVFW	COU2
	IORLW	H'30'
	MOVWF	DAT2
	MOVFW	COU3
	IORLW	H'30'
	MOVWF	DAT3
	RETURN
SETDN1
	MOVLW	H'0E'	; E
	MOVWF	DAT3
	MOVLW	H'1B'	; r
	MOVWF	DAT2
	MOVLW	H'1B'	; r
	MOVWF	DAT1
	MOVLW	H'01'	; 1
	MOVWF	DAT0
	RETURN
;******************************************************************************************
;   Function Name : CNTRPM
;   Title         : アップカウンタの単位をＲＰＭに変換
;                    CNTDEC * ( 60秒 / 4枚 )　=> 15
;   Input         : 
;   Output        : 
;******************************************************************************************
CNTRPM
	MOVLW	H'0F'
	MOVWF	LPRPM
CNTRPM1	
	CALL	CNTDEC
	DECFSZ	LPRPM,F
	GOTO	CNTRPM1
	RETURN

;******************************************************************************************
;   Function Name : CNTDEC
;   Title         : 10進(4桁)アップカウンタ
;   Input         : COU0,COU1,COU2,COU3
;   Output        : COU0,COU1,COU2,COU3
;******************************************************************************************
CNTDEC
	MOVLW	H'01'
	ADDWF	COU0,F	; 0桁目10進カウンタ(0aで桁上げ)
	MOVFW	COU0
	XORLW	H'0A'
	BTFSS	STATUS,Z
	RETURN
;
	CLRF	COU0
	MOVLW	H'01'
	ADDWF	COU1,F	; 1桁目10進カウンタ(0aで桁上げ)
	MOVFW	COU1
	XORLW	H'0A'
	BTFSS	STATUS,Z
	RETURN
;
	CLRF	COU1
	MOVLW	H'01'
	ADDWF	COU2,F	; 2桁目10進カウンタ(0aで桁上げ)
	MOVFW	COU2
	XORLW	H'0A'
	BTFSS	STATUS,Z
	RETURN
;
	CLRF	COU2
	MOVLW	H'01'
	ADDWF	COU3,F	; 3桁目10進カウンタ(0aで桁上げ)
	MOVFW	COU3
	XORLW	H'0A'
	BTFSS	STATUS,Z
	RETURN
;
	CALL	INITCOU
	MOVLW	H'01'
	MOVWF	OVER
	RETURN

;******************************************************************************************
;   Function Name : INITCOU
;   Title         : カウンタの初期化
;   Input         : COU0,COU1,COU2,COU3
;   Output        : COU0,COU1,COU2,COU3
;******************************************************************************************
INITCOU
	CLRF	COU0
	CLRF	COU1
	CLRF	COU2
	CLRF	COU3
	CLRF	OVER
	RETURN
;******************************************************************************************
;   Function Name : DEMO1
;   Title         : デモ(16F88と正常に通信がされると、F683と表示される)
;   Input         : 
;   Output        :
;******************************************************************************************
DEMO1
	MOVLW	' '
	CALL	SEND
	MOVLW	'P'
	CALL	SEND
	MOVLW	'I'
	CALL	SEND
	MOVLW	'C'
	CALL	SEND
	MOVLW	'1'
	CALL	SEND
	MOVLW	'2'
	CALL	SEND
	MOVLW	'F'
	CALL	SEND
	MOVLW	'6'
	CALL	SEND
	MOVLW	'8'
	CALL	SEND
	MOVLW	'3'
	CALL	SEND
	MOVLW	' '
	CALL	SEND
	MOVLW	'C'
	CALL	SEND
	MOVLW	'o'
	CALL	SEND
	MOVLW	'n'
	CALL	SEND
	MOVLW	'n'
	CALL	SEND
	MOVLW	'e'
	CALL	SEND
	MOVLW	'c'
	CALL	SEND
	MOVLW	't'
	CALL	SEND
	MOVLW	'e'
	CALL	SEND
	MOVLW	'd'
	CALL	SEND
	MOVLW	' '
	CALL	SEND
	MOVLW	'O'
	CALL	SEND
	MOVLW	'K'
	CALL	SEND
	MOVLW	'>'
	CALL	SEND
	RETURN

;******************************************************************************************
;   Function Name : DATOUT
;   Title         : データを出力
;   Input         : 
;   Output        :
;******************************************************************************************
DATOUT	
; 1.送信指示を待つ
;	CALL	REC
; 2.送信開始
;
	MOVFW	DAT3
	CALL	SEND
;
	MOVFW	DAT2
	CALL	SEND
;
	MOVFW	DAT1
	CALL	SEND
;
	MOVFW	DAT0
	CALL	SEND
;
	RETURN

;******************************************************************************************
;   Function Name : REC
;   Disctiption   : ＲＳ２３２Ｃ受信サブルーチン(GPIO,1)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
REC
; (0)変数初期化
	CLRF	IODAT
REC0
; (1)受信データを待つ
	BTFSC	GPIO,1
	GOTO	REC0
; (2)1/2ビット分待つ
	MOVLW	H'21'	; 9600BPS,OSC;8MHz
	MOVWF   RECWAT
REC1	DECFSZ	RECWAT,F
	GOTO	REC1
; (3)データ受信(8ビット分)
	MOVLW	8
	MOVWF	RECLP
	NOP
REC2	MOVLW	H'42'	; 9600BPS,OSC;8MHz
	MOVWF	RECWAT
REC3	DECFSZ	RECWAT,F
	GOTO	REC3
	NOP
	BTFSS	GPIO,1	; ビットデータが0の時, 0を立てる
	BCF	STATUS,C
	BTFSC	GPIO,1	; ビットデータが1の時, 1を立てる
	BSF	STATUS,C
	RRF	IODAT,F	; 変数内でビットをシフトする
	DECFSZ	RECLP,F
	GOTO	REC2
	NOP
	NOP
;
	RETURN

;******************************************************************************************
;   Function Name : SEND
;   Title         : 送信サブルーチン(GPIO,2)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
SEND
	MOVWF	IODAT
; (1)送信開始
	BCF	GPIO,2	; 送信開始
	MOVLW	H'42'	; 9600BPS,OSC;8MHz
	MOVWF	SENDWAT
SEND1	DECFSZ	SENDWAT,F
	GOTO	SEND1
;
; (2)データ送信(8ビット)
	MOVLW	8	; 8ビットデータ分、送信する
	MOVWF	SENDLP
	NOP
SEND2	RRF	IODAT,F
	NOP
	BTFSS	STATUS,C ; ビットデータが0の時, 0を立てる	
	BCF	GPIO,2
	BTFSC	STATUS,C ; ビットデータが1の時, 1を立てる
	BSF	GPIO,2

	MOVLW	H'42'	; パルス(9600BPS,OSC;8MHz)
	MOVWF	SENDWAT
SEND3	DECFSZ	SENDWAT,F
	GOTO	SEND3

	DECFSZ	SENDLP,F
	GOTO	SEND2
; (3)終了
	BSF	GPIO,2	; フラグを戻す
; (4)送信後、少し待つ
	CALL	TIMER
	CALL	TIMER
	CALL	TIMER
;
	RETURN
;
;******************************************************************************************
;   Function Name : TIMER
;   Title         : タイマー(1000回ループ)
;   Input         : 
;   Output        :
;******************************************************************************************
TIMER
	MOVLW	H'1A'
	MOVWF	CNT1
TIMER1
	MOVLW	H'64'
	MOVWF	CNT
TIMER2
	DECFSZ	CNT,F
	GOTO	TIMER2 
	DECFSZ	CNT1,F
	GOTO	TIMER1

	RETURN

;******************************************************************************************
;   Function Name : CHTIM
;   Title         : チャッターリング防止タイマー
;   Input         : 
;   Output        :
;******************************************************************************************
CHTIM
	MOVLW	H'01'
	MOVWF	CHCNT1
CHTIM1
	MOVLW	H'64'
	MOVWF	CHCNT
CHTIM2
	DECFSZ	CHCNT,F
	GOTO	CHTIM2 
	DECFSZ	CHCNT1,F
	GOTO	CHTIM1

	RETURN

;
	END

