;1OOYEN RADIO PRESEISMOIVENT RESERCH PROGRAM
;
		LIST		P=PIC16F819
		INCLUDE		"P16F819.INC"
;------------------------------------------------
HA		EQU	60H		;受信DATA
HA1		EQU	61H		;受信DATA1
HA2		EQU	62H		;受信DATA2
HA3		EQU	63H		;受信DATA3
RS		EQU	4DH		;WAIT
CN		EQU	4EH		;BIT NUMBER
BTIME		EQU	43H		;SPEED((HZ/BPS/4)-10)/3
HBTIME		EQU	44H		;BTIME/2
AD1		EQU	30H		;ADC後の下位バイト
AD2		EQU	31H		;ADC後の上位バイト
TR1		EQU	32H		;送信データ
T1		EQU	20H		;TIMER
T2		EQU	21H		;TIMER
T3		EQU	25H		;TIMER
TT1		EQU	22H		;TIMER
TT2		EQU	23H		;TIMER
COUNT		EQU	24H		;TIMER
;================================================
;シリアルの設定、入力ピンの設定
;================================================
		ORG	H'00'		;

		MOVLW	H'AA'		;このあたりは時定数
		MOVWF	BTIME		;9600bpsで20MHzの値
		MOVLW	H'55'		;速くするとずれるよ
		MOVWF	HBTIME		;ちゃんとタイミングとってないから
		
					;
		BSF	STATUS,RP0	;
		MOVLW	B'00000001'	;RB.0が入力、RB.1～7が出力
		MOVWF	TRISB
		BCF	STATUS,RP0

		BSF	STATUS,RP0	; Bank 1 へ切替
		MOVLW	B'10001101'	; RA0,1アナログ,右詰,RA2=Vref+,RA3=Vref-
		MOVWF	ADCON1		; ADCON1レジスタの設定

		MOVLW	B'00011111'	;ポートAは全部入力
		MOVWF	TRISA



		BCF	STATUS,RP0	; Bank 0 へ戻す
					;
		MOVLW	B'10000001'	; Fosc/32,CH0 設定, A/D on
		MOVWF	ADCON0		; ADCON0レジスタの設定



		BCF	PORTB,4		;DEBUG
		BCF	PORTB,5		;DEBUG
		BCF	PORTB,6		;DEBUG
		BCF	PORTB,7		;DEBUG

;================================================
;ここからメインルーチン
;================================================
MAIN
		BSF	PORTB,4		;DEBUG


		CALL	RECV		;1BYTE読む
		MOVF	HA,W
		MOVWF	HA1

		MOVF	HA1,W		;FFでリセット
		SUBLW	H'FF'		;
		BTFSC	STATUS,Z
		GOTO	MAIN

		CALL	RECV
		MOVF	HA,W
		MOVWF	HA2

		MOVF	HA2,W		;FFでリセット
		SUBLW	H'FF'		;
		BTFSC	STATUS,Z
		GOTO	MAIN

		CALL	RECV
		MOVF	HA,W
		MOVWF	HA3

		MOVF	HA3,W		;FFでリセット
		SUBLW	H'FF'		;
		BTFSC	STATUS,Z
		GOTO	MAIN





;		MOVF	HA1,W		;FOR DEBUG
;		MOVWF	TR1		;CALLBACK
;	CALL	TRANS
;		MOVF	HA2,W
;		MOVWF	TR1
;	CALL	TRANS
;		MOVF	HA3,W
;		MOVWF	TR1
;	CALL	TRANS





		MOVF	HA1,W		;1バイト目が"D"なら
		SUBLW	H'44'		;DTCTVへ飛ぶ
		BTFSC	STATUS,Z
		GOTO	DTCTV

		MOVF	HA1,W		;1バイト目が"M"なら
		SUBLW	H'4D'		;MOVEへ飛ぶ
		BTFSC	STATUS,Z
		GOTO	MOVE

		MOVF	HA1,W		;1バイト目が"L"なら
		SUBLW	H'4C'		;LISTENへ飛ぶ
		BTFSC	STATUS,Z
		GOTO	LISTEN

		GOTO	MAIN

