.include	"tn13def.inc"
;=============================================================================
.def	tmp	=	r16
.def	mn_cnl	=	r17	; счетчик номера канала
.def	mcount	=	r18	; основной счетчик
.def	mn	=	r19	; временный счетчик
.def	mcPWM	=	r20	; 
.def	mcSts	=	r21	;
.def	mcPORT	=	r22	;
.def	mADC	=	r23	;
.def	mkey	=	r24	;
.def	mkeycnt	=	r25	;
;=============================================================================
.equ	B	=	PORTB
.equ	Qmax	=	100
;=============================================================================
	.cseg
	.org	0x00
start:	rjmp	begin

	;.org	INT0addr	;	= 0x0001	; External Interrupt 0
	;.org	PCI0addr	;	= 0x0002	; External Interrupt Request 0
	.org	OVF0addr	;	= 0x0003	; Timer/Counter0 Overflow
;T0_ovf:	rjmp	_t0ovf
	;.org	ERDYaddr	;	= 0x0004	; EEPROM Ready
	;.org	ACIaddr		;	= 0x0005	; Analog Comparator
	.org	OC0Aaddr	;	= 0x0006	; Timer/Counter Compare Match A
;T0_ocA:	reti
	.org	OC0Baddr	;	= 0x0007	; Timer/Counter Compare Match B
;T0_ocB:	reti
	;.org	WDTaddr		;	= 0x0008	; Watchdog Time-out
	.org	ADCCaddr	;	= 0x0009	; ADC Conversion Complete
ADC_com:rjmp	_adcc
;=============================================================================
	.org	0x0A
begin:		cli
		ldi	tmp,low(RAMEND)
		out	SPL,tmp
		clr	tmp
		out	DDRB,tmp		; все выводы входы
		out	B,tmp			; все выводы в Z
;======================================
; загрузка значений из EEPROM
		ldi	ZL,0x60
		clr	ZH
		ldi	tmp,etbl
		clr	mn
rd_erom:
		out	EEAR,tmp
		sbi	EECR,EERE
		in	mcPWM,EEDR
		st	Z+,mcPWM
		inc	tmp
		out	EEAR,tmp
		sbi	EECR,EERE
		in	mcSts,EEDR
		st	Z+,mcSts
		inc	tmp
		inc	mn
		cpi	mn,20
		brne	rd_erom
;======================================
; настройка ADC
; режим одиночного преобразования, выравнивание по левому краю, Vref=5V
; Fadc=Fo/64, 0-й какал 
; ADCSRA
		ldi	tmp,0b10001110
		out	ADCSRA,tmp
; ADCSRB
		clr	tmp
		out	ADCSRB,tmp
; ADCMUX
		ldi	tmp,0b00100000
		out	ADMUX,tmp
; DIDR0
		sbi	DIDR0,ADC0D
		sbi	ADCSRA,ADSC		; запуск преобразования
;======================================

		sei
		nop
next:	
		mov	mn,mn_cnl
	; загрузить переменные канала
		ldi	ZL,0x60
		clr	ZH
		lsl	mn			; x2
		add	ZL,mn
		ld	mcPWM,Z+
		ld	mcSts,Z
	
	; разделить n на 2
		mov	mn,mn_cnl
		lsr	mn
		out	EEAR,mn
	; загрузить из EEPROM значение для каналов
		; ждать готовности
		sbi	EECR,EERE
		in	mcPORT,EEDR
	; установить значения для порта
		mov	tmp,mcSts
		and	tmp,mcPORT
		out	DDRB,mcPORT
		out	B,tmp
	; сравнить значени nPWM и PWM
		cp	mcount,mcPWM
		brlo	next1
		out	B,mcPORT		 
next1:
		inc	mn_cnl
		cpi	mn_cnl,20
		brne	next
	; если все каналы прошли переход на новый цикл ШИМ
		clr	mn_cnl
		
		inc	mcount
		cpi	mcount,Qmax
		brne	next			; если не 0 переход на след цикл
		clr	mcount
		sbi	ADCSRA,ADSC		; запуск преобразования
		brtc	nxt1			; если Т сброшен продолжить
		rcall	set_pwm			; иначе вызвать обработчик PWM
nxt1:
		rjmp	next

;=============================================================================
set_pwm:
		clt
		cpi	mADC,0xFF
		breq	spclr
		tst	mkeycnt			; если первое нажатие
		brne	sp01
		inc	mkeycnt
		mov	mkey,mADC
		rjmp	ext_set_pwm

