Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОПМПЦ_кп_08.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
864.77 Кб
Скачать

3 Вказівки до виконання завдань курсового проекту

3.1 Вказівки до виконання завдань Перед виконанням завдання №1 слід опрацювати наступні питання:

  • Внутрішня структура й склад регістрів процесора к1816ве51;

  • призначення кожного з регістрів;

  • розподіл пам'яті мікроконтролера;

  • команди передачі даних і арифметичні команди;

  • розгалуження та переходи.

Етапи створення прикладних програм на Асемблері:

1) скласти словесний опис процесу, яким необхідно управляти;

1.1) записати перелік дій;

1.2 ) в цей перелік добавити словесні умови виконання варіантів дій;

2) скласти загальний алгоритм роботи програми. В кожному прямокутнику ховається велика група команд;

3) провести аналіз отриманого алгоритму, скласти словесний опис тих дій, які криються за кожним графічним об'єктом;

4) шукаються схожі дії алгоритму або дії, які повторюються, також дії вкрай бажано виділять в окремі процедури;

5) якщо дії мають загальне ядро, але все таки відрізняються, то необхідно проаналізувати можливість поліморфізму за допомогою переданих даних або параметрів;

6) скласти уточнений загальний алгоритм програми і докладний алгоритм для кожної процедури. Слід прагнути тому, щоб під кожним графічним об'єктом ховалося якомога менше команд на Асемблері;

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

Перед виконанням завдання №2 слід опрацювати наступні питання:

  • які команди дозволяють використовувати стек?

  • як організувати стек в оперативній пам’яті?

  • поясніть порядок передавання параметрів рутинним програмам за допомогою стека. Команди виклику та повернення з рутинних програм.

  • декомпозиція задачі керування на окремі процедури;

  • організація переривань

  • паралельні порти вводу/виводу, структурні схеми портів;

  • робота з лічильниками/таймерами;

  • розрахунок коефіцієнтів лічильников/таймеров;

Для прикладу розв’язку завдання пропонуємо задачу:

В ході технологічного процесу на конвеєрі вироби автоматично упаковуються в коробки. В одній коробці міститься 500 виробів. Потрібно:

1) кожні 120мкс подавати сигнали на завантаження в коробку одного виробу ( момент відвантаження перехід 1->0);

2) по закінченні завантаження коробки здійснити подачу сигналу на упакування коробки і переміщення її далі по конвеєру (перехід 1->0);

3) зробити паузу на час подачі наступної коробки (не менше 2с), після чого продовжити завантаження.

Постановку задачі програмування можна сформулювати таким чином:

Для підрахунку числа виробів потрібний програмний лічильник розрядністю не менше 9 біт (511 значень). Для формування тимчасових інтервалів використовуємо лічильник/таймер 0. Дані часового інтервалу дозволяють використовувати лічильник/таймер у режимі 2 як таймер. Після установлення прапорця переповнення таймера зовнішній вихід повинен перейти зі стану “1” у стан “0”. Для управління процесом відвантаження виробів використовуємо вихід Р1.0. Коли лічильник дорахує до 500, то рахунок за таймером 0 припиняється, подається сигнал на переміщення по конвеєру (Р1.1). За допомогою лічильника/таймера 1 виконується затримка на 2с. Оскільки максимальний коефіцієнт підрахунку в режимі 1 дорівнює 0FFFFH, то час переповнення дорівнює 0.065536с, тому потрібно виконати повний цикл підрахунку 31 раз, що становить 2.032с. Далі продовжити видачу імпульсів на вході Р0.0.

Рисунок 3.1 – Загальний алгоритм роботи програми

Рисунок 3.2 – Алгоритм роботи обробника переривань

Лістинг програми:

NAME Rеа1_ргосеss

LOAD ЕQU 90Н ; Опис символьних імен, що підставляються

NEXT_BOX ЕQU 91Н

PROG SEGMENT CODE ; Опис сегментів

STACK SEGMENT IDATA

FLAGS SEGMENT BIT

RSEG STACK ; Сегмент стека

DS 10H

RSEG FLAGS ; Сегмент прапорців

COUNT_H:DBIT1 ; Старший розряд лічильника циклів

END_LOAD: DBIT1 ; Прапорець кінця циклу завантаження

CSEG AT 0 ; Код початку програми

USING 0

JMP START

CSEG AT 0BH ; Код оброблювача переривання таймера 0

USING 1 ; Використовуємо банк регістрів 1

SETB RS0 ; Перемикання банку

CLR LOAD ; Подаємо імпульс на завантаження виробу

MOV R1,A ; Зберігаємо вміст А

MOV A,R0 ; У R0 молодший байт лічильника циклів

JB COUNT_H,LAB1 ;Перехід, якщо в ст. розряді лічильника 1

ADD A,#1 ;Інкремент акумулятора

JNC LAB2 ;Перехід , якщо немає переповнення

SETB COUNT_H ;Установлення старшого розряда лічильника

SJMP LAB2 ;Перехід на завершення оброблювача

LAB1:

INC A ; Інкремент А

CJNE A,#0F4H,LAB2 ;Перехід , якщо молодший байт лічильника ; не дорівнює 0f4Н (500-це 1 f4Н)

CLR COUNT_H ;Очищення старшого розряду лічильника

CLR A ; Очищення акумулятора

SETB END_LOAD ; Установка прапорця кінця циклу завантаження

LAB2:

MOV R0,A ;Збереження нового значення лічильника

MOV A,R1 ;Відновлення А після переривання

CLR RS0 ;Перемикання на банк регістрів 0

RETI ;Повернення з обробки переривання

************************ Основна програма *************************

RSEG PROG

START: MOV SP,#STACK-1

CLR COUNT_H ;Початкова ініціалізація змінних

CLR END_LOAD

MOV 08H,A ;Занесення до регістру R0 банка 1 нуля

MOV TMOD,#12H ;Програмування режимів таймерів 0

;Режим 2,1- режим 1

MOV IE,#82H ;Дозвіл переривань за таймером 0

LAB3:

MOV TH0,#135 ;Ініціалізація підрахункових регістрів таймера 0

MOV TL0,#135

MOV TCON,#10H ;Запуск таймера 0

LAB4:

SETB LOAD ;Установлення виходу Р1.0 у “1”

JNB END_LOAD,LAB4 ;Якщо END_LOAD дорівнює “1” , то ; мітку LAB4

CLR END_LOAD ;Очищення прапорця кінця циклу

MOV TCON,#0 ;Відключення таймерів

CLR NEXT_BOX ;Подача сигналу на переміщення коробки

MOV TH1,#0 ; Ініціалізація рахункових регістрів таймера 1

MOV TL1,#0

MOV TCON,#40H ; Запуск таймера 1

CLR A ; В А лічильник числа переповнень таймера 1

LAB5:

JNB TF1,LAB5 ;Чекання встановлення прапорця таймера 1

CLR TF1 ; Очищення прапорця таймера 1

INC A ; Інкремент А

CJNE A,#31,LAB5 ;Для досягнення часу рівного 2с, число

;проходів дорівнює 31

SETB NEXT_BOX ;Повернення виходу переміщення коробки в

;Стан „1”

MOV TCON,#0 ; Вимикання таймера

SJMP LAB3 ;Повторення технологічного циклу

END

Наступний приклад програми демонструє використання лічильника/таймера для синхронізації процесу в реальному часі. На входи Р0.0 і Р0.1 підходять зовнішні сигнали, а до виходів Р1.0 і Р1.1 підключені світлодіодні індикатори. Потрібно кожні 50 мкс перевіряти стан входів і якщо:

  • Р0.0 дорівнює «1», то увімкнути індикатор на виході Р1.0, інакше - вимкнути;

  • Р0.1 дорівнює «1» виключити індикатор на виході Р1.1, інакше вимкнути.

Лістинг програми:

NAME TIMER

PROG SEGMENT CODE ; оголошення сегмента коду

STACK SEGMENT IDATA ; оголошення сегмента стеку

RSEG STACK

DS 10H

CSEG AT 0

USING 0

JMP START

RSEG PROG

START:

MOV SP,#STACK-1 ;ініціалізація покажчика стека

MOV TMOD, #00000010B ;включення лічильника/таймера 0 у

;Режим 2

MOV TH0, #205 ;занесення дільника в регістр автозавантаження

MOV TL0, #205 ;занесення дільника в рахунковий регістр

MOV TCON, #00010000B ;включення лічильника/таймера 0

LAB1:

JNB TF0, LAB1 ;чекання переповнення лічильника /таймера 0

CLR TF0 ;очищення прапорця переповнення

JNB 80H, LAB2 ;якщо Р0.0 = 0 перехід на LAB2

SETB 90H ;установлення Р1.0 у «1»

SJMP LAB3 ;перехід на LAB3

LAB2:

CLR 90H ;установлення Р1.0 у «0»

LAB3:

JB 81H, LAB4 ;Якщо Р0.1 = «1» перехід на LAB4

SETB 91H ;установлення Р1.1 у «1»

SJMP LAB1 ;перехід на LAB1

LAB4:

CLR 91H ;установка Р1.0 у «0»

SJMP LAB1 ;перехід на LAB1

END

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]