Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие МИУС.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
865.51 Кб
Скачать
        1. Вызов подпрограммы

В некоторых случаях удобно бывает выполнять один и тот же фрагмент кода из разных мест программы. Команды безусловного перехода goto для этого недостаточно, потому что нужно возвращаться именно в то место, откуда был произведен переход. Для этого используется связка fcall..return (1) или fcall..retlw (2). Отличием (1) от (2) является то, что инструкция return только возвращает управление на инструкцию, следующую за fcall, а retlw в дополнение к этому может возвратить какую-либо константу. Последняя также используется для организации lookup-таблиц.

fcall subprogram ; 1

movlw 0 ; 4

subprogram:

movlw 1 ; 2

return ; 3

В приведенном примере инструкции выполнятся в порядке, обозначенном в комментариях.

      1. Использование среды mplab

Для проверки программ на учебных микропроцессорных комплектах рекомендуется использование среды MPLAB.

Рис. 2.3. Окно программы MPLAB IDE

Подготовка к набору программы

Перед началом работы с программой в среде MPLAB необходимо выбрать пункт меню FileNew. Открывшийся файл необходимо сохранить с расширением .asm. Для этого следует вызвать пункт меню FileSave As. Маршрут сохраняемого файла должен содержать только английские буквы и не содержать пробелов. После этого можно приступить к набору текста.

Также необходимо указать MPLAB тип используемого микроконтроллера. Для этого необходимо выбрать пункт меню ConfigureSelect Device... и в открывшемся диалоговом окне (рис. 1.8.) выбрать тип устройства. В данном случае это PIC16F873A.

Рис. 2.4. Выбор типа микроконтроллера

Компиляция и запуск программы

Для запуска программы на учебном микропроцессорном комплекте ее следует транслировать в машинный код и загрузить полученный код в микропроцессорный комплект. Для трансляции следует выбрать пункт меню ProjectQuickbuild, для загрузки в микропроцессорный комплект сначала следует выбрать средство отладки Pickit2 (DebuggerSelect Tool →5 Pickit 2) а затем запустить программу (DebuggerRun).

В случае, если программа работает не так как ожидалось, можно воспользоваться пошаговым режимом выполненя. Для этого вместо команды на запуск (DebuggerRun), следует отдать команду шаг (DebuggerStep Over). При этом отладчик выполнить ровно одну инструкцию и остановится. Для выполнения следующего шага команду следует повторить.

    1. Моделирование комбинационных автоматов

      1. Метод непосредственного вычисления фал

Метод непосредственного вычисления ФАЛ заключается в повторении естественного алгоритма человеческого мышления, который используется для вычисления любых сложных выражений (арифметических, булевых и иных подобных). Естественный алгоритм содержит следующие шаги:

– Разбить сложное выражение на элементарные выражения.

– Определить последовательность вычисления элементарных выражений с учетом скобок, имеющихся в изначальном сложном выражении и приоритета операторов.

– Вычислить все элементарные выражения в порядке, установленном в пункте 2.

Достоинством метода является его относительная простота для понимания. Недостатками метода являются 1) потребность в дополнительном объеме памяти для хранения промежуточных результатов. 2) вычислительная сложность, прямо пропорциональная размеру моделируемой функции.

В качестве примера, вычислим значение выражения Для этого разобьём его на элементарные выражения и определим порядок их выполнения:

После чего поэтапно вычислим элементарные выражения и получим результат.

Метод непосредственного вычисления ФАЛ, применяемый для ОМЭВМ отличается от естественного тем, что в нем дополнительно решаются проблемы памяти. Человек при вычислении выражения не задумывается о том, куда сохраняются промежуточные результаты и каким образом об этих результатах узнают остальные, программист же должен явно указывать, в какую ячейку памяти записывать промежуточные результаты и с помощью каких устройств микропроцессорная система будет сообщаться с внешним миром. С учетом изложенного, алгоритм для ОМЭВМ принимает следующий вид:

  1. Разбить сложное выражение на элементарные выражения.

  2. Определить последовательность вычисления элементарных выражений с учетом скобок, имеющихся в изначальном сложном выражении и приоритета операторов.

  3. Для каждого из элементарных выражений выделить ячейку памяти, в которой будут храниться результаты его вычисления.

  4. Определить интерфейс микропроцессорной системы: то через какие устройства, она будет сообщаться с внешним миром. В самом простом случае это означает задаться битами портов ввода, откуда будет производиться чтение входных переменных и битами портов вывода, куда будет выводиться результат вычисления ФАЛ.

  5. Для каждого из элементарных выражений записать последовательность мнемоник ассемблера, которая производит необходимые вычисления. Полученные последовательности расположить в файле исходного текста в соответсвии с установленным в пункте 2 порядком вычисления элементарных выражений.

В качестве примера напишем программу, вычисляющую следующую ФАЛ:

Элементарные операции вычисления этого выражения, а также порядок их выполнения примут следующий вид:

Как видно, выражение содержит 4 элементарных, поэтому для промежуточных результатов выделим 4 ячейки памяти и присвоим им имена EXPR_1 .. EXPR_4:

#define EXPR_1 H’20’

#define EXPR_2 H’21’

#define EXPR_3 H’22’

#define EXPR_4 H’23’

Определимся с интерфейсом: пусть переменным a, b, c, d соответствуют биты 0, 1, 2, 3 порта PORTB, а выходной переменной f — 0-й бит порта PORTC.

#define IN_A PORTB, 0

#define IN_B PORTB, 1

#define IN_C PORTB, 2

#define IN_D PORTB, 3

#define OUT_F PORTC, 0

Теперь запишем, в соответствии с установленным ранее порядком, последовательности мнемоник, вычисляющие каждое из элементарных выражений:

Элементарное выражение 1 ( ):

movlw 1

btfss IN_A

movlw 0

btfsc IN_B

iorlw 1

movf EXPR_1

Элементарное выражение 2 ( ):

movlw 1

btfss IN_C

movlw 0

btfsс IN_B

iorlw 0

movf EXPR_2

Элементарное выражение 3 ( ):

movlw 1

btfss EXPR_2

movlw 0

btfss IN_D

andlw 0

movf EXPR_3

Элементарное выражение 4 ( ):

movlw 0

btfss EXPR_1

movlw 1

btfss EXPR_3

andlw 1

movf EXPR_4

К вышенаписанному коду нужно добавить вывод результата (который получается в ячейке EXPR_4) в порт вывода.

btfss EXPR_4

bcf OUT_F

btfsc EXPR_3

bsf OUT_F

Полный исходный текст примера приведен в приложении A.1.