;-------------------------------------------------------------------------------
; comptest2.asm for ATtiny15L
; 電源電圧が3Vに低下したらLEDを点灯して知らせる
; PB1: 電池分圧入力
; PB2: 電源電圧低下時Low出力
; スリープモード(アイドル動作)で消費電流を抑える
;-------------------------------------------------------------------------------

.include 	"c:\avrtools\appnotes\tn15def.inc"

.def	temp	= r16
.def	status	= r17

.org	0

	rjmp	reset
	reti
	reti
	reti
	reti
	reti
	reti
	rjmp	ana_comp      		;アナログコンパレータ出力遷移
	reti

reset:
	ldi	temp, 0b00111101
	out	DDRB, temp		;PB1を入力に設定
	ldi	temp, 0b00000000
	out	PORTB, temp		;内部プルアップを使用しない
	sbi	PORTB, 2      		;PB2をHighに
	ldi	temp, 0b01001000
;      		        ||  | ||________ACIS1,ACIS0: 00 = トグル(立ち上がり、立ち下がりで出力)
; 		        ||  |___________ACIE: 1 = アナログコンパレータ割り込み許可
; 		        ||______________ACBG: 1 = 内部基準電圧選択
; 		        |_______________ACD: 0 = アナログコンパレータ許可
	out	ACSR, temp		;割り込み処理を有効にする
	ldi	temp, 0b00100000
;		          |   ||________SM1,SM0 00 = スリープ種別 アイドル動作
;		          |_____________SE: 1 = Sleep Enable
	out	MCUCR, temp		;スリープ許可

;	ldi	temp, 0b10000000
;	out	SREG, temp		;この2行の設定は下記 sei と同じ
	sei				;割り込み処理を有効にする

loop:	sleep				;スリープモード(アイドル動作)に移行
	rjmp	loop

;--- アナログコンパレータ出力遷移割り込み処理 ---
ana_comp:
	in	status, SREG		;ステータスレジスタを保存
	cli				;割り込み処理を無効にする
	in	temp, ACSR		;ACSRレジスタから入力
	sbrs	temp, 5			;bit5(ACO)がセット(1)なら次をスキップ
	rjmp	lp1
	cbi	PORTB, 2      		;PB2をLowに(LEDを点灯)
	rjmp	lp2
lp1:	sbi	PORTB, 2      		;PB2をHighに(LEDを消灯)
lp2:	out	SREG, status		;ステータスレジスタを復帰
	reti