 .include "m328pdef.inc"
// для сердечника из твс на 3

.equ fck	=	16000000		;частота в герцах
.equ BAUD	=	9600			;скорость
.equ UBRR_value	=	(fck/(BAUD*16))-1	;значение для регистра
.equ OneSec  = fck/256		    ;счетчик 1 секунда предделитель 256	
.equ OneSecL = low(fck/256)		;мл.б. счетчик 1 секунда предделитель 256	
.equ OneSecH = high(fck/256)	;ст.б.	

.equ MSecL = low(fck/256/250)	;мл.б. кол.циклов часов для частоты импульсов 50Гц
.equ MSecH = high(fck/256/250)	;ст.б.	(было 130)

.equ PlsWthIni = low(fck/128*0.0010);мл.б. начальная ширина имульса 400мкс (минимальная)	
.equ PlsWthMax = low(fck/128*0.001030);мл.б. разрешенная ширина имульса накачки 1030мкс (максимальная)
.equ PWPin = 0x02				;ножка для импульсов порта B (0b00000010 не номер а маска )

.equ StopTemp = 0x4A			;до какой температуры можно расширять импульс 74 град 4Ah
.equ MaxTemp = 0x50			    ;температура отключения импульсов 80град 50h
.equ TCntr = 0x04				;количество секунд ожидания ответа нагрева на увеличение импульса
.equ DPuls = 0x01				;шаг увеличения импульса




.DSEG				//0x0100
CntrSec:			.BYTE 1			;счетчик секунд на изменение длины импульса
VeryHot:			.BYTE 1			;признак "горячий"


.cseg				//0x0000

Label_01:           jmp Label_03	; Reset
					jmp Label_02	; External Interrupt Request 0
                    jmp Label_02	; External Interrupt Request 1
                    jmp Label_02	; Pin Change Interrupt Request 0
                    jmp Label_02	; Pin Change Interrupt Request 0
                    jmp Label_02	; Pin Change Interrupt Request 1
                    jmp Label_02	; Watchdog Time-out Interrupt
                    jmp Int_T2MA_01	; Timer/Counter2 Compare Match A
                    jmp Label_02	; Timer/Counter2 Compare Match B
                    jmp Label_02	; Timer/Counter2 Overflow
                    jmp Label_02	; Timer/Counter1 Capture Event
                    jmp Int_T1MA_01	; Timer/Counter1 Compare Match A
                    jmp Int_T1MB_01	; Timer/Counter1 Compare Match B
                    jmp Label_02	; Timer/Counter1 Overflow
                    jmp Label_02	; TimerCounter0 Compare Match A
                    jmp Label_02	; TimerCounter0 Compare Match B
                    jmp Label_02	; Timer/Couner0 Overflow
                    jmp Int_SPI_01	; SPI Serial Transfer Complete
                    jmp Label_02	; USART Rx Complete
                    jmp Label_02	; USART, Data Register Empty
                    jmp Label_02	; USART Tx Complete
                    jmp Label_02	; ADC Conversion Complete
                    jmp Label_02	; EEPROM Ready
                    jmp Label_02	; Analog Comparator
                    jmp Label_02	; Two-wire Serial Interface
                    jmp Label_02	; Store Program Memory Read
                    
Label_02:			cli
					jmp Label_01

					 ;поле констант

					 ;таблица значений ацп для термопары с 10 до 100 град с шагом 1 град
