;******************************************************************************************
;  ＡＶＲサンプル
;   Project      :
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H19.01.22
;   History      :
;******************************************************************************************
;  (1)Description 
;       RXD:PD0, TXD;PD1
;******************************************************************************************
.include "m48def.inc"
.equ	PI_RXD	= 0		; Define RXD
.equ	PI_TXD	= 1		; Define TXD
.cseg
	LDI	R16,0xFF	; PORTB(0-7)を全て出力にする
	OUT	DDRB,R16	; PORTB(0-7)を全て出力にする
	LDI	R16,0x02	; 
	OUT	DDRD,R16	; 
;
; 0.初期設定

	LDI	R21,0x01	; PORTB変数を1に初期化
	OUT	PORTB,R21	; PORTBを1に初期化
;
	SBI	PORTD,PI_TXD	; TXDを初期化
MAIN:
; 1.PCより回転数を得る
;  (1)データを受信する
	RCALL	SERREC		; データを受信

;  (2)キャラクタ数字を数値に変換する
	LDI	R23,0x0F	; キャラクタ数字を数値に変換
	AND	R23,R16		; キャラクタ数字を数値に変換
	MOV	R20,R23		; 数値を代入

;  (3)エコーバックする 
	RCALL	SERTRN		; データを送信

; 2.ルーレットの指定数回転
MAIN1:
	RCALL	MVLD		; ルーレットを動かす
	RCALL	WAT1S		; 少し待つ
	RCALL	WAT1S		; 少し待つ
	RCALL	WAT1S		; 少し待つ
	DEC	R20		;
	BRNE	MAIN1		;	
;
	RJMP	MAIN

;******************************************************************************************
;   Function Name : WAT1S
;   Title         : タイマー関数
;   Input         : 
;   Output        : 
;******************************************************************************************
WAT1S:
	LDI	R18,30		; 100->
WAT1S_A:			;
	LDI	R17,10		;
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		;
	RET			;

;******************************************************************************************
;   Function Name : MVLD
;   Title         : ルーレットを動かす
;   Input         : 
;   Output        : 
;******************************************************************************************
MVLD:
; 2.ルーレットを動かす
	OUT	PORTB,R21	; PORTBに代入
	SBRC	R21,7		;
	RJMP	MVLD1		;
	LSL	R21		; 表示をシフト
	RET			;　	
MVLD1:				;
	LDI	R21,0x01	; PORTB変数を1に初期化
	RET	
	
;******************************************************************************************
;   Function Name : SERREC
;   Title         : シリアルデータを受信する
;   Input         : 
;   Output        : R16(受信データ) 
;   Description   : OSC 8MHz, 9600BPS;１パルス長は、8MHz/9600=>833.3(Step)
;                   
;******************************************************************************************
SERREC:
;  1.スタートビットを待つ(833) * 1.5 ===> 1249.5
SERREC_1A:
	SBIC	PIND,PI_RXD	;(1/2,3)PORTD(0)をチェック
	RJMP	SERREC_1A	;(2)PORTD(0)をチェック
;
	LDI	R17,124		;(1)
SERREC_1B:
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
	NOP			;(1)
	DEC	R17		;(1)
	BRNE	SERREC_1B	;(1/2)
;
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
;
;  2.データ受信
;   (1)データを8ビット受信する
	LDI	R16,0		;(1)R16を初期化
	LDI	R18,8		;(1)
SERREC_2A:
	LSR	R16		;(1)
	SBIC	PIND,PI_RXD	;(1/2,3)データチェック
	ORI	R16,0x80	;(1)データがHならビットを１にする
	SBIS	PIND,PI_RXD	;(1/2,3)PORTD(0)をチェック
	ANDI	R16,0x7f	;(1)データがLならビットを０にする

;  3.１ビット分待つ
	LDI	R17,82		;(1)
SERREC_2B:			;
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
	NOP			;(1)
	DEC	R17		;(1)
	BRNE	SERREC_2B	;(1/2)
;
	RJMP	PC+1		;(2)
	NOP			;(1)
	DEC	R18		;(1)
	BRNE	SERREC_2A	;(1/2)

;  4.送信終了
	LDI	R17,83		;(1)
SERREC_4:			;
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
	NOP			;(1)
	DEC	R17		;(1)
	BRNE	SERREC_4	;(1/2)
	RJMP	PC+1		;(2)
;
	RET

;******************************************************************************************
;   Function Name : SERTRN
;   Title         : シリアルデータを送信する
;   Input         : R16(送信データ) 
;   Output        : 
;   Description   : OSC 8MHz, 9600BPS;１パルス長は、8MHz/9600=>833.3(Step)
;
;******************************************************************************************
SERTRN:
;  1.スタートビットを送信(833)
	CBI	PORTD,PI_TXD	;(2)TXDを設定
	LDI	R17,83		;(1)
SERTRN_1:
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
	NOP			;(1)
	DEC	R17		;(1)
	BRNE	SERTRN_1	;(1/2)
;				;
;  2.データを送信(8Bit)
;   (1)データを8ビット送信する
	LDI	R18,8		;(1)
SERTRN_2:			;
;
;   (2)ビットデータを送信する
;    2-1)ビット設定
	SBRC	R16,0		;(1/2,3)R16(0)が'1'の時、'H'にする
	SBI	PORTD,PI_TXD	;(2) 
	SBRS	R16,0		;(1/2,3)R16(0)が'0'の時、'L'にする
	CBI	PORTD,PI_TXD	;(2)
	LSR	R16		;(1)
;
;    2-2)１パルス作成
	LDI	R17,82		;(1)
SERTRN_2A:
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
	NOP			;(1)
	DEC	R17		;(1)
	BRNE	SERTRN_2A	;(1/2)
;
	RJMP	PC+1		;(2)
	NOP			;(1)
	DEC	R18		;(1)
	BRNE	SERTRN_2	;(1/2)
;
;  3.ストップビットを送信
	SBI	PORTD,PI_TXD	;(2)TXDを設定
	LDI	R17,83		;(1)
SERTRN_3:			;
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
	NOP			;(1)
	DEC	R17		;(1)
	BRNE	SERTRN_3	;(1/2)
	
;  4.送信終了
	SBI	PORTD,PI_TXD	;(2)TXDを初期化
	LDI	R17,83		;(1)
SERTRN_4:			;
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
	RJMP	PC+1		;(2)
	NOP			;(1)
	DEC	R17		;(1)
	BRNE	SERTRN_4	;(1/2)
;
	RET 
