Прерывания от таймеров /счетчиков
Для разрешения/запрещения прерываний от таймеров/счет-чиков Т0, Т1, Т2 предназначен регистр TIMSK (табл. 5.10). Для разрешения какого-либо прерывания необходимо установить в 1 соответствующий разряд регистра TIMSK и, разумеется, флаг I регистра SREG. Для индикации наступления прерываний от таймеров/счетчиков Т0, Т1, Т2 предназначен регистр TIFR (табл. 5.11).
Таблица 5.10 – Регистр масок прерываний TIMSK
OCIE2 | TOIE2 | TICIE1 | OCIE1A | OCIE1B | TOIE1 | – | TOIE0 |
OCIEnx – биты разрешения прерывания выходного сравнения;
TICIE1 – бит разрешения прерывания входного захвата;
TOIEn – биты разрешения прерывания по переполнению счётчика.
Таблица 5.11 – Регистр флагов прерываний от таймеров/счётчиков TIFR
OCF2 | TOV2 | ICF1 | OCF1A | OCF1B | TOV1 | – | TOV0 |
OCFnx – флаги прерывания выходного сравнения.;
ICF1 – флаг прерывания входного захвата;
TOVn – флаг прерывания по переполнению счётчика.
Программа работы
1. Рассчитав номер варианта (от N=1 до N=9), загрузить для отладки программу преобразования двоично-десятичного кода числа (байт) в двоичный (программа decbin_to_bin).
Перед выполнением программы необходимо в окне «Workspace» загрузить в регистр r16 число 10N+N в двоично-десятичном виде, которое подвергнется преобразованию.
;****** Программа decbin_to_bin
mov r17,r16 ; Исходное двоично-десятичное число
; хранится в r16
andi r17,0xF0 ; Выделение старшей тетрады (десятков)
swap r17 ;
ldi r18,10 ; Умножение десятков на десять
mul r17,r18 ;
mov r17,r16 ; Выделение младшей тетрады (единиц)
andi r17,0x0F ;
add r17,r0 ; Сложение результатов. Результат остаётся в r17
При выполнении программы число копируется в регистр r17, там на него накладывается маска 0b11110000 при помощи команды логического умножения (andi), которая выделяет десятки десятичного кода. После этого результат перемещается в младшую тетраду и умножается на 10. Результат умножения сохраняется в регистровой паре r1:r0. Т.к. наше число не может быть больше 99, то оно целиком поместится в младший байт результата, т.е. в r0. После этого повторно загружаем исходное число в r17, ещё раз накладываем маску, только на этот раз для выделения младшей тетрады, и суммируем результат с содержимым регистра r0, в котором хранились десятки. Конечный результат будет представлен в регистре r17.
Проследите процесс выполнения программы в пошаговом и автоматическом режиме. Поясните содержимое строк окна «Disassembler».
Внести ошибки в программу (неверная мнемоника команды, неверный операнд и т.п.) и проследить сообщения ассемблера при этом в окне View Output.
Модифицировать программу в соответствии со своим вариантом индивидуального задания:
1. Преобразовать дополнительный код числа (байт) в прямой.
2. Преобразовать двоичный код (от 0 до 99) в двоично-десятичный.
3. Просуммировать два числа в двоичном коде. Сумму, большую 255, заменить байтом единиц.
4. Сложить два двухбайтовых числа.
5. Вычесть два числа в двоичном коде. Разность, меньшую нуля, заменить байтом нулей.
6. Умножить на два двухбайтовое содержимое регистров R9..R10 (меньшее 32 000).
7. Сложить два десятичных числа (байт) в двоично-десятичном коде.
8. Реализовать суммирующий двоично-десятичный счетчик.
9. Реализовать вычитающий двоично-десятичный счетчик.
Дата добавления: 2016-01-09; просмотров: 1045;