;******************************************************************************************
;  ＡＶＲサンプル
;   Project      :
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H19.01.16
;   History      :
;******************************************************************************************
;  (1)Description 
;
;******************************************************************************************
.include "m48def.inc"
.cseg	
.org	$0000

	LDI	R16,HIGH(RAMEND)	; スタック領域の設定
	OUT	SPH,R16		; スタック領域の設定
	LDI	R16,LOW(RAMEND)	; スタック領域の設定
	OUT	SPL,R16		; スタック領域の設定

	LDI	R16,0xFF	; PORTB(0-7)を全て出力にする
	OUT	DDRB,R16	; PORTB(0-7)を全て出力にする
	LDI	R16,0x02	; 
	OUT	DDRD,R16	; 
;
; 0.初期設定

	LDI	R16,0x00	; PORTBを初期化
	OUT	PORTB,R16	; PORTBを初期化
	LDI	R20,10		; 初期値を設定
	LDI	R21,0x01	; PORTB変数を1に初期化
	OUT	PORTB,R21	; PORTBを1に初期化
;
	RCALL	UARTINI		; UARTを初期化
	RCALL	DEMO1		; 接続メッセージを表示
MAIN:
; 1.PCより回転数を得る
;  (1)データを受信する
	RCALL	UARTREC		; データを受信
;  (2)キャラクタ数字を数値に変換する
	LDI	R23,0x0F	; キャラクタ数字を数値に変換
	AND	R23,R16		; キャラクタ数字を数値に変換
	MOV	R20,R23		; 数値を代入
;  (3)エコーバックする 
	RCALL	UARTTRN		; データを送信
;
; 2.ルーレットの指定数回転
MAIN1:
	RCALL	MVLD		; ルーレットを動かす
	RCALL	WAT1S		; 少し待つ
	RCALL	WAT1S		; 少し待つ
	RCALL	WAT1S		; 少し待つ
	DEC	R20		;
	BRNE	MAIN1		;	
;
	RJMP	MAIN

;******************************************************************************************
;   Function Name : DEMO1
;   Title         : 接続メッセージを表示
;   Input         : 
;   Output        : 
;******************************************************************************************
DEMO1:
	PUSH	R16
;
	LDI	R16,'A'	
	RCALL	UARTTRN
	LDI	R16,'T'	
	RCALL	UARTTRN
	LDI	R16,'M'	
	RCALL	UARTTRN
	LDI	R16,'e'	
	RCALL	UARTTRN
	LDI	R16,'g'	
	RCALL	UARTTRN
	LDI	R16,'a'	
	RCALL	UARTTRN
	LDI	R16,'4'	
	RCALL	UARTTRN
	LDI	R16,'8'	
	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         : 
;   Output        : 
;   Description   : 内部OSC8MHz / 9600BPS用
;******************************************************************************************
UARTINI:
;  1.UBRRレジスタの設定
;    ※BAUD=Fck/16(UBRR+1) => UBRR=Fck/(16*BAUD) - 1
;       8MHz,9600BAUDの時, UBRR=8M/(16*9600)-1=>51.08(Dec)=>33(Hex)  
	LDI	R16,0x33	; 
	STS	UBRR0L,R16	; 
	LDI	R17,0x00	; 
	STS	UBRR0H,R17	;
;  2.UCRレジスタの設定
	LDI	R16,(0<<U2X0)	; 
	STS	UCSR0A,R16	; 
	LDI	R17,(1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0); 
	STS	UCSR0B,R17	; 
	LDI	R18,(0<<UMSEL00)|(3<<UCSZ00)|(1<<USBS0)|(0<<UPM00); 
	STS	UCSR0C,R18	;      
	RET
;
;******************************************************************************************
;   Function Name : UARTREC
;   Title         : シリアルデータを受信する(USR/UDR)
;   Input         : 
;   Output        : 
;******************************************************************************************
UARTREC:
;	SBIS	UCSR0A,RXC0	;
;	RJMP	UARTREC		;
	LDS	R16,UCSR0A
	SBRS	R16,RXC0	;
	RJMP	UARTREC		;
	LDS	R16,UDR0	;
	RET
;******************************************************************************************
;   Function Name : UARTTRN
;   Title         : シリアルデータを送信する(USR/UDR)
;   Input         : 
;   Output        : 
;******************************************************************************************
UARTTRN:
	PUSH	R17
UARTTRN1:
; (1)送信ﾊﾞｯﾌｧ空き待機
	LDS	R17,UCSR0A
	SBRS	R17,UDRE0
	RJMP	UARTTRN1

; (2)シリアルデータを設定
	STS	UDR0,R16	;
	POP	R17

	RET

;******************************************************************************************
;   Function Name : WAT1S
;   Title         : タイマー関数
;   Input         : 
;   Output        : 
;******************************************************************************************
WAT1S:
	LDI	R18,10		; 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		

