


.include 	"tn2313adef.inc"	; используем tiny2313a



.def	Temp=R16
.def	Temp1=R17
.def	Temp2=R18
.def	Temp3=R19
.def	Temp4=R20
.def	Temp5=R21
.def	Flagfazy=R22
.def	Temp7=R23
.def	Temp8=R24
.def	Temp9=R25


.dseg					; оперативка

OZU: .byte 1				; зарезервируем 1 байт в ОЗУ


;******************************************************************************

.EQU OneImp=0x640 			; длина импульса   (1600 мкс)
.EQU NylImp=0x578 			; длина импульса   (1400 мкс)
.EQU Chastota=0x4E20 			; частота 20000   (50Гц)

;******************************************************************************

.cseg


.org 0
rjmp RESET				; External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset
					; старт программы


.org INT0addr				; = 0x0001 External Interrupt Request 0
rjmp INT_0				; прерывание INT0



;	.org   OC1Aaddr			; (=0x0004) Timer/Counter1 Compare Match A
;	rjmp OCR1A_COMP			; прерывание по совпадению с OCR1A



;	.org   OC1Baddr			; (=0x000c) Timer/Counter1 Compare Match B
;	rjmp OCR1B_COMP			; прерывание по совпадению с OCR1B



.org INT_VECTORS_SIZE


;******************************************************************************
;старт
;******************************************************************************

reset:								; включение микроконтроллера

	cli							; глобальный запрет на прерывания


	ldi Temp,low(RamEnd)					; инициализации стека	
	out SPL,Temp						;




INIT_ports:
	
	ldi Temp,0b00011000					; настроили порт "В" ( 0-ввод, 1-вывод )
	out DDRB,Temp						; 000xх000 - "вывод" 
								; ( PB3 - 15 ножка - OC1A ) - импульсы ( буду смотреть осциллографом )
								; ( PB4 - 16 ножка - OC1B ) -  ШИМ
	

	ldi Temp,0b00000000					; выводим лог_0 в весь порт!
	out PortB,Temp						; 
																						 
												 
	ldi Temp,0b00000000					; настраиваем порт "D" (0-ввод, 1-вывод)
	out DDRD,Temp 						; 





INIT_ext_int:

	ldi Temp,(1<<ISC01)|(1<<ISC00)				; нарастающий фронт на INT0 генерирует запрос на прерывание
	out MCUCR,Temp


	ldi Temp,(1<<INT0)					; глобальное разрешение внешнего прерывания INT0
	out GIMSK ,Temp

	in  Temp, EIFR						; сбрасываем флаги *************************************************
	out EIFR ,Temp




Timer1_Init:

	LDI Temp,high(NylImp)					; зададим длину импульса 1400 тиков ( 1400 мкс )
	OUT OCR1AH,Temp						; и выведем ее в порт сравнения
	LDI Temp,low(NylImp)							
	OUT OCR1AL,Temp       


	LDI Temp,high(NylImp)					; зададим длину импульса 1400 тиков ( 1400 мкс )
	OUT OCR1BH,Temp						; и выведем ее в порт сравнения
	LDI Temp,low(NylImp)							
	OUT OCR1BL,Temp 


	ldi Temp,(1<<COM1A1)|(1<<COM1B1)|(1<<wgm11)		; быстрый ШИМ с вершиной в ICR1 
	out TCCR1A,Temp						; *1 ( ШИМ с регулируемой частотой )


					
	ldi Temp,(1<<wgm13)|(1<<wgm12)|(1<<CS10)		; установили тактовый сигнал = CK 1:1 
	out TCCR1B,Temp						; таймер начал считать!



	LDI Temp,high(Chastota)					; зададим Частоту ШИМ 20000 тиков ( частота ШИМ 50Гц )
	OUT ICR1H,Temp						; и выведем ее в порт сравнения
	LDI Temp,low(Chastota)							
	OUT ICR1L,Temp 


						
;	ldi Temp,(1<<OCIE1A)|(1<<OCIE1B)			; разрешить прерывание компаратора 1-го таймера
;	out TIMSK,Temp						; по OCR1A и OCR1B ( ноги OC1A и OC1B )



	ldi Temp,0						; обнуление таймера 
	out TCNT1H,Temp
	out TCNT1L,Temp


	ldi FlagFazy,1						; флаг фазы ( 1=нарастающмий фронт, 0=падающий фронт )


	sei							; глобальное разрешение прерываний
        



;*******************************************************************************
; главный цикл
;*******************************************************************************


Main_cicle:



	
	rjmp Main_cicle			; циклимся


;*******************************************************************************
; ОБРАБОТКА ПРЕРЫВАНИЯ INT0
;*******************************************************************************

INT_0:




	in temp4,SREG			; сохраняем "SREG"/////////////////////////////////////////////////////
	push temp4


;********************************************************************************



	cpi FlagFazy,1			; мы вошли в прерывание нарастающему фронту ?
	brne set_falling_edge		; если нет, то идем на метку "установка прерывания по нарастающему фронту"


;********************************************************************************


	ldi Temp,(1<<ISC01)		; устанавливаем прерывание на падающий фронт "INT0" 
	out MCUCR,Temp

	ldi FlagFazy,0			; устанавливаем флаг фазы (0=падающий фронт)



	LDI Temp,high(OneImp)		; зададим длину импульса 1600 тиков ( 1600 мкс )
	OUT OCR1AH,Temp			; и выведем ее в порт сравнения
	LDI Temp,low(OneImp)							
	OUT OCR1AL,Temp       


	LDI Temp,high(OneImp)		; зададим длину импульса 1600 тиков ( 1600 мкс )
	OUT OCR1BH,Temp			; и выведем ее в порт сравнения
	LDI Temp,low(OneImp)							
	OUT OCR1BL,Temp 

	rjmp out_1







set_falling_edge:			; установка прерывания по нарастающему фронту	



	ldi Temp,(1<<ISC01)|(1<<ISC00)	; нарастающий фронт на INT0 генерирует запрос на прерывание
	out MCUCR,Temp


	ldi FlagFazy,1			; устанавливаем флаг фазы (1=нарастающий фронт)


	LDI Temp,high(NylImp)		; зададим длину импульса 1400 тиков ( 1400 мкс )
	OUT OCR1AH,Temp			; и выведем ее в порт сравнения
	LDI Temp,low(NylImp)							
	OUT OCR1AL,Temp       


	LDI Temp,high(NylImp)		; зададим длину импульса 1400 тиков ( 1400 мкс )
	OUT OCR1BH,Temp			; и выведем ее в порт сравнения
	LDI Temp,low(NylImp)							
	OUT OCR1BL,Temp 

	rjmp out_1



;**************************************************************************************************************
; Выход из прерывания
;**************************************************************************************************************

out_1:	

	

	pop temp4			; извлекаем "SREG" ////////////////////////////////////////////////////
	out SREG, temp4

	RETI				; точка выхода из прерывания



