
.include "m328pdef.inc"	; кварц4МГц
.cseg
.org 0				;начало кода
	jmp start
.org 0x0016			;Output Compare1A Interrupt Vector Address
	jmp timer1compare
.org 0x001a			;переполнение timer1
    jmp timer1
.org 0x002a				;прер. АЦП
	jmp adc_complete       ;подпрограмма АЦП (срабатывает редко)


start:
;=========Стек===========
ldi R16, low(RAMEND) ;низ стека
out SPL, R16 
ldi R16, high(RAMEND);верх стека
out SPH, R16
;====установка портов====
ldi R16, 0b00000000	;0=все на вход
out ddrC, R16		;
ldi R16, 0b00110000
out PortC, R16		;подтягивающие резисторы
ldi R16, 0b00010000
out ddrD, R16		;PD0-вх,PD4-выхDC-CDI
ldi R16, 0b00010001
out PortD, R16		;подтягивающие резиторы
ldi R16, 0b00000001 
out ddrB, R16		;вых pb0 
clr R16
out PortB, R16		;подтягивающие резисторы

;========регистры========
clr R0				;для умножения
clr R1				;для умножения
clr R2				;"0", для умножения
clr R3				;множитель задержки из ОЗУ H
clr R4				;множитель задержки из ОЗУ L
clr R5				;старший бит задержки x%
clr R6				;младший бит задержки x%
clr R7				;OCR1AH
clr R8				;OCR1AL
clr R9				;TCNT1H
clr R10				;TCNT1L,счет1
clr R11				;TCNT1H
clr R12				;TCNT1L,счет2
clr R14				;АЦП
clr R15				;рон sreg,счетч
cpi R17,8			;АЦП2,на старте среднее
clr R18				;задержка опускания искры
clr R19				;РОН опускания упр.DC-CDI
ldi R20,0b10000000	;РОН статуса
clr R21				;РОН рассчета задержки для ОЗУ
clr R22             ;изменение длительности импульса
ldi R23,0b11001101  ;для вкл ацп измерения 
clr R25				;множитель задержки из ОЗУ
clr R26				;РОН "lowX",адресация ОЗУ,LD
clr R27				;POH "highX",адресация ОЗУ,LD
clr R28             ;растяжка ослепления
;===таблица в озу===
rcall FuozTable1
rcall FuozTable2
rcall FuozTable3	;таблицы задержек в ОЗУ
;========Timer+ADC=======
cli
LDI   R16,0b10000000    ;1<<CLKPCE
   STS   CLKPR,R16
   LDI   R16,0b10000010 ;1<<CLKPS1|1<<CLKPS0
   STS   CLKPR,R16      ; Fclk/4

ldi R16, 0b00000010	;задержка 8,для счета при 4МГц
sts TCCR1B, R16 	;пуск таймера 16-бит
ldi R16, 0b00000011
sts TIMSK1, R16 		;настройки 16-бит счетчика
ldi R16, 0b01100010	;AD_Converter ADMUX byte
sts ADMUX, R16      
ldi R16, 0b10001101	;AD_Converter ADCSRA byte,125kHz
sts ADCSRA, R16		;первый замер АЦП 800т,следующие 416т 
sei 				;вкл. прерывания в ЦП
;==конец инициализации устройств, далее основной код==

main:
;блок задержки искры, опускает искру
;не отнимая сремени ЦП на выполнение кода
sbic PinB,0		;выполнить если бит порта "1"
inc R18			;+1
cpi R18, 25		;80mks
brlo main2		;перейти если меньше
;а если больше, опустим искру
cbi PortB,0		;лог"0"на выход "искра"
clr R18			;РОН задержки опускания искры
main2:

;блок задержки опускания Flyback
sbis PinD,4		;выполнить если бит порта "0"
inc R19			;+1
cp R19,R22		;252mks,flyback
brlo main3		;перейти если меньше
clr R19
inc R28
cpi R28,40
brlo main3 ;а если больше,вкл.генератор DC-CDI
sbi PortD,4		;лог"1"на выход "flyback"
clr R19			;РОН задержки DC-CDI
clr R28
main3:

