;********************************************************************
;* ИК-локатор: ИК-светодиод на PB4 дает пачки импульсов с частотой
;* около 36кГц, а TSOP1736 на PB3 их отслеживает
;*									   
;* MCU: ATtiny12@1MHz	(c) RoboClub 2003				   
;********************************************************************


.include "tn13def.inc"

	rjmp	RESET		;reset handle


;* Объявление переменных

	.def  t1      = r1	;счетчик для "длинных" задержек
	.def  temp    = r19	;счетчик времени задержки
	.def  count   = r20	;счетчик числа импульсов в пачке

;* Определения

	.equ  led1   = 0	;led1 на PB0
	.equ  led2   = 2	;led2 на PB2
	.equ  tsop   = 3	;TSOP на PB3
	.equ  ir_led = 4	;IR LED на PB4

;* Начало кода

RESET:
	sbi   DDRB, led1	;подключаем led1 и led2
	sbi   DDRB, led2	;

	sbi   DDRB, ir_led	;подключаем IR LED на выход PORTB 
	    
	cbi   DDRB, tsop	;подключаем TSOP на вход PORTB
	sbi   PORTB,tsop	;включаем "подтяжку"

	cbi	PORTB, led1	;начальные установки выходов: гасим led1 и зажигаем led2 
	sbi	PORTB, led2	;

;* Задание значений

	.equ  TIME1   =  4 	;длительность импульса
	.equ  TIME2   =  5 	;задержка между импульсами
	.equ  TIME3   =  20	;задержка между пачками импульсов
	.equ  Const_COUNT   =  10	;число импульсов в пачке


; Главный цикл программы 
; ----------------------
start: 
		ldi   	count, Const_COUNT	;загружаем в счетчик число импульсов в пачке

; цикл выдачи пачки импульсов
flash: 	
		cbi   	PORTB, ir_led	;зажигаем IR LED

		ldi   	temp, TIME1	;загружаем в temp длительность импульса           
Delay1: dec   	temp			;уменьшаем на единицу temp, пока
		brne  	Delay1	    	;  не станет равным 0

		sbi   	PORTB, ir_led	;гасим IR LED 
        
		ldi   	temp, TIME2	;загружаем в temp длительность паузы между импульсами
Delay2: dec   	temp			;уменьшаем на единицу temp, пока 
		brne  	Delay2		;  не станет равным 0

		
		dec   	count		;уменьшаем на 1 счетчик числа импульсов
		brne  	flash		;если не 0, то посылаем следующий импульс

;когда пачка импульсов выдана - проверяем, есть ли сигнал от TSOP
	
		sbis	PINB, tsop	;если уровень на выходе TSOP низкий (т.е. сигнал есть)
		rjmp	ledon		;то идем зажигать led1 и гасить led2
		cbi	PORTB, led1	;иначе гасим led1 и зажигаем led2 	
		sbi	PORTB, led2	;
		rjmp	wait_next	;и переходим к ожиданию следующей пачки

ledon:		cbi	PORTB, led2	;гасим led2 и зажигаем led1
		sbi	PORTB, led1

;задержка перед следующей пачкой импульсов
wait_next:	
		
		clr	t1		;сбрасываем t1 (т.е. t1=0 или, что тоже t1=256)
		ldi   	temp, TIME3	;устанавливаем число задержек

Delay3: 	dec   	t1		;задержка по счетчику t1 от 256 до 0
		brne  	Delay3		;   т.е. 256*3 тактов 
		dec	temp		;повторяем TIME3 раз задержку по t1
		brne  	Delay3		;   т.е. всего  (TIME3*256*3 + TIME3*3) тактов

		rjmp  	start		;переходим к началу главного цикла