;================================================
;普通の観測ルーチン
;================================================
DTCTV
		BSF	PORTB,5		;DEBUG
		CALL	SERVO		;サーボ駆動へ飛ぶ
		CALL	TIME4		;LPF安定待ちタイマへ飛ぶ
		CALL	ADC		;ADCへ飛ぶ
		MOVF	AD2,W		;上位バイトの送信
		MOVWF	TR1		;
		CALL	TRANS		;TRANSへ飛ぶ
		MOVF	AD1,W		;下位バイトの送信
		MOVWF	TR1
		CALL	TRANS		;TRANSへ飛ぶ
		GOTO	MAIN		;MAINへ戻る

;================================================
;サーボ移動だけ
;================================================
MOVE
		CALL	SERVO		;サーボ駆動へ飛ぶ
		MOVLW	H'4F'		;"O"を送信
		MOVWF	TR1		;するためTR1に入れて
		CALL	TRANS		;TRANSへ飛ぶ
		MOVLW	H'4B'		;"K"を送信
		MOVWF	TR1		;するためTR1に入れて
		CALL	TRANS		;TRANSへ飛ぶ

		GOTO	MAIN		;MAINへ戻る
;================================================
;観測だけ
;================================================
LISTEN
		CALL	ADC		;ADCへ飛ぶ
		MOVF	AD1,W		;上位バイトの送信
		MOVWF	TR1		;
		CALL	TRANS		;TRANSへ飛ぶ
		MOVF	AD2,W		;下位バイトの送信
		MOVWF	TR1		;
		CALL	TRANS		;TRANSへ飛ぶ
		GOTO	MAIN		;MAINへ戻る


;================================================
;ＲＳ２３２Ｃ送信サブルーチン・ほとんど秋月のサンプルのまんまｗ
;================================================
TRANS
		BCF   	 PORTB,1	;
		MOVF 	 BTIME,W  	;
		MOVWF 	 RS  		;
TRANS10
		DECFSZ	 RS,F		;
		GOTO  	 TRANS10  	;
					;
		MOVLW 	 8	  	;
		MOVWF 	 CN  		;
		NOP    	   		;
TRANS0
		RRF   	 TR1,F		;
		NOP    	   		;
		BTFSS 	 STATUS,C	;
		BCF   	 PORTB,1	;
		BTFSC 	 STATUS,C	;
		BSF   	 PORTB,1	;
					;
		MOVF 	 BTIME,W  	;
		MOVWF 	 RS  		;
TRANS11
		DECFSZ	 RS,F		;
		GOTO  	 TRANS11  	;
					;
		DECFSZ	 CN,F		;
		GOTO  	 TRANS0  	;
					;
		NOP    	   		;
		NOP    	   		;
		NOP    	   		;
		NOP    	   		;
		NOP    	   		;
		NOP    	   		;
		BSF   	 PORTB,1	;
		MOVF 	 BTIME,W  	;
		MOVWF 	 RS  		;
TRANS12
		DECFSZ	 RS,F		;
		GOTO  	 TRANS12  	; ＳＴＯＰビット分ウェイト
		BSF	PORTB,7		;DEBUG
		RETURN 	   		;
					;
;================================================
;ＲＳ２３２Ｃ受信サブルーチン・こちらもほとんどそのまんま
;================================================
RECV
		BTFSC 	 PORTB,0	;
		GOTO  	 RECV	  	; STARTビット待ち
					;
		MOVF 	 HBTIME,W  	; 1/2ビット分待つ
		MOVWF 	 RS  		;
RECV10
		DECFSZ	 RS,F		;
		GOTO  	 RECV10  	;
					;
		MOVLW 	 8	  	;
		MOVWF 	 CN  		;
		NOP    	   		;
					;
RECV0
		MOVF 	 BTIME,W  	;
		MOVWF 	 RS 		;
