; Проба измерить период T и длительность импульса D
; Контроллер AT90S2313. Номинальная частота кварца 20'000'000 Гц.
; расчет длительности импульса D
; D=1'000'000*Dno/ Fo*Nx
; расчет периода T
; T=1'000'000*Tno/ Fo*Nx

	.include "c:\avr\avrasm\appnotes\tn2313def.inc"

	.def	temp	=r16
	.def	temp1	=r17
	.def	temp2	=r18
	.def	temp3	=r25
	
	.CSEG
					 
	RESET:				
	.org 0				; (нужен ли он здесь?)
		RJMP	START		; Прерывание Reset 		(то что адреса фиксированы это понятно т.е. 0X0000 это ресет и.т.д., но вопрос в том, 
		RETI			; Внешнее прерывание Int0	как он определяет что эта строчка именно 0X0000? случайно не из-за .org 0, т.е.следующее 
		RETI			; Внешнее прерывание Int1	значение после .org 0 это и есть 0X0000 следующей строчкой 0X0001 и.т.д.)
		IJMP			; Таймер/счётчик 1 захват
		RETI			; Таймер/счётчик 1, совпадение, канал A
		ADIW	XL,1		; Таймер/счётчик 1, прерывание по переполнению
		RETI			; Таймер/счётчик 0, прерывание по переполнению
		RETI			; Прерывание UART приём завершён
		RETI			; Прерывание UART регистр данных пуст
		RETI			; Прерывание UART передача завершена
		RETI			; Прерывние по компаратору
		RETI			; Прерыание по изменению на любом контакте
		RETI			; Таймер/счётчик 1, совпадение, канал B
		RETI			; Таймер/счётчик 0, совпадение, канал A
		RETI			; Таймер/счётчик 0, совпадение, канал A			;дописал весь список

;************************************************
;Fo:
;	.DB	$01,$31, $2D,$00	; Fo=20'000'000 Hz
;************************************************

;************************************************
;Настройка портов, тоже всё понятно
;************************************************
	START:
		CLI
		LDI	temp,LOW(RAMEND)
		OUT	SPL,temp

		CLR	temp1		; очистка R17
		SER	temp
		OUT	PORTD,temp	; Включение внутреннего резистора, разобрался.
		OUT	DDRD,temp
		LDI	temp,$01
		OUT	DDRD,t          ; Инициализация порта  D                                  ; Здесь вроде всё понятно
		
;**********************************************************************
;Настройка прерываний компараторы и.т.д. это тоже стало понятно.
;**********************************************************************
	SCHIT:
		CLI
		LDI	K,$01		

		CLR	temp1           ; очистка R17
		OUT	TCCR1B,temp1	; остановка таймера и сброс всех установок
		OUT	TCCR1A,temp1
		OUT	TCNT1H,temp1
		OUT	TCNT1L,temp1
		
		CLR	XH
		CLR	XL		; старшая часть счетчика длительности

		LDI	temp,$20
		OUT	MCUCR,temp		; разрешение SLEEP IDLE
		
		LDI	temp2,$88	; OVER_T1+CAPT
		OUT	TIMSK,temp2	;
					;		
		LDI	temp,$40	;
		OUT	TCCR1B,temp	; подготовка к приему фронта сигнала на ICP
					;
		
		CLT			; сброс пользовательского флага, по которому программа
					; определяет конец измерения. См. ниже

		LDI	ZH,HIGH(CAPT)	;
		LDI	ZL,LOW (CAPT)	; Установка адреса, по которому будет переход на обработчик
					; прерывания CAPT по фронту сигнала по команде IJMP
		
		SER	temp
		OUT	TIFR,temp	; сброс FLAG's
		
		SEI
	WAIT:
		SLEEP			; ждем'с прерываний
		BRTC	WAIT		; было прерывание, но Т-флаг очищен- переход на ожидание

		CLI			; Т-флаг установлен, значит конец измерения
		CLT

	
		RJMP	SCHIT
;************************************************
;Обработчик прерывания CAPT. Здесь непонятно только 4-е строчки, прочитав немного информации, попробую расписать, что происходит.
;************************************************
	CAPT:
		OUT	TCCR1B,temp3	; старт T1 с 0 и установка режима срабатывания CAPT по спаду импульса

;		ADIW	ZL,$10
		LDI	ZH,HIGH(CAPT2)
		LDI	ZL,LOW (CAPT2)	; Установка адреса, по которому будет переход на обработчик
					; прерывания CAPT по спаду сигнала по команде IJMP
		SER	temp				
		OUT	TIFR,temp

		RETI
;	.ORG	CAPT+$10
	CAPT2:
		OUT	TCCR1B,temp1	; конец измерения. Останавливаем таймер и 
		OUT	TIMSK,temp1	; запрещаем от него прерывания
		
		IN	R4,ICR1L	; здесь мы считываем содержимое младшего бита в r4		(а что именно копируется сюда?)
		IN	R3,ICR1H	; здесь мы считываем содержимое старшего бита в r5
		MOV	R2,XL		; здесь мы копируем значения регистра r2 в младший бит X     (как я понял полученное значение длительности импульса
		MOV	R1,XH		; здесь мы копируем значение регистра r1 d старший бит X     сохраняется принудительно в эти регистры т.е. r1 и r2?)
		
		SET			; установка Т-флага, свидетельстующего об окончании измерения

		RETI

