;----------------  赤外線送信機 Ver.1 --------------------
;

;Ver1.1.0	2003.10.29	By T.HINOKI

		LIST		P=16C84,R=DEC
	PC	EQU	2
	STATUS	EQU	3
	PG	EQU	5
	PORTA	EQU	5
	PORTB	EQU	6
	EEDATA	EQU	8
	EEADR	EQU	9
	INTCON	EQU	H'B'

	OPTION_REG	EQU	H'81'
	TRISA	EQU	H'85'
	TRISB	EQU	H'86'
	EECON1	EQU	H'88'
	EECON2	EQU	H'89'
	RD	EQU	0
	WR	EQU	1
	WREN	EQU	2
	COUNT1	EQU	H'10'
	COUNT2	EQU	H'11'
	SAVEW	EQU	H'12'
	SAVECCR	EQU	H'13'
	RDATA1	EQU	H'14'		;受信データ１回目
	RDATA2	EQU	H'15'		;受信データ２回目
	CNT1	EQU	H'16'		;タイマカウンタ
	CNT2	EQU	H'17'		;　〃
	BITCNT	EQU	H'18'		;ビットカウンタ
	WORK	EQU	H'19'		;ワーク
	KEISAN1	EQU	H'1A'	;計算用変数
	KEISAN2	EQU	H'1B'	;計算用変数
	KEISAN3	EQU	H'1C'	;計算用変数
;	HSPEED	EQU	H'1D'	;砲身の上下スピード
	COUNT3	EQU	H'1E'	;砲身の上下スピード作業用
;	CENTER3	EQU	H'1F'	;砲塔旋回サーボ停止位置
;	POUT5	EQU	H'20'	;５ｃｈ出力パルス幅（ブローバックサーボ用）
	COUNT4	EQU	H'21'	;ブローバックサーボの動作カウント用
	COUNT10	EQU	H'22'	;長時間のウエイト用
	COUNT11	EQU	H'23'	;ＴＯＰスピードの時間（揺れに使用）
	COUNT9	EQU	H'24'	;デモ走行作業用
	COUNT8	EQU	H'25'	;機銃発光のタイミング
	CHKDATA	EQU	H'26'	;赤外線データエラーチェック用
	COUNT12	EQU	H'27'	;フギュアサーボのスピード（作業用）
	COUNT13	EQU	H'28'	;フギュアサーボの待ち時間（作業用）
;	POUT6	EQU	H'29'	;６ｃｈ出力パルス幅（フギュアサーボ上下用）
	COUNT14	EQU	H'2A'	;赤外線用カウンター
	COUNT15	EQU	H'2B'	;赤外線用カウンター
	SDATA	EQU	H'2C'	;赤外線送信データ
	SDATAW	EQU	H'2D'	;赤外線送信データのワーク
;	HLED	EQU	H'2E'	;大砲発砲時のLED点滅時間
	RDAT0	EQU	H'2F'	;赤外線受信のワーク
	RDAT1	EQU	H'30'	;赤外線受信のワーク
	RDAT2	EQU	H'31'	;赤外線受信のワーク
	TAMA	EQU	H'32'	;被弾した大砲のサイズ
	POUT7	EQU	H'33'	;赤外線通信出力
	PIN7	EQU	H'34'	;PIC通信入力用
	PIN1	EQU	H'35'	;
	PIN2	EQU	H'36'	;


	DEVICE		EQU	B'11100000'	;デバイスコード定数'11100000'

	ORG	0

START
	BSF	STATUS,PG	;Change Page1
	MOVLW	B'11000'	;RA入出力
	MOVWF	TRISA		;
	MOVLW	B'11111111'	;RB入出力
	MOVWF	TRISB		;
	BCF	OPTION_REG,7	;PORTB のプルアップ抵抗ON
	BCF	STATUS,PG	;Change Page0
	CLRF	PORTB		;クリア PORTB


;--------------初期値 読み込み----------------
	MOVLW	B'00100'	;RA2をon
	MOVWF	PORTA		;
	MOVLW	20
	CALL	TIM25		;

	MOVF	PORTB,0		;PORTBから入力
	MOVWF	PIN1		;初期設定をPin1に記憶

	MOVLW	B'00010'	;RA1をon
	MOVWF	PORTA		;
	MOVLW	20
	CALL	TIM25		;