tmprgrid:			 .dw      0x0152       ;    338     10
					 .dw      0x015D       ;    349     
					 .dw      0x0168       ;    360     
					 .dw      0x0174       ;    372     
					 .dw      0x017F       ;    383     
					 .dw      0x018B       ;    395     
					 .dw      0x0196       ;    406     
					 .dw      0x01A2       ;    418     
					 .dw      0x01AE       ;    430     
					 .dw      0x01BA       ;    442     
					 .dw      0x01C5       ;    453     20
					 .dw      0x01D1       ;    465     1
					 .dw      0x01DD       ;    477     2
					 .dw      0x01E8       ;    488     3
					 .dw      0x01F4       ;    500     4
					 .dw      0x0200       ;    512     25   10кОм
					 .dw      0x020B       ;    523     
					 .dw      0x0216       ;    534     
					 .dw      0x0221       ;    545     
					 .dw      0x022C       ;    556     
					 .dw      0x0237       ;    567     30
					 .dw      0x0242       ;    578     
					 .dw      0x024D       ;    589     
					 .dw      0x0257       ;    599     
					 .dw      0x0262       ;    610     
					 .dw      0x026C       ;    620     
					 .dw      0x0276       ;    630     
					 .dw      0x0280       ;    640     
					 .dw      0x028A       ;    650     
					 .dw      0x0293       ;    659     
					 .dw      0x029D       ;    669     40
					 .dw      0x02A6       ;    678     
					 .dw      0x02AF       ;    687     
					 .dw      0x02B8       ;    696     
					 .dw      0x02C1       ;    705     
					 .dw      0x02C9       ;    713     
					 .dw      0x02D1       ;    721     
					 .dw      0x02DA       ;    730     
					 .dw      0x02E2       ;    738     
					 .dw      0x02E9       ;    745     
					 .dw      0x02F1       ;    753     50
					 .dw      0x02F8       ;    760     
					 .dw      0x0300       ;    768     
					 .dw      0x0307       ;    775     
					 .dw      0x030E       ;    782     
					 .dw      0x0314       ;    788     
					 .dw      0x031B       ;    795     
					 .dw      0x0321       ;    801     
					 .dw      0x0328       ;    808     
					 .dw      0x032E       ;    814     
					 .dw      0x0333       ;    819     60
					 .dw      0x0339       ;    825     
					 .dw      0x033F       ;    831     
					 .dw      0x0344       ;    836     
					 .dw      0x0349       ;    841     
					 .dw      0x034F       ;    847     
					 .dw      0x0354       ;    852     
					 .dw      0x0358       ;    856     
					 .dw      0x035D       ;    861     
					 .dw      0x0362       ;    866     
					 .dw      0x0366       ;    870     70
					 .dw      0x036B       ;    875     
					 .dw      0x036F       ;    879     
					 .dw      0x0373       ;    883     
					 .dw      0x0377       ;    887     
					 .dw      0x037B       ;    891     
					 .dw      0x037E       ;    894     
					 .dw      0x0382       ;    898     
					 .dw      0x0385       ;    901     
					 .dw      0x0389       ;    905     
					 .dw      0x038C       ;    908     80
					 .dw      0x038F       ;    911     
					 .dw      0x0392       ;    914     
					 .dw      0x0395       ;    917     
					 .dw      0x0398       ;    920     
					 .dw      0x039B       ;    923     
					 .dw      0x039E       ;    926     
					 .dw      0x03A1       ;    929     
					 .dw      0x03A3       ;    931     
					 .dw      0x03A6       ;    934     
					 .dw      0x03A8       ;    936     90
					 .dw      0x03AB       ;    939     
					 .dw      0x03AD       ;    941     
					 .dw      0x03AF       ;    943     
					 .dw      0x03B1       ;    945     
					 .dw      0x03B3       ;    947     
					 .dw      0x03B5       ;    949     
					 .dw      0x03B7       ;    951     
					 .dw      0x03B9       ;    953     
					 .dw      0x03BB       ;    955     
tmprgridend:		 .dw      0x03BD       ;    957     100



					 ;старт программы - инициализация
