Смекни!
smekni.com

Мікропроцесорні пристрої (стр. 10 из 21)

Використовувані як операнди символічні імена і мітки повинні бути визначені, а числа представлені з вказівкою системи числення, для чого використовується префікс (буква, що стоїть перед числом): В - для двійкової, Q - для вісімкової, D - для десяткової, Н - для шістнадцяткової.

Число без префікса за умовчанням вважається десятковим.

Псевдокоманди асемблера. Асемблююча програма транслює початкову програму в об‘єктні коди. Хоча транслююча програма бере на себе багато з рутинних завдань програміста, такі як привласнення дійсних адрес, перетворення чисел, привласнення дійсних значень символьним змінним і т.п., програміст все ж таки повинен вказати їй деякі параметри: початкова адреса робочої програми, кінець асембльованої програми, формати даних і т.п. Всю цю інформацію програміст вставляє в початковий текст своєї прикладної програми у вигляді псевдокоманд (директив) асемблера, які тільки управляють процесом трансляції і не перетворяться в коди об‘єктної програми.

Псевдокоманда ORG 100H задає асемблеру адресу елементу пам'яті (100Н), в якій повинна бути розташована наступна за нею команда прикладної програми.

Псевдокомандою EQU можна будь-якому символічному імені, використовуваному в програмі, поставити у відповідність певний операнд.

Наприклад, запис

TMR0 EQU 01h приводить до того, що в процесі асемблювання усюди, де зустрінеться символічне ім'я TMR0, воно буде замінено числом 1.

Псевдокомандою END програміст дає асемблеру вказівку про закінчення трансляції.

В результаті трансляції повинна бути отримана карта пам'яті програм, де кожному елементу пам'яті поставлений у відповідність код, що зберігається в ньому.

Нижче приведений фрагмент робочої програми, що містить операнди з різним способом завдання і псевдокоманду END:

MOVLW

B'01010101'

; Завантажити константу

;01010101

; у регістр W

MOVLW

DATAPORT

; Записати вміст регістра

; W в регістр DATAPORT

; (визначений раніше як порт ; В)

GOTO

$

; Безкінцевий цикл (вічний

; цикл для перевірки програми в ; динамічному режимі). Вихід ; тільки по перериванню.

END

; Кінець трансляції і закінчення

; програми

3.2 Структура робочої програми

Робоча програма для ОMK PIC 16/18 складається з трьох основних секцій:

1.Секція заголовка;

2.Робоча секція; 3.Секція закінчення.

У секції заголовка визначаються логічні імена для всіх використовуємих в програмі ресурсів: портів, бітових і байтових змінних, регістрів. Це початкова частина початкової програми до рядка з виразом ORG 0 (для PIC 16F877). Для інших типів мікроконтролерів сімейств PIC

