
;------------------------------------------------------------------
;				 ИПКС - 042-03
;	Программа для автомата сентябрь 2004г.
; Цифровая установка тока заварки по 3-м каналам, с измерением напряжения
; трансформатора и стабилизацией тока от измерения, цифровое задание временных
; параметров цикла и времени прогрева губок.
; Параметры для режимов с дозой 0.5 и 1.0 литра
; Цифровое задание уставки преобразователя частоты от ЦАП
;
; Процессор	- ATMEGA8-16PI(ATMEGA8L-8PI)
; Частота	- внутренний калиброванный RC-генератор 2 МГц
;
; Устанавливаемые FUSE биты (остальные по умолчанию):
; BODLEVEL=0, BODEN=0 - Brown out detect включить на 4.0 В
; CKSEL1=1, CKSEL0=0  - внутренний калиброванный RC-генератор на 2 МГц
;
; В EEPROM на отправл 22.06.04 автомате было записано 17 19 07 06 09 07 0A 23 FF
	.include		"m8def.inc"
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;	.def		=r0	;
;	.def		=r1	;
	.def	bd0	=r2	;
	.def	bd1	=r3	;
	.def	bd2	=r4	;
	.def	bd3	=r5	;
	.def	ddS	=r6	;
	.def	ddH	=r7	;
	.def	drH	=r7	;
	.def	ddL	=r8	;
	.def	drL	=r8	;
	.def	dvH	=r9	;
	.def	dvL	=r10	;
	.def	dmL	=r11	;
	.def	dmH	=r12	;
	.def	radr1	=r12	;
	.def	cnres	=r13	;
	.def	d	=r14	;
;	.def		=r15	;
	.def	temp	=r16
	.def	svet	=r16	;
	.def	dcnt	=r17	;
	.def	count	=r17	;
	.def	cntlab	=r18	; Счетчик для огран. времени ожидания метки
	.def	rin4	=r18						; и вращения двигателя при прогреве
	.def	T_NAS1	=r19	;
	.def	Ttemp	=r20	;
	.def	rin3	=r20	;
	.def	rin	=r21	;
	.def	reg_flgs=r22	; регистр флагов для флагов
	.def	rin1	=r23	;
	.def	rin2	=r24	;
	.def	radr	=r25	; регистр адреса дешифратора
	.def	paus	=r26	;
	.def	cnagr	=r26	;
	.def	ind	=r27	;
;	.def	yl	=r28	;
;	.def	yh	=r29	;

; Константы

	.equ	AVTDEC	=12	; Кол-во циклов в автом режиме, после которого
	.equ	t1c		=1953				; уменьшаем мощность на 1

; порт B
	.equ	zr1dc	=0	; СЗР адреса дешифратора
	.equ	zr2dc	=1	; 2ЗР адреса дешифратора
	.equ	zr3dc	=2	; МЗР адреса дешифратора
	.equ	Di_dc	=3	; информационный канал дешифратора
	.equ	En1_dc	=4	; enable 1 дешифратора
	.equ	En2_dc	=5	; enable 2 дешифратора
;	.equ	Xtal1	=6	; не используется
;	.equ	Xtal2	=7	; не используется

; порт C
	.equ	Um	=0	; амплитуда напряжения с трансформатора
;	.equ	Ter2	=1	; не используется
	.equ	DACSCLK	=2	; сигнал SCLK для ЦАП
	.equ	DACSYNC	=3	; сигнал SINC для ЦАП
	.equ	DACDIN	=4	; сигнал DIN для ЦАП
	.equ	STOPB	=5	; кнопка СТОП
;	.equ	RESET	=5	; используется как RESET

; порт D
	.equ	Clk_pi	=0     ; клок на плату индекации
	.equ	Data_pi	=1     ; данные на плату индикаци
	.equ	DoorIn 	=2     ; датчик двери
;	.equ	Int_set	=3     ; не используется
	.equ	Metka	=4     ; вход датчика метки
	.equ	Dozat2	=5     ; вход датчика дозатора на 1л
	.equ	Dozat1	=6     ; вход датчика дозатора на 0.5л
	.equ	InFPow	=7     ; вход для синхронизации с фазой сети 

	.equ	ps	=40

 ;Интервалы времени работы автомата:

;	.equ	T1	      =3     ; 3=0.3c
;	.equ	T2	      =3     ; 0.3c
;	.equ	T21	      =2     ; 0.2c
;	.equ	T3	      =5     ; 0.7c
;	.equ	T4	      =10    ; 1c
	.equ	T41	      =2     ; 0.2c
;	.equ	T5	      =3     ; 0.3c
;	.equ	T6	      =27     ; 0.7с
;	.equ	Tmax	      =20    ; 2 c

;Выводы дешифратора:
;включение:
	.equ	dvig_1	=0b00101000	;+ OT1 DD2
	.equ	torm_1	=0b00101011	;+ OT4 DD2
	.equ	doza_1	=0b00101100	;+ OT5 DD2
	.equ	dat_1	=0b00101101	;+ OT6 DD2
	.equ	gprod_1	=0b00101110	;+ OT7 DD2
	.equ	gpop_1	=0b00101111	;+ OT8 DD2
	.equ	pc1_1	=0b00101001	;+ OT2 DD2
	.equ	nprod_1	=0b00011100	;+ OT13 DD3
	.equ	dater_1	=0b00011010	;+-OT11 DD3 Прогр, но не исп
	.equ	npop_1	=0b00011011	;+ OT12 DD3
	.equ	gotov_1	=0b00011001	;- OT10 DD3
	.equ	ozon_1	=0b00011000	;- OT9 DD3
	.equ	metka_0	=0b00011110	;- OT14 DD3
 ;выключение:
	.equ	dvig_0	=0b00100000	;+ OT1 DD2
	.equ	torm_0	=0b00100011	;+ OT4 DD2
	.equ	doza_0	=0b00100100	;+ OT5 DD2
	.equ	dat_0	=0b00100101	;- OT6 DD2
	.equ	gprod_0	=0b00100110	;+ OT7 DD2
	.equ	gpop_0	=0b00100111	;+ OT8 DD2
	.equ	pc1_0	=0b00100001	;+ OT2 DD2
	.equ	nprod_0	=0b00010100	;+ OT13 DD3
	.equ	dater_0	=0b00010010	;+-OT11 DD3 Прогр, но не исп
	.equ	npop_0	=0b00010011	;+ OT12 DD3
	.equ	gotov_0	=0b00010001	;- OT10 DD3
	.equ	ozon_0	=0b00010000	;- OT9 DD3
	.equ	metka_1	=0b00010110	;- OT14 DD3

; Биты регистра reg_flgs=R22 флаги режима работы
	.equ	FDOZ	=0 ; 0-наcос выкл, 1-насос вкл
	.equ	FPI	=1 ; 1-запрещ обмен с ПИ, 0-разрешен
	.equ	FIMP	=2 ; 1-начался импульс завар, 0-кончился имп на заварку
	.equ	FPROG	=3 ; 0-режим прогр-я, 1-рабочий режим
	.equ	F01	=4 ; 1-прошло прер 0.1сек,0-прер. 0.1 сек еще не произ
	.equ	FDP	=5 ; 1-горит дес точка BD1, 0-не горит
	.equ	FCPR	=6 ; 1-устан флаг подсчета времени реж прогр
	.equ	FWARM	=7 ; 1-режим прогрева, 0-нет режима прогрева

; Биты регистра svet=R16 индицируемых светодиодов если устан в 1-высвечивается
	.equ	S1L	=7	; 0b10000000=$80
	.equ	ST3	=6	; 0b01000000=$40
	.equ	ST2	=5	; 0b00100000=$20
	.equ	ST1	=4	; 0b00010000=$10
	.equ	SLABEL	=3	; 0b00001000=$08
	.equ	SBP	=2	; 0b00000100=$04
;	.equ	ST	=1	; 0b00000010=$02
	.equ	SPROG	=0	; 0b00000001=$01

; Биты регистра ind=R27 принятых кнопок если устан в 0-нажата
	.equ	PROG	=7	; 0b01111111=$7f
	.equ	VVOD	=6	; 0b10111111=$bf
	.equ	PLUS	=5	; 0b11011111=$df
	.equ	MINUS	=4	; 0b11101111=$ef
	.equ	AUTO	=3	; 0b11110111=$f7
	.equ	PUSK	=2	; 0b11111011=$fb
;	.equ	STOPem	=1	; 0b11111101=$fd
;	.equ	LABEL	=0	; 0b11111110=$fe



; ОЗУ
 .equ MODE	=$60 ; Последний заданный режим работы перебор между 
			;"1Р0.5"-"1Р1.0"-"2Р0.5"-"2Р1.0"
; Параметры для дозы 0.5 литра
 .equ POW1H1	=$61 ; Мощность нагревателя 1 Поперечн 0...50 (шаг 1) "1H30"
 .equ POW2H1	=$62 ; Мощность нагревателя 2 Продольн 0...50 (шаг 1) "2H30"
 .equ POW3H1	=$63 ; Мощность нагревателя 3 Запас    0...50 (шаг 1) "3H" (нет)
 .equ T1L1	=$64 ; Время заварки Т1 в 0.1 сек "1L0.7"
 .equ T2L1	=$65 ; Время заварки Т2 в 0.1 сек "2L0.7"
 .equ T3L1	=$66 ; Время заварки Т3 в 0.1 сек "3L0.7" - время остывания швов
 .equ T4L1	=$67 ; Время паузы для падения пакета в 0.1 сек "4L1.0"
 .equ TWARM1	=$68 ; Время прогрева губок в секундах "5L25"
 .equ FRCF1	=$69 ; Частота на частотном преобр. от 50 Гц мл. байт
 .equ FRCFF1	=$6A ; 0...50% (шаг 1Гц) "F33.5"             ст. байт
 .equ TCICL1	=$6B ; Время цикла общее - расчетное как 1L+2L+3L+4L+0.3c

; Те же параметры для дозы 1.0 литр
 .equ POW1H2	=$6C ; Мощность нагревателя 1 Поперечн 0...50 (шаг 1) "1H30"
 .equ POW2H2	=$6D ; Мощность нагревателя 2 Продольн 0...50 (шаг 1) "2H30"
 .equ POW3H2	=$6E ; Мощность нагревателя 3 Запас    0...50 (шаг 1) "3H" (нет)
 .equ T1L2	=$6F; Время заварки Т1 в 0.1 сек "1L0.7"
 .equ T2L2	=$70 ; Время заварки Т2 в 0.1 сек "2L0.7"
 .equ T3L2	=$71 ; Время заварки Т3 в 0.1 сек "3L0.7" - время остывания швов
 .equ T4L2	=$72 ; Время паузы для падения пакета в 0.1 сек "4L1.0"
 .equ TWARM2	=$73 ; Время прогрева губок в секундах "5L25"
 .equ FRCF2	=$74 ; Частота на частотном преобр. от 50 Гц мл. байт
 .equ FRCFF2	=$75 ; 0...50 (шаг 1Гц) "F33.5"              ст. байт
 .equ TCICL2	=$76 ; Время цикла общее - расчетное как 1L+2L+3L+4L+0.3c

; .equ 		=$77 ; Не использ
; .equ 		=$78 ; Не использ
; .equ 		=$79 ; Не использ
 .equ NCHEAT	=$7A ; Текущий номер канала нагрева 0-попер,1-прод,3-отключен
 .equ CNTAVT	=$7B ; Счетчик кол-ва циклов в авт режиме для уменьш. нагрева
 .equ OLDIND	=$7C ; Старое значение кнопок с ПИ - регистра ind
 .equ CNTIND	=$7D ; Счетчик для обработки кнопок с ПИ
;$7E
;$7F
;$80	Ст. байт измеренного напряжения
;$81	Мл. байт измеренного напряжения
 .equ TCH1H	=$82 ; Ст. байт записи таймера по нагревателю 1
 .equ TCH1L	=$83 ; Мл. байт записи таймера по нагревателю 1
 .equ TCH2H	=$84 ; Ст. байт записи таймера по нагревателю 2
 .equ TCH2L	=$85 ; Мл. байт записи таймера по нагревателю 2
 .equ TCH3H	=$86 ; Ст. байт записи таймера по нагревателю 3
 .equ TCH3L	=$87 ; Мл. байт записи таймера по нагревателю 3
;$88
;$89
 .equ KOEFU	=$90 ; Коэф-т напр для 256/(01XX) не использ
;
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.cseg
.org $000
	rjmp  main	; reset Handle
.org $004
;	reti
	rjmp  timer2	; Timer 2 overflow Handle 0.1 секунды
.org $008
;	reti		;
	rjmp  timer1	; Timer 1 overflow Handle
.org $009
;	reti
	rjmp  timer0	; Timer 0 overflow Handle 0.1 секунды
.org $00E
	reti
	rjmp  adc_preob ; ADC convertion complete
.org $010
;	reti
	rjmp  ancomp	; Analog Comparator handle

main:
	cli
	ldi	rin,high(RAMEND); Установить указатель стека
	out	sph,rin 	;
	ldi	rin,low(RAMEND) ;
	out	spl,rin 	;

;------------------------------------------------------------------------
;---------------------инициализация системы------------------------------
;------------------------------------------------------------------------
init:
;-------------- Инициализация ОЗУ -----------------------------------
	rcall	pzu_ozu 	; Чтение уставок
	
init2:
	ldi	radr,dvig_0	; отключить двигатель
	rcall	Decod		;

	clr	zh
	ldi	rin,high(RAMEND); Установить указатель стека еще раз
	out	sph,rin 	; для случаев останова по СТОП
	ldi	rin,low(RAMEND) ;
	out	spl,rin 	;

;	rjmp	initi1		;			*

	ldi	zl,POW1H1 ; Проверка уставки мощности нагрева на 0.5л
tstram1:
	ld	rin,z+	;
	cpi	rin,50	;если мощность больше 50, то обнуление
	brcc	initi1	;
	ld	rin,z+	;
	cpi	rin,50	;если мощность больше 50, то обнуление
	brcc	initi1	;
	ld	rin,z+	;
	cpi	rin,50	;если мощность больше 50, то обнуление
	brcc	initi1	;
	cpi	zl,POW3H2 ;
	brcc	initi0	;
	ldi	zl,POW1H2 ; Проверка уставки мощности нагрева на 1л
	rjmp	tstram1	;

initi1: 		; Ошибка чтения EEPROM
	ldi	rin,1	; Обнуляем уставки
	ldi	zl,MODE	;
	st	z+,rin	; Режим работы 1Р1.0 - дозирование 1л по времени
	ldi	rin,7	;
initi2:
	st	z+,rin	; Все параметры по 7
	cpi	zl,TWARM2 ;
	brcs	initi2	;

	clr	rin	; обнуляем старшие байты параметров частоты
	ldi	zl,FRCFF1; преобразователя
	st	z,rin	;
	ldi	zl,FRCFF2;
	st	z,rin	;

	ldi	rin,32	;
	ldi	zl,TCICL1 ;
	st	z,rin	; Время цикла для 0.5л
	ldi	zl,TCICL2 ;
	st	z,rin	; Время цикла для 1л
	rcall	ozu_pzu ;

initi0:
	ldi	rin,4	;
	ldi	zl,NCHEAT ; Номер канала нагрева - отключить
	st	z+,rin	;
	clr	rin	;
	st	z+,rin	; $7b Обнулить счетчик кол-ва циклов в авт режиме
	st	z+,rin	; $7c Обнулить стар знач кнопок
	st	z+,rin	; $7d Обнулить счетчик ПИ
	st	z+,rin	; $7e
	st	z+,rin	; $7f
	st	z+,rin	; $80 Обнулить расчетные записи таймеров
	st	z+,rin	; $81
	st	z+,rin	; $82
	st	z+,rin	; $83
	st	z+,rin	; $84
	st	z+,rin	; $85
	st	z+,rin	; $86
	st	z+,rin	; $87

	rcall pnev_off	;
;---------------	Инициализация прерываний	----------------------

;---------------	Timer0		--------------------------------------
; Обеспечивает прерывания с частотой 0.1 сек CK=2MHz

	ldi	rin,0b00000101	; CK/1024
	out	tccr0,rin	;
	ldi	rin,$3c 	; $3c=60
	out	tcnt0,rin	; Период (255-60)*1024/2000000=0.09984c

	ldi rin,0b01000101
	out timsk,rin
	
;--------------     Timer1	-------------------------------------
; Обеспечивает прерывания для работы задания угла открытия симисторов
	clr	rin		; CK=2MHz
	out	tccr1a,rin
	ldi	rin,0b00000001	; /1024
	out	tccr1b,rin

;---------------	Timer2		--------------------------------------
; Обеспечивает прерывания с частотой 0.1 сек CK=2MHz

	ldi	rin1,0b00000111	; CK/1024
	out	tccr2,rin1	;
	ldi	rin1,$3c 	; $3c=60
	out	tcnt2,rin1	; Период (255-60)*1024/2000000=0.09984c

;	ldi	rin,0b01000000	; Подключаем только Timer2
;	out	timsk,rin	; overflow timer2

;-------------- Установка аналогового компаратора -------------------
	ldi	rin,0b01001011	;
	out	acsr,rin	; прерывания по росту выхода PD7 (AIN1)

;-------------- Установка АЦП ---------------------------------------
;	ldi	rin,0b11000000	; Выбираем встроенный Vref=2.56В(первые 11)
	ldi	rin,0b00000000	; Выбираем внешний Vref=2.5В(первые 00)
	out	admux,rin	; и канал ADC0(последние 0000)

	ldi	rin,0b10001110	; ADC enable, ADC Inter enable, XTAL/64
	out	adcsra,rin	; частота работы АЦП=31.25кГц

	ldi	reg_flgs,0b00101000	; Начальное положение флагов режимов
	rcall	vrcikl	; Подсчет времени цикла

MA1:
	ser	ind		; сбросить нажатые кнопки
	clr	cnres		;

	ldi	zl,MODE		; Считываем режим работы
	ld	rin,z		;
	clr	svet		;
	sbrc	rin,0		; Если режим дозирования 1л
	sbr	svet,0b10000000	; то высвечиваем это
	sbrc	rin,1		; Если режим работы по меткам
	sbr	svet,0b00001000	; то высвечиваем и это

;	sbr	svet,0b00000100	; Светить индикатор "ВРЕМЯ"

	clr	bd3		; Очистка тысяч
	clr	bd2		; Очистка сотен

	rcall	dacout		;

	wdr			;
;	ldi	rin,0b00001101	; 512 circles - 0.52c WDR
;	out	wdtcr,rin	;

	rcall pnev_off		;

	ldi	radr,dvig_0	; отключить двигатель
	rcall	Decod		;

	sei			; Прерывания разрешены

	ldi	Ttemp,20	; пауза для обмена с ПИ
	rcall	delay		;
	rjmp	start		; Обход тестового режима
;--------------------------------------------------------------------
; Индикация измеренного напряжения в непрерывном режиме - тестовый режим
LLLLL:
	ldi	rin,0b10010000	; Подготовим МП к засыпанию в режиме
	out	mcucr,rin	; измерения АЦП
	sleep			; Засыпаем с измерением

;	sbi	adcsra,adsc	; запуск АЦП				*
;	rcall	adc_preob	;					*
	ldi	Ttemp,1		;
	rcall	delay		;

	in	rin,adcl	; Измеренное напряжение в 1/16 В
	in	bd2,adch	;
	mov	rin1,rin	;
	cbr	rin1,0b11110000	;
	mov	bd0,rin1	;
	swap	rin		;
	cbr	rin,0b11110000	;		
	mov	bd1,rin		;
 
	ldi	Ttemp,5		;
	rcall	delay		;
	rjmp	LLLLL		;
;--------------------------------------------------------------------

;--------------------------------------------------------------------
;	Проверяем нажатие кнопки "PROG"
start:
	ser	ind		;
	cbr	reg_flgs,0b00010000	; Сброс флага 0.1 секунды
stt2:
	sbrs	reg_flgs,4	; Ожидаем обмена с ПИ
	rjmp	stt2		;

	ldi	radr,dvig_0	; отключить двигатель
	rcall	Decod		;

	rcall	pnev_off	; Отключим все механизмы
	sei			;
stt1:
	sbrs	ind,PROG	; если нажата "ПРОГ"
	rcall	 Obrab_key	; Переход в режим программирования
;--------------------------------------------------------------------
;	Проверяем условие начала цикла - нажатие кнопки "ЦИКЛ-ПУСК"
C0:
C1:
	sbrc	ind,PUSK	;
	rjmp	start		; Если нет, то назад

	ser	ind		; Была нажата ПУСК, сброс кнопок
	ldi	Ttemp,2		; Ожидаем 0.2 секунды
	rcall	delay		;
	sbrc	ind,PUSK	; Опять проверка кнопки ПУСК
	rjmp	start		; Если не нажата, то назад

;	rjmp	C6		;				*

	clr	rin		; Очистить счетчик
C2:
	ser	ind		; Сброс кнопок
	cbr	reg_flgs,0b00010000	; Сброс флага 0.1 секунды
C3:
	sbrs	reg_flgs,4	; Ожидаем обмена с ПИ
	rjmp	C3		;

	sbrc	ind,PUSK	; Опять проверка кнопки ПУСК
	rjmp	C6		; Если не нажата, то работа

	inc	rin		; Увеличить счетчик ожидания
	cpi	rin,50		; Если еще не прошло 10 секунд
	brne	C2		; то ждем

;--------------------------------------------------------------------
;	Процедура прогрева губок автомата
;--------------------------------------------------------------------
progrev:
	cli			;
	ldi	radr,torm_1	; включить тормоз
	rcall	decod		;
	ldi	radr,gprod_1	; сводим прод.губки
	rcall	decod		;
	ldi	radr,gpop_1	; сводим попер.губки
	rcall	decod		;
	ldi	radr,dvig_1	; включить двигатель 
	rcall	Decod		;
	ldi	reg_flgs,0b10001000 ; флаг режима прогрева
	clr	cntlab		; Сброс счетчика времени

	clr	zh		; Обнуляем счетчик циклов
	ldi	zl,CNTAVT	;  в автоматическом режиме
	st	z,zh		;

	ldi	zl,TWARM1	; Считываем время прогрева для нужного режима
	sbrc	svet,S1L		;
	ldi	zl,TWARM2	;
	ld	rin2,z		; В rin2 время прогрева в секундах
pr1:
	cli			;
	mov	rin,rin2	;
	rcall	bd_conv		;
pr3:
	sei			;
	ldi	rin,0b10010000	; Подготовим МП к засыпанию в режиме
	out	mcucr,rin	; измерения АЦП
	sleep			; Засыпаем с измерением
pr2:
	ldi	Ttemp,1 	; пауза 0.1 с
	rcall	Delay

	sbr	svet,0b00010000 ; светить Т1
	ldi	rin,0		; включить поперечный нагрев
	rcall	nagr		;

	ldi	Ttemp,4		;
	rcall	delay		; Выдерживаем время 0.4 c

	cbr	svet,0b00010000 ; погасить Т1
	sbr	svet,0b00100000 ; светить Т2

	ldi	rin,1		; включить продольный нагрев
	rcall	nagr		;
	ldi	Ttemp,3		;
	rcall	delay		; Выдерживаем время 0.3 c

	cbr	svet,0b00100000 ; погасить Т2
	sbr	svet,0b01000000 ; светить Т3
	ldi	rin,2		; включить Т3
	rcall	nagr		;
	ldi	Ttemp,2		;
	rcall	delay		; Выдерживаем время 0.2 c

	cli			;
	ldi	zl,NCHEAT	;
	ldi	rin,3		;
	st	z,rin		; выключить нагрев
	sei			;

	cbr	svet,0b01000000 ; погасить Т3
	cbr	reg_flgs,0b00000010 ;разрешить обмен по прерываниям

	dec	rin2		; Проверяем счетчик времени
	brne	pr1		;

	rjmp	stop		; Время прогрева закончилось, выход
;--------------------------------------------------------------------


;--------------------------------------------------------------------
;	Рабочий режим автомата
;--------------------------------------------------------------------
C6:
	ldi	rin,0b10010000	; Подготовим МП к засыпанию в режиме
	out	mcucr,rin	; измерения АЦП
	sleep			; Засыпаем с измерением

	ldi	Ttemp,1 	; пауза 0,1 с
	rcall	Delay

	clr	zh		; Обнуляем счетчик циклов
	ldi	zl,CNTAVT	;  в автоматическом режиме
	st	z,zh		;

;----------------------------- начинаем работу автомата -------------

ty0:	cli
	ldi	radr,dvig_1	;включить двигатель
	rcall	Decod		;переход на выбор ноги дешифратора
	sei

;--------------------------- проверка работа "МЕТКА-ВРЕМЯ" -------------------
M0:
	sbrs	svet,SLABEL	; переход, если работаем по времени
	rjmp	M2