Label_03:           eor r1, r1			;r1 в ноль
					out SREG, r1		;в SREG ноль

                    ldi r28,low(RAMEND) 	;
                    ldi r29,high(RAMEND)	;конец рамы
                    out SPH, r29		; 
                    out SPL, r28		;загрузить стек 
					
					


                    ;начальная инициализация таймеров и порта (из дизассемблированного примера Fade)
		           /*
				    in r24, TCCR0A			;читать Timer/Counter Control Register A
                    sbr r24, 0x02			;установить регистр WGM01: Waveform Generation Mode
                    out TCCR0A, r24		;записать Timer/Counter Control Register A
                    in r24, TCCR0A			;читать Timer/Counter Control Register A
                    sbr r24, 0x01			;установить регистр WGM00: Waveform Generation Mode
                    out TCCR0A, r24		;записать Timer/Counter Control Register A		- Fast PWM	
                    in r24, TCCR0B			;читать TCCR0B – Timer/Counter Control Register B
                    sbr r24, 0x02			;
                    out TCCR0B, r24		;бит1 в единицу 
                    in r24, TCCR0B 		;читать TCCR0B – Timer/Counter Control Register B
                    sbr r24, 0x01 			;
                    out TCCR0B, r24		;бит0 в единицу  clkI/O/64 (From prescaler)
                    lds r24, TIMSK0		;читать TIMSK0 – Timer/Counter Interrupt Mask Register
                    sbr r24, 0x01			;	
                    ;sts TIMSK0, r24		;разрешить прерывание Bit 0 – TOIE0: Timer/Counter0 Overflow Interrupt Enable
                    sts TCCR1B, r1			;TCCR1B – Timer/Counter1 Control Register B  - в ноль
                    lds r24, TCCR1B		;читать TCCR1B – Timer/Counter1 Control Register B
                    sbr r24, 0x02 
                    sts TCCR1B, r24		;clkI/O/8 (From prescaler)
                    lds r24, TCCR1B		;читать TCCR1B – Timer/Counter1 Control Register B
                    sbr r24, 0x01 
                    sts TCCR1B, r24		;теперь clkI/O/64 (From prescaler)
                    lds r24, TCCR1A		;читать TCCR1A – Timer/Counter1 Control Register A
                    sbr r24, 0x01 
                    sts TCCR1A, r24		;до 00ff
                    lds r24, TCCR2B		;TCCR2B – Timer/Counter Control Register B
                    sbr r24, 0x04 
                    sts TCCR2B, r24		;clkT2S/64 (From prescaler)
                    lds r24, TCCR2A		;TCCR2A – Timer/Counter Control Register A
                    sbr r24, 0x01 
                    sts TCCR2A, r24		;0xFF TOP BOTTOM
                    lds r24, ADCSRA		; ADCSRA – ADC Control and Status Register A
                    sbr r24, 0x04 
                    sts ADCSRA, r24		;бит2 в 1
                    lds r24, ADCSRA 
                    sbr r24, 0x02	
                    sts ADCSRA, r24		;бит1 в 1 
                    lds r24, ADCSRA 
                    sbr r24, 0x01 
                    sts ADCSRA, r24		;бит0 в 1	Division Factor 128
                    lds r24, ADCSRA 
                    sbr r24, 0x80 
                    sts ADCSRA, r24		;бит7 в 1	Bit 7 – ADEN: ADC Enable
					sts UCSR0B, r1	    ;статусный регистр порта в ноль	
                */
					
					;настройка уарта
					ldi  R16,high(UBRR_value)   ;устанавливаем скорость 9600 бод
	  				sts   UBRR0H,R16
  					ldi   R16,low(UBRR_value)   
					sts   UBRR0L,R16
  					ldi   R16,0x08 ;только передатчик без прерываний
					sts   UCSR0B,R16
					ldi   R16, 0x06 ;8 бит без контроля чет 1 стоп
					sts   UCSR0C,R16
					

					;Т1 настроить на 1 секунду
					ldi r24, 0b00000000	;
					sts TCCR1A, r24		;0xFFFF TOP BOTTOM
                    ldi r24, 0b00001100	;clk/256, wgm12-1
					sts TCCR1B, r24		;предделитель
                    ldi r24, 0b00000000	;clk/256
					sts TCCR1C, r24		;предделитель
                    ldi r24, OneSecH	;
					sts OCR1AH, r24		;задать частоту 1гц
					ldi r24, OneSecL	;
					sts OCR1AL, r24		;задать частоту 
                    
					ldi r24,OneSecH/100		;
					sts OCR1BH, r24		;задать начальное срабатывание T2
					ldi r24, OneSecL/100	;
					sts OCR1BL, r24		;задать частоту 

					ldi r24, 0x06		;
					sts TIMSK1, r24		;прерывание по совпадению А и В
                    
				    ;Т2 настроить на импульс
                    ldi r24, 0x02		;WGM21-WGM20 10 CTC сброс по совпадению
					sts TCCR2A, r24		;0xFF TOP BOTTOM
                    ldi r24, 0x00		;пока таймер останавливаем
					sts TCCR2B, r24		;
                    ldi r24, PlsWthIni	
					sts OCR2A, r24		;задать начальную ширину импульса 20мкс
                    ldi r24, 0x02		;
					sts TIMSK2, r24		;прерывание на сравнение A
                    
					sei					;разрешить прерывание глобально
					
					// настроить порт B
					ldi r24, PWPin	
					out DDRB, r24		; ножку PWPin испльзовать как выход
					
					// настроить порт C
					ldi r24, 0b00000000	;
					out DDRC, r24		; все ножки как вход
					out PORTC, r24		; не подтягивать

					// начальные значения
					ldi r24, 0x00		;таймер ожидания увеличения длины импульса в ноль
					sts CntrSec,r24
					
		
		
					
					;в режим ожидания
					ldi r24, 0x01
					out SMCR, r24		;режим ожидания Idle

					;jmp Int_T1MA_01

