Читайте также: |
|
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ
ГОМЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ИМЕНИ П. О. СУХОГО
Факультет автоматизированных и информационных систем
Кафедра “ Промышленная электроника ”
Отчет
по лабораторной работе №10
по дисциплине «Микропроцессорная техника»
на тему «Исследование системы прерываний
микроконтроллеров PIC16»
Выполнил: студент гр. ПМ-41
Мазуренко В.А.
Принял: преподаватель
Старостенко В.О.
Дата выполнения___________
Дата сдачи ___________
Гомель, 2014 г.
Цель работы: Изучить методы программирования на языке mikroC системы прерываний микроконтроллеров семейства PIC16. Исследовать методику проверки работы микроконтроллерных устройств в режиме прерываний с помощью среды моделирования Proteus VSM.
Практическая часть
Рисунок 1 – Схема МКУ с управлением светодиодом от кнопки
Задание 1. Разработайте программу для МКУ, схема которого приведена на рисунке 1. Алгоритм работы МКУ следующий. После сброса МК (запуска программы) и разомкнутом контакте кнопки SB1 светодиод «мигает» с частотой 1 Гц (0,5 с – светится, 0,5 с – погашен). При каждом нажатии на кнопку (замыкании ее контакта) светодиод гаснет на время 5 с, а затем вновь начинает «мигать» с частотой 1 Гц.
Указание. Используйте прерывание по INT при нажатии кнопки. Для реализации «мигающего» режима светодиода используйте функцию временной задержки Delay_ms(). Разработанную программу назовите int_2.c.
void interrupt() // функция-обработчик прерывания { PORTC ^= 0x01; // инвертировать сигнал на выводе RC0 INTF_bit = 0; // сбросить флаг прерывания INTF PORTC.B0=0; Delay_ms(5000); } void init(); void main() { init(); while(1) { PORTC.B0=1; Delay_ms(500); PORTC.B0=0; Delay_ms(500); OPTION_REG.B6 =0; // активный перепад для INT: 1 -> 0 INTCON.B4 = 1; // разрешить прерывание по INT INTCON.B7 = 1; // общее разрешение прерываний } } void init() { TRISB.B0 = 1; // настроить линию RB0 на ввод TRISC.B0 = 0; // настроить линию RC0 на вывод PORTC.B0 = 1; // погасить светодиод OPTION_REG.B7 = 0; // подключить к порту В внутренние } |
Рисунок 2 – Схема МКУ для генерации меандра
Задание 2. Разработайте программу для МКУ на рисунке 2, чтобы на линию RC1 выдавался меандр с частотой 500 Гц.
Указание. Используйте прерывание по переполнении таймера. По формуле (2) определите число, которое необходимо загружать в TMR0 для получения частоты меандра 500 Гц. Расчеты проведите для тактовой частоты 8 МГц и коэффициенте К = 16 предделителя. Разработанную программу назовите meandr500.c.
TMR0 = 256 – 1000 / (4 × 0,125 × 16) = 131
void interrupt() // функция-обработчик прерывания от TMR0 { PORTC ^= 0x02; // инвертировать сигнал на выводе RC1 TMR0 = 131; // перезагрузить таймер T0IF_bit = 0; // сбросить флаг прерывания T0IF } void main() { TRISC.B1 = 0; // настроить линию RC1 на вывод OPTION_REG = 0x03; //выбрать коэффициент 256 предделителя TMR0 = 131; // загрузить таймер для отсчета времени // переполнения 10 мс INTCON.B5 = 1; // разрешить прерывания от TMR0 INTCON.B7 = 1; // общее разрешение прерываний while(1); // зацикливание программы } |
Рисунок 3 – Схема МКУ управления светодиодом от таймера
Задание 3. Модернизируйте программу timer.c, чтобы она выполняла следующий алгоритм. После сброса МК (запуска программы) светодиод должен 5 раз «мигнуть» с частотой 0,5 Гц (загореться на 1 с и погаснуть на 1 с пять раз). После этого светодиод должен гореть постоянно. Разработанную программу назовите timer_2.c.
char counter = 0; // переменная-счетчик переполнений TMR0 char flag_T = 0; // переменная-флаг отсчета времени 1 с char pr; void interrupt() { counter++; if(counter == 100) // если истекло время 1 с { flag_T = 1; // установить флаг отсчета 1 с counter = 0; } TMR0 = 178; // перезагрузить таймер T0IF_bit = 0; // сбросить флаг прерывания от TMR0 } void main() { TRISC.B0 = 0; // настроить линию RC0 на вывод OPTION_REG = 0x07; // выбрать коэффициент K=256 предделителя TMR0 = 178; // загрузить в TMR0 число для отсчета 10 мс INTCON.B5 = 1; // разрешить прерывания от TMR0 INTCON.B7 = 1; // общее разрешение прерываний pr=0; while(pr<10) { if(flag_T) // если прошло время 1 с { PORTC ^= 0x01; // переключить светодиод flag_T = 0; // сбросить флаг отсчета 1 с pr++; } } } |
Вывод: Изучили методы программирования на языке mikroC системы прерываний микроконтроллеров семейства PIC16. Исследовали методику проверки работы микроконтроллерных устройств в режиме прерываний с помощью среды моделирования Proteus VSM.
Дата добавления: 2015-12-07; просмотров: 60 | Нарушение авторских прав