;ожидание импульса
sbic PinD,0		;выполнить если бит порта "1"
andi R20, 0b10111111;cbiR20/6, контроль

;пришел ипмульс датчика
sbis PinD,0		;выполнить если бит порта "0"
rcall impuls

sbrs R20, 5		;if pinX,n='0' then do
rjmp main
sbrc R20, 7		;if pinX,n='1' then do
rcall holostie
sbrs R20, 7		;if pinX,n='0' then do
rcall norm
rjmp main
nop
nop
nop
;-------------------------------------------------------------
;----------------далее только подпрограммы--------------------
;-------------------------------------------------------------
;==переполнение 16-бит счетчика==
timer1:
;переполнение означает что частота оборотов ниже 480/мин
in R15,SREG		;сохраним SREG
ori R20, 0b10000000	;sbiR20/7, контроль
out SREG,R15	;восстановим SREG
reti


;=совпадение сравнения OCR1A, 16-бит счетчика=
;рассчетная искра цилиндра один
timer1compare:
in R15,SREG		;сохраним SREG
sbrs R20, 4		;if pinX,n='0' then do
reti
sbi PortB,0		;лог"1"на выход "искра"
cbi PortD,4		;лог"0"на выход "flyback"
andi R20, 0b11101111;cbiR20/4, контроль
out SREG,R15	;восстановим SREG
reti


;====АЦП замер сделан====
adc_complete:
lds R14, ADCL	
lds R14, ADCH   
lsr R14			;1/2=128
lsr R14			;1/2=64
lsr R14			;1/2=32
lsr R14                 ;1/2=16 
ori R20, 0b00000010;sbiR20/1,АЦП,контроль
reti


;====импульс вмт датчика====
impuls:
sbis PinD,4		;выполнить если бит порта "0"
ret				;если искра активна,вых.
sbrc R20, 6		;if pinX,n='1' then do
ret				;если уже был счет то выход
cbi PortD,4		;лог"0"на выход "flyback"
cli
lds R10, TCNT1L
lds R9, TCNT1H	;считываем показания счетчика
clr R2
sts TCNT1H, R2	;R2=0    
sts TCNT1L, R2	;обнуляем счетчик
sei
ori R20, 0b01100000	;sbiR20/6,5, контроль
;показания счетчика записаны, счетчик обнулен
ret