Label_End:          sleep
					nop
					nop
					rjmp Label_End

// обработчик конца импульса
Int_T2MA_01:		push r24					
                    ldi r24, 0x00		;пока таймер останавливаем
					sts TCCR2B, r24		;
					//ldi r24, 0x00		;
					//sts TIMSK2, r24		;прерывание Т2 по совпадению А запретить
                    in r24,PINB
					cbr	r24, PWPin		;в ноль ножку
					out PORTB, r24
					pop r24
					reti



// обработчик запуска импульса
Int_T1MB_01:		push r24					
					lds r2,TCNT1L
					lds r3,TCNT1H
					//прибавить интервал
					ldi r24,MSecL
					add r2,r24 
                    ldi r24,MSecH
					adc r3,r24 
					brcc Int_T1MB_05	;если не за FFFF переход
					// выход за пределы FFFF - прибавить разницу 10000h-OneSec
					ldi r24,low(0x10000-OneSec)
					add r2,r24 
                    ldi r24,high(0x10000-OneSec)
					adc r3,r24 
					jmp Int_T1MB_07
Int_T1MB_05:		// сравнить с границей одной секунды
					push r2
					push r3
					ldi r24,low(OneSec)
					sub r2,r24 
                    ldi r24,high(OneSec)
					sbc r3,r24
					brcc Int_T1MB_06;если за OneSec переход
					pop r3
					pop r2
					jmp Int_T1MB_07
Int_T1MB_06:		pop r24				;освободить стек
					pop r24				;освободить стек
Int_T1MB_07:		// записать новой значение для сравнения
					sts OCR1BH, r3		;задать значение на совпадение B таймера T1
					sts OCR1BL, r2		;задать частоту 
					
					// проверка напряжения на входе
					ldi r24,0b01000000		;по внешн питанию, мерить ADC0 - ножка А0
					sts ADMUX,R24 
					ldi r24,0b11000100		;включить, без прерывания, делитель на 16
					sts ADCSRA,R24
Int_T1MB_11:		lds r24,ADCSRA
					sbrc r24,ADSC
					jmp Int_T1MB_11			;ждем окончания расчета
					ldi r24,0b00000000		;ADC выключен
					sts ADCSRA,R24
					lds r24,ADCL			;считали значение ADC
					lds r2,ADCH
					
					subi r24,0xD0			;
                    mov r24,r2
					sbci r24, 0x01			;сравниваем с 
					brcs Int_T1MB_19		;если на входе меньше 11.5 вольт
					

					;проверка на перегрев
					lds r24,VeryHot			;смотрим флаг перегрева
					cpi r24,0xFF
					breq Int_T1MB_19	;если был перегрев не запускать импульс


					// дать начало импульсу
					;lds	r24,OCR2A 
					;cpi r24,0
					;breq Int_T1MB_19	;если был перегрев не запускать импульс
					
					in r24,PINB
					sbr	r24, PWPin		;ножку вверх
					out PORTB, r24
					ldi r24, 0x05		;clk/128  = шаг таймера 4мкс
					sts TCCR2B, r24		;запуск
Int_T1MB_19:		pop r24
					reti