;---------------------------- работаем по метке ------------------------------

	clr	cntlab		; Обнуляем счетчик времени ожидания метки
M1:
	cpi	cntlab,100	; Проверка - не прошло ли еще 10 секунд
	brcs	M1L4		;
	rjmp	stop		; Если прошло, то остановка
M1L4:
	sbis	pind,metka	; Ждем сигнала с датчика метки, "1"- метка
	rjmp	M1		; возврат если метки нет
	ldi	rin,255		; Загружаем счетчик
M1L1:
	sbis	pind,metka	; Снова проверяем наличие метки
	rjmp	M1		; возврат если метки нет
	dec	rin		; Уменьшаем счетчик
	brne	M1L1		; если он не равен 0, то возврат

; Дождались начала метки, теперь ждем ее окончания
	clr	cntlab		; Обнуляем счетчик времени ожидания метки
M1L2:
	cpi	cntlab,50	; Проверка - не прошло ли еще 5 секунд
	brcs	M1L5		;
	rjmp	stop		; Если прошло, то остановка
M1L5:
	sbic	pind,metka	; Ждем сигнала с датчика метки, "0"- пробел
	rjmp	M1L2		; возврат если метка еще есть
	ldi	rin,255		; Загружаем счетчик
M1L3:
	sbic	pind,metka	; Снова проверяем наличие метки
	rjmp	M1L2		; возврат если метка еще есть
	dec	rin		; Уменьшаем счетчик
	brne	M1L3		; если он не равен 0, то возврат

; Дождались окончания метки можно начинать работать

; Начало цикла
M2:
	cli			;
	clr	zh		; Считываем счетчик циклов
	ldi	zl,CNTAVT	; в автоматическом режиме
	ld	rin,z		;
	cpi	rin,250		; Сравнить с 250 для ограничения переполнения
	brcc	M2A		;
	inc	rin		; Если не переполняется, то увеличить
	st	z,rin		; и сохранить
M2A:
	ldi	radr,dvig_1	;включить двигатель
	rcall	Decod		;переход на выбор ноги дешифратора
	ldi	radr,torm_1	; включить тормоз
	rcall	decod		;
	ldi	radr,gprod_1	; сводим прод.губки
	rcall	decod		;
	ldi	radr,gpop_1	; сводим попер.губки
	rcall	decod		;
;	ldi	radr,klap_1	; клапан на всасывание
;	rcall	decod		;
	

	sbrc reg_flgs,FDOZ
	rjmp NNN

	ldi	radr,doza_1	; дозатор на всасывание
	rcall	decod		;
	SBR reg_flgs,1<<FDOZ ;флаг включения насоса
	LDI T_NAS1,$5
 	
	

NNN:





 	sei			;
	ldi	Ttemp,1		; Ожидаем время для схождения губок
	rcall	delay		;

	cli			;
	ldi	radr,dat_1	; включить датер
	rcall	decod		;
	sei			;

	sbr	svet,0b00010000 ; светить Т1
	ldi	rin,0		; включить поперечный нагрев
	rcall	nagr		;
	rcall	delay		; Выдерживаем время для заварки Т1



	
	cbr	svet,0b00010000 ; погасить Т1
	
	sbr	svet,0b00100000 ; светить Т2
	ldi	rin,1		; включить продольный нагрев
	rcall	nagr		;
	rcall	delay		; Выдерживаем время для заварки Т2

	cli			;
	ldi	radr,pc1_1	; включить счетчик
	rcall	decod		;
	sei			;

	cbr	svet,0b00100000 ; погасить Т2
	sbr	svet,0b01000000 ; светить Т3
	ldi	rin,2		; включить Т3
	rcall	nagr		;
	rcall	delay		; Выдерживаем время для заварки Т3

	cli			;
	ldi	zl,NCHEAT	;
	ldi	rin,3		;
	st	z,rin		; выключить нагрев
	sei			;

	cbr	svet,0b01000000 ; погасить Т3
;	ldi	svet,0b00000000		;
	cbr	reg_flgs,0b00000010	;разрешить обмен по прерываниям

cs1:
	cli
	ldi	radr,dat_0	; разводим продольные губки
	rcall	decod		;
	ldi	radr,gprod_0	; разводим продольные губки
	rcall	decod		;
;	ldi	radr,doza_0	; Отключаем дозатор
;	rcall	decod		;
;	ldi	radr,klap_0	; и клапан
;	rcall	decod		;
	sei			;
	ldi	Ttemp,T41	; выдерживаем время T41
	rcall	delay		;
	cli			;
	ldi	radr,gpop_0	; разводим поперечные губки
	rcall	decod
	sei			;

	ldi	Ttemp,1		; Ожидаем время для расхождения губок
	rcall	delay		;

	cli			;
	ldi	radr,torm_0	; отпустить тормоз
	rcall	decod
	ldi	radr,pc1_0	; выключить счетчик
	rcall	decod		;
	sei

	ldi	rin,0b10010000	; Подготовим МП к засыпанию в режиме
	out	mcucr,rin	; измерения АЦП
	sleep			; Засыпаем с измерением

;	Проверка режима работы "МЕТКА-ВРЕМЯ"
	sbrs	svet,SLABEL	; переход на М4, если работаем по времени
	rjmp	M4

;	Работаем по меткам
	sbic	pind,DoorIn	; Если датчик двери не в 0 (т.е.)дверь открыта
	rjmp	M5		; то переход на ручной режим с остановкой
	sbrc	 ind,AUTO	; переход на М1 если работаем в автомате
	rjmp	 M1
; 	Работаем по меткам в ручном режиме
	rjmp	M5		; Остановка цикла

;	Работаем по времени
M4:
	ldi	zl,T4L1		; Адрес время для падения пакета для 0.5л
	sbrc	svet,S1L	; Выбираем какой нужен
	ldi	zl,T4L1		; Адрес время для падения пакета для 1л
	ld	Ttemp,z		; выдерживаем время для падения пакета
	rcall	delay		;

	sbic	pind,DoorIn	; Если датчик двери не в 0 (т.е.)дверь открыта
	rjmp	M5		; то переход на ручной режим с остановкой
	sbrc	ind,AUTO	; переход на М2 если работаем в автомате
	rjmp	M2		;
; 	Работаем по времени (или по меткам) в ручном режиме - остановка
M5:
	ser ind			; Сброс кнопок
	rcall	pnev_off	; Отключим все механизмы
;	ldi	svet,0b00000100	; Индикатор "ВРЕМЯ"
	clr	bd3		; Очистка тысяч
	clr	bd2		; Очистка сотен
	clr	zh		; Обнуляем счетчик циклов
	ldi	zl,CNTAVT	;  в автоматическом режиме
	st	z,zh		;
	sei			;
	rjmp	start		; Остановка цикла

; Процедура остановки работы автомата по кнопке СТОП
stop1:
       pop     rin2	; очищаем стек, если выход из прерыв timer0
       pop     rin2	; очищаем стек, если выход из прерыв timer0
stop:
; если нажата кнопка "ЦИКЛ-СТОП", то отключаем двигатель, пневматику
	cli			;
	ldi	rin,3		; Отключаем нагрев
	ldi	zl,NCHEAT	;
	st	z,rin		;

;	ser	ind		; Сброс кнопок
;	rcall	pnev_off	; Отключим все механизмы
;	ldi	rin,high(RAMEND); Установить указатель стека
;	out	sph,rin 	;
;	ldi	rin,low(RAMEND) ;
;	out	spl,rin 	;
	rjmp	init2		;
; "ЦИКЛ-СТОП" и переходим в начало на опрос кнопки "ЦИКЛ-ПУСК"

; конец основной программы дальше прерывания и подпрограммы

;-------------------------------------------------------------------------
;	Подпрограмма выдержки определенного времени, задаваемого в Ttemp
;-------------------------------------------------------------------------
delay:
	push	rin		;
	cbr	reg_flgs,0b00010000	; снимаем флаг 0.1c
z1:	 ; Процедура обработки датчика на ПЦ дозатора
	sbrc	reg_flgs,0	;
	rjmp	z3		; пропускаем если датчик уже сработал раньше

	;sbrc	svet,S1L	; 
	;rjmp	z11		; Переход если режим дозирования 1л 
; Режим дозирования 0.5л
	;sbic	pind,dozat1	; Выход если датчик дозатора сработал
	;ldi	rin,100		; 100 раз убеждаемся что действительно сработал
z4:
	;sbic	pind,dozat1	;
	;rjmp	z3		;
	;dec	rin		;
	;brne	z4		; 
	;rjmp	z42		; Выход из опроса датчика

; Режим дозирования 1л
z11:
	;sbic	pind,dozat2	; Выход если датчик дозатора сработал
	;ldi	rin,100		; 100 раз убеждаемся что действительно сработал
z41:
	;sbic	pind,dozat2	;
	;rjmp	z3		;
	;dec	rin		;
	;brne	z41		;

z42:
;	Датчик действительно сработал
;	sbr	reg_flgs,0b00000001 ; флаг сработавшего датчика
	cli			;
;	ldi	radr,klap_0	; включаем клапан на излив
;	rcall	decod		;
;	ldi	radr,doza_0	; переключаем дозатор на излив
;	rcall	decod		;
	sei		; Конец процедуры отработки датчика на ПЦ дозатора
z3:
	sbrs	reg_flgs,4		; ждем 0.1с
	rjmp	z1			;
	cbr	reg_flgs,0b00010000	; снимаем флаг 0.1c

	ldi	rin,0b10010000	; Подготовим МП к засыпанию в режиме
	out	mcucr,rin	; измерения АЦП
	sleep			; Засыпаем с измерением

	dec	Ttemp		; Уменьшаем счетчик
	breq	z2		; Если 0,то выход
	rjmp	z1		; Если не 0, то ждем дальше
z2:
	pop	rin		;
	ret			; Выход

;--------------------------------------------------------------------
;--------------- Процедура обработки прерываний от ------------------
;---------------	таймера/счетчика 0	   ------------------
;--------------------------------------------------------------------
timer0:
	push	rin1		;
	push	rin		;
	push	zl		;
	in	rin1,sreg	; запомнить регистр состояния
	push	rin1		;
	push	rin2		;
	push	zh		;
	wdr			;

	ldi	rin,$3c 	; $3c=60
	out	tcnt0,rin	; Период (255-60)*1024/2000000=0.09984c

	inc 	cntlab		; Увеличиваем счетчик времени ожидания метки
				; или отключения двигателя

	sbic	pinc,STOPB	; Если не нажата кнопка СТОП,
	rjmp	ti2		; то обход ее обработки
	ldi	rin,250		; Загружаем счетчик
t0st1:
	sbic	pinc,STOPB	; Проверяем еще раз,
	rjmp	ti2		; если не нажата, то идем дальше
	dec	rin		; если нажата, то уменьшаем счетчик
	brne	t0st1		; если счетчик не кончился, то в цикл
	rjmp	stop1		; если кончился, то переход на выключение

ti2:
	sbr	reg_flgs,0b00010000	; выставляем флаг 0.1c
ti3:
	sbrc	reg_flgs,1	; Если обмен не запрещен из-за работы нагрева,
	rjmp	ti56		;
	rcall	transmit_all	; то начать обмен с ПИ

	mov	rin2,ind	; Сохранить младшую часть байта
	sbr	rin2,0b11110000	;
	sbr	ind,0b00001111	; Сбросить младшую часть принятого байта
	clr	zh		;
	ldi	zl,OLDIND	;
	ld	rin,z+		; Загрузить в rin старые значения кнопок ПИ
	ld	rin1,z		; Загрузить в rin1 счетчик по ПИ
	cpi	ind,$FF		; Если новое значение равно $FF
	breq	timpis1		; 
	cp	ind,rin		;
	brne	timpis1		;
	tst	rin1		;
	breq	timpis3		;
	cpi	rin1,10;20		;
	breq	timpis3		;
	cpi	rin1,14;28		;
	breq	timpis3		;
	cpi	rin1,17;35		;
	breq	timpis3		;
	cpi	rin1,20;41		;
	breq	timpis3		;
	cpi	rin1,23;46		;
	breq	timpis3		;
	cpi	rin1,25;50		;
	breq	timpis3		;
	brcc	timpis2		;
	ldi	ind,$FF		;
timpis3:
	inc	rin1		; Увеличив счетчик
	rjmp	timpis2		;
timpis1:
	mov	rin,ind		; Обновляем старое значение
	clr	rin1		; обнуляем счетчик
	ldi	ind,$FF		; Сброс нажатых кнопок
timpis2:
	st	z,rin1		; Сохранение новых значений
	st	-z,rin		;

	and	ind,rin2	; Добавляем перекл и др кнопки

; Проверка выхода из режима программирования по времени
	sbrc	reg_flgs,FPROG	; Если в режиме программирования
	rjmp	ti56		;
	sbrs	reg_flgs,FCPR	; то проверяем флаг задержки сброса счетчика
	rjmp	tim0p1		;
	cbr	reg_flgs,0b01000000 ; если он установлен, то сбрасываем его
	inc	cnres		; Увеличиваем счетчик
	brne	tim0p2		; если он переполнен
	sbr	reg_flgs,0b00001000 ; то отключаем режим программирования
	rjmp	tim0p2		; выход
tim0p1:
	sbr	reg_flgs,0b01000000 ; если флаг задержки был сброшен, то устанавл
tim0p2:

; Проверка отключения двигателя при прогреве
ti56:
	sbrs	reg_flgs,7	;
	rjmp	ti6		; Пропустить если не режим прогрева
	ldi	zl,TCICL1	; Загрузить адрес времени цикла на 0.5л
	sbrc	svet,S1L	; Проверяем режим дозирования
	ldi	zl,TCICL2	; Загрузить адрес времени цикла на 1л
	clr	zh		;
	ld	rin,z		; Загрузить нужное время цикла
	subi	rin,$fd		; Вычитаем -3=$fd,т.е. прибавляем дополн. 3
	cp	cntlab,rin	; После времени цикла отключить двигатель
	brcs	ti6		;
	ldi	radr,dvig_0	; отключить двигатель
	rcall	Decod		;
ti6:
	pop	zh		;
	pop	rin2		;
	pop	rin1		;
	out	sreg,rin1	;
	pop	zl		;
	pop	rin		;
	pop	rin1		;
	reti			; Конец прерывания

;-----------------начальная установка внешних устройств----------------------
Pnev_off:
	cli
	ldi	rin,0b00011100	; установить порт С
	out	ddrc,rin	;
	ldi	rin,0b00001000	;
	out	portc,rin	;

	clr	rin		;
	out	ddrd,rin	; установить порт D как вход
	out	portd,rin	;

	out	portb,rin	;
	ldi	rin,0b11111111	; установить порт B как выход
	out	ddrb,rin	;

	ldi	radr,nprod_0	;
	rcall	decod		; отключение нагревателей продольн
	ldi	radr,npop_0	;
	rcall	decod		; отключение нагревателей поперечн
	ldi	radr,dater_0	;
	rcall	decod		; отключение нагревателей
	ldi	radr,dvig_0	;
	rcall	decod		; отключение двигателя
	ldi	radr,torm_0	;
	rcall	decod		; тормоз отпущен
;	ldi	radr,doza_0	;
;	rcall	decod		; откл дозатор
;	ldi	radr,klap_0	;
;	rcall	decod		; откл клапан
	ldi	radr,dat_0	;
	rcall	decod		; откл датер
	ldi	radr,gprod_0	;
	rcall	decod		; разв Г. прод
	ldi	radr,gpop_0	;
	rcall	decod		; разв Г. поперечн
	ldi	radr,pc1_0	; отключить счетчик
	rcall	decod		;
	ret
;--------------------------------------------------------------------
;	Подпрограмма подсчета времени цикла
;--------------------------------------------------------------------
vrcikl:
;Для дозы 0.5 л
	ldi	zl,T1L1	;
	ld	rin,z+	; Считали время T1
	ld	rin1,z+	; Считали время T2
	add	rin,rin1;
	ld	rin1,z+	; Считали время T3
	add	rin,rin1;
	ld	rin1,z+	; Считали время для падения пакета
	add	rin,rin1;
	ldi	rin1,4	; Остальные непрограммируемые запасы по времени
	add	rin,rin1; Итоговое время цикла для индикации
	ldi	zl,TCICL1 ; Сохранить подсчитанное значение
	st	z,rin	;

;Для дозы 1 л
	ldi	zl,T1L2	;
	ld	rin,z+	; Считали время T1
	ld	rin1,z+	; Считали время T2
	add	rin,rin1;
	ld	rin1,z+	; Считали время T3
	add	rin,rin1;
	ld	rin1,z+	; Считали время для падения пакета
	add	rin,rin1;
	ldi	rin1,4	; Остальные непрограммируемые запасы по времени
	add	rin,rin1; Итоговое время цикла для индикации
	ldi	zl,TCICL2 ; Сохранить подсчитанное значение
	st	z,rin	;

	ldi	zl,TCICL1	; Загрузить адрес времени цикла на 0.5л
	sbrc	svet,S1L	; Проверяем режим дозирования
	ldi	zl,TCICL2	; Загрузить адрес времени цикла на 1л
	ld	rin,z	; Снова считать нужное 
	rcall	bd_conv ; Расчет для индикации
	ret

;--------------------------------------------------------------------
;--------------- Процедура обработки прерываний от ------------------
;---------------	таймера/счетчика 2	   ------------------
;--------------------------------------------------------------------

timer2:
	push	rin
	in	rin1,sreg	; запомнить регистр состояния
	push	rin1
	
		
	
	ldi	rin,$3c 	; $3c=60
	out	tcnt2,rin	;


	SBRS reg_flgs,FDOZ
	RJMP MMM
	DEC T_NAS1
	BRNE MMM
	CBR reg_flgs,1<<FDOZ
	LDI radr,doza_0	;
	rcall	decod


MMM:

	

	
	pop	rin1		;
	out	sreg,rin1	;
	pop	rin		;
	reti
	




;--------------------------------------------------------------------
;	Перезапись уставок из ППЗУ в ОЗУ
;	EEPROM(0...7) -> ОЗУ ($60+0...$60+7)
;--------------------------------------------------------------------
pzu_ozu:
	clr	zh		; Очистить ст.байт Z-регистра
	out	eearh,zh	; Очистить ст.байт адресного регистра EEPROM
	clr	zl		; Очистить счетчик
eread:
	sbic	eecr,eewe	; Ожидаем возможности
	rjmp	eread		; начала чтения из EEPROM
	out	eearl,zl	; Записываем счетчик в мл. байт адреса EEPROM
	sbi	eecr,eere	; Старт чтения EEPROM
	in	rin,eedr	; Считываем z-ю уставку EEPROM
	subi	zl,$A0		; вычитаем из zl $A0=-$60, т.е. прибавляем $60
	st	z,rin		; и записываем в z-ю ячейку ОЗУ
	subi	zl,$5F		; Вычитаем из zl $5F,т.е.прибавляем 1 к счетчику
;	inc	zl		; Увеличиваем счетчик
	cpi	zl,24		; и сравниваем с кол-вом уставок (24)
	brne	eread		; возврат если не все
	ret			; Возврат



;--------------------------------------------------------------------
;	Перезапись уставок из ОЗУ в ППЗУ
;	ОЗУ ($60+0...$60+7) -> ППЗУ (0...7)
;--------------------------------------------------------------------
ozu_pzu:
	clr	zh		; Очистить ст.байт Z-регистра
	clr	zl		; Очистить счетчик
	cli
ewrite:
	sbic	eecr,eewe	; Ожидаем возможности начала записи
	rjmp	ewrite		; в EEPROM
	out	eearh,zh	; Очистить ст.байт адресного регистра EEPROM
	out	eearl,zl	; Записываем счетчик в мл. байт адреса EEPROM
	subi	zl,$A0		;* вычитаем из zl $A0=-$60, т.е. прибавляем $60
	ld	rin,z		;* и записываем в z-ю ячейку ОЗУ
	subi	zl,$5F		;* Вычитаем из zl $5F,т.е.прибавляем 1 к счетчику
	out	eedr,rin	; Записываем z-ю уставку в регистр данных EEPROM
	sbi	eecr,eemwe	; Подготовка к записи
	sbi	eecr,eewe	; Начало записи в EEPROM
	nop
	nop
	nop
	cpi	zl,24		; и сравниваем с кол-вом уставок (24)
	brne	ewrite		; возврат если не все
	ret			;




;-------------------------------------------------------------------------
;	Подпрограмма выдачи числа на ЦАП для частотного преобразователя
;-------------------------------------------------------------------------
dacout:
	push	rin	;
	push	rin1	;
	push	rin2	;
	push	zl	;
	push	rin3	;

	ldi	zl,FRCFF1 ; Считываем адрес уст. частоты для дозы 0.5л ст.байт
	sbrc	svet,S1L ; Выбираем нужную
	ldi	zl,FRCFF2 ; Считываем адрес уст. частоты для дозы 1л ст. байт

	clr	zh	;
	ld	rin,z	; Считываем старший байт уставки частоты
	ror	rin	; Смещаем мл. бит в С
	dec	zl	; адрес младшего байта уставки
	ld	rin,z	;
	ror	rin	; Т.о. получаем уставку деленную на 2 т.к. ЦАП - 8 бит

	ldi	rin1,0b00010011 ; Управляющее слово для ЦАП Vref=Vdd/2(7)
; не синхронно (5), DAC B-откл(4),  DAC A-вкл(3), shift reg->DAC A(2-0)
	cli			; Запрет на прерывания
	rcall	daco1		; Передача управляющего слова на ЦАП
	mov	rin1,rin	; Пишем уставку
	rcall	daco1		; Передача уставки на ЦАП

	ldi	rin2,0b00001000	; конец передачи
	out	portc,rin2	; Установили SYNC и сбросили SCLK

	sei
	pop	rin3	;
	pop	zl	;
	pop	rin2	;
	pop	rin1	;
	pop	rin	;
	ret			; Выход

;--------------------------------------------------------------------------
; Подпрограмма выдачи байта на ЦАП
daco1:
	ldi	rin3,8		; Счетчик числа бит
	ldi	rin2,0b00000000	; начало передачи
daco2:
	out	portc,rin2	; Установили значение порта
	bst	rin1,7		; Берем старший бит передаваемого байта
	bld	rin2,DACDIN	; и пишем в отображение DACDIN в rin2
	lsl	rin1		; смещаем биты в регистре rin1
	out	portc,rin2	; Выставляем порт
	sbr	rin2,0b00000100	; Установили в 1 отображение DACSCLK в rin2
	nop			; Ждем
	nop			;
	out	portc,rin2	; Выставляем порт
	cbr	rin2,0b00000100	; Установили в 0 отображение DACSCLK в rin2
	nop			;
	nop			;
	dec	rin3		; Проверяем счетчик
	brne	daco2		;
	ret			; Возврат
;--------------------------------------------------------------------------


;--------------------------------------------------------------------
; двоично-десятичное преобразование числа
; вход - RIN, выход - bd3,bd2,bd1
;--------------------------------------------------------------------
bd_conv:
	push	rin		;
	push	rin1		;
	push	rin2		;
;	ldi	rin1,100	;
;	rcall	bd_dig		;   преобр-е Х00
;	mov	bd2,rin2	;   сотни -  bd2
	ldi	rin1,10 	;
	rcall	bd_dig		;   преобр-е 0Х0
	mov	bd1,rin2	;   десятки -bd1

	ldi	rin1,0b10000000	;
	sbrc	reg_flgs,5	; Если индикация десят точки,
	or	bd1,rin1	; то включить дес. точку BD1

	mov	bd0,rin		;   единицы -bd0
	pop	rin2		;
	pop	rin1		;
	pop	rin		;
	ret
;--------------------------------------------------------------------
; Подпрограмма обработки индикации режима работы при программировании
;--------------------------------------------------------------------
bd_convm:
	push	rin		;
	push	rin1		;
	push	rin2		;

	ldi	rin1,1		; Выбираем первый знак индикатора 1-по времени
	cbr	svet,0b00001000	; светодиод Метки погасить
	sbrs	rin,1		;
	rjmp	bdcm0		;
	ldi	rin1,2		; или 2-по меткам
	sbr	svet,0b00001000	; светодиод Метки светить
bdcm0:
	mov	bd3,rin1	; записываем в старший разряд индикатора-тысячи

	ldi	rin1,10		; Во второй разряд-сотни пишем букву "Р"
	mov	bd2,rin1	;

	ldi	rin1,0		; Выбираем третий-десятки и четвертый-единицы
	ldi	rin2,5		; разряды индикатора 05 - 0.5литра
	cbr	svet,0b10000000	; светодиод 1.0л погасить
	sbrs	rin,0		;
	rjmp	bdcm1		;
	ldi	rin1,1		; Выбираем третий-десятки и четвертый-единицы
	ldi	rin2,0		; разряды индикатора 10 - 1.0литра
	sbr	svet,0b10000000	; светодиод 1.0л светить