;-------------------メインルーチン -------------
;	初期でBRは全て1になっている、ボタンを押すと0になる
LOOP1

	BTFSS	PORTA,4		;OFF の時
	GOTO	MAIN10		;

	BTFSS	PORTB,1		;RB1＝0でジャンプ(大砲)
	CALL	MAIN50

	BTFSS	PORTB,0		;RB0＝0でジャンプ
	CALL	MAIN100
	BTFSS	PORTB,2		;RB2＝0でジャンプ
	CALL	MAIN100
	BTFSS	PORTB,3		;RB3＝0でジャンプ
	CALL	MAIN100
	BTFSS	PORTB,4		;RB4＝0でジャンプ
	CALL	MAIN100
	BTFSS	PORTB,5		;RB5＝0でジャンプ
	CALL	MAIN100
	BTFSS	PORTB,6		;RB6＝0でジャンプ
	CALL	MAIN100
	BTFSS	PORTB,7		;RB7＝0でジャンプ
	CALL	MAIN100



	MOVLW	20
	CALL	TIM25		;

	GOTO	LOOP1

;----------RA4(ファンクションキー)がONの時
MAIN10
	BTFSS	PORTB,1		;ＢＲ1＝0で機関銃
	CALL	MAIN60

	BTFSS	PORTB,0		;RB0＝0でジャンプ
	CALL	MAIN100
	BTFSS	PORTB,2		;RB2＝0でジャンプ
	CALL	MAIN100
	BTFSS	PORTB,3		;RB3＝0でジャンプ
	CALL	MAIN100
	BTFSS	PORTB,4		;RB4＝0でジャンプ
	CALL	MAIN100
	BTFSS	PORTB,5		;RB5＝0でジャンプ
	CALL	MAIN100
	BTFSS	PORTB,6		;RB6＝0でジャンプ
	CALL	MAIN100
	BTFSS	PORTB,7		;RB7＝0でジャンプ
	CALL	MAIN100

	MOVLW	20
	CALL	TIM25		;
	GOTO	LOOP1

;-----------------RB1(大砲)
MAIN50
	MOVF	PIN1,0		;W=PIN1
	CALL	SEKIOUT3
	RETURN

;-----------------RA4+RB1(機関銃)
MAIN60
	MOVF	PIN1,0		;データ取出し(W=PIN1)
	ANDLW	B'11100000'	;チーム識別コード３バイト取出し後は0

	IORLW	B'00000001'	;Wの内容を、0はそのまま、1は1に

	CALL	SEKIOUT3
	RETURN

;-----------------未処理
MAIN100
	RETURN

;-----赤外線----
SEKIOUT3
	MOVWF	SDATA
	CALL	LEED
	CALL	SEND		;データ部送信
	CALL	TARIL		;トレーラー部(BIT0×4)
	CALL	SEND		;再送
	RETURN

;----------- リーダー部送信サブルーチン----------
LEED
	MOVLW	7		;７ビット分
	MOVWF	COUNT15
LDLP
	CALL	BIT0		;0のデータ送信
	DECFSZ	COUNT15,1	;繰り返し
	GOTO	LDLP		;
	RETURN


;------------- １６ビットのデータ送信サブルーチン
SEND
;**** スタートビットの送信  ****
	CALL	BIT1		;send start bit
;**** デバイスコードの送信 ****
	MOVLW	3		;３ビット分
	MOVWF	COUNT15
DCODE
	RLF	SDATA,1		;送信ビットをキャリーへ
	BTFSS	STATUS,0	;０なら０送信へ
	CALL	BIT0		;０送信
	BTFSC	STATUS,0	;１なら１送信へ
	CALL	BIT1		;１送信
	DECFSZ	COUNT15,1        ;終了か？
	GOTO	DCODE		;次のビットへ
	CALL	BIT0		;リーダ部送信
	CALL	BIT1		;第二スタートビット出力
