
;
;trc00.asm rc04.asm	+ タイマping
;				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

loop2:		LDI		R17,1				;点滅回数

loop:		LDI		R16,0b00000000
			OUT		PORTB,R16

			RCALL	wait05
			
			LDI		R16,0b00000011
			OUT		PORTB,R16

			RCALL	wait05

			DEC		R17
			BRNE	loop

		LDI		R16,0b00000000			;タイマの設定
				;　　 !!!!  ++------標準動作、アップカウンタ　
				;     ++++----------出力ピンは使わない
		sts		TCCR1A,R16
		LDI		R16,0b00000011		
				;          +++------64分周
				;        ++---------標準動作
		sts		TCCR1B,R16

			LDI		R16,0xff
			sts		TWBR,r16

			ldi		r16,0x88			;受信
			sts		TWAR,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

			ldi		r25,0
lpp:		ldi		r16,0b11000100
					;          +---------TW Enable
					;	   +-------------ack許可 
			sts		TWCR,r16

										;アドレス受信待ち
i2c_a:		lds		r17,TCNT1L
			lds		r17,TCNT1H

			CP		R17,r25
			brcc	i2c_a2

			ldi		r16,0x01
			out		PORTB,r16

			ldi		r16,'3'				;データは3個
			rcall	sosin
			rcall	wait01

			ldi		r16,'A'				;ブロック名
			rcall	sosin			
			rcall	wait01

			ldi		r16,'@'				;初段
			rcall	sosin			
			rcall	wait01

			ldi		r16,'E'				;ポート名
			rcall	sosin
			ldi		r16,0x00
			out		PORTB,r16
							
i2c_a2:		mov		r25,r17				;過去値更新
			lds		r16,TWCR	
			sbrs	r16,TWINT
			rjmp	i2c_a

			lds		r16,TWSR			;
			ANDI	r16,0xf8			;

			CPI		r16,0x60
			breq	rok

;			lsr		r16
;			lsr		r16
;			lsr		r16
;			lsr		r16
;			andi	r16,0x0f
;			ori		r16,0x30
;			rcall	sosin
;			LDI		R16,0b00000001
;			rjmp	lpp

rok:		LDI		R16,0b00000011
			OUT		PORTB,R16

			ldi		r16,0b11000100
					;          +---------TW Enable
					;	   +-------------ack許可 
			sts		TWCR,r16

			rcall	intck
			
			lds		r16,TWDR
			mov		r24,r16
			andi	r24,0x0f
			inc		r16					;出力ポート番号分を増やす
			OUT		PORTB,R16
			
			rcall	sosin

loop3:
			ldi		r18,0b11000100
					;          +---------TW Enable
					;	   +-------------ack許可 
			sts		TWCR,r18

			rcall	intck

			lds		r16,TWDR
			OUT		PORTB,R16	
			rcall	sosin
	
			dec		r24
			brne	loop3

			ldi		r18,0b10000100
			sts		TWCR,r18

			rcall	intck				;stop待ち

			ldi		r16,'E'				;出力ポート
			rcall	sosin

			LDI		R16,0x00
			OUT		PORTB,R16

			RJMP	lpp

intck:		lds		r16,TWCR	
			sbrs	r16,TWINT
			rjmp	intck
			ret

sosin:		lds		r18,UCSR0A
			SBrS	r18,5				;UDRE=1なら送信レジスタ空き，スキップ
			RJMP	sosin
			sts		UDR0,R16	
			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