bdcm1:
	mov	bd1,rin1	;
	mov	bd0,rin2	;

	ldi	rin1,0b10000000	;
	or	bd1,rin1	; включить дес. точку BD1
	sbr	reg_flgs,0b00100000 ; включить флаг дес. точки

	pop	rin2		;
	pop	rin1		;
	pop	rin		;
	ret			; выход

;--------------------------------------------------------------------
; Подпрограмма обработки индикации частоты при программировании
;--------------------------------------------------------------------
bd_convf:
	push	rin		;
	push	rin1		;
	push	rin2		;

	clr	ddS		;
	mov	ddH,rin1	;
	mov	ddL,rin		;
	clr	dvH		;
	ldi	rin2,100	; Делим частоту на 100
	mov	dvL,rin2	;
	rcall	d24on16u	;
	mov	bd2,drL		; индикация сотен

	clr	ddS		;
	mov	ddH,dmH		;
	mov	ddL,dmL		;
	clr	dvH		;
	ldi	rin2,10		; Делим остаток на 10
	mov	dvL,rin2	;
	rcall	d24on16u	;
	mov	bd1,drL		; индикация десятков

	ldi	rin2,0b10000000	;
	or	bd1,rin2	; включить дес. точку BD1

	mov	bd0,dmL		; индикация единиц

	rcall	dacout		; Установить новое значение выхода ЦАП
	pop	rin2		;
	pop	rin1		;
	pop	rin		;
	ret			; выход

;--------------------------------------------------------------------
; двоично-десятичное преобразование цифры
; вход - rin, основание - rin1, выход - rin2
;--------------------------------------------------------------------
bd_dig:
	clr	rin2		;   очистить result
bd_m1:
	cp	rin,rin1	;   сравнить число с весом разряда
	brcs	bd_m2		;   если меньше - возврат
	inc	rin2		;   иначе увеличить result
	sub	rin,rin1	;   вычесть из числа вес
	rjmp	bd_m1		;   продолжить
bd_m2:
	ret

;------------------------------------------------------------------------
;-----------------Передача на блок индикации-----------------------------
;----------------4 байт температуры и 1 байта----------------------------
;-------------------состояния светодиодов--------------------------------
;------------------------------------------------------------------------
;************ вход bd3,bd2,bd1,rin2 *************************************
transmit_all:
; bd0 -  1
; bd1 -  10
; bd2 -  100
; bd3 -  1000
;	ret			  ; для проверки
	push	rin
	rcall	transm_start
	ldi	rin,$f1 	; передать байт направления
	rcall	transmit	; $f1 - передать на блок индикации
				;			  5 байт
	mov	rin,bd3
	rcall	transmit
	mov	rin,bd2
	rcall	transmit
	mov	rin,bd1
	rcall	transmit	;
	mov	rin,bd0
	rcall	transmit	;
	mov	rin,svet
	rcall	transmit	; передача состояния светодиодов
	ldi	paus,ps
	rcall	pausa
	rcall	accept
	pop	rin
	       ret

;-----------------------------------------------------------------------
;--------------------Передача байта на блок индикации-------------------
;-----------------------------------------------------------------------
;************** вход - RIN *********************************************
transmit:
		push	rin
;		sbi	ddrd,0		; определить PD0 как выход (SCLK)
;		sbi	ddrd,1		; определить PD1 как выход (DATA)
		ldi	count,8 	; загрузить счетчик переданных бит
	trans:	ldi	paus,ps
		rcall	pausa
		cbi	portd,0 	; сбросить SCLK в 0
		sbi	portd,1 	; установить PD1 в 1
		sbrs	rin,7		; если передаваемый бит <>1,
		cbi	portd,1 	;      сбросить PD1 в 0
		ldi	paus,ps
		rcall	pausa
		sbi	portd,0 	; установить SCLK в 1
		lsl	rin		; сдвиг RIN влево
		dec	count		; уменьшить счетчик
		brne	trans		; если передано не все,продолжить
		pop	rin
		ret
;-------------------------------------------------------------------------
;    Передача стартового условия
transm_start:
	sbi	ddrd,0		; определить PD0 как выход (SCLK)
	sbi	ddrd,1		; определить PD1 как выход (DATA)
	sbi	portd,1
	cbi	portd,0
	ldi	paus,ps
	add	paus,paus	; Добавить для улучшения обмена
	rcall	pausa
	sbi	portd,0
	ldi	paus,ps
	add	paus,paus	; Добавить для улучшения обмена
	rcall	pausa
	cbi	portd,1
	ldi	paus,ps
	add	paus,paus	; Добавить для улучшения обмена
	rcall	pausa
	sbi	portd,1
	ret
 ;------------------------------------------------------------------------
pausa:
mmm0:
	dec	paus
	nop    ; подождать немного
	nop	; ещё немного
	nop	  ; ещё немного
	nop	  ; ещё немного
	nop	  ; ещё немного
	brne	mmm0
mmm1:	ret	; теперь можно выйти
;-----------------------------------------------------------------------
;--------------------Прием байта с блока индикации---------------------
;----------------------------------------------------------------------
;*************** выход - RIN ******************************************
accept:
;	ret		;				*
	push	rin
;	clr	 rin
	cbi	ddrd,0	  ; установить SCLK и DATE
	cbi	ddrd,1	  ;	     на ввод
	cbi	portd,0
	cbi	portd,1
rs0:
	in	rin,tcnt0 ;  Считываем состояние регистра ТС0
	cpi	rin,$a0	; если tcnt0 вырос до $60, то
	breq	rs04	; плата индикации не реагирует, надо выйти
	sbic	pind,0	; если передача не началась,
	rjmp	rs0	; то возврат

	ldi	count,7   ;  установить счетчик
rs01:
	in	rin,tcnt0 ;  Считываем состояние регистра ТС0
	cpi	rin,$a0	; если tcnt0 вырос до $60, то
	breq	rs04	; плата индикации не реагирует, надо выйти
	sbis	pind,0	;  ждать когда PD0=1
	rjmp	rs01	;
	sec		;
	sbis	pind,1	;  флаг С = PD1
	clc		;
	rol	ind	;  сдвиг влево
	subi	count,1 ;  уменьшить счетчик
	brmi	rs02	; если принят весь старт.
				  ; байт, то переход
rs03:
	in	rin,tcnt0 ;  Считываем состояние регистра ТС0
	cpi	rin,$a0	; если tcnt0 вырос до $60, то
	breq	rs04	; плата индикации не реагирует, надо выйти
	sbic	pind,0	;  ждать когда PD0=0
	rjmp	rs03	;
	rjmp	rs01	;
rs04:
	ser	ind	; Ничего путного не приняли - сброс регистра

rs02:
rs6:
	sbi	ddrd,0	  ; установить SCLK и DATE
	sbi	ddrd,1	  ;	     на выход
	sbi	portd,1
	pop	rin
	ret
		
;----------------------------------------------------------------------------
;	Обработка нажатия кнопки "ПРОГ" - режим программирования
;----------------------------------------------------------------------------
Obrab_key:

	clr	cnres	; Обнул счетчик для вых из реж прог-я по времени
	ldi	reg_flgs,0b00000001; снять флаги раб режима и десят точки
obm1:
	cbr	svet,0b01110110 ; гасить "Т1" "T2" "T3" "T" "BP"
	sbr	svet,0b00000001 ; индицировать "ПРОГ"
	ser	ind		; Сброс кнопок
	ldi	zl,MODE		; загрузить адрес текущего режима работы
	ld	rin,z		;
	rcall	bd_convm 	; переслать для индикации
obm2:
	sbrs	ind,PROG	; если ПРОГ нажата
	rjmp	obm4		; то след параметр
obm3:
	sbrc	reg_flgs,3	; Если нет режима программирования,
	rjmp	init		; то выход отсюда без сохранения
	sbrs	ind,VVOD	; если ВВОД нажата
	rjmp	key_up		; то выход
	sbrs	ind,PLUS	; если нажата ПЛЮС
	rcall	key_plusm	; то увеличить
	sbrs	ind,MINUS	; если нажата МИНУС
	rcall	key_minusm	; то уменьшить
	rjmp	obm2
obm4:

	clr	cnres		;
	cbr	reg_flgs,0b00101000; снять флаг рабочего режима и десят точки
	sbr	svet,0b00010001 ; индицировать "Т1" и "ПРОГ"
ob3:
	ser	ind		; Сброс кнопок
;	clr	bd3		; Очистка тысяч
;	clr	bd2		; Очистка сотен
	ldi	rin,1		; "1"
	mov	bd3,rin		; 
	ldi	rin,16		; "H"
	mov	bd2,rin		; Индикация "1НХХ"

	ldi	zl,POW1H1	; загрузить адрес мощности заварки 1 реж 0.5л
	sbrc	svet,S1L	; выбрать нужный
	ldi	zl,POW1H2	; загрузить адрес мощности заварки 1 реж 1.0л
	ld	rin,z		;
	rcall	bd_conv 	; переслать
ob399:
	sbrs	ind,PROG	; если ПРОГ нажата
	rjmp	ob5		; то след мощность заварки 2
ob4:
	sbrc	reg_flgs,3	; Если нет режима программирования,
	rjmp	init		; то выход отсюда без сохранения
	sbrs	ind,VVOD	; если ВВОД нажата
	rjmp	key_up		; то выход
	sbrs	ind,PLUS	; если нажата ПЛЮС
	rcall	key_plus	; то обнулить
	sbrs	ind,MINUS	; если нажата МИНУС
	rcall	key_minus	; то обнулить
	rjmp	ob399
ob5:
	clr	cnres		;
	ser	ind
	ldi	rin,2		; "2"
	mov	bd3,rin		; Индикация "2НХХ" 
;	ldi	rin,16		; "H"
;	mov	bd2,rin		;
	cbr	svet,0b00010000 ; гасить "Т1"
	sbr	svet,0b00100001 ; индицировать "Т2" и "ПРОГ"
	ldi	zl,POW2H1	; загрузить адрес мощности заварки 2 реж 0.5л
	sbrc	svet,S1L	; выбрать нужный
	ldi	zl,POW2H2	; загрузить адрес мощности заварки 2 реж 1.0л
	ld	rin,z		;
	rcall	bd_conv 	; переслать
ob499:
	sbrs	ind,PROG	; если ПРОГ нажата
;	rjmp	ob7		; то след мощность заварки 3
;	rjmp	ob10		; то след время заварки 1
	rjmp	obf0		; то след частота преобразователя
ob6:
	sbrc	reg_flgs,3	; Если нет режима программирования,
	rjmp	init		; то выход отсюда без сохранения
	sbrs	ind,VVOD	; если ВВОД нажата
	rjmp	key_up		; то выход
	sbrs	ind,PLUS	; если нажата ПЛЮС
	rcall	key_plus	; то обнулить
	sbrs	ind,MINUS	; если нажата МИНУС
	rcall	key_minus	; то обнулить
	rjmp	ob499		;

;--------------------------------------------------------------------
;	Пропущено
ob7:
	clr	cnres		;
	ser	ind		;
	ldi	svet,0b01000011 ; индицировать "T","Т3" и "ПРОГ"
	ldi	zl,$62		; загрузить мощность заварки 3
	ld	rin,z		;
	rcall	bd_conv 	; переслать
ob599:
	sbrs	ind,PROG	; если ПРОГ нажата
	rjmp	ob10		; то след термопара
ob8:
	sbrc	reg_flgs,3	; Если нет режима программирования,
	rjmp	init		; то выход отсюда без сохранения
	sbrs	ind,VVOD	; если ВВОД нажата
	rjmp	key_up		; то выход
	sbrs	ind,PLUS	; если нажата ПЛЮС
	rcall	key_plus	; то обнулить
	sbrs	ind,MINUS	; если нажата МИНУС
	rcall	key_minus	; то обнулить
	rjmp	ob599
;--------------------------------------------------------------------

obf0:
	clr	cnres		;
	ser	ind
	ldi	rin,15		; "F"
	mov	bd3,rin		; 
;	ldi	rin,17		; "L"
;	mov	bd2,rin		; Индикация "FXХХ"
	cbr	svet,0b00100000 ; гасить "Т2"
;	sbr	svet,0b00000001 ; индицировать "ПРОГ"
	sbr	reg_flgs,0b00100000; Флаг индикации десятичной точки в знаке BD1
	ldi	zl,FRCF1	; загрузить адрес частоты преобраз реж 0.5л
	sbrc	svet,S1L	; выбрать нужный
	ldi	zl,FRCF2	; загрузить адрес частоты преобраз реж 1.0л
	ld	rin,z+		; Считываем младший
	ld	rin1,z		; и старший байты
	dec	zl		; восстановить адрес
	rcall	bd_convf	;
obf1:
	sbrs	ind,PROG	; если ПРОГ нажата
	rjmp	ob10		; то след параметр время заварки 1
obf2:
	sbrc	reg_flgs,3	; Если нет режима программирования,
	rjmp	init		; то выход отсюда без сохранения
	sbrs	ind,VVOD	; если ВВОД нажата
	rjmp	key_up		; то выход
	sbrs	ind,PLUS	; если нажата ПЛЮС
	rcall	key_plusf	; то обнулить
	sbrs	ind,MINUS	; если нажата МИНУС
	rcall	key_minusf	; то обнулить
	rjmp	obf1		;

ob10:
	clr	cnres		;
	ser	ind
	ldi	rin,1		; "1"
	mov	bd3,rin		; 
	ldi	rin,17		; "L"
	mov	bd2,rin		; Индикация "1LХХ"
	cbr	svet,0b00100000 ; гасить "Т2"
	sbr	svet,0b00010001 ; индицировать "Т1" и "ПРОГ"
	sbr	reg_flgs,0b00100000; Флаг индикации десятичной точки в знаке BD1
	ldi	zl,T1L1		; загрузить адрес времени заварки 1 реж 0.5л
	sbrc	svet,S1L	; выбрать нужный
	ldi	zl,T1L2		; загрузить адрес времени заварки 1 реж 1.0л
	ld	rin,z		;
	rcall	bd_conv		;
ob699:
	sbrs	ind,PROG	; если ПРОГ нажата
	rjmp	ob12		; то след параметр
ob11:
	sbrc	reg_flgs,3	; Если нет режима программирования,
	rjmp	init		; то выход отсюда без сохранения
	sbrs	ind,VVOD	; если ВВОД нажата
	rjmp	key_up		; то выход
	sbrs	ind,PLUS	; если нажата ПЛЮС
	rcall	key_plus	; то обнулить
	sbrs	ind,MINUS	; если нажата МИНУС
	rcall	key_minus	; то обнулить
	rjmp	ob699
ob12:
	clr	cnres		;
	ser	ind
	ldi	rin,2		; "2"
	mov	bd3,rin		; Индикация "2LХХ" 
;	ldi	rin,17		; "L"
;	mov	bd2,rin		;
	cbr	svet,0b00010000 ; гасить "Т1"
	sbr	svet,0b00100001 ; индицировать "Т2" и "ПРОГ"
	ldi	zl,T2L1		; загрузить адрес времени заварки 2 реж 0.5л
	sbrc	svet,S1L	; выбрать нужный
	ldi	zl,T2L2		; загрузить адрес времени заварки 2 реж 1.0л
	ld	rin,z
	rcall	bd_conv
ob799:
	sbrs	ind,PROG	; если ПРОГ нажата
	rjmp	ob14		; то след параметр
ob13:
	sbrc	reg_flgs,3	; Если нет режима программирования,
	rjmp	init		; то выход отсюда без сохранения
	sbrs	ind,VVOD	; если ВВОД нажата
	rjmp	key_up		; то выход
	sbrs	ind,PLUS	; если нажата ПЛЮС
	rcall	key_plus	; то обнулить
	sbrs	ind,MINUS	; если нажата МИНУС
	rcall	key_minus	; то обнулить
	rjmp	ob799
ob14:
	clr	cnres		;
	ser	ind
	ldi	rin,3		; "3"
	mov	bd3,rin		; Индикация "3LХХ" 
;	ldi	rin,17		; "L"
;	mov	bd2,rin		;
	cbr	svet,0b00100000 ; гасить "Т2"
	sbr	svet,0b01000001 ; индицировать "Т3" и "ПРОГ"
	ldi	zl,T3L1		; загрузить адрес времени заварки 3 реж 0.5л
	sbrc	svet,S1L	; выбрать нужный
	ldi	zl,T3L2		; загрузить адрес времени заварки 3 реж 1.0л
	ld	rin,z
	rcall	bd_conv
ob899:
	sbrs	ind,PROG	; если ПРОГ нажата
	rjmp	ob16		; то след параметр
ob15:
	sbrc	reg_flgs,3	; Если нет режима программирования,
	rjmp	init		; то выход отсюда без сохранения
	sbrs	ind,VVOD	; если ВВОД нажата
	rjmp	key_up		; то выход
	sbrs	ind,PLUS	; если нажата ПЛЮС
	rcall	key_plus	; то обнулить
	sbrs	ind,MINUS	; если нажата МИНУС
	rcall	key_minus	; то обнулить
	rjmp	ob899
ob16:
	clr	cnres		;
	ser	ind
	ldi	rin,4		; "4"
	mov	bd3,rin		; Индикация "4LХХ" 
;	ldi	rin,17		; "L"
;	mov	bd2,rin		;
	cbr	svet,0b01000000 ; гасить "Т3"
	sbr	svet,0b00000001 ; индицировать "ПРОГ"
	ldi	zl,T4L1		; загрузить адрес времени 4 реж 0.5л
	sbrc	svet,S1L	; выбрать нужный
	ldi	zl,T4L2		; загрузить адрес времени 4 реж 1.0л
	ld	rin,z
	rcall	bd_conv
ob999:
	sbrs	ind,PROG	; если ПРОГ нажата
	rjmp	ob18		; то след параметр
ob17:
	sbrc	reg_flgs,3	; Если нет режима программирования,
	rjmp	init		; то выход отсюда без сохранения
	sbrs	ind,VVOD	; если ВВОД нажата
	rjmp	key_up		; то выход
	sbrs	ind,PLUS	; если нажата ПЛЮС
	rcall	key_plus	; то обнулить
	sbrs	ind,MINUS	; если нажата МИНУС
	rcall	key_minus	; то обнулить
	rjmp	ob999

ob18:
	clr	cnres		;
	ser	ind
	ldi	rin,5		; "5"
	mov	bd3,rin		; Индикация "5LХХ" 
;	ldi	rin,17		; "L"
;	mov	bd2,rin		;
	cbr	reg_flgs,0b00100000; Погасить флаг индикации десятичной точки
;	cbr	svet,0b00000000 ; гасить
	sbr	svet,0b00110001 ; индицировать "T1","T2", "ПРОГ"
	ldi	zl,TWARM1	; загрузить адрес времени прогрева реж 0.5л
	sbrc	svet,S1L	; выбрать нужный
	ldi	zl,TWARM2	; загрузить адрес времени прогрева реж 1.0л
	ld	rin,z
	rcall	bd_conv
oba99:
	sbrs	ind,PROG	; если ПРОГ нажата
	rjmp	obrab_key;ob22	; то на первый параметр			*

;	sbrs	ind,PUSK	; если ПУСК нажата
;	rjmp	ob20		; то индикация напряжения
ob19:
	sbrc	reg_flgs,3	; Если нет режима программирования,
	rjmp	init		; то выход отсюда без сохранения
	sbrs	ind,VVOD	; если ВВОД нажата
	rjmp	key_up		; то выход
	sbrs	ind,PLUS	; если нажата ПЛЮС
	rcall	key_plus	; то обнулить
	sbrs	ind,MINUS	; если нажата МИНУС
	rcall	key_minus	; то обнулить
	rjmp	oba99






ob20:
	ser	ind		;
;--------------------------------------------------------------------
; Индикация измеренного напряжения в непрерывном режиме
ob21:
	sbrs	ind,PROG	; если ПРОГ нажата
	rjmp	obrab_key	; то на первый параметр

	ldi	rin,0b10010000	; Подготовим МП к засыпанию в режиме
	out	mcucr,rin	; измерения АЦП
	sleep			; Засыпаем с измерением

	ldi	Ttemp,1		;
	rcall	delay		;

	in	rin,adcl	; Измеренное напряжение в 1/16 В
	in	bd2,adch	;
	mov	rin1,rin	;
	cbr	rin1,0b11110000	;
	mov	bd0,rin1	;
	swap	rin		;
	cbr	rin,0b11110000	;		
	mov	bd1,rin		;
	clr	bd3		;
 
	ldi	Ttemp,5		;
	rcall	delay		;
	rjmp	ob21		;
;--------------------------------------------------------------------
ob22:
	clr	cnres		;
	ser	ind
	ldi	rin,6		; "6"
	mov	bd3,rin		; Индикация "6LХХ" 
;	ldi	rin,17		; "L"
;	mov	bd2,rin		;
	cbr	reg_flgs,0b00100000; Погасить флаг индикации десятичной точки
	ldi	svet,0b00000001 ; индицировать "ПРОГ"
	ldi	zl,$7a		; загрузить коэффициент напряжения
	ld	rin,z		;
	mov	rin1,rin	;
	cbr	rin1,0b11110000	;
	mov	bd0,rin1	;
	mov	rin1,rin	;
	swap	rin1		;
	cbr	rin1,0b11110000	;		
	mov	bd1,rin1	;
;	mov	bd0,rin		;
;	clr	bd1		;
;	rcall	bd_conv		;
ob23:
	sbrs	ind,PROG	; если ПРОГ нажата
	rjmp	obrab_key	; то на первый параметр

;	sbrs	ind,PUSK	; если ПУСК нажата
;	rjmp	ob20		; то индикация напряжения
ob24:
;	sbrc	reg_flgs,3	; Если нет режима программирования,
;	rjmp	init		; то выход отсюда без сохранения
	sbrs	ind,VVOD	; если ВВОД нажата
	rjmp	key_up		; то выход
	sbrc	ind,PLUS	; если нажата ПЛЮС
	rjmp	oba24		;
	ser	ind		;
	inc	rin		; то увеличить
oba24:
	sbrc	ind,MINUS	; если нажата МИНУС
	rjmp	obb24		;
	dec	rin		; то уменьшить
	ser	ind		;
obb24:
	mov	rin1,rin	;
	cbr	rin1,0b11110000	;
	mov	bd0,rin1	;
	mov	rin1,rin	;
	swap	rin1		;
	cbr	rin1,0b11110000	;		
	mov	bd1,rin1	;
	ldi	zl,$7a		; Сохранить коэффициент напряжения
	st	z,rin		;
	rjmp	ob23
ob25:

;--------------------------------------------------------------------
;	нажатие кнопки "+" в режиме программирования
;--------------------------------------------------------------------
key_plus:
	cpi	rin,60		;
	breq	km1		;
	inc	rin		;
	rjmp	km0		;
;--------------------------------------------------------------------
;	нажатие кнопки "-" в режиме программирования
;--------------------------------------------------------------------
key_minus:
	tst	rin		;
	breq	km1		;
	dec	rin		;
km0:
	rcall	bd_conv		; переслать уставку
km1:
	st	z,rin		;  и запомнить уставку
	clr	cnres		;
	ser	ind		;
	sei			;
	ret			;
;--------------------------------------------------------------------
;	нажатие кнопки "+" в режиме программирования режима работы
;--------------------------------------------------------------------
key_plusm:
	cpi	rin,3		;
	breq	kmm0		;
	inc	rin		;
	rjmp	kmm0		;
;--------------------------------------------------------------------
;	нажатие кнопки "-" в режиме программирования режима работы
;--------------------------------------------------------------------
key_minusm:
	tst	rin		;
	breq	kmm0		;
	dec	rin		;
kmm0:
	rcall	bd_convm	; переслать уставку
	rjmp	km1		; Выход

;--------------------------------------------------------------------
;	нажатие кнопки "+" в режиме программирования частоты
;--------------------------------------------------------------------
key_plusf:
	cli			;
	ldi	zh,1		; Если значение меньше 500=$1F4
	cpi	rin,$f4		; 
	cpc	rin1,zh		; 
	breq	kmf1		; Если равно, то не менять
	brcs	kpf1		; Если меньше, то увеличить
	ldi	rin1,$01	; Если равно, то загрузить
	ldi	rin,$f4		; 500=$1F4
kpf1:
	add	rin,zh		;
	clr	zh		;
	adc	rin1,zh		;
	rjmp	kmf0		;
;--------------------------------------------------------------------
;	нажатие кнопки "-" в режиме программирования частоты
;--------------------------------------------------------------------
key_minusf:
	clr	zh		;
	cpi	rin,1		; Сравнить с 1
	cpc	rin1,zh		;
	brcs	kmf1		; Если число меньше 1, то не менять
	subi	rin,1		; Если число >=1, то вычитаем 1
	sbc	rin1,zh		;
kmf0:
	rcall	bd_convf	; переслать уставку
