

;
;s02.asm	mega48テストプログラム0
;				LED点滅
;				8分周された内部8MHzクロック,1MHzを想定

.include "m48def.inc"

.org		0x0							;割り込みは使用しないので
										;ベクトル省略

reset:		LDI		R16,LOW(RAMEND)		;スタックポインタの設定
			OUT		SPL,R16
			LDI		R16,HIGH(RAMEND)	;RAMのサイズが大きいので2バイト設定する
			OUT		SPH,R16

			LDI		R16,0b11111111		;ポートBを出力に設定
			OUT		DDRB,R16


			LDI		R16,0				;2400ボー/1MHzクロック
			sts		UBRR0H,R16
			LDI		R16,25
			sts		UBRR0L,R16

			LDI		R16,0b00011000		;送受信イネーブル
			sts		UCSR0B,R16

			LDI		R16,0b00000110		;8ビット,パリティなし,ストップビット1
			sts		UCSR0C,R16

										;I2Cの準備
			LDI		R16,0xff			;レート
			sts		TWBR,r16

			ldi		r16,0x02			;自分のアドレス
			sts		TWAR,r16			;アドレス

			ldi		r22,0x80			;送信アドレス

loop2:		LDI		R17,1				;3回点滅

loop:		LDI		R16,0b00000000
			OUT		PORTB,R16

			RCALL	wait05
			
			LDI		R16,0b00000011
			OUT		PORTB,R16

			RCALL	wait05

			DEC		R17
			BRNE	loop


lpst:		rcall	rsin				;data on r21

			ldi		r16,0b00000011
			out		PORTB,r16

			ldi		r16,0b10100100		;start
			sts		TWCR,r16

loop3:		lds		r16,TWCR			;開始完了待ち
			sbrs	r16,TWINT
			rjmp	loop3

			lds		r16,TWSR			;未
			andi	r16,0xf8			;
			cpi		r16,0x08			;

;			mov		r16,r22				;アドレス送信
;			inc		r22
;			inc		r22
;			andi	r22,0x8f
			ldi		r16,0x88			;
			sts		TWDR,r16

			ldi		r16,0b10000100		;開始
			sts		TWCR,r16

			ldi		r16,0b00000010
			out		PORTB,r16
loop4:		rcall	intck				;アドレス送信完了待ち

			ldi		r16,0b00000000
			out		PORTB,r16

;			lds		r16,TWSR			;未
;			andi	r16,0xf8
	
			mov		r16,r21
			inc		r16
			inc		r16
			sts		TWDR,r16			;データ送信
			ldi		r16,0b10000100		;開始
			sts		TWCR,r16

			rcall	intck

			mov		r24,r21
			andi	r24,0x0f

loop5:		rcall	rsin

			sts		TWDR,r21			;データ送信
			ldi		r16,0b10000100		;開始
			sts		TWCR,r16

			rcall	intck

			lds		r16,TWSR			;未
			andi	r16,0xf8

			dec		r24
			brne	loop5

			ldi		r21,'A'				;ブロック名
			sts		TWDR,r21			;データ送信
			ldi		r16,0b10000100		;開始
			sts		TWCR,r16

			rcall	intck	
			ldi		r21,'C'				;受信ポート名
			sts		TWDR,r21			;データ送信
			ldi		r16,0b10000100		;開始
			sts		TWCR,r16

			rcall	intck
			ldi		r16,0b10010100		;stop
			sts		TWCR,r16

			LDI		R16,0b00000000
			OUT		PORTB,R16

			RJMP	lpst

rsin:		lds		r16,UCSR0A
			sBrS	r16,0x7					;RXC=1なら受信あり，スキップ
			RJMP	rsin
			lds		r21,UDR0				;受信レジスタからデータ取り出し
			ret

intck:		lds		r16,TWCR	
			sbrs	r16,TWINT
			rjmp	intck
			ret

;        
;時間待ち　0.5秒/1MHzクロック
;	
wait05:		LDI		R18,5

wait052:	RCALL	wait01
			DEC		R18
			BRNE	wait052

			RET

;        
;時間待ち　0.1秒/1MHzクロック
;
wait01:		LDI		R19,100
wait012:	RCALL	wait1m
			DEC		R19
			BRNE	wait012

			RET

;        
;時間待ち　約1ミリ秒/1MHzクロック
;
wait1m:		LDI		R20,250
wait1m2:	NOP
			DEC		R20
			BRNE	wait1m2

			RET
