Однокристальные микроконтроллеры семейства MCS-51. Разработка и отладка многомодульных программ. Алгоритм программы работы МК, страница 5

2.  Выполняем прогон программы в автоматическом режиме. После останова проверяем правильность вывода данных в порты P1 и P2 (семисегментный код).

3.  Восстанавливаем точку останова и заносим в PC код 0000H. Проверяем правильность работы программы при других значениях исходных данных, например, (A)=99H, (A)=FFH.

3.1.6. Отладка главной программы работы МК проводится в следующем порядке. Выполните компоновку программ IN_OUT, DISPL и CROSSCOD в диалоговом режиме работы линкера. Последовательно запишите имена всех файлов, помеченных в директивах  PUBLIC и EXTERN, т.е. in_out.obj,  displ.obj, crosscod.obj. В результате компоновки появится новый файл in_out. hex. Обязательно убедитесь в отсутствии ошибок при компоновке. Для удобства дальнейшей отладки запишите начальные и конечные адреса всех модулей, входящих в результирующую программу.

Запустите симулятор/отладчик AVSIM51 и загрузите в него файл in_out.hex. Выполните прогон программы в автоматическом режиме с низкой скоростью (LOW). Программа должна зациклиться на команде JB INT0, $. Это соответствует строке WAIT1: JB P3.2,WAIT1 в программе IN_OUT. Программа ожидает нажатия кнопки SB1, т.е. появления нуля на линии P3.2 (INT0 – это альтернативная функция линии P3.2).. Используя комбинацию клавиш Alt-P, переместите курсор на выводы порта Р3 и занесите 0 во второй разряд Р3 (Р3.2<-0). Отладчик перейдет на следующую команду JNB INT0, $,  что соответствует команде WAIT2: JNB P3.2,WAIT2 программы IN_OUT. Это будет цикл ожидания появления 1 на линии P3.2 (отжатия кнопки SB1). Запишите 1 во второй разряд порта P3 (P3.2<-1). Программа продолжит выполнение, а затем вновь зациклится на команде JB INT0,$. Убедитесь по содержанию ячейки SAVE (адрес 30H в ПД) и информации на выводах портов P1 и P2 в правильности работы программы.

Дальнейшее тестирование программы выполните при других значениях кода на входе порта Р0, например, 99Н и 00H. Если программа выполняется правильно при всех значениях входного кода, то процесс отладки можно считать законченным.

                                 Задание 1 для самостоятельной работы

Модернизируйте программу IN_OUT таким образом, что после инициализации МК ожидает появления на входе P3.2 четырех импульсов от кнопки SB1. После каждого импульса происходит ввод кода из порта P0 и его накопление (суммирование) в ячейках памяти данных без отображения на дисплее. После прихода последнего, четвертого импульса программа вычисляет среднее значение кода, записывает его в ячейку SAVE и выводит на дисплей. Затем программа вновь зацикливается.

Указание.  При накоплении входных кодов из порта P0 возможно переполнение аккумулятора, поэтому результат суммирования следует хранить в двух смежных ячейках памяти данных. При вычислении среднего значения для деления на 4 используйте метод сдвига 2-байтного числа вправо (см. лаб. работу № 5).

Программу назовите IN_OUT1 и занесите в файл in_out1.asm. Проверьте правильность работы программы с помощью симулятора/отладчика AVSIM51.

3.2.    Работа микроконтроллера с использованием системы прерывания

Рассмотрим пример реализации микроконтроллера с использованием системы прерывания. Функциональная схема МК приведена на рис.12.1. Кнопка SB1 при нажатии выдает напряжение низкого уровня (лог. 0) на вход порта P3.2. Это будет запрос прерывания INT0 для МК.

Алгоритм работы МК заключается в следующем. После включения электропитания МК выводит на дисплей нули, а затем программа зацикливается (останавливается). При нажатии кнопки SB1 происходит вызов подпрограммы обслуживания прерывания (обработчика прерывания). Блок-схема алгоритма программы приведена на рис. 12.4. Главная программа управления с именем INTER производит инициализацию МК, в которой определяется стек, выводятся нули на индикаторы и разрешаются прерывания по входу INT0 (прерывания разрешаются только по перепаду 1->0, т.е. при нажатии кнопки SB1). Затем программа зацикливается, и МК переходит в режим ожидания нажатия кнопки SB1.  При выполнении подпрограммы обслуживания прерывания ISR0 вводится код со входа порта P0, его запоминание в памяти данных и вывод в hex-формате в порты P1 и P2. После этого происходит возврат в основную программу, т.е. вновь в режим ожидания нажатия кнопки SB1.