Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

РОБОЧИХ ПРОГРАМ ДЛЯ OMK PIC

Читайте также:
  1. D) программа
  2. I)Однофакторный дисперсионный анализ (выполняется с применением программы «Однофакторный дисперсионный анализ» надстройки «Анализ данных» пакета Microsoft Excel).
  3. I. ПРИКЛАДНОЕ ПРОГРАМНОЕ ОБЕСПЕЧЕНИЕ
  4. I. ПРОГРАМА КУРСУ
  5. I. Программирование на CF Pascal
  6. I. Рабочая программа дисциплины
  7. I. Языки программирования
  8. IF(POS('ПРОГРАММИР',NAZ)<>0) AND
  9. II. Анализ программ по чтению и литературной подготовке учащихся начальной школы и УМК к ним. Познакомьтесь с требованиями ФГОС.
  10. II. Программа курса

“Регістри”

 

 

Виконав: ст. гр. КІТ-21б

Карабут Д. В.

Перевірив: Скородєлов В. В.

 

 

Харків - 2003

 

РОБОЧИХ ПРОГРАМ ДЛЯ OMK PIC

 

Технологія розробки та відлагодження робочих програм для ОМК PIC відрізняється від традиційної [1] тільки набором інструментальних засобів. Написання вхідного тексту програми можливо на одній з наступних мов: Асемблері, Макроасемблері та С. На цьому етапі можуть використовуватися будь-які текстові редактори.

Для компіляції програм може бути використаний відповідний компілятор з мови С або Асемблер МРАSM [5, 6]. Відлагодження програм може бути здійснено з використанням програмних симуляторів MPSIM або внутрішньосхемних емуляторів реального часу PICMASTER або ICE PIC.

Запис відлагодженої програми у вигляді гексадецимального коду можна записати в ПЗУ ОМК. Ця операція здійснюється за допомогою спеціальних програматорів, наприклад типу PIC START, СOM PIC, PIC LAB-16 та інших.

Для цієї ж мети можна скористатися інтегрованими середовищами picDesigner або MPLAB, що представляють собою потужні пакети інструменталь­них засобів, аналогічні зазначеним вище.

Розглянемо більш докладно ці питання для випадку написання робочих програм на мові Асемблер.

 

3.1. Правила запису програм на мові Асемблера

 

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

 

МIТКА ОПЕРАЦІЯ ОПЕРАНД (і) КОМЕНТАР

 

Ланки (поля) можуть відділятися один від одного довільним числом пропусків. Порядок і позиція полів важливі. Так, мітки повинні починатися в першому стовпчику. Операція (мнемоніка команди) може починатися в другому стовпчику або поза ним.

Операнди слідують за мнемонікою команди. Коментарі можуть слідувати за операндами, мнемонікою або мітками, і можуть починатися в будь-якому стовпчику. Максимальна ширина стовпця – 255 символів. Один або більша кількість пробілів повинна відділити мітку і мнемоніку команди, та мнемоніку і операнд (i). Операнди повинні відділятися комою.

Мітки. В полі мітки міститься символічне ім'я комірки пам'яті, в якому зберігається відмічена команда або операнд. Мітка представляє собою літерно-цифрову комбінацію, що починається з літери. Використовуються тільки літери латинського алфавіту. Мова Асемблер припускає використання в мітках символу підкреслювання (_). Довжина мітки може бути від 6 до 32 (наприклад для MPASM) символів. Мітки можуть супроводжуватися пробілом, табуляцією або кінцем рядка.

В якості символічних імен і міток не можуть бути використані мнемокоди команд, псевдокоманд і операторів асемблера, а також мнемонічні позначки регістрів та інших внутрішніх блоків МК.

Операція. В поле операції записується мнемонічна позначка команди МК або псевдокоманди асемблера, що є скороченням (абревіатурою) повного англійського найменування дії, що виконується. Якщо є мітка на тому ж самому рядку, то мнемоніка команди асемблера, директиви асемблера і макрозвернення повинні відділятися від цієї мітки двокрапкою чи одним або більшою кількістю пробілів або міток табуляції.

Операнди. В цьому полі містяться операнди (або операнд), що беруть участь в операції. Операнди повинні відділятися від мнемоніки одним або більше пробілів чи міток табуляції. Списки операндів (операнди) повинні відділятися комами.

 

Наприклад:

;

; Приклад фрагмента вхідної програми “Iніціалізація МК“

BEGIN

  MOVLW INITA ; Завантаження в робочий регістр ; W значення, присвоєного імені ; INITA (значення: (константа, число) ; повинно бути присвоєне раніше в ; попередніх фрагментах програми)
  MOVWF TRISA ; Завантаження значення з ; робочого регістру W в регістр ; управління конфігурацією порту А
  MOVLW INITB ; Завантаження в робочий регістр ; W значення, присвоєного імені INITB
  MOVWF TRISB ; Завантаження значення з робочого W в ; регістр управління конфігурацією порту В

