;***** PIC16F648A ASM Source File For Sub_Controller_1(osc 10MHz,2400bps) *****
;                                    *** (Ver.61230, by T.S) ***
       	list	p=pic16f648a
;	include pic16f648a.inc
;     _config _osc_hs & _wdt_disable & _pwrte_enable & _mclre_internal & _boden _enable & _lvp_rb4:gpio & _cpd_disable & _cp_disable

ra	equ	h'05'
rb	equ	h'06'

outa	equ	h'20'
outb	equ	h'21'
fr	equ	h'22'
fr1	equ	h'23'
fr2	equ	h'24'
fr3	equ	h'25'

fdat1	equ	h'26'
fdat2	equ	h'27'
adat	equ	h'28'
bdat	equ	h'29'
cdat	equ	h'2a'
ddat	equ	h'2b'

tim1	equ	h'2c'
tim2	equ	h'2d'
tim3	equ	h'2e'
timdt   equ	h'2f'
trno	equ	h'30'

	org	0
	goto	start

start
	clrf	ra
	clrf	rb
	clrf	outa
	clrf	outb

	movlw	h'07'
	movwf	h'1f'		;入出力ピンのデフォルトアナログ→デジタル変更

	bcf	h'03',6
	bsf	h'03',5		;以下ポートの入出力設定
	movlw	b'111100'
	movwf	h'05'		;aポート設定
	movlw	b'00000010'
	movwf	h'06'		;bポート設定
	movlw	h'20'
	movwf	h'18'		;USARTのTXSTA設定
	movlw	h'40'
	movwf	h'19'		;USARTのSPBRG設定(10MHz,2400bps)
	bcf	h'03',5		;Bank0へ
	movlw	h'90'
	movwf	h'18'		;USARTのRCSTA設定

; ***** メインプログラムスタート *****

main

	movlw	h'00'		;***** 出力イニシャライズ *****
	movwf	outa
	movf	outa,0
	movwf	ra
	movlw	h'00'
	movwf	outb
	movf	outb,0
	movwf	rb

jp0				;***** Front-Data イニシャライズ *****
	movlw	h'cc'
	movwf	fdat1		;***** 1-Front Data→h=cc(変更可) *****
	movlw	h'dd'
	movwf	fdat2		;***** 2-Front Data→h=dd(変更可) *****

	call	usrsb
	movf	fr2,0
	xorwf	fdat1,0		;***** 1-Front Data "h=cc" 検出待ち *****
	btfss	h'03',2
	goto	jp0

	call	usrsb
	movf	fr2,0
	xorwf	fdat2,0		;***** 2-Front Data "h=dd" 確認 *****
	btfss	h'03',2
	goto	jp0

jp1
	call	usrsb		;***** ４個のデータ取り込み *****
	movf	fr2,0
	movwf	adat
	call	usrsb
	movf	fr2,0
	movwf	bdat
	call	usrsb
	movf	fr2,0
	movwf	cdat
	call	usrsb
	movf	fr2,0
	movwf	ddat

	movf	adat,0		;***** データの確認 *****
	xorwf	cdat,0
	btfss	h'03',2
	goto	jp0

	movf	bdat,0
	xorwf	ddat,0
	btfss	h'03',2
	goto	jp0

	movf	adat,0		;***** リレー出力をする *****
	movwf	ra
	movf	bdat,0
	movwf	rb


	movlw	d'60'		;***** 約60ms送信切換タイマー *****
	movwf	timdt
	call	timr

			;***** 以下 ra入力ポートのデータ送信処理 *****
	movlw	h'cc'
	movwf	fdat1		;***** 1-Front Data→h=cc(変更可) *****
;	movlw	h'dd'
;	movwf	fdat2		;***** 2-Front Data→h=dd(変更可) *****
	movlw   d'06'
	movwf	trno		;***** 入力値送信回数 trno=6回設定 *****
	movlw	d'05'
	movwf	timdt		;***** 約5ms データ送信間隔の設定値 *****

jp2
	movf	fdat1,0
	movwf	fr3
	call	ustsb		;***** 1-Front Dataの送信 *****
	call	timr

;	movf	fdat2,0
;	movwf	fr3
;	call	ustsb		;***** 2-Front Dataの送信 *****
;	call	timr

;	movf	ra,0
;	movwf	fr3
;	movlw	h'c3'
;	iorwf	fr3,1
;	call	ustsb		;***** 入力データ１回目を送信 *****
;	call	timr

	movf	ra,0
	movwf	fr3
	movlw	h'c3'
	iorwf	fr3,1
	call	ustsb		;***** 入力データ２回目を送信 *****
	call	timr

	decfsz	trno,1
	goto	jp2

	goto	jp0


; ******** USART シリアル通信・受信(2400bps) ********

usrsb
	btfss	h'0c',5		;受信バッファーがフルか！
	goto	usrsb
	btfsc	h'18',2		;Framingエラーはリターン
	return
	btfsc	h'18',1		;Overrunエラーはリターン
	return
	movf	h'1a',0		;データをバッファーからfr2に格納
	movwf	fr2
	return

; ******** USART シリアル通信・送信(2400bps) ********

ustsb
	bsf	h'03',5		;Bank1へ
	btfss	h'18',1		;送信準備OK!
	goto	ustsb
	movlw	h'20'
	movwf	h'18'		;USARTのTXSTA設定
	bcf	h'03',5		;Bank0
	movf	fr3,0
	movwf	h'19'		;fr3データをTXREGに挿入し送信
	return

; ******** サブルーチン　timr (OSC=10MHz)　********

timr
	movf	timdt,0
	movwf	tim1
wa10	movlw	d'03'
	movwf	tim2
wa11	movlw	d'245'
	movwf	tim3
wa12	nop
	decfsz	tim3,1
	goto	wa12
	decfsz	tim2,1
	goto	wa11
	decfsz	tim1,1
	goto	wa10

	return

	end

