2-Лабораторная_Основы микропроцессорной техники_3 / Lab_2_OMT
.docМинистерство Образования Российской Федерации
Томский Университет Систем Управления и Радиоэлектроники (ТУСУР)
Лабораторная работа №2
по предмету "Основы микропроцессорной техники"
Отладка прикладных программ для микроконтроллера серии МК48
1. Цель работы:
Целью лабораторной работы является приобретение навыков отладки прикладных программ для однокристальных микроконтроллеров семейства МК48 с помощью программных средств инструментальной ЭВМ, в качестве которой используется компьютер IBM PC: ассемблера, линковщика, и эмулятора.
2. Подготовить исходный текст исследуемой программы test.asm, реализующий 8-канальный распределитель уровня логической 1 по линиям порта p1:
mov a,#1
m1: outl p1,a
rl a
nop
djnz r1,$
jmp m1
end
В регистр a загружается 1 и в процессе выполнения программы циклически сдвигается влево, после задержки, вызванной командой djnz r1,$ содержимое аккумулятора загружается в порт р1. Регистр r1 изменяется в цикле djnz r1,$ от 0ffh до 0h. Далее управление передаётся следующей команде.
Модифицируем программу, как указано в задании.
mov a,#1
m1: outl p1,a
rl a
inc a
djnz r1,$
jmp m1
end
Аккумулятор в цикле стал заполняться единицами и обнуляться. Так как после сдвига 1 влево самый младший бит аккумулятора обнуляется, команда inc a добавляет единицу в этот бит, и так до полного заполнения регистра a. Когда аккумулятор заполнен единицами, команда inc a обнуляет его (0ffh + 1h = 0h).
mov a,#1
m1: outl p1,a
rr a
nop
djnz r1,$
jmp m1
end
Триггер переноса с при выполнении циклических сдвигов не изменяется.
В режиме Patch Code запишем программу временной задержки:
mov r0,#0
djnz r0,$
Счётчик показал 514 циклов.
Запишем программу prog.asm.
en i
jmp m1
jmp clock
m1: strt cnt
inc a
movd p4,a
swap a
movd p5,a
swap a
jmp m1
clock: ent0 clk
retr
end
Порт р2 меняется потому что сигнал на порт р4 идёт через порт р2.
Действительно, при int=0 выполняется подпрограмма обслуживания clock.
При наличии прерывания управление программы передаётся по адресу 0dh.
Запретить прерывание может команда dis i.
В стеке сохраняется адрес команды, следующей после той, во время которой произошло прерывание. После выполнения подпрограммы обслуживающей прерывание управление передаётся команде, адрес которой находится в стеке.
При переполнении таймера/счётчика флаг таймера устанавливается в 1.
Проверим на эмуляторе работу программы comp.asm, формирующей в аккумуляторе двоично-десятичный код числа датчиков, информация с которых превышает пороговое значение, находящееся в аккумуляторе.
mov r2,#0
mov r0,#32
mov r7,#32
cpl a
mov r1,a
m1: mov a,r1
add a,@r0
jnc m2
xch a,r2
add a,#1
da a
xch a,r2
m2: inc r0
djnz r7,m1
mov a,r2
Программа подсчитывает количество ненулевых элементов массива, находящегося во внутреннем ОЗУ по адресам 20h – 3fh. Результат выполнения хранится в регистре r2.
Индивидуальное задание:
Массив 20h – 27h переместить в массив 28h – 2fh внутреннего ОЗУ данных в обратной последовательности.
Текст программы prg.asm:
mov r0,#20h ; Начальный адрес первого массива
mov r1,#2fh ; Конечный адрес второго массива
mov r7,#8h ; Число элементов массива
m1: mov a,@r0 ; Пересылка байта из РПД в А
mov @r1,a ; Пересылка байта из А в РПД
inc r0 ; Наращивание адреса первого массива
dec r1 ; Декремент адреса второго массива
djnz r7,m1 ; Цикл обработки массивов
end ; Конец трансляции
Контрольные вопросы:
В. Каким образом можно вызвать подпрограмму, находящуюся в первом банке памяти программ, из программы, расположенной в нулевом банке?
О. sel mb1 ; Выбор первого банка ПП
call delay ; Вызов подпрограммы
В. Какие действия происходят при системном сбросе микроконтроллера?
О. Системный сброс устанавливает pc и sp в нулевое состояние, выбирает rb0 и mb0, запрещает прерывания, останавливает таймер/счётчик, сбрасывает в нуль флаги пользователя f0 и f1, запрещает выдачу тактовых импульсов на вывод t0, подготавливает порты р1 и р2 для приёма информации (выводит в них байт единиц).
В. Каким образом можно воспользоваться эмулятором для определения времени выполнения программы?
О. С помощью счётчика циклов (Set Cycles) можно узнать количество циклов программы, умножив на 2.5 (при частоте кварца 6 МГц), узнаем время выполнения программы в микросекундах.