16/18 адреса початку наступної секції (сегменту) робочої програми може бути іншою (див. організацію пам'яті програм конкретного типу ОМК).

Робоча секція програми починається з виразу ORG 0 (для PIC16F877), який є покажчиком для Асемблера про те, що код наступний за цим виразом починається з нульової адреси пам'яті програм. Приклад цього фрагмента робочої програми для PIC 16F877 приведений нижче:

; Робоча секція

;

; Початок виконуємої частини програми

ORG

; Наступна команда буде

; розташована в пам‘яті

; програм за адресою 0h

GOTO

BEGIN

; Перша команда, яка буде

; виконана процесором

ORG

100h

; Наступна команда буде ; розташована за адресою 100h

BEGIN

; Иніціалізація мікроконтролера

; (Конфігурація портів введення/виводу, TMR0, WDT и т.п.)

;

Секція закінчення в простому випадку містить тільки псевдо-команду END.

3.3 Приклад написання початкового тексту програми

Нижче приведений приклад написання початкового тексту робочої програми для ОМК PIC 16С877 (16F877):

; Приклад початкового тексту програми (Назва програми)

;

LIST P=16C877

;

;Секція заголовка

;

;Опис операційних регістрів

TMR0 EQU 01h ; Імені TMR0 привласнено

; значення 01h ( де, 01h- ; адреса регістра TMRO в

; памяти даних ПД )

PC EQU 02h

STATUS EQU 03h

FSR EQU 04h

; Опис регістрів введення/виводу

CNTRLPORT EQU 05h ; Імені CNTRLPORT

; привласнено значення 05h

DATAPORT EQU 06h

; Опис комірок ОЗП

SCRATCH EQU 0Ch ; Імені SCRATCH

;привласнено значення 0Сh

DIGIT EQU D

; Опис бітів регістра STATUS

C EQU 0h ; Ідентифікатору (імені)

; С привласнено значення 0

; ( 0-й розряд регістра

; STATUS )

DC EQU 1h

Z EQU 2h

PD EQU 3h

TO EQU 4h

RP EQU 5h

; Опис керуючих регістрів

TRISA EQU 85h ; Імені TRISA привласнено

; значення 85h ( де, 85h – ; адреса регістра TRISA в

; ПД )

TRISB EQU 86h

; Опис слів ініціалізації (констант) для портів введення/виводу

; що визначають призначення кожного розряду регістрів портів

INITA

EQU

B'00000000'

; Імені INITA привласнено ; значення двійкового коду

; 00000000, згідно

; якому всі розряди

; порта А призначені ; виходами

INITB

EQU

B'00000000'

;

; Робоча секція

; Початок виконуємої частини робочої програми

ORG 0

GOTO BEGIN

ORG 100h

; Ініціалізація мікроконтролера

MOVLW INITA

MOVLF TRISA

MOVLW INITB

MOVWF TRISB

;

; Виведення дискретних сигналів

MOVLW B'01010101'

;Завантажити01010101 у W

MOVWF DATAPORT

; Записати W у порт В

GOTO $

;

; Нескінченний цикл

; Секція закінчення

;

END

Спробуємо на підставі приведеного прикладу пояснити деякі основні особливості і правила написання початкових текстів програм для ОМК PIC на мові Асемблера. Для цього аналізуватимемо і обговорюватимемо рядок за рядком дану програму.

По-перше, всі рядки, що починаються із знаку ";", сприймаються асемблером як коментарі. Перейдемо до виразу TMR0. Ми задали асемблеру, що кожного разу, коли зустрінеться слово TMR0, необхідно підставити значення 01h (01 шістнадцяткове). Слово "EQU" означає рівність. Таким чином, ми привласнили TMR0 значення 1h. Ви можете використовувати 01h кожного разу, коли хочете адресувати регістр TMR0, але це значно складніше відладжувати, оскільки Ви повинні будете весь час пам'ятати, що 01h означає TMR0. У Вас можуть існувати і дані, рівні 01h. Використання символьних імен усуває двозначність і дозволяє полегшити читання початкового тексту. Ви також можете бачити вирази для визначення регістрів РС, STATUS і FSR. Ім'я РС відповідає регістру з адресою 02h, ім'я STATUS відповідає регістру з адресою 03h, ім'я FSR - регістру з адресою 04h і так далі. Ми також задали імена для портів введення/виводу, CNTRLPORT (05h) і DATAPORT (06h).

Осередки ОЗП також можуть мати імена. Ми вибрали імена "SCRATCH" для осередку з адресою 0Ch і "DIGIT" для осередку з адресою 0Dh.

Якщо Ви прочитаєте до кінця цей початковий текст програми, то побачите, що ми ніде не використовуємо РС безпосередньо, хоча це ім'я і визначено. У цьому немає помилки - можна визначати імена і потім не використовувати їх, хоча, звичайно, не можна використовувати ім'я, якщо воно не було заздалегідь визначене. Hе дуже піклуйтесь про це - робота асемблера якраз і полягає в перевірці тексту на дотримання всіх правил, і Ви отримаєте повідомлення про помилки, якщо щось не відповідатиме.

Ви можете не тільки іменувати регістри, але і окремі біти усередині регістрів. Зверніть увагу на секцію, задаючу регістр STATUS. Символу С привласнено значення 0h, оскільки C або CARRY, це нульовий біт слова стану STATUS. Кожного разу, коли ми повинні будемо перевірити біт CARRY (біт 0), ми користуватимемося заздалегідь певним символом "C". Кожного разу, коли ми захочемо звернутися до біта 2, або біту ZERO, ми використовуватимемо символ "Z" замість 02h. Ви можете визначити повну структуру бітів регістра, навіть якщо Ви потім не все з них використовуватимете.

Тепер нам стало ясно, як описуються регістри, і ми можемо перейти до виконуваного коду. Перед тим, як почати виконуваний код, ми повинні задати вираз ORG 0. Це покажчик для Асемблера, що код, наступний за цим виразом, починається з нульової адреси ППЗП. Вираз "ORG" використовується для розміщення сегментів коду по різних адресах в межах розмірів ППЗП. Ще один вираз ORG знаходиться перед міткою BEGIN, що має адресу 100h, як задано виразом ORG 100h. Виконуваний код повинен закінчуватися директивою END, що означає, що за цією директивою відсутні виконувані команди.

При включенні живлення PIC16F877 переходить на адресу 0000h.