;******************************************************************************************
;  ＡＶＲサンプル (ATTiny2313用)
;   Project      :  超音波センサー式　距離計
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H19.06.01
;   History      :
;******************************************************************************************
;  (1)Description 
;
;******************************************************************************************
.include "tn2313def.inc"
.equ	COU0	=	$0060	; キャラクタ数字０桁目
.equ	COU1	=	$0061	; キャラクタ数字１桁目
.equ	COU2	=	$0062	; キャラクタ数字２桁目
.equ	COU3	=	$0063	; キャラクタ数字３桁目

.cseg
.org	$0000
	LDI	R16,RAMEND
	OUT	SPL,R16		;
	LDI	R16,0x80	; PORTB(7)を出力にする
	OUT	DDRB,R16	; PORTB(7)を出力にする
	LDI	R16,0x02	; PORTD(1)を出力にする
	OUT	DDRD,R16	; PORTD(1)を出力にする
;
	LDI	R16,0x00	; PORTBを初期化
	OUT	PORTB,R16	; PORTBを初期化
	LDI	R16,0x00	; PORTDを初期化
	OUT	PORTD,R16	; PORTDを初期化
; 0.初期設定
	RCALL	UARTINI		; UARTを初期化
	RCALL	DEMO01		; 接続メッセージ	
;
; ===========================================
;    0.Main loop
; ===========================================
MAIN:
	RCALL	INTCOU		; カウンタ変数の初期化
; ===========================================
;    1.Output 40KHz
; ===========================================
MAIN_S:
;    (1)出力するパルス数を設定
	LDI	R17,5
;    (2)40KHzを出力する
MAIN_1:
	LDI	R16,0x80	; 
	OUT	PORTB,R16	; 
	RCALL	WAT		;
;
	LDI	R16,0x00	; 
	OUT	PORTB,R16	; 
	RCALL	WAT		;
;
	DEC	R17
	BRNE	MAIN_1
;
; ===========================================
;    2.Recive Plus
; ===========================================
;    (0)First Plus
	SBIS	PINB,6
	RJMP	MAIN_R0
;     2)Recive ON
;     2-1)SET Counting-value
	RCALL	INTCOU
;     2-2)End
	RJMP	MAIN_O
MAIN_R0:
;     3)First wait
MAIN_R:
;    (1)Check PORTB(6)
	RCALL	CNTPLS
	LDI	R16,0x00
	CPSE	R16,R21
	RJMP	MAIN_O
;
	RCALL	TIMOUT
	LDI	R16,0x00
	CPSE	R16,R21
	RJMP	MAIN_O
;
	SBIS	PINB,6
	RJMP	MAIN_R
MAIN_O:
;    (2)Output
	RCALL	OUTCNT

; ===========================================
;    3.Wait
; ===========================================
	RCALL	WAT1S
	RCALL	WAT1S
	RCALL	WAT1S
	RCALL	WAT1S
	RJMP	MAIN

;******************************************************************************************
;   Function Name : WAT
;   Title         : タイマー関数(超音波センサー用)
;   Input         : None
;   Output        : None
;******************************************************************************************
WAT:
	PUSH	R16
	LDI	R16,11
WAT_A:
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DEC	R16
	BRNE	WAT_A
	POP	R16
	RET

;******************************************************************************************
;   Function Name : INTCOU
;   Title         : カウンタ変数の初期化
;   Input         : None
;   Output        : None
;******************************************************************************************
INTCOU:
	PUSH	R16
;
	LDI	R16,0x00
	STS	COU0,R16 
	STS	COU1,R16 
	STS	COU2,R16 
	STS	COU3,R16 
;
	POP	R16
	RET


;******************************************************************************************
;   Function Name : TIMOUT
;   Title         : カウンタ変数のオーバーフローチェック
;   Input         : None
;   Output        : R21(Over:FF, Else:00)
;******************************************************************************************
TIMOUT:
	PUSH	R16
	PUSH	R17
;
	LDS	R16,COU0
	LDI	R17,0x09
	CPSE	R16,R17
	RJMP	TIMOUTE
;
	LDS	R16,COU1
	LDI	R17,0x09
	CPSE	R16,R17
	RJMP	TIMOUTE
;
	LDS	R16,COU2
	LDI	R17,0x09
	CPSE	R16,R17
	RJMP	TIMOUTE
;
	LDS	R16,COU3
	LDI	R17,0x09
	CPSE	R16,R17
	RJMP	TIMOUTE
;
	LDI	R21,0xFF
	POP	R17
	POP	R16
	RET	
