;---------------------------------------------------------------------------- ; 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