// обработчик прерывания 1 СЕКУНДА
Int_T1MA_01:		;Timer/Counter1 A Overflow
					/*
					;моргалка
					in r24,PINB
					mov r25,r24
					andi r25, 0x02	
					brne Int_T1MA_02
					sbr	r24, 0x02	
					jmp Int_T1MA_03
Int_T1MA_02:		cbr	r24, 0x02
Int_T1MA_03:		out PORTB, r24
					in r24,DDRB
					sbr r24, 0x02	
					out DDRB, r24	
					*/
					
					// померить температуру  датчик 103 (10кОм при 24С), резистр 10кОм
					
					ldi r24,0b01000100		;по внешн питанию, мерить ADC4 - ножка А4
					sts ADMUX,R24 
					ldi r24,0b11000100		;включить, запустить, делитель на 16
					sts ADCSRA,R24
Int_T1MA_04:		lds r24,ADCSRA
					sbrc r24,ADSC
					jmp Int_T1MA_04			;ждем окончания расчета
					ldi r24,0b00000000		;ADC выключен
					sts ADCSRA,R24
					lds r18,ADCL			;считали значение ADC
					lds r19,ADCH

					sei						;разрешить прерывания

					ldi r16,10				;начальный градус
					ldi r17,low(tmprgridend-tmprgrid+10);последний градус
					ldi r24,low(tmprgrid*2) 	;
                    ldi r25,high(tmprgrid*2)	;загрузить в Z адрес начала температурной таблицы
					movw r31:r30, r25:r24  ;загрузка Z-регистра входными данными
					lpm r0,Z+
					lpm r1,Z+
					push r0
					push r1
					sub r0,r18
					sbc r1,r19
					brcc Int_T1MA_14		;меньше равно 10 градусов
Int_T1MA_07:		lpm r0,Z+
					lpm r1,Z+
					push r0
					push r1
					sub r0,r18
					sbc r1,r19
					pop r1
					pop r0					;восстановить значение текущего интервала
					pop r25
					pop	r24					;восстановить предидущее значение	
					brcc Int_T1MA_09		;попали в интервал
					push r0
					push r1					;сохранить текущее в качестве предидущего
					inc r16					;увеличить градус
					cpse r16,r17			;если дошли до последнего градуса пропустить
					jmp Int_T1MA_07
					jmp Int_T1MA_14			;выше 70 градусов
Int_T1MA_09:		sub r0,r24
					sbc r1,r25				;значение в итервале которое равно 1градусу 
					sub r18,r24
					sbc r19,r25				;значение от прошлого интервала
					movw r25:r24, r1:r0		;значение в итервале которое равно 1градусу
					ldi r19,100
					mul r19,r18				;умножить на 100
					ldi r17,0
Int_T1MA_10:		sub r0,r24
					sbc r1,r25				;значение в итервале которое равно 1градусу 
					brcs Int_T1MA_16		;целое кончилось выход
					inc r17
					jmp Int_T1MA_10
Int_T1MA_14:		pop r1
					pop r0
					ldi r17,0				;десятую часть в ноль
Int_T1MA_16:		;выдать измеренную температуру в порт без контроля по прерыванию
					sts   UDR0,R16
					//sts   UDR0,R17
					
					;управление шириной импульса в зависимости от температуры  
					
										
					cpi r16,MaxTemp			;сравнить с температурой перегрева
					brcs Int_T1MA_22		;нет перегрева перейти
					;пеергрев - отключить импульсы
					ldi	r24, 0xFF			;установить признак перегрева
					sts VeryHot,r24
					;ldi	r24, 0
					;sts	OCR2A,r24 
					jmp Int_T1MA_76
Int_T1MA_22:		;нет перегрева
					ldi	r24, 0
					sts VeryHot,r24			;снять флаг перегрева
					
					lds	r24, OCR2A
					;cpi r24,0
					;breq Int_T1MA_76		;если был перегрев
					cpi r24, PlsWthMax
					brcc Int_T1MA_76		;если размер импульса максимальный не анализировать
					cpi r16, StopTemp			;сравнить с X градусов
					brcc Int_T1MA_76		;достигли x градусов не прибавлять 
					lds r24,CntrSec
					inc r24
					sts CntrSec,r24
					cpi r24,TCntr
					brcs Int_T1MA_76		;еще ждем 
					ldi r24,0
					sts CntrSec,r24			;счетчик ожидания в ноль
					ldi r17,DPuls
					lds	r24,OCR2A 
					add r24,r17
					sts	OCR2A,r24			;увеличить импульс