TIMOUTE:
	LDI	R21,0x00
	POP	R17
	POP	R16
	RET
;******************************************************************************************
;   Function Name : CNTDEC
;   Title         : 4桁10進カウンタ
;   Input         : None
;   Output        : None
;******************************************************************************************
CNTDEC:
	PUSH	R18
	PUSH	R17
	PUSH	R16
; (1)0桁目の処理
	LDS	R17,COU0
	LDI	R16,0x01
	ADD	R17,R16
	LDI	R18,0x0a
	CPSE	R17,R18
	RJMP	CNTDEC1A
	RJMP	CNTDEC2
CNTDEC1A:
	STS	COU0,R17
	POP	R16
	POP	R17
	POP	R18
	RET
CNTDEC2:
; (2)1桁目の処理
	LDI	R17,0x00
	STS	COU0,R17
	LDS	R17,COU1
	LDI	R16,0x01
	ADD	R17,R16
	LDI	R18,0x0a
	CPSE	R17,R18
	RJMP	CNTDEC2A
	RJMP	CNTDEC3
CNTDEC2A:
	STS	COU1,R17
	POP	R16
	POP	R17
	POP	R18
	RET
CNTDEC3:
; (2)2桁目の処理
	LDI	R17,0x00
	STS	COU1,R17
	LDS	R17,COU2
	LDI	R16,0x01
	ADD	R17,R16
	LDI	R18,0x0a
	CPSE	R17,R18
	RJMP	CNTDEC3A
	RJMP	CNTDEC4
CNTDEC3A:
	STS	COU2,R17
	POP	R16
	POP	R17
	POP	R18
	RET
CNTDEC4:	
; (3)3桁目の処理
	LDI	R17,0x00
	STS	COU2,R17
	LDS	R17,COU3
	LDI	R16,0x01
	ADD	R17,R16
	LDI	R18,0x0a
	CPSE	R17,R18
	RJMP	CNTDEC4A
	RJMP	CNTDEC5
CNTDEC4A:
	STS	COU3,R17
	POP	R16
	POP	R17
	POP	R18
	RET
CNTDEC5:	
	LDI	R16,0x00
	STS	COU0,R16
	STS	COU1,R16
	STS	COU2,R16
	STS	COU3,R16
	POP	R16
	POP	R17
	POP	R18
	RET
;******************************************************************************************
;   Function Name : CNTPLS
;   Title         : パルスが戻るまでの時間をカウントする
;   Input         : None
;   Output        : None
;******************************************************************************************
CNTPLS:
	PUSH	R16
;  1.Wait
	RCALL	WATTT
	LDI	R16,0xFF
	CPSE	R16,R21
	RJMP	CNTPLS1
	POP	R16
	RET
CNTPLS1:
;  2.Count
	RCALL	CNTDEC
	POP	R16
	RET


;******************************************************************************************
;   Function Name : OUTCNT
;   Title         : 結果を出力する
;   Input         : R18
;   Output        : None
;******************************************************************************************
OUTCNT:
	PUSH	R16
;
	LDI	R16,' '	
	RCALL	UARTTRN
;
	LDS	R16,COU3
	ORI	R16,0x30
	RCALL	UARTTRN
	LDS	R16,COU2
	ORI	R16,0x30
	RCALL	UARTTRN
	LDS	R16,COU1
	ORI	R16,0x30
	RCALL	UARTTRN
	LDS	R16,COU0
	ORI	R16,0x30
	RCALL	UARTTRN
;
	LDI	R16,'['	
	RCALL	UARTTRN
	LDI	R16,'c'	
	RCALL	UARTTRN
	LDI	R16,'m'	
	RCALL	UARTTRN
	LDI	R16,']'	
	RCALL	UARTTRN
;
	POP	R16
	RET

;******************************************************************************************
;   Function Name : DEMO01
;   Title         : 接続メッセージを出力する
;   Input         : None
;   Output        : None
;   Description   : 
;******************************************************************************************
DEMO01:
	PUSH	R16