sp01:		cp	mkey,mADC
		breq	sp02			; если = переход на обработку
		mov	mkey,mADC		; если нет присваиваем новое значение
		ldi	mkeycnt,1
		rjmp	ext_set_pwm
	; обработка при равенстве
sp02:		inc	mkeycnt
		cpi	mkeycnt,10			; если N раз совпали значения
		brne	ext_set_pwm
	; вычисление адреса mPWMn
		mov	tmp,mkey
		andi	tmp,0b11111000		; используем 5 ст.разрядов
		lsr	tmp
		lsr	tmp			; = смещение для mPWMn
	; загрузка значения mPWMn
		ldi	ZL,0x60
		clr	ZH
		add	ZL,tmp
		ld	tmp,Z
	; изменение mPWMn в зависимости от мл.разряда
		sbrc	mADC,2			; если 1 переход на увеличение
		rjmp	sp_pls
		dec	tmp
		cpi	tmp,0xFF		; если <0 то сделать 0
		brne	sp_nxt
		clr	tmp
		rjmp	sp_nxt
sp_pls:		inc	tmp
		brne	sp_nxt			; переход если не 0
		ser	tmp
	; подготовка след.цикла
sp_nxt:		st	Z,tmp			; запись нового значения mPWM
		ldi	mkeycnt,1
		rjmp	ext_set_pwm
spclr:		clr	mADC
		clr	mkey
		clr	mkeycnt
ext_set_pwm:	ret
;=============================================================================
;_t0ovf:
;		reti
;======================================
_adcc:
		in	tmp,ADCL
		in	mADC,ADCH
;******************
;test
;		ldi	mADC,0x03
;******************
		set			; установить флаг Т
		reti
;=============================================================================
	.eseg
ecnl:	.db	0b00000011		; 0-1
	.db	0b00000110		; 2-3
	.db	0b00001100		; 4-5
	.db	0b00011000		; 6-7
	.db	0b00000101		; 8-9
	.db	0b00001010		; 10-11
	.db	0b00010100		; 12-13
	.db	0b00001001		; 14-15
	.db	0b00010010		; 16-17
	.db	0b00010001		; 18-19
etbl:	.db	5			; начальное значение ШИМ канала0
	.db	0b00000001		; начальное значение статуса канала0
	.db	10			; начальное значение ШИМ канала1
	.db	0b00000010		; начальное значение статуса канала1
	.db	15			; начальное значение ШИМ канала2
	.db	0b00000010		; начальное значение статуса канала2
	.db	20			; начальное значение ШИМ канала3
	.db	0b00000100		; начальное значение статуса канала3
	.db	25			; начальное значение ШИМ канала4
	.db	0b00000100		; начальное значение статуса канала4
	.db	30			; начальное значение ШИМ канала5
	.db	0b00001000		; начальное значение статуса канала5
	.db	35			; начальное значение ШИМ канала6
	.db	0b00001000		; начальное значение статуса канала6
	.db	40			; начальное значение ШИМ канала7
	.db	0b00010000		; начальное значение статуса канала7
	.db	45			; начальное значение ШИМ канала8
	.db	0b00000001		; начальное значение статуса канала8
	.db	50			; начальное значение ШИМ канала9
	.db	0b00000100		; начальное значение статуса канала9
	.db	55			; начальное значение ШИМ канала10
	.db	0b00000010		; начальное значение статуса канала10
	.db	60			; начальное значение ШИМ канала11
	.db	0b00001000		; начальное значение статуса канала11
	.db	65			; начальное значение ШИМ канала12
	.db	0b00000100		; начальное значение статуса канала12
	.db	70			; начальное значение ШИМ канала13
	.db	0b00010000		; начальное значение статуса канала13
	.db	75			; начальное значение ШИМ канала14
	.db	0b00000001		; начальное значение статуса канала14
	.db	80			; начальное значение ШИМ канала15
	.db	0b00001000		; начальное значение статуса канала15
	.db	85			; начальное значение ШИМ канала16
	.db	0b00000010		; начальное значение статуса канала16
	.db	90			; начальное значение ШИМ канала17
	.db	0b00010000		; начальное значение статуса канала17
	.db	95			; начальное значение ШИМ канала18
	.db	0b00000001		; начальное значение статуса канала18
	.db	100			; начальное значение ШИМ канала19
	.db	0b00010000		; начальное значение статуса канала19
;=============================================================================
	.dseg
tbl:	.byte	(40)