kmf1:
	clr	zh		;
	st	z+,rin		;  и запомнить уставку
	st	z,rin1		;
	dec	zl		;
	clr	cnres		;
	ser	ind		;
	sei			;
	ret			;

;--------------------------------------------------------------------
;	Нажатие кнопки "ВВОД" в режиме программирования
;--------------------------------------------------------------------
key_up:
	ser	ind			; Сбросить кнопки
	cli				;
	ldi	reg_flgs,0b00101001	; Начальное положение флагов режимов
	rcall	ozu_pzu
		; Сохранить уставки
	rcall	vrcikl			; Подсчет времени цикла
	cbr	svet,0b01110111		; Погасить лишние светодиоды индикатора
	clr	bd3			;
	clr	bd2			;
	sei				;
	ret				;

;--------------------------------------------------------------------
;	Процедура включения требуемых устройств
;--------------------------------------------------------------------
decod:
	cli				;
	push	radr1			;
	mov	radr1,radr		;
	ori	radr,0b00110000 	; чтобы на время запретить Enable
	out	portb,radr1		; выставить адрес дешифратора
	nop				; ждем время выполнения
	nop				;
	nop				;
	nop				;
	nop				;
	out	portb,radr		; выставляем Enable
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	pop	radr1			;
	ret				;
;------------------------------------------------------------------------------
;--------------------- Обработка прерывания от компаратора --------------------
;------------------------------------------------------------------------------
ancomp:
	cli			;				*
	push	zh		;
	push	zl		;
	push	rin		;
	push	rin1		;
	in	rin1,sreg	;
	push	rin1		;

;	ldi	radr,nprod_1	; включить продольный нагрев	*
;	rcall	decod		;				*

	ldi	radr,nprod_0	; выключить продольный нагрев
	rcall	decod
	ldi	radr,npop_0	; -//- поперечный
	rcall	decod
	ldi	radr,dater_0	; -//- датер
	rcall	decod

	clr	zh		;
	ldi	zl,NCHEAT	;
	ld	rin,z		; прочитать номер канала нагрева
	cpi	rin,3		; выход если 3 или более
	brcc	rupt

	ldi	zl,TCH1H	;
	add	zl,rin		; установить смещение
	add	zl,rin		;
	ld	rin1,z+		; прочитать ст байт записи таймера
	ld	rin,z		; прочитать мл байт записи таймера
	tst	rin1		; если ст. байт равен 0, то
	breq	rupt		; выход без запуска нагрева

an1:

;	ldi	radr,nprod_1	; включить продольный нагрев	*
;	rcall	decod		;				*

;	ldi	rin1,$f8	;					*
;	ldi	rin,$2f		;					*

	out	tcnt1h,rin1	; Запись уставки в таймер
	out	tcnt1l,rin	;
	ldi	rin,0b00000100	; Гасим флаг timer1
	out	tifr,rin	;
	ldi	rin,0b01000101	;
	out	timsk,rin	; разрешить прерывания timer1
;	clr	zh
rupt:

;	ldi	radr,nprod_0	; включить продольный нагрев	*
;	rcall	decod		;				*

	pop	rin1		;
	out	sreg,rin1	;
	pop	rin1		;
	pop	rin		;
	pop	zl		;
	pop	zh		;
	reti			;

;------------------------------------------------------------------------------
;------------------ Обработка прерывания от таймера 1 -------------------------
;------------------------------------------------------------------------------
timer1:
	push	zh		;
	push	zl		;
	push	rin		;
	push	rin1		;
	push	rin2		;
	in	rin1,sreg	; запомнить регистр состояния

	wdr

	ldi	radr,npop_0	; выключить нагрев
	rcall	decod
	ldi	radr,dater_0
	rcall	decod
	ldi	radr,nprod_0
	rcall	 decod

	sbrc	reg_flgs,2	; переход если это
	rjmp	mer5		; окончание импульса
	ldi	rin,0b00001010	;
;	out	wdtcr,rin	; установить WDT на 65мс.

	ldi	rin,$fc		; установить timer1 на 0.0005с.
	out	tcnt1h,rin	; FFFF-FC17=3E8=1000 тактов
	ldi	rin,$17		; 
	out	tcnt1l,rin	;

;	ldi	rin,$f8		; установить timer1 на 0.001с.		*
;	out	tcnt1h,rin	; FFFF-F82F=7d0=2000 тактов		*
;	ldi	rin,$2f		;					*
;	out	tcnt1l,rin	;					*

	sbr	reg_flgs,0b00000100; на выдерж. 0,001с.

	clr	zh		;
	ldi	zl,NCHEAT	; прочитать канал нагрева
	ld	rin2,z		;
	tst	rin2		; если ноль, то
	brne	mer1
	ldi	radr,npop_1	; включить поперечный нагрев
	rcall	decod

mer3:
	out	sreg,rin1	;
	pop	rin2		;
	pop	rin1		;
	pop	rin		;
	pop	zl		;
	pop	zh		;
	reti			; Выход

mer1:
	cpi	rin2,1		; Включить второй (продольный) нагрев
	brne	mer4		;
	ldi	radr,nprod_1	;
	rcall	decod		;
	rjmp	mer3		;
mer4:
	cpi	rin2,2		; Включить третий нагрев
	brne	mer3		;
	ldi	radr,dater_1	;
	rcall	decod		;
	rjmp	mer3		;
mer5:
;	ldi	rin,0b00001101  ; 512 circles - 0.52c WDR
;	out	wdtcr,rin

	ldi	rin,0b01000001	;
	out	timsk,rin	; запретить прерывания  timer1
	cbr	reg_flgs,0b00000100;
	rjmp	mer3		; Выход

;------------------------------------------------------------------------------
;------------------ Обработка прерываний от АЦП -------------------------------
;------------------------------------------------------------------------------
adc_preob:
	cli
	push	zl
	push	rin
	push	rin1
	push	rin2
	in	rin2,sreg
	push	rin2

	in	rin1,adcl	; Измеренное напряжение в 1/16 В
	in	rin,adch	;

;	clr	zh		;

;	rjmp	adcexit		;					*

	ldi	zh,1		; Если значение меньше
	cpi	rin1,$90	; 400, т.е.
	cpc	rin,zh		; напряжение меньше 25В
	brcc	adc1		;
	rcall	adclow		; то выход без включения напряжения
	rjmp	adcexit		; Выход
adc1:
	rjmp	adc2		; Обход следующей процедуры
;--------------------------------------------------------------------
; Для получения соотношения (rin:rin1)*0.96=(rin:rin1)*256/266
;	clc			;
	clr	ddL		; Помещаем (rin:rin1:00) в (ddS:ddH:ddL)
	mov	ddS,rin		; т.е. умножаем на 256
	mov	ddH,rin1	;
;	ror	ddS		;
;	ror	ddH		;
;	ror	ddL		;	

	ldi	rin,$01		;
	mov	dvH,rin		;

	clr	zh		;
	ldi	zl,KOEFU	; загрузить коэффициент напряжения
	ld	rin,z		;

;	ldi	rin,$1c		;
	mov	dvL,rin		;
	rcall	d24on16u	; Делим на 284(256/284=0.9)

	mov	rin1,drL	; Результат
	mov	rin,drH		;
;--------------------------------------------------------------------

adc2:
	clr	zh		;
	ldi	zl,43;00;10;43;22	; Увеличиваем измеренное напряжение на 
	add	rin1,zl		; величину падения напряжения на выпрямителе
	adc	rin,zh		; было 22, но реально надо больше - 43-?

	ldi	zh,2		; Если значение меньше 180B
	cpi	rin1,$c6	; 710=02c6,
	cpc	rin,zh		;
	brcc	adc4		;
	clr	zh		;
	subi	rin1,12		; Уменьшаем измеренное напряжение на 12/16В
	adc	rin,zh		;
	rjmp	adc3		;
adc4:
	ldi	zh,2		; Если значение меньше 190B
	cpi	rin1,$ec	; 748=02ec,
	cpc	rin,zh		;
	brcc	adc5		;
	clr	zh		;
	subi	rin1,10		; Уменьшаем измеренное напряжение на 10/16В
	adc	rin,zh		;
	rjmp	adc3		;
adc5:
	ldi	zh,3		; Если значение меньше 200B
	cpi	rin1,$10	; 784=$0310,
	cpc	rin,zh		;
	brcc	adc6		;
	clr	zh		;
	subi	rin1,4		; Уменьшаем измеренное напряжение на 4/16В
	adc	rin,zh		;
	rjmp	adc3		;
adc6:
	ldi	zh,3		; Если значение меньше 210B
	cpi	rin1,$36	; 822=$0336,
	cpc	rin,zh		;
	brcc	adc3		;
	clr	zh		;
	subi	rin1,2		; Уменьшаем измеренное напряжение на 2/16В
	adc	rin,zh		;
	rjmp	adc3		;
adc3:
	ldi	zl,$70		; Сохраняем измеренное напряжение
	st	z+,rin		; в ОЗУ
	st	z,rin1		;

	clr	cnagr		; Расчет для первого нагревателя
	rcall	raschet		;

	inc	cnagr		; Расчет для второго нагревателя
	rcall	raschet		;

	inc	cnagr		; Расчет для третьего нагревателя
	rcall	raschet		;

;--------------------------------------------------------------------
adcexit:
	clr	zh		;
	pop	rin2		;
	out	sreg,rin2	;
	pop	rin2		;
	pop	rin1		;
	pop	rin		;
	pop	zl		;
	reti			;

;--------------------------------------------------------------------
; Подпрограмма обнуления записей таймера в случае плохих данных
; Если напряжение меньше 25В
adclow:
	ldi	yl,TCH1H	; В Y-регистре координаты ОЗУ с записью
	clr	yh		; таймера для первого нагревателя
	ST Y,YH
	ADIW YL,1		;
	ST Y,YH
	ADIW YL,1		;
	ST Y,YH
	ADIW YL,1		; Для второго нагревателя
	ST Y,YH
	ADIW YL,1		;
	ST Y,YH
	ADIW YL,1	; Для третьего нагревателя
	ST Y,YH
	ADIW YL,1		;
	ret			;
;--------------------------------------------------------------------

;--------------------------------------------------------------------
; Подпрограмма расчета состояния таймера в зависимости от уставки мощности
; нагревателя и измеренного напряжения. Входная величина - номер нагревателя
; сnagr=0,1 или 2
raschet:
	clr	zh		;
	ldi	zl,POW1H1	; загрузить адрес мощности заварки 1 реж 0.5л
	sbrc	svet,S1L	; выбрать нужный
	ldi	zl,POW1H2	; загрузить адрес мощности заварки 1 реж 1.0л

	add	zl,cnagr	;
	ld	ddS,z		;

	tst	ddS		; Сравнить уставку с 0
	breq	ras4		;

	cpi	cnagr,1		; 
	brne	ras1		; Переход если не продольная заварка

	ldi	zl,CNTAVT	; Считываем счетчик циклов
	ld	yl,z		; в автоматическом режиме
	cpi	yl,AVTDEC	; сравниваем с константой
	brcs	ras1		; Если еще рано, то не менять
	dec	ddS		; если уже можно, то уменьшаем уставку на 1
	tst	ddS		; Сравнить уставку с 0
	brne	ras1		;
ras4:
	ldi	yl,TCH1H	; Вычисляем адрес по которому надо сохранить
	clr	yh		; результат
	add	yl,cnagr	;
	add	yl,cnagr	; В Y-регистре положение
;	inc	yl		; старшего байта рез-та
	ST Y,YH
	ADIW YL,1		; Пишем нули
	st	y,yh		;
	ret			;	

ras1:
	clc			; Умножаем уставку на 2^13
	clr	ddH		; Для этого очищаем средний байт
	ror	ddS		; и три раза сдвигаем биты
	ror	ddH		; из ddS в ddH
	ror	ddS		;
	ror	ddH		;
	ror	ddS		; В ddS старший байт,
	ror	ddH		; в ddH средний байт,
	clr	ddL		; в младшем - 00

	mov	dvH,rin		; Находим 1024*Uср/Um
	mov	dvL,rin1	; где Uср - уставка/2, Um - амплитуда
	rcall	d24on16u	; Делим

	ldi	yh,$02		; Сравниваем результат
	ldi	yl,$8c		;
	cp	drL,yl		; с 652=$028c 
	cpc	drH,yH		;

	brcs	ras2		;
ras3:
	rcall	adclow		; Если больше, то писать нули
	ret			; и сразу выход