;**** キーコードの送信 ****
	MOVLW	5		;５ビット分
	MOVWF	COUNT15
KEYCODE
	RLF	SDATA,1		;送信ビットをキャリーへ
	BTFSS	STATUS,0	;０なら０送信へ
	CALL	BIT0		;０送信
	BTFSC	STATUS,0	;１なら１送信へ
	CALL	BIT1		;１送信
	DECFSZ	COUNT15,1        ;終了か？
	GOTO	KEYCODE		;次のビットへ
	RLF	SDATA,1		;もとに戻す
	CALL	BIT1		;ストップビット送信
	RETURN

TARIL
;**** トレーラ部送信 ****
	MOVLW	4		;４ビット分
	MOVWF	COUNT15
TARIL10
	CALL	BIT0		;０を送信
	DECFSZ	COUNT15,1	;終了か？
	GOTO	TARIL10
	RETURN


;---------- 「０」送信サブルーチン-----------
BIT0

	MOVLW	B'11110'	;LED OFF制御
	ANDWF	PORTA,1		;

;------------600μsecタイマ(1500サイクル)-------
TIM600
	MOVLW	60
	CALL	TIM25		;60*25=1500
	RETURN 			;1500*0.4us=600us
;------------300us(750サイクル)-------------
TIM300
	MOVLW	30
	CALL	TIM25		;30×25＝750＝300us
	RETURN		
;-------------「１」送信サブルーチン--------------
BIT1
	MOVLW	23	 	;600usec分繰り返し
	MOVWF	COUNT14
BIT1_1
	MOVLW	B'00001'	;ON 32+1=33
	IORWF	PORTA,1		;1
	MOVLW	1		;1+1=2
	CALL	TIM25		;2+27=29
	GOTO	$+1		;29+2=31
	MOVLW	B'11110'	;LED OFF制御 31+1=32
	ANDWF	PORTA,1		;1
	MOVLW	1		;1+1
	CALL	TIM20		;2+22=24
	NOP			;+1=25
	NOP			;+1=26
	NOP			;+1=27
	DECFSZ	COUNT14,1	;27+1=28
	GOTO	BIT1_1		;28+2=30
	RETURN


;-------------  20サイクルタイマー（実際は19サイクル）
TIM20
	GOTO	$+1	;2
	GOTO	$+1	;+2=4
	GOTO	$+1	;+2=6
	GOTO	$+1	;+2=8
	GOTO	$+1	;+2=10
	GOTO	$+1	;+2=12
	GOTO	$+1	;+2=14
	GOTO	$+1	;+2=16
	NOP		;+1=17
	RETURN		;+2=19

;-------------  Ｗレジスタ分のカウントタイマー(1カウント=25サイクル)×Ｗ
TIM25
	MOVWF	COUNT1		;1+1=2
TIM26
	CALL	TIM20		;19+2=21
	NOP			;+1=22
	DECFSZ	COUNT1,1	;+1=23
	GOTO	TIM26		;+2=25
	RETURN			;+1+(W*25)+2-1

;-------------  Ｗレジスタ分のカウントタイマー(1カウント=13サイクル)×Ｗ
TIM12
	MOVWF	COUNT1		;2+1=3
TIM13
	GOTO	$+1	;2=2
	GOTO	$+1	;+2=4
	GOTO	$+1	;+2=6
	GOTO	$+1	;+2=8
	NOP		;+1=9
	DECFSZ	COUNT1,1	;+1=10
	GOTO	TIM13		;+2=12
	RETURN			;3+(W*12)+2-1

;-----------パルスとパルスの間の空き時間-----------------
PULSOFF
	MOVLW	255
	CALL	TIM25		;
	MOVLW	255
	CALL	TIM25		;
	RETURN

;-------------  時間稼ぎ(1/4秒×Ｗ)
TIM90
	MOVWF	COUNT10		;
TIM91
	MOVLW	50
	MOVWF	COUNT9		;
TIM92
	MOVLW	255
	CALL	TIM25		;
	DECFSZ	COUNT9,1	;
	GOTO	TIM92		;
	DECFSZ	COUNT10,1	;
	GOTO	TIM91		;
	RETURN			;

	END


