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