;====нормальные обороты=====
;=определяем задержку искры=
norm:
mov R21, R9		;скопируем значение счетчика 16-бит
com R21			;инвертируем число
;теперь имеем 255 значений счетчика оборотов,
;наименьшее значение - медленные обороты, большее - большые
;для усреднения точек таблицы выборка делаеться
;через некоторое число точек, для равномерности
ldi R22,250
sub R22,R21       ;для растяжки импульса ослепления
cpi R21, 236	;сравнение РОН с контстантой
brsh rpm19k5	;если больше или равно
cpi R21, 234	;сравнение РОН с контстантой
brsh rpm16k7	;если больше или равно
cpi R21, 232	;сравнение РОН с контстантой
brsh rpm14k6	;если больше или равно
cpi R21, 230	;сравнение РОН с контстантой
brsh rpm13k		;если больше или равно
cpi R21, 227	;сравнение РОН с контстантой
brsh rpm11k7	;если больше или равно
cpi R21, 225	;сравнение РОН с контстантой
brsh rpm10k6	;если больше или равно
cpi R21, 222	;сравнение РОН с контстантой
brsh rpm9k7		;если больше или равно
cpi R21, 218	;сравнение РОН с контстантой
brsh rpm9k		;если больше или равно
cpi R21, 216	;сравнение РОН с контстантой
brsh rpm8k3		;если больше или равно
cpi R21, 213	;сравнение РОН с контстантой
brsh rpm7k8		;если больше или равно
cpi R21, 210	;сравнение РОН с контстантой
brsh rpm7k3		;если больше или равно
cpi R21, 208	;сравнение РОН с контстантой
brsh rpm6k9		;если больше или равно
cpi R21, 206	;сравнение РОН с контстантой
brsh rpm6k5		;если больше или равно
cpi R21, 204	;сравнение РОН с контстантой
brsh rpm6k1		;если больше или равно
cpi R21, 202	;сравнение РОН с контстантой
brsh rpm5k6		;если больше или равно
cpi R21, 199	;сравнение РОН с контстантой
brsh rpm5k1		;если больше или равно
cpi R21, 196	;сравнение РОН с контстантой
brsh rpm4k7		;если больше или равно
cpi R21, 193	;сравнение РОН с контстантой
brsh rpm4k2		;если больше или равно
cpi R21, 190	;сравнение РОН с контстантой
brsh rpm3k9		;если больше или равно
cpi R21, 186	;сравнение РОН с контстантой
brsh rpm3k5		;если больше или равно
cpi R21, 182	;сравнение РОН с контстантой
brsh rpm3k		;если больше или равно
cpi R21, 177	;сравнение РОН с контстантой
brsh rpm2k8		;если больше или равно
cpi R21, 171	;сравнение РОН с контстантой
brsh rpm2k5		;если больше или равно
cpi R21, 165	;сравнение РОН с контстантой
brsh rpm2k2		;если больше или равно
cpi R21, 157	;сравнение РОН с контстантой
brsh rpm2k		;если больше или равно
cpi R21, 148	;сравнение РОН с контстантой
brsh rpm1k8		;если больше или равно
cpi R21, 138	;сравнение РОН с контстантой
brsh rpm1k5		;если больше или равно
cpi R21, 125	;сравнение РОН с контстантой
brsh rpm1k2		;если больше или равно
cpi R21, 109	;сравнение РОН с контстантой
brsh rpm1k		;если больше или равно
cpi R21, 88	;сравнение РОН с контстантой
brsh rpm0k8		;если больше или равно
cpi R21, 60		;сравнение РОН с контстантой
brsh rpm0k6		;если больше или равно
clr R26			;если 500 и меньше об/мин
rjmp RpmEnd		;всего 32строки
////////////////////////////////////////////////////////
rpm19k5:		;обороты
ldi R26, 0x1F	;задаем адрес ОЗУ "lowХ"
rjmp RpmEnd		;метка "дальше"
rpm16k7:
ldi R26, 0x1E
rjmp RpmEnd
rpm14k6:
ldi R26, 0x1D
rjmp RpmEnd
rpm13k:
ldi R26, 0x1C
rjmp RpmEnd
rpm11k7:
ldi R26, 0x1B
rjmp RpmEnd
rpm10k6:
ldi R26, 0x1A
rjmp RpmEnd
rpm9k7:
ldi R26, 0x19
rjmp RpmEnd
rpm9k:
ldi R26, 0x18
rjmp RpmEnd
rpm8k3:
ldi R26, 0x17
rjmp RpmEnd
rpm7k8:
ldi R26, 0x16
rjmp RpmEnd
rpm7k3:
ldi R26, 0x15
rjmp RpmEnd
rpm6k9:
ldi R26, 0x14
rjmp RpmEnd
rpm6k5:
ldi R26, 0x13
rjmp RpmEnd
rpm6k1:
ldi R26, 0x12
rjmp RpmEnd
rpm5k6:
ldi R26, 0x11
rjmp RpmEnd
rpm5k1:
ldi R26, 0x10
rjmp RpmEnd
rpm4k7:
ldi R26, 0x0F
rjmp RpmEnd
rpm4k2:
ldi R26, 0x0E
rjmp RpmEnd
rpm3k9:
ldi R26, 0x0D
rjmp RpmEnd
rpm3k5:
ldi R26, 0x0C
rjmp RpmEnd
rpm3k:
ldi R26, 0x0B
rjmp RpmEnd
rpm2k8:
ldi R26, 0x0A
rjmp RpmEnd
rpm2k5:
ldi R26, 0x09
rjmp RpmEnd
rpm2k2:
ldi R26, 0x08
rjmp RpmEnd
rpm2k:
ldi R26, 0x07
rjmp RpmEnd
rpm1k8:
ldi R26, 0x06
rjmp RpmEnd
rpm1k5:
ldi R26, 0x05
rjmp RpmEnd
rpm1k2:
ldi R26, 0x04
rjmp RpmEnd
rpm1k:
ldi R26, 0x03
rjmp RpmEnd
rpm0k8:
ldi R26, 0x02
rjmp RpmEnd
rpm0k6:
ldi R26, 0x01
;адрес ОЗУ "lowХ" определен
;задействованно ОЗУ 0х0100-0х011F,32строки
RpmEnd:

;выбор таблицы УОЗ тумблером на"0"
;приоритет у нижних таблиц
ldi R27, 0x01	;задаем "highX"таблица№1
sbis PinC,5		;выполнить если бит порта "0"
ldi R27, 0x02	;задаем "highX"таблица№2
sbis PinC,4		;выполнить если бит порта "0"
ldi R27, 0x03	;задаем "highX"таблица№3
;адрес ОЗУ "HighХ" определен, чтение ОЗУ
ld R25, X		;байт из ОЗУ-R27:26 загружается в РОН25

;АЦП корректор:
sts ADCSRA, R23 	;R23 старт замер АЦП 
sbrs R20, 1		;if pinX,n='0' then do
rjmp ADC_negotov
mov R17,R14		;новый сдвиг
andi R20, 0b11111101;cbiR20/1, контроль
ADC_negotov:
;АЦП корректор
cpi R17,8		;средина резистора
brlo adc_plus	        ;если меньше
;adc_minus:
mov R16,R17
subi R16,8		;0...15
sub R25,R16		;"задержка" минус АЦП
brpl adc_exit	        ;если больше нуля,вых
clr R25			;иначе 0
rjmp adc_exit	;вых
adc_plus:
ldi R16,8
sub R16,R17		;инверсия,0...15
add R25,R16		;"задержка" плюс АЦП
adc_exit:


cpi R21, 177		;перейти если меньше 1500об
brlo troling
rjmp raschet
troling:
mov R6,R10		;копируем оборот
mov R5,R9		
cp R10,R12		;сравнимваем с предыдущим
cpc R9,R11		
breq rovno1		;если равны,нет рассчета
mov R10,R12
mov R9,R11
rovno1:
mov R12,R6        ;задержка искры будет по предыдущему обороту
mov R11,R5        ;т.е. поддерживать стабильность.
;R10:R9-текущий
;R12:R11-будет предыдущим
;R6:R5-текущий для сравнения

raschet:
;проверим на нулевое значение, что
;соответствует оборотам более 4к
;при этом искра по датчику уоз,20°
cpi R25, 1		;"min" перейти если меньше
brlo iskra		;искра без задержки

;рассчет УОЗ
mov R5, R9		;копируем реал оборот
mov R6, R10		;копируем 
lsr R5			;1/2,шаг смены
ror R6			;угла 360°/512=0.7°
;========умножение:R5R6*R25=R7R8===============
mul R5,R25		;старший и младший
mov R8,R0
mov R7,R1
mul R6,R25		;младший и младший
add R8,R1
adc R7,R2		;R2=0
;теперь имеем R7R8 значение задержки
;запишем в регистр сравнения 16-бит счетчика
cli
sts OCR1AH, R7	;записываем задержку HighByte
sts OCR1AL, R8	;записываем задержку LowByte
sei
ori R20, 0b00010000	;sbiR20/4, контроль
andi R20, 0b11011111;cbiR20/5, контроль
ret


;======искра без задержки, сразу по датчику=======
;при первом переходе с запаздывания на опережение
;этот блок нужен для устранения провала при переходе
iskra:
sbi PortB,0		;лог"1"на выход "искра"
cbi PortD,4     ;лог"0"на выход "flyback"
andi R20, 0b11011111;cbiR20/5, контроль
ret

;==холостые(низкие) обороты==
;режим активен при переполнении счетчика
;когда обороты ниже чем 460/мин
;при этом рассчет задержки невозможен
;и имеет смысл делать ее константой для
;познего зажигания 4°,без пропусков искры
holostie:
ser R16			;РОН=0xFF
mov R9, R16		;сработает как 500/мин
mov R10, R16	;и мл.
andi R20, 0b01111111;cbiR20/7, контроль
ret


;таблица контрольных бит, РОН20
;R20/7-холостые обороты, переполнение 16-бит счетчика
;R20/6-пришел импульс с датчика, бит-1, контроль вала
;R20/5-пришел импульс с датчика, бит-2, контроль рассчета
;R20/4-окончен рассчет опережения, вкл. сравнение
;R20/3-переход на опережение оборота 0x1FF
;R20/1-АЦП,коректор,замер сделан


;==таблица №1,углов опережения в ОЗУ==
;=======для метки 20°, шаг 0.7°=======
FuozTable1:
ldi R27, 0x01	;задаем "highX"=01
ldi R26, 0x00	;задаем "lowX"=00
;опережение при оборотах
;500 и ниже, об/мин
ldi R16, 47	;множитель
st X+, R16	;в ОЗУ, 2,1°
;600 об/мин
ldi R16, 46	;множитель
st X+, R16	;в ОЗУ, 2,8°
;800 об/мин
ldi R16, 44	;множитель
st X+, R16	;в ОЗУ, 4,2°
;1000 об/мин
ldi R16, 43	;множитель
st X+, R16	;в ОЗУ, 4,9°
;1200 об/мин
ldi R16, 41	;множитель
st X+, R16	;в ОЗУ, 6,3°
;1500 об/мин
ldi R16, 40	;множитель
st X+, R16	;в ОЗУ, 7°
;1800 об/мин
ldi R16, 39	;множитель
st X+, R16	;в ОЗУ, 7,7°
;2000 об/мин
ldi R16, 37	;множитель
st X+, R16	;в ОЗУ, 9,1°
;2200 об/мин
ldi R16, 34	;множитель
st X+, R16	;в ОЗУ, 11,2°
;2500 об/мин
ldi R16, 31	;множитель
st X+, R16	;в ОЗУ, 13,3°
;2800 об/мин
ldi R16, 29	;множитель
st X+, R16	;в ОЗУ, 14,7°
;3000 об/мин
ldi R16, 27	;множитель
st X+, R16	;в ОЗУ, 16,1°
;3500 об/мин
ldi R16, 24	;множитель
st X+, R16	;в ОЗУ, 18,2°
;3900 об/мин
ldi R16, 23	;множитель
st X+, R16	;в ОЗУ, 18,9°
;4200 об/мин
ldi R16, 21	;множитель
st X+, R16	;в ОЗУ, 20,3°
;4700 об/мин
ldi R16, 20	;множитель
st X+, R16	;в ОЗУ, 21°
;5100 об/мин
ldi R16, 19	;множитель
st X+, R16	;в ОЗУ, 21,7°
;5600 об/мин
ldi R16, 17	;множитель
st X+, R16	;в ОЗУ, 23,1°
;6100 об/мин
ldi R16, 16	;множитель
st X+, R16	;в ОЗУ, 23,8°
;6500 об/мин
ldi R16, 14	;множитель
st X+, R16	;в ОЗУ, 25,2°
;6900 об/мин
ldi R16, 13	;множитель
st X+, R16	;в ОЗУ, 25,9°
;7300 об/мин
ldi R16, 11	;множитель
st X+, R16	;в ОЗУ, 27,3°
;7800 об/мин
ldi R16, 10	;множитель
st X+, R16	;в ОЗУ, 28°
;8300 об/мин
ldi R16, 9	;множитель
st X+, R16	;в ОЗУ, 28,7°
;9000 об/мин
ldi R16, 7	;множитель
st X+, R16	;в ОЗУ, 30,1°
;9700 об/мин
ldi R16, 6	;множитель
st X+, R16	;в ОЗУ, 30,8°
;10600 об/мин
ldi R16, 4	;множитель
st X+, R16	;в ОЗУ, 32,2°
;11700 об/мин
ldi R16, 3	;множитель
st X+, R16	;в ОЗУ, 32,9°
;13000 об/мин
ldi R16, 1	;множитель
st X+, R16	;в ОЗУ, 34,3°
;14600 об/мин
ldi R16, 0	;множитель
st X+, R16	;в ОЗУ, 35°
;16700 об/мин
ldi R16, 0	;множитель
st X+, R16	;в ОЗУ, 35°
;19500 об/мин
ldi R16, 29	;множитель
st X+, R16	;в ОЗУ, 14,7°
ret		;возврат в программу

;==таблица №2,углов опережения в ОЗУ==
;=======для метки 20°, шаг 1.4°=======
FuozTable2:
ldi R27, 0x02	;задаем "highX"=02
ldi R26, 0x00	;задаем "lowX"=00
;опережение при оборотах
;500 и ниже, об/мин
ldi R16, 44	;множитель
st X+, R16	;в ОЗУ, 4,2°
;600 об/мин
ldi R16, 43	;множитель
st X+, R16	;в ОЗУ, 4,9°
;800 об/мин
ldi R16, 41	;множитель
st X+, R16	;в ОЗУ, 6,3°
;1000 об/мин
ldi R16, 40	;множитель
st X+, R16	;в ОЗУ, 7°
;1200 об/мин
ldi R16, 39	;множитель
st X+, R16	;в ОЗУ, 7,7°
;1500 об/мин
ldi R16, 37	;множитель
st X+, R16	;в ОЗУ, 9,1°
;1800 об/мин
ldi R16, 36	;множитель
st X+, R16	;в ОЗУ, 9,8°
;2000 об/мин
ldi R16, 34	;множитель
st X+, R16	;в ОЗУ, 11,2°
;2200 об/мин
ldi R16, 31	;множитель
st X+, R16	;в ОЗУ, 13,3°
;2500 об/мин
ldi R16, 29	;множитель
st X+, R16	;в ОЗУ, 14,7°
;2800 об/мин
ldi R16, 26	;множитель
st X+, R16	;в ОЗУ, 16,8°
;3000 об/мин
ldi R16, 23	;множитель
st X+, R16	;в ОЗУ, 18,9°
;3500 об/мин
ldi R16, 21	;множитель
st X+, R16	;в ОЗУ, 20,3°
;3900 об/мин
ldi R16, 20	;множитель
st X+, R16	;в ОЗУ, 21°
;4200 об/мин
ldi R16, 19	;множитель
st X+, R16	;в ОЗУ, 21,7°
;4700 об/мин
ldi R16, 17	;множитель
st X+, R16	;в ОЗУ, 23,1°
;5100 об/мин
ldi R16, 16	;множитель
st X+, R16	;в ОЗУ, 23,8°
;5600 об/мин
ldi R16, 14	;множитель
st X+, R16	;в ОЗУ, 25,2°
;6100 об/мин
ldi R16, 13	;множитель
st X+, R16	;в ОЗУ, 25,9°
;6500 об/мин
ldi R16, 11	;множитель
st X+, R16	;в ОЗУ, 27,3°
;6900 об/мин
ldi R16, 10	;множитель
st X+, R16	;в ОЗУ, 28°
;7300 об/мин
ldi R16, 9	;множитель
st X+, R16	;в ОЗУ, 28,7°
;7800 об/мин
ldi R16, 7	;множитель
st X+, R16	;в ОЗУ, 30,1°
;8300 об/мин
ldi R16, 6	;множитель
st X+, R16	;в ОЗУ, 30,8°
;9000 об/мин
ldi R16, 4	;множитель
st X+, R16	;в ОЗУ, 32,2°
;9700 об/мин
ldi R16, 3	;множитель
st X+, R16	;в ОЗУ, 32,9°
;10600 об/мин
ldi R16, 1	;множитель
st X+, R16	;в ОЗУ, 34,3°
;11700 об/мин
ldi R16, 0	;множитель
st X+, R16	;в ОЗУ, 35°
;13000 об/мин
ldi R16, 0	;множитель
st X+, R16	;в ОЗУ, 35°
;14600 об/мин
ldi R16, 0	;множитель
st X+, R16	;в ОЗУ, 35°
;16700 об/мин
ldi R16, 0	;множитель
st X+, R16	;в ОЗУ, 35°
;19500 об/мин
ldi R16, 29	;множитель
st X+, R16	;в ОЗУ, 14,7°
ret		;возврат в программу

;==таблица №3,углов опережения в ОЗУ==
;=======для метки 20°, шаг 1.4°=======
FuozTable3:
ldi R27, 0x03	;задаем "highX"=03
ldi R26, 0x00	;задаем "lowX"=00
;опережение при оборотах
;500 и ниже, об/мин
ldi R16, 50	;множитель
st X+, R16	;в ОЗУ, 0°
;600 об/мин
ldi R16, 49	;множитель
st X+, R16	;в ОЗУ, 0,7°
;800 об/мин
ldi R16, 47	;множитель
st X+, R16	;в ОЗУ, 2,1°
;1000 об/мин
ldi R16, 46	;множитель
st X+, R16	;в ОЗУ, 2,8°
;1200 об/мин
ldi R16, 44	;множитель
st X+, R16	;в ОЗУ, 4,2°
;1500 об/мин
ldi R16, 43	;множитель
st X+, R16	;в ОЗУ, 4,9°
;1800 об/мин
ldi R16, 41	;множитель
st X+, R16	;в ОЗУ, 6,3°
;2000 об/мин
ldi R16, 40	;множитель
st X+, R16	;в ОЗУ, 7°
;2200 об/мин
ldi R16, 39	;множитель
st X+, R16	;в ОЗУ, 7,7°
;2500 об/мин
ldi R16, 36	;множитель
st X+, R16	;в ОЗУ, 9,8°
;2800 об/мин
ldi R16, 33	;множитель
st X+, R16	;в ОЗУ, 11,9°
;3000 об/мин
ldi R16, 30	;множитель
st X+, R16	;в ОЗУ, 14°
;3500 об/мин
ldi R16, 29	;множитель
st X+, R16	;в ОЗУ, 14,7°
;3900 об/мин
ldi R16, 27	;множитель
st X+, R16	;в ОЗУ, 16,1°
;4200 об/мин
ldi R16, 24	;множитель
st X+, R16	;в ОЗУ, 18,2°
;4700 об/мин
ldi R16, 23	;множитель
st X+, R16	;в ОЗУ, 18,9°
;5100 об/мин
ldi R16, 21	;множитель
st X+, R16	;в ОЗУ, 20,3°
;5600 об/мин
ldi R16, 20	;множитель
st X+, R16	;в ОЗУ, 21°
;6100 об/мин
ldi R16, 19	;множитель
st X+, R16	;в ОЗУ, 21,7°
;6500 об/мин
ldi R16, 17	;множитель
st X+, R16	;в ОЗУ, 23,1°
;6900 об/мин
ldi R16, 16	;множитель
st X+, R16	;в ОЗУ, 23,8°
;7300 об/мин
ldi R16, 14	;множитель
st X+, R16	;в ОЗУ, 25,2°
;7800 об/мин
ldi R16, 13	;множитель
st X+, R16	;в ОЗУ, 25,9°
;8300 об/мин
ldi R16, 11	;множитель
st X+, R16	;в ОЗУ, 27,3°
;9000 об/мин
ldi R16, 10	;множитель
st X+, R16	;в ОЗУ, 28°
;9700 об/мин
ldi R16, 7	;множитель
st X+, R16	;в ОЗУ, 30,1°
;10600 об/мин
ldi R16, 6	;множитель
st X+, R16	;в ОЗУ, 30,8°
;11700 об/мин
ldi R16, 4	;множитель
st X+, R16	;в ОЗУ, 32,2°
;13000 об/мин
ldi R16, 3	;множитель
st X+, R16	;в ОЗУ, 32,9°
;14600 об/мин
ldi R16, 1	;множитель
st X+, R16	;в ОЗУ, 34,3°
;16700 об/мин
ldi R16, 1	;множитель
st X+, R16	;в ОЗУ, 34,3°
;19500 об/мин
ldi R16, 29	;множитель
st X+, R16	;в ОЗУ, 14,7°
ret		;возврат в программу
