;----------------------------------------------------------------------------
; pwm-esc1.asm for tiny15L
; スピコン(ESC)
; PB2: 入力(正論理)
; PB1: PWM出力
;----------------------------------------------------------------------------

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

.def	temp	= r16			;r0からr31までが汎用レジスタ
.def	thr_cnt	= r17			;スロットルカウンター

.equ	thr_h	= 175			;スロットルハイ 175x10usec=1750usec
.equ	thr_l	= 95			;スロットルロー  95x10usec=950usec

.org	0

	rjmp	reset			;パワーオンリセット
	reti				;ATtiny15Lには8つの割り込みがあるがすべて未使用
	reti
	reti
	reti
	reti
	reti
	reti
	reti

reset:
;-- OSCCALレジスタに発振周波数校正値をセット --
	ldi	temp, $3F
	out	EEAR, temp
	sbi	EECR, EERE
	in	temp, EEDR
	out	OSCCAL, temp

;-------------------------------
	ldi	temp, 0b00011011
	out	DDRB, temp		;PB2を入力、PB0,PB1,PB3,PB4を出力に設定
	ldi	temp, 0b00000100
	out	PORTB, temp		;PB2を内部プルアップ

	clr	thr_cnt			;出力用スロットルカウンターをクリア
	out	OCR1A, thr_cnt		;初期値にゼロをセット

	ldi	temp, thr_h-thr_l	;スロットルHigh-スロットルLow
	out	OCR1B, temp		;比較カウンターBの上限値をセット

	ldi	temp, 0b01100101
;			 ||||__|________CS13,CS12,CS11,CS10 0101クロックセレクトビット
;			 |||            システムクロックを使用
;			 |||____________COM1A1,COM1A0 10 非反転出力
;			 |______________PWM1 PWM動作許可
	out	TCCR1, temp

loop:	in	temp, PINB		;ポートBから入力
	sbrs	temp, 2			;入力が1なら次をスキップ
	rjmp	loop
lp0:	in	temp, PINB		;ポートBから入力
	inc	thr_cnt			;スロットルカウンターインクリメント
	nop				;nop x 11 ステップ数調整
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	sbrc	temp, 2			;入力がゼロなら次をスキップ
	rjmp	lp0			;このループ16ステップ(10usec)

	cpi	thr_cnt, thr_l		;スロットルカウンター値とスロットルロー値を比較
	brlo	lp1			;スロットルカウンター値がスロットルロー値以下ならlp1へ
	subi	thr_cnt, thr_l		;スロットルカウンター値からスロットルロー値を減算
	rjmp	lp2
lp1:	clr	thr_cnt			;スロットルカウンターをクリア
lp2:	out	OCR1A, thr_cnt		;PWM出力を更新
	clr	thr_cnt
	rjmp	loop