Читайте также:
|
|
Лабораторна робота №5
Тема: “Система переривань мікроконтролера PIC16F84. Власні оброблювачі переривань”
Мета роботи: Вивчити систему переривань мікроконтролера PIC16F84, способи формування переривань, використання оброблювачів декількох переривань.
Індивідуальне завдання:
Написати оброблювачі переривань відповідно до варіанта завдання і номера студента за списком журналу групи (N=14).
1. Оброблювач переривання по передньому фронту сигналу на виводі повинен виконувати закінчення запису у EEPROM.
Варіант№1. Інкремент 16-розрядного лічильника в пам'яті даних.
2. Оброблювач переривання за зміною рівня сигналу на виводі RB7 повинен виконувати.
Хід роботи:
Перед тим як розробити текст програми, яка буде виконувати всі дії які необхідні для виконання індивідуального завдання, розробимо алгоритм виконання цього завдання:
Алгоритм виконання завдання:
Для всіх преривань мікроконтролера вектор преривання однаковий та має адресу 0004h, тому першим, що треба зробити, це починаючи з цієї адреси у пам’яті розташувати програмний код, який спочатку визначає джерело преривання (тобто від якого пристрою мікроконтролера прийшов сигнал преривання), а потім визначивши джерело преривання необхідно перейти на відповідну підпрограму, яка є оброблювачем цього преривання. Після виходу з цієї підпрограми необхидно зробити вихід з цього преривання.
Далі опишемо всі дії більш стисло з описом побудови оброблювачив преривань:
1. Спочатку виконуємо ініціалізацію мікроконтролера, а саме: 6-й біт INTEG регістру OPTION встановлюемо у “1”, це означає, що преривання на виводі RB0/INT буде по передньому фронту сигналу. Також налагоджуємо порти вводу/виводу: порт В всі виводи на ввод, а порт А вивід RA1 на вивод та інші на ввод.
2. Далі робимо заборону непотрібних преривань та дозволяемо необхідні, а саме: у регістрі INTCON 7-й біт GIE=1 (дозвіл усіх преривань), 4-й біт INTE=1 (дозвіл преривання на виводі RB0/INT), 3-й біт RBIE=1 (дозвіл преривання на виводах RB7-RB4), всі інші біти регістру скидаємо бо інші преривання нам непотрібні.
3. Зберігаемо значення порту В у комірці пам’яті та далі входимо у бескінечний цикл який складають пусті команди для очиковання преривання.
4. Для того щоб преривання трапилося на виводі RB0/INT ми за допомогою файлу стімулу на визначеному такті подаемо на вивід RB0/INT “1”, тобто трапляеться передній фронт сигналу (перехід від “0” до “1”), спричиняє преривання на виводі RB0/INT та перехід на адресу 0004h у пам’яті з якої ми починаємо програмний код оброблювачів цих преривань. Так само за допомогою файлу стімулу на визначеному такті подаемо на вивід RB4 “1”, тобто трапляеться зміна рівня сигналу на цьому виводі, а саме з “0” на “1”, що спричиняє преривання на виводі RB4 та перехід на адресу 0004h з якої ми починаємо програмний код оброблювачів цих преривань.
5. Спочатку необхідно визначити джерело преривання, для цього необхідно заборинити всі преривання (у регістрі INTCON 7-й біт GIE=0) та зробивши збереження значень необхідних регістрів у відповідні заздалегідь визначені комірки пам’яті, робимо перевірку відповідних бітів у регістрі INTCON, а саме: якщо 1-й біт INTF=1 то преривання на виводі RB0/INT і далі переходімо на підпрограму обробки цього преривання; якщо 0-й біт RBIF=1 то преривання на виводах RB7-RB4 і далі переходімо на підпрограму обробки цього преривання; якщо преривання від іншого джерела, то робимо дозвіл усіх преривань (у регістрі INTCON 7-й біт GIE=1) та вихід з преривання за допомогою команди “retfie”, після того як зробили повернення значень у регістри які було збережено у визначених для цього комірках пам’яті. При виході з преривання адреса наступної команди береться зі “стеку” тому наступною командою буде команда, яка була після команди під час виконання якої трапилося преривання.
6. Опишемо тепер алгоритми роботи підпрограм оброблювачів цих преривань.
а) алгоритм роботи підпрограми оброблювача преривання на виводі RB0/INT:
1. Цей оброблювач має виконувати - інкремент 16-розрядного лічильника в пам'яті даних, тому для цього лічильника у пам'яті даних беремо дві комірки (8-розрядні) одна з яких буде молочшою, а інша старшою частиною 16-розрядного лічильника. Кожного разу коли це преривання буде траплятися буде виконуватися інкремент молочшої частини 16-розрядного лічильника та якщо трапиться її переповнення буде виконуватися інкремент старшої частини 16-розрядного лічильника.
2. У кінці кожного оброблювача преривання необхідно зробити скидання біту цього преривання у регістрі INTCON, бо це не робиться апаратно, тому в кінці цієї підпрограми оброблювача преривання на виводі RB0/INT ми маємо зробити скидання біту INTF, а далі робимо повернення з цієї підпрограми оброблювача преривання.
б) алгоритм роботи підпрограми оброблювача преривання на виводі RB4.
1. Цей оброблювач має виконувати - формування позитивного імпульсу тривалістю ti =7tц на виводі RA1, але спочатку треба у оброблювачі зробити перервірку, чи дійсно преривання трапилося за зміною рівня сигналу на виводі RB4, а не на іншому з виводів: RB5, RB6 або RB7. Для цоьго робимо порівняння значення порту В до та після преривання, а саме перевіряємо чи змінилося значення на виводі RB4, якщо ні, то переходимо на кінець підпрограми та далі робимо повернення з цієї підпрограми оброблювача цього преривання; якщо так, то робимо формування позитивного імпульсу тривалістю ti на виводі RA1: для цього встановлюємо RA1 у “1” та далі робимо необхідну затримку за допомогою порожніх команд, кожна з яких нічого не робить, закрема затримки у один такт мікроконтролера. Після виконання необхідної затримки робимо скидання RA1 та перехід на кінець підпрограми де ми зберігаємо значення порту В у відповідній комірці пам’яті та скидання біту RBIF у регістрі INTCON і виконуємо повернення з цієї підпрограми оброблювача цього преривання.
Розобивши алгоритм виконання завдання, напишемо текст програми, яка буде працювати за цим алгоритмом:
Текст програми:
list p=16f84a;определение типа мк
#include p16f84.inc;подключение файла p16f84a.inc
counter_l EQU 0x0c;молодша частина 16-розрядного лічильника
oldportb EQU 0x0d;попереднє значення порту В
T_W EQU 0x0e;комірка для збереження старого значення регістру W
T_STATUS EQU 0x0f;комірка для збереження старого значення регістру STATUS
counter_h EQU 0x10;старша частина 16-розрядного лічильника
test EQU 0x11;допоміжня комірка
bcf INTCON, GIE;запрет прерываний
goto start;перейт на початок програми
int_point
org 0x04;начало вектора прерываний
bcf INTCON, GIE;запрет прерываний
movwf T_W;сохраняем значение W
swapf STATUS,W;сохранение регистра
movwf T_STATUS;STATUS
btfsc INTCON,INTF;ожидание появления сигнала на ножке INT
call obrob_INT;вызов подпрограммы
btfsc INTCON,RBIF;ожидание смены сигнала на RB7-RB4
call obrob_RB4;вызов подпрограммы
swapf T_STATUS,W;востановление STATUS
movwf STATUS
movf T_W,0;востановление W
bsf INTCON, GIE;разрешение прерываний
retfie;возврат из прерывания
start call init;вызов подпрограммы ініціалізації
movlw b'10011000';запрет ненужных и разрешение
movwf INTCON;нужных прерываний
movf PORTB,0;чтение состаяния порта В
movwf oldportb;сохранение для следубщего сравнения
loop
nop;пустая команда
nop;пустая команда
nop;пустая команда
nop;пустая команда
goto loop;зацикливаем программу
init movlw b'01000000';внешнее прерывание на RB0/INT
OPTION;осуществляется по переднему фронту
movlw b'11111111';все разряды PORTB
TRIS PORTB;на ввод
movlw b'11111101';все разряды PORTA кроме первого (RA1)
TRIS PORTA;на ввод
Return;вихід з підпрограми ініціалізації
obrob_INT;обраболювач прерывания INT
incfsz counter_l;инкремент младшего байта счетчика
goto m1;переход если нет переполнения
incf counter_h;инкремент старшего байта счетчика
m1 movf counter_l,0
bcf INTCON,INTF;сброс флага прерывания INT
return;вихід з підпрограми обраболювача прерывания
obrob_RB4;обработчик прерывания от RB4
movf PORTB,0;чтение состаяния порта В
xorwf oldportb,0;сравнение с предыдущем значением порта В
movwf test;сохраняем результат сравнения
btfss test, 5;проверяем изминилось ли состояние RB4
goto notRB4;если нет переход на конец обработчика
;если изминилось то формируем импульс на выводе RA1 (ti=7*tц)
bcf PORTA,1;сброс RA1
bsf PORTA,1;установка RA1
nop;пустая команда
nop;пустая команда
nop;пустая команда
nop;пустая команда
nop;пустая команда
nop;пустая команда
nop;пустая команда
bcf PORTA,1;сброс RA1
notRB4 movf PORTB,0;чтение состаяния порта В
movwf oldportb;сохранение для следубщего сравнения
bcf INTCON,RBIF;сброс флага прерывания
return;вихід з підпрограми обраболювача прерывания
END;кінець програми
Рис.1. Фрагмент тестування програми.
Висновок: Під час виконання лабораторної роботи вивчили систему переривань мікроконтролера PIC16F84, способи формування переривань, використання оброблювачів декількох переривань.
Лабораторна робота №4
“Програмування масивів та запис даних в файл під Win32 API”
Мета заняття:
– поглибити і закріпити знання з архітектури МП платформи х86 і навички його програмування;
– надути практичних навичків складання, налагодження і виконання програм з використанням масивів, написаних мовою асемблеру для програмування розгалужених процесів МП платформи х86 із застосуванням АРІ-функцій під Win32 та введенням-виведенням даних на екран.
Дата добавления: 2014-12-18; просмотров: 36 | Поможем написать вашу работу | Нарушение авторских прав |