;******************************************************************************************
;  ＡＶＲサンプル
;   Project      :
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H19.02.20
;   History      :
;******************************************************************************************
;  (1)Description 
;
;******************************************************************************************
.include "m48def.inc"
;
; 内蔵SRAMの定義
; (1)カウンタ変数
.equ	COU0	=	$0100	; カウンタ０桁目
.equ	COU1	=	$0101	; カウンタ１桁目
.equ	COU2	=	$0102	; カウンタ２桁目
.equ	COU3	=	$0103	; カウンタ３桁目
.equ	CCOU0	=	$0104	; キャラクタ数字０桁目
.equ	CCOU1	=	$0105	; キャラクタ数字１桁目
.equ	CCOU2	=	$0106	; キャラクタ数字２桁目
.equ	CCOU3	=	$0107	; キャラクタ数字３桁目
.equ	TMPADCL	=	$0108	; キャラクタ数字３桁目
.equ	TMPADCH	=	$0109	; キャラクタ数字３桁目
.cseg	
.org	$0000

	LDI	R16,HIGH(RAMEND); スタック領域の設定
	OUT	SPH,R16		; スタック領域の設定
	LDI	R16,LOW(RAMEND)	; スタック領域の設定
	OUT	SPL,R16		; スタック領域の設定

	LDI	R16,0x00	; PORTB
	OUT	DDRB,R16	; PORTB
	LDI	R16,0x02	; PORTD
	OUT	DDRD,R16	; PORTD
	LDI	R16,0x00	; PORTC
	OUT	DDRC,R16	; PORTC
;
; 0.初期設定
;
	RCALL	UARTINI		; UARTを初期化
	RCALL	INITADC		; ADCを初期化 
;	RCALL	DEMO01		; 接続メッセージを表示
MAIN:
; 1.メイン処理
;  (1)A/D Converterがらデータを得る
	RCALL	GETADC
	STS	TMPADCL,R16
	STS	TMPADCH,R17
;  (2)10bit16進=>キャラクタ10進に変換
	RCALL	CNVBD		; 10進表示バージョン
;;;;;	RCALL	CNVBH		; 16進表示バージョン
;  (3)結果を出力
	RCALL	OUTADC
;  (4)少し待つ
 	RCALL	WAT1S		; 少し待つ
	RJMP	MAIN


;******************************************************************************************
;   Function Name : DEMO01
;   Title         : 接続メッセージ
;   Input         : 
;   Output        : 
;   Description   : 
;******************************************************************************************
DEMO01:
	LDI	R16,'A'		;
	RCALL	UARTTRN		; データを送信
	LDI	R16,'V'		;
	RCALL	UARTTRN		; データを送信
	LDI	R16,'R'		;
	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,'O'		;
	RCALL	UARTTRN		; データを送信
	LDI	R16,'K'		;
	RCALL	UARTTRN		; データを送信
	LDI	R16,'>'		;
	RCALL	UARTTRN		; データを送信
	RET


;******************************************************************************************
;   Function Name : OUTADC
;   Title         : 結果を出力
;   Input         : 
;   Output        : 
;   Description   : 
;******************************************************************************************
OUTADC:
	LDI	R16,' '		;
	RCALL	UARTTRN		; データを送信
	LDI	R16,'V'		;
	RCALL	UARTTRN		; データを送信
	LDI	R16,'o'		;
	RCALL	UARTTRN		; データを送信
	LDI	R16,'l'		;
	RCALL	UARTTRN		; データを送信
	LDI	R16,'t'		;
	RCALL	UARTTRN		; データを送信
	LDI	R16,'['		;
	RCALL	UARTTRN		; データを送信
	LDI	R16,'m'		;
	RCALL	UARTTRN		; データを送信
	LDI	R16,'V'		;
	RCALL	UARTTRN		; データを送信
	LDI	R16,']'		;
	RCALL	UARTTRN		; データを送信
	LDI	R16,'='		;
	RCALL	UARTTRN		; データを送信
;
	LDS	R16,CCOU3	;	
	RCALL	UARTTRN		; データを送信
	LDS	R16,CCOU2	;	
	RCALL	UARTTRN		; データを送信
	LDS	R16,CCOU1	;	
	RCALL	UARTTRN		; データを送信
	LDS	R16,CCOU0	;	
	RCALL	UARTTRN		; データを送信

	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	R16,0x00	; 
	STS	UBRR0H,R16	;
;  2.UCRレジスタの設定
	LDI	R16,(0<<U2X0)	; 
	STS	UCSR0A,R16	; 
	LDI	R16,(1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0); 
	STS	UCSR0B,R16	; 
	LDI	R16,(0<<UMSEL00)|(3<<UCSZ00)|(1<<USBS0)|(0<<UPM00); 
	STS	UCSR0C,R16	;      
	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 : INITADC
;   Title         : A/D Converterを初期化する
;   Input         :
;   Output        :
;   Description   : Set ADMUX,ADCSRA
;******************************************************************************************
INITADC:    
	LDI	R16,(0<<REFS1)|(0<<REFS0)|(0<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
 	STS	ADMUX,R16	;
;
	LDI	R16,(1<<ADEN)|(1<<ADSC)|(0<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);
 	STS	ADCSRA,R16	;
   
	RET


;******************************************************************************************
;   Function Name : GETADC
;   Title         : A/D-Converterからデータを得る
;   Input         :
;   Output        :
;   Description   : Set ADMUX,ADCSRA
;******************************************************************************************
GETADC:
; (1)A/Dコンバータの変換開始
	LDI	R16,(1<<ADEN)|(1<<ADSC)|(0<<ADIF)|(0<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);
 	STS	ADCSRA,R16	;
;
; (2)A/D-Converterの変換完了まで待つ
GETADC1:
	LDS	R16,ADCSRA	;
	SBRS	R16,ADIF	;
	RJMP	GETADC1		;
;
	RCALL	WATLP		;
; (3)データをセットする
	LDS	R16,ADCL	;
	LDS	R17,ADCH	;

	RET


;******************************************************************************************
;   Function Name : WAT1S
;   Title         : タイマー関数
;   Input         : 
;   Output        : 
;******************************************************************************************
WAT1S:
	LDI	R18,100		; 100->
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		;
	RET			;


;******************************************************************************************
;   Function Name : WATLP
;   Title         : タイマー関数
;   Input         : 
;   Output        : 
;******************************************************************************************
WATLP:
;	LDI	R18,10		; 100->
;WATLP_A:			;
	LDI	R17,10		;
WATLP_B:			;
	LDI	R16,110		;
WATLP_C:			;
	RJMP	PC+1		;
	RJMP	PC+1		;
	RJMP	PC+1		;
	DEC	R16		;
	BRNE	WATLP_C		;
	DEC	R17		;
	BRNE	WATLP_B		;
;	DEC	R18		;
;	BRNE	WATLP_A		;
	RET		

;******************************************************************************************
;   Function Name : CNVBH
;   Title         : 16進数バイナリ=>16進数キャラクタ変換
;   Input         : 
;   Output        : 
;   Description   : 16進表示バージョン
;******************************************************************************************
CNVBH:
; (1)16進数バイナリを16進数に変換
;    1)3桁目
	LDI	R16,0x00		;
	STS	COU3,R16		;
;    2)2桁目	
	LDS	R16,TMPADCH		;
	STS	COU2,R16		;
;    3)1,0桁目
	LDS	R16,TMPADCL		;
	MOV	R17,R16			;
	LSR	R17			;
	LSR	R17			;
	LSR	R17			;
	LSR	R17			;
	ANDI	R17,0x0F		;
	STS	COU1,R17		;
	ANDI	R16,0x0F		;
	STS	COU0,R16		;	
; (2)16進数をキャラクタに変換
	RCALL	CNVCHAR			;
	RET
;******************************************************************************************
;   Function Name : CNVBD
;   Title         : 16進数バイナリ=>10進数キャラクタ変換
;   Input         : 
;   Output        : 
;******************************************************************************************
CNVBD:
; (1)キャラクタ変数の初期化
	RCALL	INTCOU			; カウンタ変数の初期化

; (2)16進数バイナリを10進数に変換
;   1)ADCHから設定
	LDS	R17,TMPADCH		;
	LDI	R18,0x01
	CPSE	R17,R18
	RJMP	CNVBD1A
	LDI	R16,0x02
	STS	COU2,R16
	LDI	R16,0x05
	STS	COU1,R16
	LDI	R16,0x06
	STS	COU0,R16
	RJMP	CNVBD2
CNVBD1A:
	LDI	R18,0x02
	CPSE	R17,R18
	RJMP	CNVBD1B
	LDI	R16,0x05
	STS	COU2,R16
	LDI	R16,0x01
	STS	COU1,R16
	LDI	R16,0x02
	STS	COU0,R16
	RJMP	CNVBD2
CNVBD1B:
	LDI	R18,0x03
	CPSE	R17,R18
	RJMP	CNVBD2
	LDI	R16,0x07
	STS	COU2,R16
	LDI	R16,0x06
	STS	COU1,R16
	LDI	R16,0x08
	STS	COU0,R16
CNVBD2:
;   2)ADCLから設定
	LDS	R16,TMPADCL
	LDI	R17,0x01
	ADD	R16,R17
CNVBD2A:	
	PUSH	R16
	LDI	R17,0x01
	CPSE	R16,R17	
	RCALL	CNTDEC
	POP	R16
	DEC	R16		;
	BRNE	CNVBD2A	

; (3)10進数をキャラクタに変換
	RCALL	CNVCHAR			;
	RET

;******************************************************************************************
;   Function Name : CNTDEC
;   Title         : ４桁10進カウンタ
;   Input         : 
;   Output        : 
;******************************************************************************************
CNTDEC:
; (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
	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
	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
	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
	RET
CNTDEC5:	
	LDI	R16,0x00
	STS	COU0,R16
	STS	COU1,R16
	STS	COU2,R16
	STS	COU3,R16
	RET
;******************************************************************************************
;   Function Name : CNVCHAR
;   Title         : 数値=>キャラクタ変換
;   Input         : 
;   Output        : 
;   Description   : 
;******************************************************************************************
CNVCHAR:
;
	LDS	R16,COU3
	ORI	R16,0x30
	RCALL	CNVCHARS	
	STS	CCOU3,R16
;
	LDS	R16,COU2
	ORI	R16,0x30
	RCALL	CNVCHARS
	STS	CCOU2,R16
;
	LDS	R16,COU1
	ORI	R16,0x30
	RCALL	CNVCHARS
	STS	CCOU1,R16
;
	LDS	R16,COU0
	ORI	R16,0x30
	RCALL	CNVCHARS
	STS	CCOU0,R16
;	
	RET

;******************************************************************************************
;   Function Name : CNVCHARS
;   Title         : 数値=>キャラクタ変換(2)
;   Input         : R16 
;   Output        : R16
;   Description   : 0x3a=>'A',,,,,0x3f=>'F'に補正する 
;******************************************************************************************
CNVCHARS:
	MOV	R17,R16
;
	LDI	R18,0x3a
	CPSE	R17,R18
	RJMP	CNVCHARS1
	LDI	R16,'A'
	RET
CNVCHARS1:
;
	LDI	R18,0x3b
	CPSE	R17,R18
	RJMP	CNVCHARS2
	LDI	R16,'B'
	RET
CNVCHARS2:
;
	LDI	R18,0x3c
	CPSE	R17,R18
	RJMP	CNVCHARS3
	LDI	R16,'C'
	RET
CNVCHARS3:
;
	LDI	R18,0x3d
	CPSE	R17,R18
	RJMP	CNVCHARS4
	LDI	R16,'D'
	RET
CNVCHARS4:
;
	LDI	R18,0x3e
	CPSE	R17,R18
	RJMP	CNVCHARS5
	LDI	R16,'E'
	RET
CNVCHARS5:
;
	LDI	R18,0x3f
	CPSE	R17,R18
	RJMP	CNVCHARS6
	LDI	R16,'F'
	RET
CNVCHARS6:	
	RET
;
;******************************************************************************************
;   Function Name : INTCOU
;   Title         : 4桁10進カウンタ変数の初期化
;   Input         : 
;   Output        : 
;******************************************************************************************
INTCOU:
	LDI	R16,0x00		;
	STS	COU0,R16		;
	LDI	R16,0x00		;
	STS	COU1,R16		;
	LDI	R16,0x00		;
	STS	COU2,R16		;
	LDI	R16,0x00		;
	STS	COU3,R16		;
;
	LDI	R16,'*'			;
	STS	CCOU0,R16		;
	LDI	R16,'*'			;
	STS	CCOU1,R16		;
	LDI	R16,'*'			;
	STS	CCOU2,R16		;
	LDI	R16,'*'			;
	STS	CCOU3,R16		;
	RET