;
	LDI	R16,'A'	
	RCALL	UARTTRN
	LDI	R16,'T'	
	RCALL	UARTTRN
	LDI	R16,'T'	
	RCALL	UARTTRN
	LDI	R16,'i'	
	RCALL	UARTTRN
	LDI	R16,'n'	
	RCALL	UARTTRN
	LDI	R16,'y'	
	RCALL	UARTTRN
	LDI	R16,'2'	
	RCALL	UARTTRN
	LDI	R16,'3'	
	RCALL	UARTTRN
	LDI	R16,'1'	
	RCALL	UARTTRN
	LDI	R16,'3'	
	RCALL	UARTTRN
	LDI	R16,' '	
	RCALL	UARTTRN
	LDI	R16,'C'	
	RCALL	UARTTRN
	LDI	R16,'o'	
	RCALL	UARTTRN
	LDI	R16,'n'	
	RCALL	UARTTRN
	LDI	R16,'n'	
	RCALL	UARTTRN
	LDI	R16,'e'	
	RCALL	UARTTRN
	LDI	R16,'c'	
	RCALL	UARTTRN
	LDI	R16,'t'	
	RCALL	UARTTRN
	LDI	R16,'e'	
	RCALL	UARTTRN
	LDI	R16,'d'	
	RCALL	UARTTRN
	LDI	R16,' '	
	RCALL	UARTTRN
	LDI	R16,'O'	
	RCALL	UARTTRN
	LDI	R16,'K'	
	RCALL	UARTTRN
	LDI	R16,'>'	
	RCALL	UARTTRN
;
	POP	R16
	RET
;******************************************************************************************
;   Function Name : UARTINI
;   Title         : UARTを初期化する(UCR/UBRR)
;   Input         : None
;   Output        : None
;   Description   : OSC10MHz / 9600BPS用
;******************************************************************************************
UARTINI:
	PUSH	R16
;  1.UCRレジスタの設定
	LDI	R16,0b11111011	; 
	OUT	UCR,R16		; 
;  2.UBRRレジスタの設定
;    ※BAUD=Fck/16(UBRR+1) => UBRR=Fck/(16*BAUD) - 1
;       10MHz,9600BAUDの時, UBRR=10M/(16*9600)-1=>64.10(Dec)=>40(Hex)  
	LDI	R16,0x40	; 
	OUT	UBRR,R16	; 
;
	POP	R16
	RET
;
;******************************************************************************************
;   Function Name : UARTREC
;   Title         : シリアルデータを受信する(USR/UDR)
;   Input         : None
;   Output        : R16
;******************************************************************************************
UARTREC:
	SBIS	USR,RXC		;
	RJMP	UARTREC		;
	IN	R16,UDR		;

	RET

;******************************************************************************************
;   Function Name : UARTTRN
;   Title         : シリアルデータを送信する(USR/UDR)
;   Input         : R16
;   Output        : None
;******************************************************************************************
UARTTRN:
; (1)送信ﾊﾞｯﾌｧ空き待機
	SBIS	USR,UDRE	;
	RJMP	UARTTRN

; (2)シリアルデータを設定
	OUT	UDR,R16		;

	RET

;******************************************************************************************
;   Function Name : WAT1S
;   Title         : タイマー関数
;   Input         : 
;   Output        : 
;******************************************************************************************
WAT1S:
	PUSH	R16
	PUSH	R17
	PUSH	R18
;
	LDI	R18,10		;
WAT1S_A:			;
	LDI	R17,100		;
WAT1S_B:			;
	LDI	R16,110		;
WAT1S_C:			;
	RJMP	PC+1		;
	RJMP	PC+1		;
	RJMP	PC+1		;
	DEC	R16		;
	BRNE	WAT1S_C		;
	DEC	R17		;
	BRNE	WAT1S_B		;
	DEC	R18		;
	BRNE	WAT1S_A		;

;
	POP	R18
	POP	R17
	POP	R16
	RET			;


;******************************************************************************************
;   Function Name : WATTT
;   Title         : タイマー関数(距離補正用)
;   Input         : 
;   Output        : 
;   Description   :
;      音速を340[m/S]と仮定する
;        1カウント10[cm]*2(往復)とするなら、0.000,589[S]
;******************************************************************************************
WATTT:
	PUSH	R16
	PUSH	R17
	PUSH	R18
;
	LDI	R21,0x00
;
	LDI	R18,10		;
WATTT_A:			;
	LDI	R17,100		;
WATTT_B:			;
	LDI	R16,50		;
WATTT_C:			;
	SBIC	PINB,6
	LDI	R21,0xFF
;	RJMP	PC+1		;
	RJMP	PC+1		;
	RJMP	PC+1		;
	DEC	R16		;
	BRNE	WATTT_C		;
;	DEC	R17		;
;	BRNE	WATTT_B		;
;	DEC	R18		;
;	BRNE	WATTT_A		;
;
	POP	R18
	POP	R17
	POP	R16
	RET			;