Int_T1MA_76:		lds	r24, OCR2A
					sts   UDR0,R24
					ret

					/*
					для телека по достижение 70 градусов включить светодиод
					subi r16, 0x45
					brcs Int_T1MA_19
					;моргалка
					in r24,PINB
					mov r25,r24
					andi r25, 0x02	
					brne Int_T1MA_02
					sbr	r24, 0x02	
					jmp Int_T1MA_03
Int_T1MA_02:		cbr	r24, 0x02
Int_T1MA_03:		out PORTB, r24
					in r24,DDRB
					sbr r24, 0x02	
					out DDRB, r24	
					jmp Int_T1MA_20
Int_T1MA_19:		in r24,PINB
					mov r25,r24
					andi r25, 0x02	
					breq Int_T1MA_20			
					cbr	r24, 0x02
					out PORTB, r24
Int_T1MA_20:
					ret
					*/

					
					
						

					
				
					 /*
					 ldi r24, 0x09			;в r24 = 9
                     call Label_28			;вызов процедурки 2
                     ldi r16, 0x71 
                     ldi r17, 0x00			;r16r17 = 0071
                     ldi r25, 0x00 
	                 mov r14, r25			;r14=0
                     ldi r25, 0x00 
                     mov r15, r25			;r15=0
Label_48:            lds r28, 0x010B		;из sram 
                     lds r29, 0x010C		;из sram 
                     ldi r24, 0x09				
                     call Label_28			;второй вызов процедурки 2 так же на входе r24=9
                     sbiw r29:r28, 0x00		;минус ноль	
                     brne Label_29			;если Y регистр не ноль
Label_42:            ldi r22, 0x00 
                     rjmp Label_30 
Label_29:            cpi r28, 0xFF 
                     cpc r29, r1 
                     brne Label_31 
Label_41:            ldi r22, 0x01 
Label_30:            ldi r24, 0x09 
                     call Label_32 
                     rjmp Label_33 
Label_31:            movw r31:r30, r17:r16 
                     lpm r24, Z 
                     cpi r24, 0x03 
                     breq Label_34 
                     brsh Label_35 
                     cpi r24, 0x01 
                     breq Label_36 
                     cpi r24, 0x02 
                     brne Label_37 
                     in r24, TCCR0A 
                     sbr r24, 0x20 
                     out TCCR0A, r24 
                     out OCR0B, r28 
                     rjmp Label_33 
Label_35:            cpi r24, 0x07 
                     breq Label_38 
                     cpi r24, 0x08 
                     breq Label_39 
                     cpi r24, 0x04 
                     brne Label_37 
                     lds r24, TCCR1A 
                     sbr r24, 0x20 
                     sts TCCR1A, r24 
                     sts OCR1BH, r29 
                     sts OCR1BL, r28 
                     rjmp Label_33 
Label_36:            in r24, TCCR0A 
                     sbr r24, 0x80 
                     out TCCR0A, r24 
                     out OCR0A, r28 
                     rjmp Label_33 
Label_34:            lds r24, TCCR1A 
                     sbr r24, 0x80 
                     sts TCCR1A, r24 
                     sts OCR1AH, r29 
                     sts OCR1AL, r28 
                     rjmp Label_33 
Label_38:            lds r24, TCCR2A 
                     sbr r24, 0x80 
                     sts TCCR2A, r24 
                     sts OCR2A, r28 
                     rjmp Label_33 
Label_39:            lds r24, TCCR2A 
                     sbr r24, 0x20 
                     sts TCCR2A, r24 
                     sts OCR2B, r28 
                     rjmp Label_33 
Label_37:            cpi r28, 0x80 
                     cpc r29, r1 
                     brlt Label_40 
                     rjmp Label_41 
Label_40:            rjmp Label_42 
Label_33:            lds r18, 0x0100 
                     lds r19, 0x0101 
                     lds r24, 0x010B 
                     lds r25, 0x010C 
                     add r24, r18 
                     adc r25, r19 
                     sts 0x010C, r25 
                     sts 0x010B, r24 
                     sbiw r25:r24, 0x01 
                     cpi r24, 0xFE 
                     cpc r25, r1 
                     brlo Label_43 
                     neg r19 
                     neg r18 
                     sbc r19, r1 
                     sts 0x0101, r19 
                     sts 0x0100, r18 
Label_43:            call Label_44 
                     movw r5:r4, r23:r22 
                     movw r7:r6, r25:r24 
                     ldi r24, 0x1E 
                     mov r8, r24 
                     mov r9, r1 
                     mov r10, r1 
                     mov r11, r1 
Label_46:            call Label_44 
                     movw r27:r26, r25:r24 
                     movw r25:r24, r23:r22 
                     sub r24, r4 
                     sbc r25, r5 
                     sbc r26, r6 
                     sbc r27, r7 
                     cpi r24, 0xE8 
                     sbci r25, 0x03 
                     cpc r26, r1 
                     cpc r27, r1 
                     brlo Label_45 
                     ldi r31, 0x01 
                     sub r8, r31 
                     sbc r9, r1 
                     sbc r10, r1 
                     sbc r11, r1 
                     ldi r18, 0xE8 
                     add r4, r18 
                     ldi r18, 0x03 
                     adc r5, r18 
                     adc r6, r1 
                     adc r7, r1 
Label_45:            cp r8, r1 
                     cpc r9, r1 
                     cpc r10, r1 
                     cpc r11, r1 
                     brne Label_46 
                     cp r14, r1 
                     cpc r15, r1 
                     brne Label_47 
                     rjmp Label_48 
Label_47:            call Label_09 
                     rjmp Label_48 
					 

Label_8:             cli					;запрет прерываний
Label_49:            rjmp Label_49 
						*/


						/*
					 ;процедурка 2	на входе r24 (вызов из процедурки1 r24=09) манипуляции с константами
Label_28:            ldi r25, 0x00 
                     movw r31:r30, r25:r24  ;загрузка Z-регистра входными данными
                     subi r30, 0x5C			;
                     sbci r31, 0xFF			;Z минус FF5C (z = 0009 - ff5c = 00ad (/2=56) )  
                     lpm r18, Z				;чтение из программной памяти по адресу Z  (01)
                     movw r31:r30, r25:r24	;загрузка Z-регистра входными данными
                     subi r30, 0x70			; 
                     sbci r31, 0xFF			;Z минус FF70 (z = 0009 - ff70 = 0099 (/2=4c старший байт) ) 
                     lpm r24, Z				;чтение из программной памяти по адресу Z (02)
                     and r24, r24			;финт с флагами
                     breq Label_10			;если r24=0 переход на выход
                     ldi r25, 0x00			;r25=0
                     add r24, r24			;
                     adc r25, r25			;
                     movw r31:r30, r25:r24 
                     subi r30, 0x7A 
                     sbci r31, 0xFF			;0004 - FF7A = 008A (WORD 0045)
                     lpm r26, Z+ 
                     lpm r27, Z				;в X = 0024
                     movw r31:r30, r25:r24 
                     subi r30, 0x84 
                     sbci r31, 0xFF			;0004 - FF84 = 0080 (WORD 0040)
                     lpm r24, Z+ 
                     lpm r25, Z				;в r24r25 = 0025
	                 in r24, SREG			;сохранить в r24 регистр флагов
                     cli					;запретить прерывания
                     ld r30, X 
                     or r30, r18			;в r18 01
                     st X, r30				;ddrb0 в 1
                     out SREG, r24			;восстановить из r24 регистр флагов
Label_10:            ret 

Label_32:            ldi r25, 0x00 
                     movw r31:r30, r25:r24 
                     subi r30, 0x98 
                     sbci r31, 0xFF 
                     lpm r19, Z 
                     movw r31:r30, r25:r24 
                     subi r30, 0x5C 
                     sbci r31, 0xFF 
                     lpm r18, Z 
                     movw r31:r30, r25:r24 
                     subi r30, 0x70 
                     sbci r31, 0xFF 
                     lpm r30, Z 
                     and r30, r30 
                     brne Label_11 
                     rjmp Label_12 
Label_11:            and r19, r19 
                     breq Label_13 
                     cpi r19, 0x03 
                     breq Label_14 
                     brsh Label_15 
                     cpi r19, 0x01 
                     breq Label_16 
                     cpi r19, 0x02 
                     brne Label_13 
                     in r24, TCCR0A 
                     andi r24, 0xDF 
                     rjmp Label_17 
Label_15:            cpi r19, 0x07 
                     breq Label_18 
                     cpi r19, 0x08 
                     breq Label_19 
                     cpi r19, 0x04 
                     brne Label_13 
                     lds r24, TCCR1A 
                     andi r24, 0xDF 
                     rjmp Label_20 
Label_14:            lds r24, TCCR1A 
                     andi r24, 0x7F 
Label_20:            sts TCCR1A, r24 
                     rjmp Label_13 
Label_16:            in r24, TCCR0A 
                     andi r24, 0x7F 
Label_17:            out TCCR0A, r24 
                     rjmp Label_13 
Label_18:            lds r24, TCCR2A 
                     andi r24, 0x7F 
                     rjmp Label_21 
Label_19:            lds r24, TCCR2A 
                     andi r24, 0xDF 
Label_21:            sts TCCR2A, r24 
Label_13:            ldi r31, 0x00 
                     add r30, r30 
                     adc r31, r31 
                     subi r30, 0x84 
                     sbci r31, 0xFF 
                     lpm r26, Z+ 
                     lpm r27, Z 
                     in r24, SREG 
                     cli 
                     ld r30, X 
                     cpse r22, r1 
                     rjmp Label_22 
                     com r18 
                     and r18, r30 
                     rjmp Label_23 
Label_22:            or r18, r30 
Label_23:            st X, r18 
                     out SREG, r24 
Label_12:            ret 

Label_44:            in r19, SREG 
                     cli 
                     lds r24, 0x0107 
                     lds r25, 0x0108 
                     lds r26, 0x0109 
                     lds r27, 0x010A 
                     in r18, TCNT0 
                     sbis TIFR0, TOV0 
                     rjmp Label_24 
                     cpi r18, 0xFF 
                     breq Label_24 
                     adiw r25:r24, 0x01 
                     adc r26, r1 
                     adc r27, r1 
Label_24:            out SREG, r19 
                     mov r27, r26 
                     mov r26, r25 
                     mov r25, r24 
                     eor r24, r24 
                     add r24, r18 
                     adc r25, r1 
                     adc r26, r1 
                     adc r27, r1 
                     movw r23:r22, r25:r24 
                     movw r25:r24, r27:r26 
                     ldi r20, 0x02 
Label_25:            add r22, r22 
                     adc r23, r23 
                     adc r24, r24 
                     adc r25, r25 
                     dec r20 
                     brne Label_25 
                     ret 
					 */

					 ;обработка прерывания spi
