;---------------------------------------------------
; inttest.asm for ATtiny15L 4 チャンネルデコーダー
; PB2 : 負論理入力
; PB0 : ch1 出力
; PB1 : ch2 出力
; PB3 : ch3 出力
; PB4 : ch4 出力
; 外部割り込み0によるプログラム
;---------------------------------------------------
.include "c:\avrtools\appnotes\tn15def.inc"

.def	stack	= r15
.def	temp	= r16
.def	count	= r17
.def	channel	= r18
.def	count3	= r19

	rjmp	reset
	rjmp	ext_int0      	;外部割り込み要求0
	reti
	reti
	reti
	reti
	reti
	reti
	reti

reset:
	ldi	temp,0x1b      	;0b00011011
	out	DDRB,temp      	;bit2のみ入力に設定

	ldi	temp,0x04      	;0b00000100
	out	PORTB,temp	;bit2のプルアップを有効に設定

	ldi	temp,(1<<ISC01)	;ldi temp,0x02 と同じ 0b00000010
	out	MCUCR,temp	;外部割り込み、立ち下がりで発生

	ldi	temp,(1<<INT0)	;ldi temp,0x20 と同じ 0b00100000
	out	GIMSK,temp	;外部割り込みを有効に

	sei			;Global Interrupt Enable

	clr	count
loop:
	rcall	tim
	inc	count
	rjmp	loop

tim:
	ldi	count3,10
tlp1:	dec	count3		;count3=count3-1
	brne	tlp1		;count3がゼロでなければtlp1へ ゼロの時1stepゼロ以外は2steps
	ret

;--- 外部割り込み要求0処理 ---
ext_int0:
	in	stack,SREG

	cpi	count,120
	brlo	lp01
	clr	channel		;countが120になったらギャップを検出したのでチャンネルをクリア
lp01:
	inc	channel
	cpi	channel,1
	breq	ch1
	cpi	channel,2
	breq	ch2
	cpi	channel,3
	breq	ch3
	cpi	channel,4
	breq	ch4
	rjmp	ch0

ch1:	sbi	PORTB,0
	rjmp	lp02
ch2:	cbi	PORTB,0
	sbi	PORTB,1
	rjmp	lp02
ch3:	cbi	PORTB,1
	sbi	PORTB,3
	rjmp	lp02
ch4:	cbi	PORTB,3
	sbi	PORTB,4
	rjmp	lp02
ch0:	cbi	PORTB,4
	rjmp	lp02
	
lp02:
	clr	count
	out	SREG,stack
	reti