- •1. Введение.
- •2. Области применения микроконтроллеров.
- •3. Основные характеристики микроконтроллера кр1816ве48.
- •4. Память микроконтроллера.
- •5. Организация ввода/вывода информации.
- •6. Управление микроконтроллером.
- •7. Система команд мк48.
- •8. Мк-система с внешней памятью программ.
- •9. Основные принципы разработки программ для мк48.
- •10. Постановка задачи.
- •11. Аппаратные средства.
- •12. Программные средства.
- •13. Транслятор с языка asm-48.
- •14. Имитатор.
- •15. Тестирование.
- •16. Заключение.
14. Имитатор.
Внешнее описание. На рисунке показан внешний вид имитатора.
Весь экран разделён на 5 функциональных окон:
Регистры - просмотр двух банков регистров микроконтроллера;
Флаги - все флаги центрального процессора микроконтроллера;
Основные узлы МК48 - линии ввода-вывода, а также содержание аккумулятора, таймера, РС, флаги таймера;
ОЗУ - Внутренняя память данных микроконтроллера - 64 байта;
Программа (ПЗУ) - содержимое программы, которую будет выполнять контроллер.
Внизу имеется длинная командная строка. Она предназначена для ввода команд управления имитатором.
В каждый момент времени курсор может находиться только в одном поле ввода (чёрного фона). Для того, чтобы изменить содержание какого-либо поля, необходимо переместить курсор туда. Для этого можно либо нажимать клавиши вверх и вниз (при этом курсор будет последовательно пробегать все строки ввода), либо навести курсор мышки на нужную строку ввода и щёлкнуть левой кнопкой. После внесений изменений в текстовую строчку желательно нажать Ввод.
В микроконтроллере существует множество внутренних регистров и флагов. При выполнении программы микроконтроллер постоянно их считывает, выполняет программу с учётом их содержания. Имитатор позволяет человеку одновременно увидеть содержание всех этих регистров на экране и изменять их. Таким образом, можно тщательно анализировать каждый шаг программы, выявлять ошибки и совершенствовать алгоритмы.
Программа для МК в имитаторе. Программа находиться в окне ПЗУ. Это:
Адрес - адрес команды;
Код - код команды;
Деассемблер - текстовое представление команды;
Комментарий - комментарий к данной команде.
Однобайтовые команды занимают одну строчку: напротив адреса стоит код этой команды и её текстовое представление. Двухбайтовые команды имеют некие отличия. Второй байт располагается следом за первым. При этом он не деассемблируется, а просто печатается как есть в поле деассемблера. Комментарий ко второму байту не вводится – он игнорируется. На второй байт нельзя поставить точку останова, текущий адрес, его нельзя (не надо) выполнять.
Будьте внимательны! Если в программе подряд стояло 2 однобайтовые команды, а потом первую вы заменили на двухбайтную, то вторая команда уничтожится. Можно было бы конечно отодвинуть вторую команду (и все последующие) на более старшие адреса, но при этом все адреса в командах переходов, указывающих на отодвинутые команды, окажутся неверными. При необходимости серьёзного редактирования текста программы лучше всего внести все необходимые изменения в исходный *.ASM-файл, и потом, оттранслировав его, вновь загрузить в имитатор.
Справочная система. Если в процессе работы с имитатором возникают какие-то проблемы, необходимо обратиться к справочной системе. Для этого можно в любой момент нажать F10. С помощью стрелок можно перемещать курсор по окну помощи. Чтобы перейти по выделенной ссылке, надо навести курсор на неё и нажать Ввод. Backspace - возврат на предыдущую тему. Esc - закрытие окна помощи.
15. Тестирование.
Сначала в качестве теста бралась простая программа для МК48:
Адр. |
Команда |
Код |
0 |
Mov a,0 |
35 |
1 |
|
0 |
2 |
Outl p1,a |
57 |
3 |
Mov a,#1 |
35 |
4 |
|
1 |
5 |
Outl p1,a |
57 |
6 |
Jmp 0 |
4 |
7 |
|
0 |
Суть этой программы заключается в том, что на нулевую линию порта номер один выдавалось последовательно то логическая 1, то 0.
Эта программа успешно транслировалась и загружалась в имитатор. Имитатор показывал, что линия 0 порта Р1 действительно постоянно изменяет своё значение.
Однако наиболее убедительным доказательством того, что всё работает правильно, безусловно, является проверка работоспособности этой программы в самом микроконтроллере.
К линии Р1.0 микроконтроллера был подсоединён светодиод. Программа загружалась в ОЗУ программатора и потом отдавалась на выполнение микроконтроллером в пошаговом режиме. Как и следовало ожидать, всё работало правильно.
Для более полной проверки основных узлов контроллера данная программа модифицировалась:
А) Операции условного перехода |
Б) Тест таймера | ||
Mov r1,#255 |
Начальная инициализация |
0 jmp Старт |
Безусловный переход к началу программы |
#define Цикл |
Матка адреса |
7 mov a,#1 |
Прерывание от таймера |
Djnz r1, Цикл |
Декремент и переход, если не 0 |
Outl p1,a |
Мигаем светодиодом |
Mov a,#1 |
Мигание светодиодом |
Mov a,#0 |
|
Outl p1,a |
|
Outl p1,a |
|
Mov a,#0 |
|
Retr |
Возвращаемся |
Outl p1,a |
|
#define Старт |
Начало программы |
Jmp Цикл |
Повторяем цикл |
Strt t |
Запуск таймера |
|
|
En tcnti |
Разрешение прерываний от таймера |
|
|
#defile Ожид |
Бесконечный цикл |
|
|
Jmp Ожид |
|
В) Тест входа ЗПР |
Г) Датчик случайных чисел 0h-Fh | ||
0 jmp Старт |
Безусловный переход к началу программы |
En i |
Разрешение внешнего прерывания |
3 mov a,#1 |
Мигание светодиодом |
jmp Старт |
Переход к началу программы |
3 Outl p1,a |
|
3 Mov a,#15 |
Загрузка в аккумулятор маски 00001111В |
Mov a,#0 |
|
Anl a,r4 |
Копирование младшей тетрады r4 в а |
Outl p1,a |
|
Outl p1,a |
Выдача в порт числа |
Retr |
Возврат |
Retr |
Возврат |
#define Старт |
Начальный адрес программы |
#define Старт |
Начало программы |
En i |
Разрешение внешних прерываний |
Inc R4 |
Постоянный инкремент R4 |
#defile Ожид |
Бесконечный цикл |
Jmp Старт |
|
Jmp Ожид |
|
|
|
Текст данных тестов не предназначен для прямой записи в МК. Его сначала надо оттранслировать.
А) В этом примере очень долго выполняется цикл декремента регистра. И только тогда, когда в регистре R1 окажется ноль, управление передается подпрограмме, которая быстро мигает светодиодом и вновь передаёт управление на начало цикла. Данную программу на микроконтроллере лучше всего выполнять не в пошаговом режиме, а на полной скорости. При этом получается, что светодиод горит еле-еле.
Б) Данная программа тестирует внутренний таймер в режиме непрерывного счёта. Внешние проявления этой программы почти такие же, как и у предыдущей. Для возникновения прерывания от таймера необходимо, чтобы его значение перевалило (точнее, попыталось перевалить) за 255. Таймер считает лишь каждый 32 такт процессора. В итоге светодиод должен гореть ещё слабее, чем в тесте а). Поэтому не удивительно, что я вообще практически ничего не увидел. Но на экране осциллографа импульсы вывода Р1.0 были хорошо видны. Можно даже примерно рассчитать их частоту:
F = Fпроцессора : 32 : 256 = 49 Гц.
Получается неплохой генератор с довольно высокой точностью (точность кварца 3 знака). Путём установки начального значения таймера можно получить различные частоты с небольшим шагом.
В) Данная программа мигает светодиодом при подаче на МК внешнего прерывания.
Г) На основе этой тестовой программы можно продемонстрировать работу микроконтроллера с более сложным внешним оборудованием, чем светодиод. На этот раз к младшей тетраде порта 1 был подключён двоично-десятичный дешифратор, нагруженный на ЖК-экран.
В основе данной программы лежит бесконечный цикл, в котором постоянно увеличивается регистр R4. В произвольный момент человек нажимает кнопку, соединённую со входом ЗПР. Происходит выполнение подпрограммы обслуживания внешнего прерывания, в ходе которой на порт 1 выводится младшая тетрада регистра R4, после чего управление опять передаётся бесконечному циклу. МК удерживает линии порта ввода/вывода в установленном состоянии, и поэтому всё время между нажатиями кнопок на индикаторе будет видно значение, ранее выведенное в порт.
Следует отметить, что числа, получаемые на описанном устройстве, являются действительно случайными, так как регистр R4 инкрементируется с частотой более 100кГц, а нажатие человеком на кнопку, по сравнению с такими частотами, происходит очень медленно.