;---------------------------------------------------------------------------- ; decode.asm for tiny15L ; 3チャンネルデコーダー ; PB2: 入力(負論理) ; PB3: ch1出力(正論理) ; PB4: ch2出力(正論理) ; PB1: ch3出力(正論理)] ;---------------------------------------------------------------------------- .include "c:\avrtools\appnotes\tn15def.inc" .def temp = r16 ;r0からr31までが汎用レジスタ .def gapcnt1 = r17 ;だがすべての命令が使えるのはr16からr31まで .def gapcnt2 = r18 .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 ;PB0,PB1,PB3,PB4を出力に設定 ldi temp, 0b00000100 out PORTB, temp ;PB2 pull-up clr gapcnt1 clr gapcnt2 ;-- ギャップ検出 --------------- loop: in temp, PINB sbrc temp, 2 ;Skip if Bit in Register is Cleared ;入力がゼロなら次をスキップ rjmp out_h ;入力が1ならout_hへ cpi gapcnt2, 3 ;今回のギャップ検出ループでは3.84msecとなる clr gapcnt1 clr gapcnt2 brlo loop ; rjmp output ;output処理へ out_h: inc gapcnt1 brbs 1, lp1 ;Branch if Bit in SREG is Set rjmp loop ;Zフラグが1(桁上がり)ならlp1へ lp1: inc gapcnt2 rjmp loop ;-- 出力 ----------------------- output: ;-- ch1 -- sbi PORTB, 3 ;PB3 ON o1: in temp, PINB sbrs temp, 2 ;入力が1なら次をスキップ rjmp o1 o2: in temp, PINB sbrc temp, 2 ;入力がゼロなら次をスキップ rjmp o2 cbi PORTB, 3 ;PB3 OFF ;-- ch2 -- sbi PORTB, 4 ;PB4 ON o3: in temp, PINB sbrs temp, 2 ;入力が1なら次をスキップ rjmp o3 o4: in temp, PINB sbrc temp, 2 ;入力がゼロなら次をスキップ rjmp o4 cbi PORTB, 4 ;PB4 OFF ;-- ch3 -- sbi PORTB, 1 ;PB1 ON o5: in temp, PINB sbrs temp, 2 ;入力が1なら次をスキップ rjmp o5 o6: in temp, PINB sbrc temp, 2 ;入力がゼロなら次をスキップ rjmp o6 cbi PORTB, 1 ;PB1 OFF rjmp loop