ras2:
	ldi	zl,low(table1)	; В регистре z начало таблицы 
	ldi	zh,high(table1)	; с временами задержки
	add	zl,drL		; Прибавим смещение
	adc	zh,drH		;

	add	zl,zl		; Умножаем адрес на 2, т.к. пространство
	adc	zh,zh		; двухбайтное

	ldi	yl,TCH1H	; Вычисляем адрес по которому надо сохранить
	clr	yh		; результат
	add	yl,cnagr	;
	add	yl,cnagr	; В Y-регистре положение
	inc	yl		; младшего байта рез-та

	lpm			; Считываем младший байт уставки таймера
	mov	rin2,d		;
	adiw	zl,1		;
	lpm			; Считываем старший байт уставки таймера

	ldi	zl,$b4		; $02b4=692 такта складыв из: 30мкс - время вкл
	ldi	zh,$02		; оптрона, 30мкс - вкл симистора, 286мкс -
	; время задержки срабат аналогового компаратора после перехода сети 0

	sub	rin2,zl		; Вычитаем задержки
	sbc	d,zh		;

	st	y,rin2		; Сохраняем младший байт
	st	-y,d		; Сохраняем старший байт
	ret			;
;--------------------------------------------------------------------


;***************************************************************************
;*
;* "d24on16u" - 24/16 Bit Unsigned Division
;*
;* This subroutine divides the 24-bit on 16-bit numbers
;* "ddS:ddH:ddL" (dividend) and "dvH:dvL" (divisor).
;* The result is placed in "drH:drL" and the remainder in
;* "dmH:dmL".
;* Low registers used   :3 (dmL,dmH,ddS)
;* High registers used  :5 (drL/ddL,drH/ddH,dvL,dvH,dcnt)
;*
;***************************************************************************
d24on16u: clr     dmL        ;clear remainder Low byte
        sub     dmH,dmH;clear remainder High byte and carry
        ldi     dcnt,25      ;init loop counter
d24u_1: rol     ddL          ;shift left dividend
        rol     ddH
        rol     ddS
        dec     dcnt         ;decrement counter
        brne    d24u_2          ;if done
        ret                     ;    return
d24u_2: rol     dmL        ;shift dividend into remainder
        rol     dmH
        sub     dmL,dvL ;remainder = remainder - divisor
        sbc     dmH,dvH ;
        brcc    d24u_3          ;if result negative
        add     dmL,dvL ;    restore remainder
        adc     dmH,dvH
        clc                     ;    clear carry to be shifted into result
        rjmp    d24u_1          ;else
d24u_3: sec                     ;    set carry to be shifted into result
        rjmp    d24u_1
;***************************************************************************


;--------------------------------------------------------------------------
; подпрограмма инициализ. нагрева
;--------------------------------------------------------------------------
nagr:
	cli			;
	ldi	radr,nprod_0	; выключить продольный нагрев
	rcall	decod
	ldi	radr,npop_0	; -//- поперечный
	rcall	decod
	ldi	radr,dater_0	; -//- датер
	rcall	decod
	rcall	transmit_all	; Произвести обмен с ПИ
	sbr	reg_flgs,0b00000010  ;запретить обмен по прерываниям
	ldi	zl,NCHEAT	; выставить флаг и
	st	z,rin		; включить нужный нагрев

	ldi	zl,T1L1		; загрузить адрес времени заварки 1 реж 0.5л
	sbrc	svet,S1L	; выбрать нужный
	ldi	zl,T1L2		; загрузить адрес времени заварки 1 реж 1.0л
	add	zl,rin		;
	ld	Ttemp,z		; прочитать время нагрева
	sei
	ret
;--------------------------------------------------------------------------

 ;------ данные соответствия мощности нагревателей и единиц таймера ---------
table1:
 .DW $B3D2, $B4A1, $B53F, $B5C5, $B63C, $B6A6, $B709, $B764, $B7BA, $B80C
 .DW $B85A, $B8A4, $B8EB, $B930, $B972, $B9B2, $B9F0, $BA2D, $BA67, $BAA1
 .DW $BAD9, $BB0F, $BB45, $BB79, $BBAD, $BBDF, $BC10, $BC41, $BC71, $BCA0
 .DW $BCCE, $BCFC, $BD28, $BD55, $BD80, $BDAB, $BDD6, $BE00, $BE29, $BE52
 .DW $BE7B, $BEA3, $BECA, $BEF1, $BF18, $BF3E, $BF64, $BF8A, $BFAF, $BFD4
 .DW $BFF8, $C01D, $C041, $C064, $C087, $C0AA, $C0CD, $C0F0, $C112, $C134
 .DW $C155, $C177, $C198, $C1B9, $C1D9, $C1FA, $C21A, $C23A, $C25A, $C27A
 .DW $C299, $C2B8, $C2D8, $C2F6, $C315, $C334, $C352, $C370, $C38E, $C3AC
 .DW $C3CA, $C3E7, $C405, $C422, $C43F, $C45C, $C479, $C495, $C4B2, $C4CE
 .DW $C4EA, $C506, $C522, $C53E, $C55A, $C576, $C591, $C5AD, $C5C8, $C5E3
 .DW $C5FE, $C619, $C634, $C64E, $C669, $C684, $C69E, $C6B8, $C6D3, $C6ED
 .DW $C707, $C721, $C73B, $C754, $C76E, $C788, $C7A1, $C7BA, $C7D4, $C7ED
 .DW $C806, $C81F, $C838, $C851, $C86A, $C883, $C89B, $C8B4, $C8CD, $C8E5
 .DW $C8FD, $C916, $C92E, $C946, $C95E, $C976, $C98E, $C9A6, $C9BE, $C9D6
 .DW $C9EE, $CA06, $CA1D, $CA35, $CA4C, $CA64, $CA7B, $CA92, $CAAA, $CAC1
 .DW $CAD8, $CAEF, $CB06, $CB1D, $CB34, $CB4B, $CB62, $CB79, $CB90, $CBA6
 .DW $CBBD, $CBD4, $CBEA, $CC01, $CC17, $CC2E, $CC44, $CC5A, $CC71, $CC87
 .DW $CC9D, $CCB3, $CCCA, $CCE0, $CCF6, $CD0C, $CD22, $CD38, $CD4E, $CD63
 .DW $CD79, $CD8F, $CDA5, $CDBA, $CDD0, $CDE6, $CDFB, $CE11, $CE27, $CE3C
 .DW $CE51, $CE67, $CE7C, $CE92, $CEA7, $CEBC, $CED2, $CEE7, $CEFC, $CF11
 .DW $CF26, $CF3C, $CF51, $CF66, $CF7B, $CF90, $CFA5, $CFBA, $CFCF, $CFE4
 .DW $CFF9, $D00D, $D022, $D037, $D04C, $D061, $D075, $D08A, $D09F, $D0B3
 .DW $D0C8, $D0DD, $D0F1, $D106, $D11A, $D12F, $D143, $D158, $D16C, $D181
 .DW $D195, $D1AA, $D1BE, $D1D2, $D1E7, $D1FB, $D20F, $D224, $D238, $D24C
 .DW $D260, $D275, $D289, $D29D, $D2B1, $D2C5, $D2DA, $D2EE, $D302, $D316
 .DW $D32A, $D33E, $D352, $D366, $D37A, $D38E, $D3A2, $D3B6, $D3CA, $D3DE
 .DW $D3F2, $D406, $D41A, $D42E, $D442, $D455, $D469, $D47D, $D491, $D4A5
 .DW $D4B9, $D4CC, $D4E0, $D4F4, $D508, $D51C, $D52F, $D543, $D557, $D56B
 .DW $D57E, $D592, $D5A6, $D5B9, $D5CD, $D5E1, $D5F4, $D608, $D61C, $D62F
 .DW $D643, $D657, $D66A, $D67E, $D692, $D6A5, $D6B9, $D6CC, $D6E0, $D6F4
 .DW $D707, $D71B, $D72E, $D742, $D756, $D769, $D77D, $D790, $D7A4, $D7B7
 .DW $D7CB, $D7DE, $D7F2, $D806, $D819, $D82D, $D840, $D854, $D867, $D87B
 .DW $D88E, $D8A2, $D8B5, $D8C9, $D8DC, $D8F0, $D904, $D917, $D92B, $D93E
 .DW $D952, $D965, $D979, $D98C, $D9A0, $D9B3, $D9C7, $D9DA, $D9EE, $DA02
 .DW $DA15, $DA29, $DA3C, $DA50, $DA63, $DA77, $DA8A, $DA9E, $DAB2, $DAC5
 .DW $DAD9, $DAEC, $DB00, $DB14, $DB27, $DB3B, $DB4E, $DB62, $DB76, $DB89
 .DW $DB9D, $DBB1, $DBC4, $DBD8, $DBEC, $DBFF, $DC13, $DC27, $DC3A, $DC4E
 .DW $DC62, $DC75, $DC89, $DC9D, $DCB1, $DCC4, $DCD8, $DCEC, $DD00, $DD14
 .DW $DD27, $DD3B, $DD4F, $DD63, $DD77, $DD8B, $DD9E, $DDB2, $DDC6, $DDDA
 .DW $DDEE, $DE02, $DE16, $DE2A, $DE3E, $DE52, $DE66, $DE7A, $DE8E, $DEA2
 .DW $DEB6, $DECA, $DEDE, $DEF2, $DF07, $DF1B, $DF2F, $DF43, $DF57, $DF6B
 .DW $DF80, $DF94, $DFA8, $DFBC, $DFD1, $DFE5, $DFF9, $E00E, $E022, $E036
 .DW $E04B, $E05F, $E074, $E088, $E09D, $E0B1, $E0C6, $E0DA, $E0EF, $E103
 .DW $E118, $E12D, $E141, $E156, $E16B, $E180, $E194, $E1A9, $E1BE, $E1D3
 .DW $E1E8, $E1FC, $E211, $E226, $E23B, $E250, $E265, $E27A, $E28F, $E2A5
 .DW $E2BA, $E2CF, $E2E4, $E2F9, $E30F, $E324, $E339, $E34E, $E364, $E379
 .DW $E38F, $E3A4, $E3BA, $E3CF, $E3E5, $E3FA, $E410, $E426, $E43B, $E451
 .DW $E467, $E47D, $E493, $E4A9, $E4BF, $E4D5, $E4EB, $E501, $E517, $E52D
 .DW $E543, $E559, $E570, $E586, $E59C, $E5B3, $E5C9, $E5E0, $E5F6, $E60D
 .DW $E623, $E63A, $E651, $E667, $E67E, $E695, $E6AC, $E6C3, $E6DA, $E6F1
 .DW $E708, $E71F, $E737, $E74E, $E765, $E77D, $E794, $E7AC, $E7C3, $E7DB
 .DW $E7F3, $E80A, $E822, $E83A, $E852, $E86A, $E882, $E89A, $E8B2, $E8CB
 .DW $E8E3, $E8FB, $E914, $E92C, $E945, $E95E, $E977, $E98F, $E9A8, $E9C1
 .DW $E9DA, $E9F4, $EA0D, $EA26, $EA40, $EA59, $EA73, $EA8C, $EAA6, $EAC0
 .DW $EADA, $EAF4, $EB0E, $EB28, $EB43, $EB5D, $EB78, $EB92, $EBAD, $EBC8
 .DW $EBE3, $EBFE, $EC19, $EC34, $EC50, $EC6B, $EC87, $ECA3, $ECBE, $ECDA
 .DW $ECF7, $ED13, $ED2F, $ED4C, $ED68, $ED85, $EDA2, $EDBF, $EDDC, $EDFA
 .DW $EE17, $EE35, $EE53, $EE71, $EE8F, $EEAD, $EECC, $EEEB, $EF0A, $EF29
 .DW $EF48, $EF67, $EF87, $EFA7, $EFC7, $EFE7, $F008, $F029, $F04A, $F06B
 .DW $F08C, $F0AE, $F0D0, $F0F2, $F114, $F137, $F15A, $F17D, $F1A1, $F1C5
 .DW $F1E9, $F20E, $F233, $F258, $F27E, $F2A4, $F2CA, $F2F1, $F318, $F33F
 .DW $F368, $F390, $F3B9, $F3E2, $F40C, $F437, $F462, $F48E, $F4BA, $F4E7
 .DW $F515, $F543, $F572, $F5A2, $F5D3, $F604, $F637, $F66A, $F69F, $F6D4
 .DW $F70B, $F743, $F77D, $F7B7, $F7F4, $F832, $F873, $F8B5, $F8FA, $F942
 .DW $F98C, $F9DA, $FA2C, $FA83, $FADF, $FB42, $FBAE, $FC25, $FCAD, $FD50
 .DW $FE26


;---------------------------------// КОНЕЦ //------------------------------