Команди можуть бути без-, одно-, або двооперандовими.

Операнд може бути заданий безпосередньо або у вигляді його адреси (прямої або непрямої). Безпосередній операнд зображається числом (MOVLW 0FFh, де символ 0 для Асемблера означає, що це число FFh, а не мітка! Або, MOVLW B'01010011', де В – означає двійкове число) або символічним ім'ям (MOVWF DATAPORT).

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

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

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

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

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

TMRO EQU 01h

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

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

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

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

  MOVLW B'01010101' ; Завантажити константу ; 01010101 в регістр W
  MOVLW DATAPORT ; Записати зміст регістру ; W в регістр DATAPORT (визначений; раніше як порт В)
  GOTO $ ; Нескінченний цикл (вічний ; цикл для перевірки програми в ; динамічному режимі). Вихід ; тільки по перериванню.
  END   ; Кінець трансляції і закінчення прогр.

 

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

 

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

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

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

3. Секція закінчення.

В секції заголовка визначаються логічні імена для всіх використовуємих в програмі ресурсів: портів, бітових і байтових змінних, регістрів. Це початкова частина вхідної програми до рядка з виразом ORG 0 (для PIC 16F84). Для інших типів мікроконтролерів сімейств PIC 16/17 адреса початку наступної секції (сегмента) робочої програми може бути іншою (див. організацію пам'яті програм конкретного типу ОМК).

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

;Робоча секція
;
; Початок частини робочої програми, що виконується
  ORG   ; Наступна команда буде розміщена ; в пам'яті програм за адресою 0h
  GOTO BEGIN ; Перша команда, що буде ; виконана процесором
  ORG 100h ; Наступна команда буде ; розміщена за адресою 100h
BEGIN
; Ініціалізація мікроконтролера
; (Конфігурація портів вводу/ виводу, TMRO, WDT і т. п.)

 

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

 

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

 

Нижче наведений приклад написання початкового тексту робочої програми для ОМК 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 $ часто застосовується для зупинки коду при налагодженні.

Якщо б до всіх виводів порту В були, наприклад, підключені світлодіоди, то після запуску розглянутої програми ми побачили б свічення тільки чотирьох з них.

 

3.4. Перетворення вхідного тексту робочої програми

в об’єктний модуль

 

Написанням тексту програми закінчується перший етап розробки прикладного програмного забезпечення – "від поставлення задачі до вхідної програми" і починається наступний – "від вхідної програми до об’єктного модуля".

Для простих програм об’єктний код може бути отриманий вручну (ручна трансляція). Однак для більш складних програм вимагаються спеціальні способи автоматизації підготовки програм. Звичайно такі способи використовують більші ємності пам'яті і широкий набір периферійних приладів, в силу чого вони не можуть бути резидентними, а використовуються тільки в крос-режимі на універсальних ЕОМ типу IBM PC.

В мінімальний склад програмного забезпечення крос-засобів входять:

– системна програма для введення вхідного тексту прикладної програми, його редагування і запису на зовнішній носій інформації – так званий редактор текстів (EDIT);

– програма-транслятор, що забезпечує перетворення вхідного тексту прикладної програми в об’єктний модуль (АSM, PASM, MPASM).

Більш потужні крос-засоби припускають наявність редактора зовнішніх зв'язків (LINK), що дозволяє включати в програму модулі, розроблені незалежно один від одного, і програму, що забезпечує настройку програмних моделей, що переміщуються, на абсолютні адреси (LOCATE).

Для трансляції вхідного тексту програми необхідно викликати транслятор, вказавши йому файл з вхідним текстом, місце розміщення об’єктного коду, а також умови формування і виведення лістингу.

Всі виявлені в процесі трансляції помилки виправляються у вхідному тексті прикладної програми (це відноситься і до помилок, виявлених на етапі відлагодження). Для цього необхідно знов викликати редактор тексту і здійснити редагування вхідного тексту програми, а після цього виконати повторну трансляцію.

Якщо вхідний текст прикладної програми не мав зовнішніх посилань і містив директиву ORG, то після успішного завершення трансляції етап розробки програмного забезпечення "від вхідної програми до об’єктного модуля" можна вважати закінченим.

Для ОМК сімейств PIC 16/17 також існує інтегроване середовище для розробки робочих програм MPLAB 3.30, в складі якої є всі перелічені вище способи. Існують і окремі програми-транслятори з Асемблера PASM і MPASM.

Розглянемо трохи докладніше процес перетворення вхідного тексту робочої програми для OMK PIC 16/17 з використанням транслятора MPASМ.

 




Дата добавления: 2014-12-18; просмотров: 35 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2024 год. (0.013 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав