Федеральное Агентство пообразованию
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ ИРАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра промышленной электроники (ПрЭ)
МИКРОПРОЦЕССОРНОЕ УСТРОЙСТВО УПРАВЛЕНИЯ ЭЛЕКТРОННЫМИВЕСАМИ
Пояснительная записка к курсовому проекту по дисциплине
«Микропроцессорные устройства и системы»
ЗФ КП. ХХХХХХ.008 ПЗ
Студент группы
Руководитель проекта
профессор кафедры ПрЭ
А.В.Шарапов
2008
Федеральное Агентство пообразованию
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ ИРАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра промышленной электроники (ПрЭ)
ЗАДАНИЕ
на курсовое проектирование по дисциплине
«Микропроцессорные устройства и системы»
студенту ____________________________________
группа ________________ факультет _______ ЗФ ________
Тема проекта: Микропроцессорное устройство управления
электронными весами ________________________________
Исходные данные к проекту: Фиксируются вес и стоимость расфасованнойпорции продукта ____________________________
Содержание пояснительной записки (перечень подлежащих разработкевопросов): ______________________________________
выбор микроконтроллера, обоснование функциональной схемы,
разработка полной принципиальной схемы устройства с перечнем
элементов и листинга управляющей программы
Перечень графического материала (с точным указанием обязательных чертежейи схем):
схема электрическая принципиальная – 1 лист
Дата выдачи задания: __________________________________
Руководитель профессор кафедры ПрЭ _______ А.В.Шарапов
Задание принял к исполнению ____________________
СОДЕРЖАНИЕ
1 Введение ...................................................................................................4
2 Конкретизация технического задания ...................................................4
3 Разработка функциональной схемы .......................................................4
4 Разработка схемы алгоритма прикладной программы .........................5
5 Разработка принципиальной схемы .......................................................7
6 Разработка управляющей программы ....................................................9
7 Заключение .............................................................................................10
Список использованных источников ......................................................11
Приложение А. Листинг управляющей программы ..............................12
ЗФ КП. ХХХХХХ.008 Э3 Плата микроконтроллера. Схема электрическаяпринципиальная……………......................................................19
ЗФ КП.ХХХХХХ.008 ПЭ3 Плата микроконтроллера. Переченьэлементов..............................................................................................................20
1 ВВЕДЕНИЕ
Применение микропроцессорных средств позволяет строить универсальныеустройства управления электронными весами, легко перестраиваемые на различныережимы его работы.
Анализ технического задания показывает, что проектируемое устройстводолжно выполнять две основные задачи:
а) позволять вводить цену продукта с клавиатуры;
б) обрабатывать и выводить значение цены, веса и стоимости расфасованногопродукта;
При проектировании принято, что вес товара не превышает 1кг, а цена закилограмм и стоимость – 99р. 99коп..
2 КОНКРЕТИЗАЦИЯ ТЕХНИЧЕСКОГО ЗАДАНИЯ
Для электронных весов потребуются следующие внешние устройства:
— клавиатура с цифрами 0-9 и клавишей ввода, т.е. всего десять клавиш;
— 2 семисегментных индикаторов: 4 отображают вес с точностью до грамма,по 4 для отображения цены и стоимости товара.
— усилитель сигнала с датчика веса и АЦП для оцифровки данных.
При использовании микропроцессорного комплекта серии К580 устройствоуправления весами кроме центрального процессора (пять микросхем) должновключать в себя параллельный интерфейс, программируемый таймер, ПЗУ дляхранения прикладной программы и ОЗУ для организации стека.
Предпочтительнее использование однокристальных микроконтроллеров, где всеперечисленные устройства реализованы в одной микросхеме и требуется лишь одинисточник питания. Наиболее оптимальное решение получается при применениимикроконтроллеров Atmel AVR с гибкой и развитой системой команди множеством вспомогательных функций, среди которых присутствуют 8- и 16-разрядныетаймеры и 10-разрядные АЦП. Кроме того, эти контроллеры изготовлены потехнологии КМОП, что обеспечивает экономичное потребление тока.
3 РАЗРАБОТКА ФУНКЦИОНАЛЬНОЙ СХЕМЫ
На рисунке 3.1 приведена функциональная схема устройства управления электроннымимвесами, выполненного на однокристальном микроконтроллере Atmega16.
В связи с достаточно большим количеством семисегментных индикаторовследует использовать схему динамической индикации. Для этого информационныевходы семисегментных индикаторов подключены к выходам дешифратора К514ИД1, аобщий вход каждого индикатора – к выходу 4-разрядного дешифратора К1564ИД5. Навход К514ИД1 от микроконтроллера подается код символа, на вход К1564ИД5 – кодактивного индикатора. Каждый индикатор должен активироваться с частотой неменее 40 Гц (частота, при которой мерцание индикаторов незаметно для глаз). Дляотображения информации при таком подключении потребуется один порт, в даннойсхеме для этих целей выделен порт PC. Поскольку удешифратора семисегментного индикатора управление запятой не предусмотрено, тодля следует выделить еще один вывод микроконтроллера, в данном случае PD7.
Клавиатуру удобно построить в виде матрицы 3´4, для ее сканирования потребуется одинпорт, в данном случае PB.
Для оцифровки сигнала датчика используется вход микроконтроллера ADC0.
Для определения веса товара с точностью до грамма при максимальном весе 1кгтребуется 10-ти разрядный АЦП, встроенный в микроконтроллер. />
DB CCD CNTL
RD SHIFT
WR RL
CS
A0 SL
IRQ
CLK BD
RES OB,OA
/>
Рисунок 3.1 – Функциональная схема контроллера
4 Разработка алгоритма управляющей программы
Вне зависимости от задач, выполняемыхмикроконтроллером, алгоритм управляющей программы, как правило, состоит из двухчастей:
— начальная загрузка регистров и значенийпеременных, инициализация внешних устройств;
— бесконечный цикл, в котором обычнопроисходит опрос внешних сигналов и обновление информации как для внутреннихрегистров, так и для внешних устройств.
У электронных весов должно быть два режимаработы: режим взвешивания и режим редактирования цены за единицу продукции.Чтобы их различать, введен специальный байт status. Присбросе весы должны находиться в режиме редактирования, контроллер в этомрежиме, ожидает ввода значения цены или ее подтверждения путем нажатия клавишиввода. В режиме взвешивания контроллер пересчитывает значение стоимостивзвешенной продукции в зависимости от веса и цены.
Для отображения чисел на экране необходимаспециальная подпрограмма, преобразующая число в последовательность выводимыхсимволов.
/>
Рисунок 4.1 – Схема алгоритма прикладной программы
5 РАЗРАБОТКА СХЕМЫ ЭЛЕКТРИЧЕСКОЙПРИНЦИПИАЛЬНОЙ
Схема электрическая принципиальная полностью приведена в приложении.
При использовании контроллера Atmega16фирмой-производителем рекомендовано использовать параллельно каждой паревыводов питания подсоединять помехозащищающий конденсатор емкостью не менее1мкФ. На схеме эти конденсаторы обозначены C1 и C2, выбран тип К10-17–10В–1мкФ±10%. Между линией RESET иплюсом питания подключается резистор с типовым значением 10 кОм (на схеме – R1), между линией RESET и минусомпитания – конденсатор емкостью 1мкФ (на схеме – C4).Такая схема позволяет избежать ложного сброса микроконтроллера.
Параллельно линиям XTAL1 и XTAL2подсоединяется кварцевый резонатор, частота которого для данногомикроконтроллера обычно равна 16МГц. Между минусом питания и линиями XTAL1 и XTAL2 ставятся конденсаторыемкостью (20..30) пФ (на схеме – C3 и C5).
Для усиления сигнала с датчика веса следует применить измерительныйусилитель. Схема такого устройства часто включает в себя несколько операционныхусилителей, но может выпускаться в интегральном исполнении. В качествеизмерительного усилителя выбрана микросхема INA128,которая в качестве дополнительных пассивных элементов требует только резистордля регулирования коэффициента усиления (на схеме – R2),определяемый по формуле:
/>, (5.1)
где K – требуемый коэффициент усиления.
Например, при K=100 рассчитанное по формулезначение RG равно 505 Ом, оно округляется дозначения из ряда номиналов E6, равное 510 Ом. Лучше применятьподстроечный резистор с целью калибровки коэффициента усиления.
В клавиатурной матрице опрашиваемые линии должны быть подтянуты к плюсупитания через резисторы, типовое значение которых равно 10кОм (на схеме – R4–R6).
Для отображения информации выбраны семисегментные индикаторы SA04-11 с общим анодом, каждый из которых потребляет максимальныйток 160мА, каждый сегмент потребляет ток Iсег=20мА.Сопротивление, ограничивающее ток линии PD7,рассчитывается по формуле:
/>, (5.2)
Округляя значение сопротивления до стандартного, получаем R3=130Ом.
Выход дешифратора К1564ИД5, разрешающий работу отдельно взятогоиндикатора, не обеспечивает такого тока, поэтому следует применить схему сусилительным каскадом, изображенную на рис. 5.1. Работа семисегментногоиндикатора разрешена, когда с выхода дешифратора приходит низкий уровень. Приэтом между базой и эмиттером транзистора подается смещение, задаваемоеделителем напряжения, состоящим из резисторов R1 и R3, включенного параллельно с сопротивлением эмиттерногоперехода со стороны базы. Резистор R2 ограничивает ток.
/>
Рис. 5.1 – Схема согласования по току дешифратора с семисегментныминдикатором.
Для данной схемы можно выбрать транзистор К501 с максимальным токомколлектора 300мА.
Если принять ток через R3 равным току базы, товеличина этого сопротивление определиться по формуле:
/> (5.3)
где b –коэффициент передачи по току в схеме с общим эмиттером, для К501 можно принятьравным 50;
Uбэ – напряжение, необходимое дляоткрытия транзистора, обычно равно (0,8..0,9)В;
Iк – ток коллектора, в данном случаеравен току, потребляемому индикатором;
Rбэ – сопротивление эмиттерногоперехода со стороны базы.
/>.
Округляя значение сопротивления до стандартного, получаем R3=300Ом.
R1 рассчитывается по формуле:
/>, (5.4)
где Uп – напряжение питания.
/>
Округляя значение сопротивления до стандартного, получаем R1=680Ом
R2 рассчитывается по формуле:
/>, (5.5)
где Uд – падение напряжение наиндикаторе, равно 2,5В.
Выводы 4 микросхемы К514ИД1, 18 и 19 микросхемы К1564ИД5 подсоединяются кминусу питания для разрешения их работы.
Извне на устройство управления через разъем XP1подаются: сигнал датчика, напряжение питания +5В, -5В (для усилителя), общийпровод питания.
6 РАЗРАБОТКА УПРАВЛЯЮЩЕЙ ПРОГРАММЫ
Листинг управляющей программы приведен в приложении А.
Для отображения информации в памяти следует выделить 12 байт, в каждом изкоторых будет храниться код отображаемого символа. Подпрограмма преобразованиячисла в последовательность выполняет деление машинного слова на 10 с остатком,поэтому для нее необходимо 6 байт: по два для делимого, частного и остатка. Подпрограммарасчета стоимости выполняет умножение и деление слов, поэтому для неенеобходимо выделить 8 временных регистров. При выделении регистровой памятиучтено, что регистры r0–r15 немогут использоваться в ряде команд, например, при сравнении. В оперативнойпамяти также следует выделить 10 ячеек под таблицу для расшифровки скан-кодовцифровых клавиш. Под вес, цену и стоимость в памяти выделяется по два байта.
После подачи сигнала сброса RESETпроизводится начальная загрузка регистров, с помощью которых реализуетсянастройка портов ввода/вывода и оцифровка аналогового сигнала, а такжеинициализация таблицы рашифровки скан-кодов. После инициализации программавходит в бесконечный цикл. Опрос клавиатуры происходит путем поочереднойустановки в низкий уровень линий PB4–PB6и чтения линий PB0–PB3. Далеескан-код клавиши распознается программно, под него выделен регистр r13. При выполнении процедуры ввода данных скан-код расшифровываетсяпри помощи таблицы и конечное значение символа, введенного с клавиатуры, записываетсяв регистр r14.
Регистры r16–r25используются для временного хранения данных.
При разработке процедуры отображения информации необходимо учитывать, чтоэкран должен полностью обновляться с частотой не менее 40Гц, следовательно, сучетом того, что дисплей имеет 16 индикаторов, активный индикатор долженменяться не позже, чем через каждые 1,5625мс. Основной цикл программы, вкотором происходит обновление отображаемой информации, занимает меньше времени
Микроконтроллер работает с целыми числами, дробная часть будет лишьимитироваться путем подсвечивания запятой возле соответствующего символа надисплее.
7 ЗАКЛЮЧЕНИЕ
В контроллере можно использовать любые микросхемы семейства AVR, в зависимости от поставленных задач. Контроллер обладаетрезидентной памятью и множеством встроенных вспомогательных устройств, чтозначительно упрощает схемотехническую реализацию системы управления. Благодарятому, что контроллер является перепрограммируемым, в системе управленияэлектронными весами достаточно легко можно менять диапазоны веса, цены истоимости.
/>ЛИТЕРАТУРА
1. Шарапов А.В. Примеры решения схемотехнических задач: Учебное пособие.- Томск: ТИАСУР, 1994. — 141 с.
2. Шарапов А.В. Цифровая и микропроцессорная техника: Учебное пособие.2-е изд., перер. и доп. — Томск: Изд-во Том. ун-та, 1997. — 108 с.
3. Сташин В.В., Урусов А.В., Мологонцева О.Ф. Проектирование цифровыхустройств на однокристальных микроконтроллерах. — М.: Энергоатомиздат, 1990. — 224 с.
4. Калабеков Б.А., Мамзелев И.А. Цифровые устройства и микропроцессорныесистемы: Учебник для техникумов связи. — М.: Радио и связь, 1987. — 400 с.
5. Микропроцессоры и микроЭВМ в системах автоматического управления:Справочник/ С.Т.Хвощ, Н.Н.Варлинский, Е.А.Попов; Под общ. ред. С.Т.Хвоща. — Л.:Машиностроение, 1987. — 640 с.
6. www.atmel.com/dyn/resources/prod_documents/2466S.pdf — польноеруководство по работе с контроллером Atmega16.Электронный ресурс.
Приложение А. ЛИСТИНГ УПРАВЛЯЮЩЕЙ ПРОГРАММЫ
.include «m16def.inc»; Включить определения для контроллера Atmega16
.def scancode=r13
.def key=r14
.def pointer=r15; используетсядля ввода данных
.equ entercode=0xD7; код клавиши ввода
.DSEG; резервирование памяти
status: .BYTE 1; байт статуса
weight: .BYTE 2; вес
price: .BYTE 2; цена
cost: .BYTE 2; стоимость
key_table .BYTE 10; таблица сканкодов
dysplay_table: .BYTE 16; выделить 16байт как буфер дисплея
.CSEG
;перед началом выполнения программы контроллер проверяет векторы прерываний
rjmp RESET; Reset Handler
nop
reti EXT_INT0; INT0 Handler
nop
reti EXT_INT1; INT1 Handler
nop
reti TIM2_COMP; Timer2 Compare Handler
nop
reti ;TIM2_OVF; Timer2 Overflow Handler
nop
reti ;TIM1_CAPT; Timer1 Capture Handler
nop
reti ;TIM1_COMPA; Timer1 CompareA Handler
nop
reti ;TIM1_COMPB; Timer1 CompareB Handler
nop
reti ;TIM1_OVF; Timer1 Overflow Handler
nop
reti ;TIM0_OVF; Timer0 Overflow Handler
nop
reti ;SPI_STC; SPI Transfer Complete Handler
nop
reti ;USART_RXC; USART0 RX Complete Handler
nop
reti ;USART_DRE; USART0,UDR Empty Handler
nop
reti ;USART_TXC; USART0 TX Complete Handler
nop
reti ;ADC; ADC Conversion Complete Handler
nop
reti ;EE_RDY; EEPROM Ready Handler
nop
reti ;ANA_COMP; Analog Comparator Handler
nop
reti ;TWI; Two-wire Serial Interface InterruptHandler
nop
reti ;TIM0_COMP; Timer0 Compare Handler
nop
reti ;EXT_INT2; INT2 Handler
nop
reti ;SPM_RDY; SPM Ready Handler
nop
; инициализация
reset: out DDRB, 0xF0; Старшая тетрада порта PB настраиваетсяна вывод, младшая – на ввод
out DDRС, 0xFF; Порты PC и PBнастраиваются на вывод
out DDRD, 0xFF;
out ADMUX, 0x40; АЦП работаетс внешним опорным сигналом, канал 0.
out SFIOR, 0x00; АЦП работаетавтоматического обновления данных.
out ADCSRA, 0xC0; Запуск АЦП.
ldi r26,low(key_table); заполнение таблицы скан-кодов
ldi r27,high(key_table)
ldi r16,0xE7; клавиша «0»
st X+,r16
ldi r16,0xEE; клавиша «1»
st X+,r16
ldi r16,0xDE; клавиша «2»
st X+,r16
ldi r16,0xBE; клавиша «3»
st X+,r16
ldi r16,0xED; клавиша «4»
st X+,r16
ldi r16,0xDD; клавиша «5»
st X+,r16
ldi r16,0xBD; клавиша «6»
st X+,r16
ldi r16,0xEB; клавиша «7»
st X+,r16
ldi r16,0xDB; клавиша «8»
st X+,r16
ldi r16,0xBB; клавиша «9»
st X+,r16
; опрос клавиатуры
begin: ldi scancode,0xFF
ldi r19,0x00; обнуление счетчикаантидребезгового цикла
l3: ldi r16,0x01; задается опрашиваемая линия
l1: mov r17,temp1; номер опрашиваемой линии преобразуется для обнуления
neg r17;соответствующего вывода
out PORTB,r17
in r17, PINB; чтение сканкода
ori r17,0x80
cpi r17,0xFF; если клавишанажата, то запомнить ее сканкод для
breq l4; обработки в антидребезговомцикле
mov r18,r17
l4: lsl r16; следующая линия
cpi r16,0x10
brne l1; если опрошенывсе линии, переходим к следующему шагу
cpi r19,0x00
breq l2
cp r18,scancode
brne l5; если текущийскан-код не равен предыдущему, то нажатие случайное
l2: mov scancode,r18
inc r19
cpi r19,0x03; антидребезговыйцикл
brne l3
; опрос режима
l5: ldi r26,low(status)
ldi r27,high(status)
ld r16,X; загружаетсяадрес байта состояния
cpi r16,0x01
breq l6; если status=1,то перейти к вводу данных
cpi scancode,entercode; если не нажат «Ввод»,
brne l7;то перейти пересчету данных
ldi r16,0x01; иначе войти в режим ввода данных
st X,r16
ldi r16,0
move pointer,r16
jmp display
; пересчет данных
l7: in r16,low(ADC); чтение АЦП
in r17,high(ADC)
; пересчет единиц АЦП в реальный вес. Вес равен 1000*ADC/1024,операции умножения и деления на константу реализованы путем операций сдвига ивычитания
mov r18,r16
mov r19,r17
lsl r16
rol r17
lsl r16
rol r17
lsl r16
rol r17
lsl r16
rol r17
lsl r16
rol r17
lsl r16
rol r17
sub r16,r18
sbc r17,r19
sub r16,r18
sbc r17,r19
sub r16,r18
sbc r17,r19
lsr r17
ror r16
lsr r17
ror r16
lsr r17
ror r16
lsr r17
ror r16
lsr r17
ror r16
lsr r17
ror r16
ldi r26,low(weight)
ldi r27,high(weight)
st X+,r16
st X+,r17
; расчет стоимости
ld X+,r18; загрузка значения цены из памяти
ld X+,r19; загрузка значения цены из памяти
ldi r20,0
ldi r21,0
ldi r22,0
ldi r23,0
ldi r24,0
ldi r25,0
ldi r0,0
ldi r2,0
ldi r3,0
; умножение цены на вес
l11: add r20,weight_l
adc r21,weight_h
adc r22,r0
adc r23,r3
inc r24
adc r25,r0
cp r24,r18
cpc r25,r19
brne l11
; деление на тысячу
l12: ldi r24,0xE8
ldi r25,0x03
cp r20,r24
cpc r21,r25
ldi r24,0
cpc r22,r24
cpc r23,r24
brne l13
ldi r24,0xE8
sub r20,r24
sbc r21,r25
sbc r22,r0
sbc r23,r0
ldi r24
add r2,r24
adc r3,r0
rjmp l12
l13: st X+,r20; загрузка стоимости в память
st X+,r21
; преобразование чисел в символы
ldi R26,low(dysplay_table); загрузка начального адреса буфера
ldi R27,high(dysplay_table); дисплея в регистр X.
ldi r16,0;заполнение буфера нулевыми символами
ldi r17,0
cpi r16,16
brlo l14
st X,r17
inc к16
l14: ldi r28,low(weight)
ldi r29,high(weight)
ld Y+,r16; загрузка веса из памяти
ld Y+,r17
rjmp IntToStr
ldi r26,low(dysplay_table+4); загрузка начального адреса буфера
ldi r27,high(dysplay_table+4); дисплея в регистр X.
ld Y+,r16; загрузка цены из памяти
ld Y+,r17
rjmp IntToStr
ldi r26,low(dysplay_table+8); загрузка начального адреса буфера
ldi r27,high(dysplay_table+8); дисплея в регистр X.
ld Y+,r16; загрузка стоимости из памяти
ld Y+,r17
rjmp IntToStr
rjmp display
; считывание данных с клавиатуры
l6: ldi r26,low(key_table); загрузка начального адреса
ldi r27,high(key_table); таблицы скан-кодов
lde r17,0
l15: ld r16,X+
cp r16,scancode;расшифровка скан-кода
breq l16;если нужный скан-код найден, переход к заполнению данных
inc r17
cpi r17,11
breq l18
rjmp l15
l18: cpi scancode,0xD7; обработканажатия ввода
brne display
ldi r20,0
ldi r28,low(dysplay_table +3); загрузка конечного адреса
ldi r29,high(dysplay_table +3); символов, отображающих цену
; перевод данных из строкового вида в числовой
l19: ld r16,Y-
ldi r17,0
mov r18,r16
mov r19,r17
lsl r16
rsl r17
lsl r16
rsl r17
lsl r16
rsl r17
lsl r16
rsl r17
add r16,r18
adc r17,r19
add r16,r18
adc r17,r19
ld r18,Y
ldi r19,0
add r16,r18
adc r17,r19
inc r20
cpi r20,3
brne l19
ldi r28,low(price);загрузка конечного адреса
ldi r29,high(dysplay_table +3); символов, отображающих цену
st Y+,r16
st Y+,r17
jmp display
l16: mov key,r17
mov r17,pointer
cpi r17,0
brne l18
; если заполнение начато заново, обнуляется вся строка
ldi r28,low(dysplay_table); загрузка начального адреса символов,
ldi r29,high(dysplay_table); отображающих цену
ldi r16,0
st Y+,r16
st Y+,r16
st Y+,r16
st Y+,r16
ldi r26,low(dysplay_table+7); загрузка адреса конца строки,
ldi r27,high(dysplay_table+7); отображающей цену
ldi r28,low(dysplay_table +6);загрузка адреса предпоследнего
ldi r29,high(dysplay_table +6); символа строки, отображающейцену
ld r16,Y-
st X-,R16
ld r16,Y-
st X-,R16
ld r16,Y-
st X-,R16
st Y,key; запись символа
ldi r16,1
add r17,r16
cpi r17,4
brlo l17
ldi r17,0
l17: mov pointer,r17
; отображение на дисплее
display: ldi r26,low(dysplay_table); загрузка начального адреса буфера
ldi r27,high(dysplay_table); дисплея в регистр X.
ldi r16,0x00; r16 используется для адресациииндикатора
l8: ld r17,X+; r17используется для временного хранения кода символа
andi r16,0x0F
lsl r17; формированиебайта для отправки на дисплей
lsl r17
lsl r17
lsl r17
add r17,r16
out PORTC,r17
cpi r16,0x01
breq l9
cpi r16,0x05
breq l9
cpi r16,0x0A
breq l9
out PORTD,0x01; гашение запятой
rjmp l10
l9: out PORTD,0x00; отображение запятой
l10: cpi r16,0x0F
brne l8
; подпрограмма преобразования числа в строку
IntToStr: ldi r20,10
ldi r21,0
ITS4: cp r16,r20
cpc r17,r21
brlo ITS1
mov r18,r16
mov r19,r16
ldi r16,0
ldi r17,0
ITS2: cp r18,r20
cpc r19,r21
brlo ITS3
sub r18,r20
sbs r19,r21
inc r16
adc r17,r19
rjmp ITS2
ITS3: ld X+,r16
rjmp ITS4
ITS1: ld X+,r16
reti