Реферат Курсовая Конспект
Приклад написання вхідного тексту програми - раздел Высокие технологии, ТЕХНОЛОГІЯ РОЗРОБКИ ТА ВІДЛАГОДЖЕННЯ Нижче Наведений Приклад Написання Початкового Тексту Робочої ...
|
Нижче наведений приклад написання початкового тексту робочої програми для ОМК PIC 16С84 (16F84):
; Приклад початкового тексту програми (назва програми) | |||||||||
LIST P = 16C84, E = 2 | |||||||||
;Секція заголовка | |||||||||
; Опис операційних регістрів | |||||||||
TMRO | EQU | 01h | ; Імені TMRO присвоєне ; значення 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 | 0D | |||||||
; Опис бітів регістру STATUS | |||||||||
C | EQU | 0h | ; Iдентифікатору (імені) ; С присвоєне значення 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 | |||||||||
GOTO | BEGIN | ||||||||
ORG | 100h | ||||||||
BEGIN | |||||||||
; Iніціалізація мікроконтролера | |||||||||
MOVLW | INITA | ||||||||
MOVLF | TRISA | ||||||||
MOVLW | INITB | ||||||||
MOVWF | TRISB | ||||||||
; Виведення дискретних сигналів | |||||||||
MOVLW | B'01010101' | ; Завантажити 01010101 в W | |||||||
MOVWF | DATAPORT | ; Записати W в порт В | |||||||
GOTO | $ | ; Нескінченний цикл | |||||||
; Секція закінчення END | |||||||||
Спробуємо на підставі наведеного прикладу пояснити деякі основні особливості й правила написання вхідних текстів програм для ОМК PIC на мові Асемблера. Для цього будемо аналізувати і обговорювати рядок за рядком дану програму.
По-перше, всі рядки, що починаються зі знака ";" сприймаються асемблеpом як коментарі. Перейдемо до виразу TMR0. Ми задали асемблеpу, що кожний раз, коли зустрінеться слово TMR0, необхідно підставити значення 01h (01 шістнадцятирічне). Слово "EQU" означає pівність.
Таким способом ми надали TMR0 значення 01h. Як видно з рис. 1.2, регістр TMR0 справді має адресу 01h. Ви можете використати 01h кожного разу, коли захочете адресувати регістр TMR0, але це буде значно складніше налагодити, оскільки Ви повинні будете весь час пам'ятати, що 01h означає TMRO. У Вас можуть існувати і дані, що дорівнюють 01h. Використання символьних імен усуває двозначність і дозволяє полегшити читання вхідного тексту. Ви також можете бачити вирази для виявлення регістрів PC, STATUS і FSR. Ім'я PC відповідає регістру з адресою 02h, ім'я STATUS відповідає регістру з адресою 03h, ім'я FSR – регістру з адресою 04h і так далі. Ми також задали імена для портів вводу/виводу, CNTRLPORT (05h) і DATAPORT (06h).
Комірки ОЗП також можуть мати імена. Ми вибрали імена "SCRATCH" для комірки з адресою 0Ch і "DIGIT" для комірки з адресою 0Dh.
Якщо Ви прочитаєте до кінця цей вхідний текст програми, то побачите, що ми ніде не використовуємо PC безпосередньо, хоча це ім'я і виявлено. В цьому немає помилки – можна виявляти імена і потім не використовувати їх, хоча, звичайно, не можна використовувати ім'я, якщо воно не було попередньо виявлено. Hе турбуйтесь за це – робота асемблеpа якраз і полягає в перевірці тексту на дотримання всіх правил, і Ви отримаєте повідомлення про помилки, якщо щось не буде відповідати правилам.
Ви можете не тільки називати регістри, але й окремі біти усередині регістрів. Зверніть увагу на секцію, що задає регістр STATUS. В табл. 1.2 показано, з чого складається регістр STATUS. Символу С присвоєно значення 0h, оскільки CARRY або C, це нульовий біт слова стану STATUS. Кожного разу, коли ми повинні будемо перевіряти біт CARRY (біт 0), ми будемо користуватися попередньо виявленим символом "C". Кожного разу, коли ми забажаємо звернутися до біта 2 або біта ZERO, ми будемо використовувати символ "Z" замість 02h. Ви можете визначити таким чином повну структуру бітів регістру, навіть якщо Ви після цього не всі з них будете використовувати.
Тепер нам стало ясно, як описуються регістри, і ми можемо перейти до коду, що виконується. Перед тим, як почати код, що виконується, ми повинні задати вираз ORG 0. Це покажчик для асемблеpа, що код, наступний за цим виразом, починається з нульової адреси ППЗУ. Вираз "ORG" використовується для розміщення сегментів коду за різними адресами в межах розмірів ППЗУ. Ще один вираз ORG знаходиться перед міткою BEGIN, що має адресу 100h, як задано виразом ORG 100h. Код, що виконується, повинен закінчуватися директивою END, що означає, що за цією директивою будуть відсутні виконувані команди.
При включенні живлення PIC16F84 пересувається на адресу 000h. Перша інструкція, котра буде виконана процесором, це команда GOTO BEGIN, яка передасть керування на адресу 100h і подальша робота продовжиться з цієї адреси. Вираз BEGIN – це ім'я мітки, що вибирається користувачем (мітки завжди повинні починатися з першої позиції рядка), котру асемблеp використовує в якості адресного заслання. В процесі роботи асемблеp виявляє положення мітки BEGIN і запам’ятовує, якщо це ім'я зустрінеться ще раз, замість нього буде підставлена адреса мітки. Команди CALL і GOTO використовують мітки для посилань у початковому тексті.
Тепер подивимось на наступні команди, що виконуються процесором. Команда MOVLW INITA завантажує в робочий регістр W значення, що присвоєне імені INITA. Це значення задане в заголовку і дорівнює B'00000000', тобто 00h. Символи B' означають, що дані задані в двійковому форматі. Можна було б написати в цьому ж місці 0 (десятковий) або 0h (шістнадцятирічний символ) і отримати той же самий результат. Двійкове число зручно використовувати в тих випадках, коли припускається операція з бітами в регістрі.
Наступна команда MOVWF TRISA завантажує значення з робочого регістру W в регістр керування конфігурацією порту A TRISA. Завдання 0 в розряді цього регістру виявляє, що відповідний розряд порту A є виходом. В нашому випадку всі розряди порту A встановлюються виходами. Зверніть увагу, що порт A має тільки 5 розрядів, і старші 3 біти значення, що записується в регістр TRISA, що також має 5 розрядів, не використовуються. Якщо б ми забажали, наприклад, встановити молодший розряд порту A як вхід, ми б задали в секції описи регістрів значення INITA, що дорівнює B'00000001'. Якщо по ходу роботи програми нам знадобиться перевизначити призначення окремих розрядів портів, наприклад, при двонаправленій передачі, то зручніше за все задати всі необхідні слова конфігурації в секції опису, як ми зробили для INITA і INITB.
Наступні дві команди MOVLW INITB і MOVWF TRISB визначають конфігурацію порту B. Ми могли б економити і не писати команду MOVLW INITB, оскільки в нашому випадку INITB також дорівнює 0h. Однак ми не стали цього робити, оскільки це може призвести до помилок, що важко виявляються, якщо згодом нам знадобиться змінити призначення якогось одного розряду. Замість того, щоб змінити тільки один pозpяд в одному порту, зміняться два розряди з однаковим номером в двох портах. Тому, доки програма не закінчена, таку економію робити не бажано, хоча в кінці, на етапі оптимізації коду, такі повтори можна вилучати.
От тепер по суті ми тільки підійшли до аналізу основної частини вхідного тексту робочої програми – "Виведення дискретних сигналів".
В цій частині програми ми використали всього три команди:
MOVLW k,
MOVWF f,
GOTO k.
Команда MOVLW завантажує байтовий літерал або константу в робочий регістр W. Наступна команда MOVWF пересилає байт з робочого регістру W в заданий регістр f. Команда GOTO передає керування на адресу k. Таким чином, ця частина програми записує в робочий регістр W значення 01010101 і після цього видає його зміст до порту B.
Директива асемблеpа "$" означає поточне значення програмного лічильника (PC). Тому команда GOTO $ означає перехід туди, де ми в даний момент знаходимось. Такий цикл нескінченний, оскільки не існує способу (окрім переривання) вийти з нього. Команда GOTO $ часто застосовується для зупинки коду при налагодженні.
Якщо б до всіх виводів порту В були, наприклад, підключені світлодіоди, то після запуску розглянутої програми ми побачили б свічення тільки чотирьох з них.
– Конец работы –
Эта тема принадлежит разделу:
ТЕХНОЛОГІЯ РОЗРОБКИ ТА ВІДЛАГОДЖЕННЯ РОБОЧИХ ПРОГРАМ ДЛЯ OMK PIC Технологія розробки та... Правила запису програм на мові Асемблера...
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Приклад написання вхідного тексту програми
Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов