Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие МИУС.docx
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
866 Кб
Скачать
☆
        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 необходимо выбрать пункт меню File → New. Открывшийся файл необходимо сохранить с расширением .asm. Для этого следует вызвать пункт меню File → Save As. Маршрут сохраняемого файла должен содержать только английские буквы и не содержать пробелов. После этого можно приступить к набору текста.

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

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

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

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

В случае, если программа работает не так как ожидалось, можно воспользоваться пошаговым режимом выполненя. Для этого вместо команды на запуск (Debugger →Run), следует отдать команду шаг (Debugger →Step 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.