Int_SPI_01:          push r1 
                     push r0 
                     in r0, SREG 
                     push r0 
                     eor r1, r1 
                     push r18 
                     push r19 
                     push r24 
                     push r25 
                     push r26 
                     push r27 
                     lds r24, 0x0103 
                     lds r25, 0x0104 
                     lds r26, 0x0105 
                     lds r27, 0x0106 
                     lds r19, 0x0102 
                     ldi r18, 0x03 
                     add r18, r19 
                     cpi r18, 0x7D 
                     brsh Int_SPI_02 
                     adiw r25:r24, 0x01 
                     adc r26, r1 
                     adc r27, r1 
                     rjmp Int_SPI_03 
Int_SPI_02:          ldi r18, 0x86 
                     add r18, r19 
                     adiw r25:r24, 0x02 
                     adc r26, r1 
                     adc r27, r1 
Int_SPI_03:          sts 0x0102, r18 
                     sts 0x0103, r24 
                     sts 0x0104, r25 
                     sts 0x0105, r26 
                     sts 0x0106, r27 
                     lds r24, 0x0107 
                     lds r25, 0x0108 
                     lds r26, 0x0109 
                     lds r27, 0x010A 
                     adiw r25:r24, 0x01 
                     adc r26, r1 
                     adc r27, r1 
                     sts 0x0107, r24 
                     sts 0x0108, r25 
                     sts 0x0109, r26 
                     sts 0x010A, r27 
                     pop r27 
                     pop r26 
                     pop r25 
                     pop r24 
                     pop r19 
                     pop r18 
                     pop r0 
                     out SREG, r0 
                     pop r0 
                     pop r1 
                     reti 

					 
