.include "tn2313def.inc" 

.def	tmp	=	r16
.def	tmp1	=	r17

.equ	period	=	0       ;для второго прохода  
.equ	Volna	=	0  
.equ	power0	=	8000	// нач мощность 20%*400
.equ	ms10	=	156	; константа для Т0 
.equ	OutPort	=	PORTB
.equ	OutCntr	=	DDRB
.equ	OutPin	=	PB0
.equ	T0_off	=	0b11111000	
.equ	T0_on	=	0b00000100
.equ	T1_off	=	0b11111110
.equ	T1_on	=	0b00000001
 
 
 
            .CSEG                
   .org 0 

reset:	rjmp   start	; 00 Reset Handler 
; ***** INTERRUPT VECTORS ************************************************
; вставлено из tn2313def.inc файла
; неиспользуемые вектора выведены в примечания
; иначе компилятор ругается
	.org	INT0addr	;= 0x0001 External Interrupt Request 0
	rjmp	int_0
;.equ	INT1addr	= 0x0002	; External Interrupt Request 1
;.equ	ICP1addr	= 0x0003	; Timer/Counter1 Capture Event
	.org	OC1Aaddr	;= 0x0004 Timer/Counter1 Compare Match A
	rjmp	comp1a
;.equ	OC1addr		= 0x0004	; For compatibility
;.equ	OVF1addr	= 0x0005	; Timer/Counter1 Overflow
;.equ	OVF0addr	= 0x0006	; Timer/Counter0 Overflow
;.equ	URXCaddr	= 0x0007	; USART, Rx Complete
;.equ	URXC0addr	= 0x0007	; For compatibility
;.equ	UDREaddr	= 0x0008	; USART Data Register Empty
;.equ	UDRE0addr	= 0x0008	; For compatibility
;.equ	UTXCaddr	= 0x0009	; USART, Tx Complete
;.equ	UTXC0addr	= 0x0009	; For compatibility
;.equ	ACIaddr		= 0x000a	; Analog Comparator
;.equ	PCIaddr		= 0x000b	; 
;.equ	OC1Baddr	= 0x000c	; 
	.org	OC0Aaddr	;= 0x000d
	rjmp	comp0a
;.equ	OC0Baddr	= 0x000e	; 
;.equ	USI_STARTaddr	= 0x000f	; USI Start Condition
;.equ	USI_OVFaddr	= 0x0010	; USI Overflow
;.equ	ERDYaddr	= 0x0011	; 
;.equ	WDTaddr		= 0x0012	; Watchdog Timer Overflow
;=======================================================================

	;start: ldi	r16,0xdf      ;stack init SP=0xdf 
	;	out	spl,r16 
start:	ldi	tmp,low(ramend)      ;stack init SP=0xdf 
	out	spl,tmp

	sbi	ACSR,ACD      ;Analog comparator off 

	;	ldi	r16,0xFF       
	;	out	ddrb,r16       
	ser	tmp
	out	OutCntr,tmp

	;	ldi	r16,0x00       
	;	out	portb,r16
	clr	tmp
	out	OutPort,tmp

	;	ldi	r16,0x00       
	clr	tmp
	out	ddrd,tmp       

	ldi	tmp,0b01111111       
	out	portd,tmp       
; разрешение прерывания от INT0
	ldi	tmp,(1<<ISC01)+(1<<ISC00)	; это так для порядка - сначала ст.бит, затем мл.бит
	out	MCUCR,tmp	      ;INT0 
	ldi	tmp,(1<<INT0)
	out	GIMSK,tmp

; установки для Т1

	clr	tmp			; таймер отключен от выводов порта
	out	TCCR1A,tmp
	ldi	tmp,0b00000100		;T/C1 CK/256 
	out	TCCR1B,tmp
        ldi     tmp,0x00 
        ldi     tmp1,0x00 
        out     TCNT1H, tmp 
        out     TCNT1L, tmp1	
        ldi     tmp,0x00 
        ldi     tmp1,0x00 
        out     OCR1AH, tmp 
        out     OCR1AL, tmp1	
  
;       ldi	tmp,low(power0)
;	ldi	tmp1,high(power0)
;	out	OCR1AH,tmp1		; загрузка стартового значения мощности
;	out	OCR1AL,tmp


; установки для Т0
	ldi	tmp,0b00000010		; режим СТС, таймер остановлен!!!
	out	TCCR0A,tmp
	clr	tmp
	out	TCCR0B,tmp
	ldi	tmp,ms10		; запись коэф.пересчета
	out	OCR0A,tmp
; установка разрешений прерываний от таймеров

;	clr	tmp
;	ldi	tmp,(1<<OCIE1A)+(1<<OCIE0A)
;	out	TIMSK,tmp


; здесь размещают тело основной программы.
	sei
next:

	
	rjmp	next

;=======================================================================
; Обработчики прерываний
;=======================================================================
int_0:   ;??? разве не надо сохранять SREG 
 	; запускаем Т1                   
        blt     period, 0               ;пред установка для второго прохода 
        ldi	tmp,low(power0)
	ldi	tmp1,high(power0)
	out	OCR1AH,tmp1		; загрузка стартового значения мощности
	out	OCR1AL,tmp
	ldi	tmp,(1<<OCIE1A)         ; разрешение прерывания по совпадению
	out	TIMSK,tmp	
	reti


comp1a:
	; останавливаем Т1
;	in	tmp,TCCR1B
;	andi	tmp,T1_off
;	out	TCCR1B,tmp
;	; обнуляем счетчик Т1, так как там накапало порядка 10 тиков
;	clr	tmp
;	out	TCNT1H,tmp
;	out	TCNT1L,tmp

	sbi	OutPort,(1<<OutPin)    	; вкл. управляющий импульс
        
        ;заряжаем таймер на 10мс как писал  pyzh_man          

        ldi	tmp,low(????)           ; CK256
	ldi	tmp1,high(????)
	out	OCR1AH,tmp1		; загрузка стартового значения мощности
	out	OCR1AL,tmp
	SBRS    period,0
	RJMP    ext
        ldi	tmp,(0<<OCIE1A)         ; запрет прерывания по совпадению
	out	TIMSK,tmp	
ext:
        blt     period, 1               ; второй проход 


	; запустить Т0 
;	in	tmp,TCCR0B
;	ori	tmp,T0_on
;	out	TCCR0B,tmp
;	; подбором числа NOP, добиться tимп> 2мкс
;	nop
;	nop
;	nop
;	nop
;	cbi	OutPort,(1<<OutPin)	; получается 2,5 мкс

	reti


comp0a:
	; останавливаем Т0
	in	tmp,TCCR0B
	andi	tmp,T0_off
	out	TCCR0B,tmp
	; обнуляем счетчик Т0, так как там накапало порядка 10 тиков
	clr	tmp
	out	TCNT0,tmp
	; вкл. управляющий импульс
	sbi	OutPort,(1<<OutPin)
	; подбором числа NOP, добиться tимп> 2мкс
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	cbi	OutPort,(1<<OutPin)	; получается 2,5 мкс

	reti
