


.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							;

	
	ldi Temp,0b00011000						; настроили порт "В" ( 0-ввод, 1-вывод )
	out DDRB,Temp							; 000xх000 - "вывод" 
									; ( PB3 - 15 ножка - OC1A ) - импульсы ( буду смотреть осциллографом )
									; ( PB4 - 16 ножка - OC1B ) -  ШИМ
						 
												 
	ldi Temp,0b00000000						; настраиваем порт "D" (0-ввод, 1-вывод)
	out DDRD,Temp 							; 



	ldi Temp,(1<<COM1A1)|(1<<COM1B1)|(1<<wgm11)|(1<<wgm10)		; быстрый ШИМ с вершиной в OCR1A 
	out TCCR1A,Temp							; *1 ( ШИМ с регулируемой частотой )


					
	ldi Temp,(1<<wgm13)|(1<<wgm12)|(1<<CS10)			; установили тактовый сигнал = CK 1:1 
	out TCCR1B,Temp							; таймер начал считать!

						
;	ldi Temp,(1<<OCIE1A)|(1<<OCIE1B)				; разрешить прерывание компаратора 1-го таймера
;	out TIMSK,Temp							; по OCR1A и OCR1B ( ноги OC1A и OC1B )




	ldi Temp,(1<<ISC01)|(1<<ISC00)					; нарастающий фронт на INT0 генерирует запрос на прерывание
	out MCUCR,Temp



	ldi Temp,(1<<INT0)						; глобальное разрешение внешнего прерывания INT0
	out GIMSK ,Temp



	LDI Temp,high(Chastota)						; зададим Частоту ШИМ 20000 тиков ( частота ШИМ 50Гц )
	OUT OCR1AH,Temp							; и выведем ее в порт сравнения
	LDI Temp,low(Chastota)							
	OUT OCR1AL,Temp       



	LDI Temp,high(NylImp)						; зададим длину импульса 1400 тиков ( 1400 мкс )
	OUT OCR1BH,Temp							; и выведем ее в порт сравнения
	LDI Temp,low(NylImp)							
	OUT OCR1BL,Temp 



	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 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 OCR1BH,Temp			; и выведем ее в порт сравнения
	LDI Temp,low(NylImp)							
	OUT OCR1BL,Temp

	rjmp out_1



;**************************************************************************************************************
; Выход из прерывания
;**************************************************************************************************************

out_1:	

	

	pop temp4			; извлекаем "SREG" ////////////////////////////////////////////////////
	out SREG, temp4

	RETI				; точка выхода из прерывания



