Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПР 10.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
83.22 Кб
Скачать

Указание. Имена директив public и extern необходимо набирать, начиная со 2-й позиции курсора. Имена меток, символических имен следует набирать, начиная с 1-й позиции курсора.

;-----------------CROSSCOD--------------------------------------------------------------------------------

; Подпрограмма преобразования двоичного позиционного кода в семисегментный код.

; Входной параметр: (А) – двоичный (позиционный) код символа.

; Выходной параметр: (А) – семисегментный код символа.

;-----------------------------------------------------------------------------------------------------------------

PUBLIC CROSSCOD

CROSSCOD: MOV DPTR, #TABLECOD

MOVC A, @A+DPTR

RET

; Таблица семисегментных кодов символов

TABLECOD: DB 3FH ; Код цифры “0”

DB 06H ; Код цифры “1”

DB 5BH ; Код цифры “2”

DB 4FH ; Код цифры “3”

DB 66H ; Код цифры “4”

DB 6DH ; Код цифры “5”

DB 7DH ; Код цифры “6”

DB 07H ; Код цифры “7”

DB 7FH ; Код цифры “8”

DB 6FH ; Код цифры “9”

DB 77H ; Код цифры “A”

DB 7CH ; Код цифры “B”

DB 39H ; Код цифры “C”

DB 5EH ; Код цифры “D”

DB 79H ; Код цифры “E”

DB 71H ; Код цифры “F”

END

Закончив набор текста, получите объектный файл crosscod.obj.

2. Создайте файл с именем displ.asm в вашей папке. Запишите в него текст подпрограммы DISPL:

;-----------------------------DISPL------------------------------------------------------

; Подпрограмма вывода двухзначного шестнадцатиричного числа на дисплей

; Входной параметр регистр A - число в HEX-коде

; Используется подпрограмма CROSSCOD

;------------------------------------------------------------------------------------------------

PUBLIC DISPL

EXTERN CROSSCOD

DISPL: MOV R1, A

ANL A, #0FH ; Выделить МлТ числа

CALL CROSSCOD ; В аккумуляторе – семисегментный код

MOV P1, A ; Вывод на индикатор HG1

MOV A, R1

SWAP A ; Обмен тетрад в аккумуляторе

ANL A, #0FH ; Выделить МлТ числа

CALL CROSSCOD

MOV P2, A ; Вывод на индикатор HG2

RET

END

Закончив набор текста программы, получите объектный файл displ.obj.

3. Создайте файл с именем in_out.asm в вашей папке. Запишите в него текст программы IN_OUT:

;------------------------------------------IN_OUT-----------------------------------------------------------

; Главная программа работы микроконтроллера

; Используются подпрограммы DISPL, CROSSCOD

;----------------------------------------------------------------------------------------------------------------

PUBLIC IN_OUT

EXTERN DISPL, CROSSCOD

SAVE: EQU 30H ; Адрес ячейки ПД для хранения входного кода

ORG 0000H

IN_OUT: MOV SP, #70H ; Определить стек

CLR A

MOV SAVE, A ; Очистить ячейку ПД

CALL DISPL ; Вывести нули на дисплей

; Ожидание импульса на входе порта P3.2

WAIT1: JB P3.2, WAIT1 ; Ожидание P3.2=0

WAIT2: JNB P3.2, WAIT2 ; Ожидание P3.2=1

MOV A, P0 ; Ввод кода из порта

MOV SAVE, A ; Запоминание кода в ПД

CALL DISPL ; Вывод на дисплей

JMP WAIT1 ; Зацикливание программы

END

Закончив набор текста программы, получите файл in_out.obj.

Отладку многомодульных программ следует выполнять последовательно. В нашем примере сначала подпрограмму CROSSCOD, затем подпрограмму DISPL и, наконец, главную программу IN_OUT.

4. Выполните проверку работы подпрограммы CROSSCOD. С этой целью получите файл crosscod.hex с помощью линкера link.exe. Запустите симулятор/отладчик AVSIM51 и загрузите в него файл crosscod.hex. При рассмотрении текста программы CROSSCOD недоумение могут вызвать команды, расположенные с адреса 0005H. В исходной программе здесь располагались константы 3FH, 06H и т.д. Дело в том, что отладчик AVSIM51 не может различать константы и коды команд, которые размещены в программной памяти. Любые данные он интерпретирует как команды. Таким образом, значению 3FH соответствует команда ADDC A, R6, а значению 06H – команда INC @R0 и т.д.

Отладка подпрограммы CROSSCOD состоит в проверке соответствия полученных данных (выходной параметр) и исходных данных (входной параметр). Исследуйте работу программы CROSSCOD в пошаговом режиме при следующих исходных данных: (A)=00H, (A)=09H, (A)=0FH. Выполнение программы заканчивайте при достижении команды RET.

5. Выполните проверку работы подпрограммы DISPL. Она является двухмодульной, в ней есть ссылка на другую программу CROSSCOD. В данном случае программный модуль DISPL будет считаться главным, а модуль CROSSCOD будет внешним. Объектные файлы этих модулей содержатся в файлах displ.obj и crosscod.obj.

Компоновку многомодульных программ с помощью линкера link.exe удобно выполнять в диалоговом режиме. При этом компьютер выдает на экран монитора несколько подсказок, на которые требуется ответить.

Рассмотрим процесс компоновки программ, полученных в файлах displ.obj и crosscod.obj.

1. На панели TotCom с помощью курсора выделяем файл link.exe и запускаем его. Компьютер выдает первую подсказку:

Input Filename:

Необходимо набрать имя первого входного файла. В нашем случае это будет файл главного модуля displ.obj. По умолчанию расширение .obj можно не вводить. Наберите displ и нажмите Enter.

Далее появляется сообщение:

Enter offset for 'CODE':

Компьютер запрашивает величину смещения (offset) первой команды программы DISPL относительно начального адреса 0000H. Так как для однокристальных микроконтроллеров фирмы “Intel” программа должна обязательно начинаться с адреса 0000H, то смещение равно 0. Нажмите клавишу Enter, что по умолчанию в данном случае означает отсутствие смещения.

2. На экране появляется вторая подсказка:

Input Filename:

Необходимо ввести имя второго входного файла. В данном случае это будет crosscod.obj. Наберите crosscod и нажмите Enter. На экране появится сообщение:

Enter offset for 'CODE':

Компьютер запрашивает величину смещения начального адреса программы CROSSCOD относительно конечного адреса программы DISPL. Как правило, при компоновке программ для микроконтроллеров с целью экономии памяти отдельные модули следуют друг за другом без смещения. Поэтому нажимаем клавишу Enter, что означает отсутствие смещения.

3. На экране появится третья подсказка:

Input Filename:

Так как имена всех входных файлов были уже введены, то нажимаем клавишу Enter, что сообщает компоновщику об окончании списка входных файлов.

4. Компьютер выводит четвертую подсказку:

Output Filename:

Линкер запрашивает имя выходного файла, который им будет создаваться. В принципе имя этого файла может быть произвольным. Однако обычно имя выходного файла совпадает с именем главного модуля программы, в данном случае displ. Если это так, то просто нажимаем клавишу Enter.

5. На экране появляется пятая подсказка:

Library Filename:

Компьютер запрашивает имя файла библиотеки, где могут находиться программы, используемые при компоновке. В нашем случае библиотечные файлы не используются, поэтому в ответ нажимаем клавишу Enter.

6. И, наконец, на экране появляется последняя подсказка:

Options(D,S,A,M,Z,X,H,E…;<CR>=Default):

Компьютер запрашивает имена опций, которые будут использованы при формировании выходного файла. Опции определяют формат файла, тип устройства вывода и т.д. Если в ответ на этот запрос будет нажата клавиша Enter, то по умолчанию компоновщик создаст выходной файл в формате Intel Hex с выводом результатов только на экран дисплея. А так как именно этот формат использует симулятор/отладчик AVSIM51, то просто нажимаем клавишу Enter.

Результаты работы программы-компоновщика (линкера) выводятся на экран в следующем виде: сначала заголовок, затем карта загрузки (LOAD MAP), где указаны имена отдельных модулей, их начальные и конечные адреса, а также размеры модулей в адресном пространстве, затем следует наименование выходного файла и его формат. Компоновка считается успешной, если в нижней строке на экране будет выведено:

Link Errors: 0

В результате работа компоновщика в раскрытой папке на панели TotCom появится файл с именем displ.hex, который будет использоваться при отладке программы DISPL.

Запустите симулятор/отладчик AVSIM51 и загрузите в него файл displ.hex. Отладку программы DISPL рекомендуется делать следующим образом.

  1. С помощью клавиши ESC переходим в дисплейную область отладчика AVSIM51. Устанавливаем точку останова на первой от начала команде RET (последняя команда программы DISPL). Устанавливаем (с помощью клавиши F5) низкую скорость работы отладчика (LOW).

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

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

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. Если программа выполняется правильно при всех значениях входного кода, то процесс отладки можно считать законченным.

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

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

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

Рис. 10.4. Блок-схемы алгоритмов программ работы МК с использованием прерывания

1. На панели TotCom в вашей папке создайте файл с именем inter.asm и занесите в него текст программы INTER:

;------------------------------------INTER-------------------------------------------------------------

; Главная программа работы микроконтроллера

; Используются подпрограммы DISPL, CROSSCOD

;----------------------------------------------------------------------------------------------------------

PUBLIC INTER

EXTERN DISPL, CROSSCOD

SAVE: EQU 30H ; Адрес ячейки ПД для хранения входного кода

ORG 0000H

INTER: JMP MAIN ; Переход на метку MAIN

ORG 0003H ; Вектор прерывания по INT0

JMP ISR0 ; Переход на программу ISR0

ORG 0010H ; Начало программы MAIN

MAIN: MOV SP, #70H ; Определить стек

CLR A

MOV SAVE, A ; Очистить ячейку SAVE

CALL DISPL ; Вывести нули на HG1 и HG2

; Разрешить прерывание по INT0

SETB EX0 ; Разрешить прерывание по INT0

SETB IT0 ; Разрешить прерывание по перепаду 1->0

SETB EA ; Общее разрешение прерываний

STOP: JMP STOP ; Зацикливание программы

; Обработчик прерывания

ISR0: MOV A, P0

MOV SAVE, A ; Запоминание кода в ПД

CALL DISPL ; Вывод на дисплей

RETI ; Возврат из прерывания

END

Обратите внимание на биты EX0, IT0, EA. Они находятся в регистрах специальных функций IE и TCON.

Закончив набор текста программы, получите объектный файл inter.obj.

2. Проверку правильности работы программы микроконтроллера рекомендуется вести в следующей последовательности. Произведите компоновку программы INTER в диалоговом режиме работы линкера link.exe. Последовательно запишите имена всех файлов, помеченных в директивах PUBLIC и EXTERN, т.е. inter.obj, displ.obj, crosscod.obj. В результате компоновки появится новый файл с именем inter.hex. Обязательно убедитесь в отсутствии ошибок при компоновке. Для удобства дальнейшей отладки запишите начальные и конечные адреса всех модулей, входящих в результирующую программу.

Запустите симулятор/отладчик AVSIM51 и загрузите в него файл inter.hex. Отключите отображения меток с помощью Alt-F5. Выполните прогон программы в автоматическом режиме с малой скоростью (LOW). Программа должна зациклиться на команде AJMP $. Это соответствует строке STOP: JMP STOP в программе INTER. Программа ожидает нажатия кнопки SB1, т.е. появления нуля на линии P3.2 (INT0 – это альтернативная функция линии P3.2). Убедитесь, что на выводах портов P1 и P2 появились семисегментные коды, соответствующие числу 00H. Используя комбинацию клавиш Alt-P, переместите курсор на выводы порта Р3 и занесите 0 во второй разряд Р3 (Р3.2<-0). Должен произойти переход к обработчику прерывания, т.е. выполнение подпрограммы ISR0. В результате на выводах портов P1, P2 появятся семисегментные коды, соответствующие числу FFH со входа порта P0. Кроме того, в ячейке 30H памяти данных должен быть также код FFH. Затем занесите 1 во второй разряд порта P3 (P3.2<-1).

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]