RECV11
		DECFSZ	 RS,F		;
		GOTO  	 RECV11  	;
		NOP    	   		;
					;
		BTFSS 	 PORTB,0	; データ入力
		BCF   	 STATUS,C	;
		BTFSC 	 PORTB,0	;
		BSF   	 STATUS,C	;
		RRF   	 HA,F		;
					;
		DECFSZ	 CN,F		;
		GOTO  	 RECV0  	;


		MOVF 	 BTIME,W  	;ストップビット分の待ち
		MOVWF 	 RS 		;
RECV12
		DECFSZ	 RS,F		;
		GOTO  	 RECV12  	;
		BSF	PORTB,6
		RETURN 	   		;

;================================================
;観測データのデジタル化
;================================================
ADC


		CALL	TIME		; 23.2μs 一定時間待つ
					;（2TAD[2×1.6μｓ]＋アクィジション時間[20μｓ]
		BSF	ADCON0,GO	; A/D スタート
WAIT					; A/D が完了すると GOが0になる
		BTFSC	ADCON0,GO	; GO が 0 だったらループから抜ける
		GOTO	WAIT		; GO が 1 だったら WAIT へループする
		MOVF	ADRESH,W	; A/D データ上位をAD2へ
		MOVWF	AD2		;
		BSF	STATUS,RP0	; Bank 1 へ切替
		MOVF	ADRESL,W	; A/D データ下位をAD1へ
		BCF	STATUS,RP0	; Bank 0 へ戻す
		MOVWF	AD1		;

	RETURN

;================================================
;２３μｓ遅延サブルーチン（２０ＭＨｚクロック時）
;================================================
TIME
	MOVLW	H'50'		; 1サイクル 25H = 37---50Hに変更
	MOVWF	COUNT		; 1サイクル
	NOP			; 1サイクル 微調整ダミー
LOOP
	DECFSZ	COUNT,F		; 1×(37-1)＋2 = 38サイクル
	GOTO	LOOP		; 2×(37-1) = 72サイクル
	RETURN			; 2サイクル
				; 合計 115サイクル×0.2μｓ = 23μｓ


;================================================
;サーボ駆動
;================================================
SERVO

		

		MOVF	HA3,W

		ADDLW	H'01'
		MOVWF	TT1


TIM01
		DECFSZ	TT1
		GOTO	TIM03
		GOTO	TIM02
TIM03
		BSF	PORTB,2
		CALL	TIM1
		CALL	TIM2
		BCF	PORTB,2
		CALL	TIM3
		GOTO	TIM01
TIM02
		RETURN


;-------1mS TIMER--------
TIM1
		MOVLW	H'C'
		MOVWF	T1
TIM11
		MOVLW	H'55';調整の結果・・・
;		MOVLW	H'8A';規定値1mS
		MOVWF	T2
TIM12
		DECFSZ	T2
		GOTO	TIM12

		DECFSZ	T1
		GOTO	TIM11
		RETURN

;-------DUTY TIMER--------
TIM2
		MOVF	HA2,W
		ADDLW	H'01'
		MOVWF	T1
		
TIM21
		MOVLW	H'D';調整の結果・・・
;		MOVLW	H'8';規定値1mS～2mS
		MOVWF	T2
TIM22
		DECFSZ	T2
		GOTO	TIM22

		DECFSZ	T1
		GOTO	TIM21
		RETURN
;-------20mS TIMER--------
TIM3
		MOVLW	H'82'
		MOVWF	T1
TIM31
		MOVLW	H'FF'
		MOVWF	T2
TIM32
		DECFSZ	T2
		GOTO	TIM32

		DECFSZ	T1
		GOTO	TIM31
		RETURN
;================================================
;LPF安定待ちタイマ
;================================================
TIME4

		MOVLW	H'08'
		MOVWF	T1
TIM41
		MOVLW	H'FF'
		MOVWF	T2
TIM42

		MOVLW	H'FF'
		MOVWF	T3
TIM43
		DECFSZ	T3
		GOTO	TIM43


		DECFSZ	T2
		GOTO	TIM42

		DECFSZ	T1
		GOTO	TIM41
		RETURN


                END
