Программное управление технологическим оборудованием
.pdffor (c = 0; c < 8; c++)
{
oчтение логического уровня
pна последовательном выходе Qh регистра HC165
qсдвигая предыдущие данные влево
SAs <<= 1;
if (PORTAbits.RA4)
{
SAs |= 0x01;
}
// формирование синхроимпульса на входе SCK LATCbits.LATC4 = 1;
LATCbits.LATC4 = 0;
}
return SAs;
}
void main()
{
Serial_Init(); // настройка линий порта while (1)
{
char state = Serial_Read(); Serial_Send(state);
}
}
4 Варианты индивидуальных заданий к лабораторной работе
Разработать программу для учебного стенда, позволяющую выполнять определенные действия с дискретными светодиодными индикаторами VD3..VD10 в зависимости от состояния дискретных датчиков SA3..SA10:
Если SA = 01010101, то на VD вывести «0»; если SA = 00011000, то на VD
вывести «5» (в двоичном коде).
Если SA = 01010101, то на VD вывести «8»; если SA = 10000001, то на VD
вывести «2» (в двоичном коде).
Отобразить на VD количество включенных SA, добавляя зажженный светодиод справа налево, если включается дополнительный SA.
Отобразить на VD количество включенных SA, добавляя зажженный светодиод слева направо, если включается дополнительный SA.
Отобразить на VD количество выключенных SA, добавляя зажженный светодиод слева направо, если включается дополнительный SA.
Отобразить на VD количество выключенных SA, добавляя зажженный
481
светодиод справа налево, если включается дополнительный SA.
При любом изменении состояния SA перемещать зажженный светодиод на VD справа налево.
При любом изменении состояния SA перемещать зажженный светодиод на VD слева направо.
5 Контрольные вопросы
1.Дайте определение дискретного сигнала.
2.Приведите пример устройства либо механизма, выходной сигнал которого является дискретным.
3.Расскажите способы увеличения дискретных портов ввода вывода микроконтроллера.
4.Расскажите принцип работы сдвигового регистра.
5.Как организуется ввод дискретного сигнала при использовании сдвигового регистра?
6.Как организуется вывод дискретного сигнала при использовании сдвигового регистра?
482
Лабораторная работа 7
Изучение системы прерываний микроконтроллера
Цель работы:
Изучить механизм прерываний микроконтроллера, особенности настройки и программирования функций обработки прерываний микроконтроллера на языке программирования Си. Составить программу ввода, обработки по заданному алгоритму и вывода дискретных сигналов, записать в память программ микроконтроллера и выполнить.
Порядок выполнения работы:
1.Изучить теоретические вопросы, связанные с механизмом прерываний микроконтроллера.
2.Изучить принципиальную электрическую схему к лабораторной работе.
3.Разработать программу в соответствии с индивидуальным заданием.
4.Отладить программу в среде MPLAB IDE.
5.Загрузить программу в учебный стенд.
6.Исследовать работу прерываний.
7.Оформить отчёт по лабораторной работе.
8.Ответить на контрольные вопросы.
1 Краткие теоретические сведения
1.1 Система прерываний микроконтроллера dsPIC33fj32mc204
Прерывание – сигнал, сообщающий о наступлении какого-либо события. При этом выполнение текущей последовательности команд приостанавливается, и управление передаётся обработчику прерывания, который реагирует на событие и обслуживает его, после чего возвращает управление в прерванный код.
Микроконтроллеры семейства dsPIC33 имеют развитую систему прерываний, позволяющую использовать это устройство в приложениях реального времени различной степени сложности. Модуль прерываний микроконтроллеров dsPIC33 обладает следующими характеристиками:
1.обеспечивает обработку 8 немаскируемых системных прерываний;
2.позволяет задавать до семи уровней приоритетов пользовательских прерываний;
3.позволяет задавать до 126 векторов прерываний в таблице векторов прерываний IVT. При этом каждому прерыванию назначается уникальный вектор;
4.позволяет настроить дополнительную таблицу векторов прерываний (AIVT), которую можно использовать при отладке программ;
483
5.фиксированное время запуска и выхода из процедуры обработки прерывания. Наиболее часто используемыми событиями, вызывающими прерывания, являются:
6.совпадение либо переполнение значения счётчика таймера;
7.появление сигнала требуемого уровня либо изменение величины сигнала на входе линии порта;
8.приём данных, отправка данных модулей приёмо-передатчиков;
9.завершение преобразования модуля АЦП.
Каждый источник прерывания имеет собственный вектор в таблице, расположенной в программной памяти. Внутри таблицы прерывания имеют естественный приоритет: при одновременном возникновении двух прерываний приоритет имеет то, чей вектор имеет меньший адрес. Вектора представляют собой 24-битное слово программы, в котором должна быть расположена команда перехода на сервис обработчика прерывания.
Пользователь может изменить естественный приоритет, назначив источнику прерывания искусственный приоритет. При возникновении прерывания в программный счетчик записывается адрес вектора прерывания, а приоритет CPU-ядра становится равным приоритету возникшего прерывания. Это позволяет организовывать гибкую систему вложенных прерываний.
Возможно назначение приоритета каждому прерыванию, количество возможных уровней приоритета равно 8. CPU ядро может иметь приоритет от 0 до 15, уровни 8 – 15 зарезервированы для аппаратных исключений.
Аппаратные исключения – это определенный вид немаскируемых прерываний, которые генерирует CPU-ядро. Условно исключения можно разделить на программные и аппаратные.
К программным относятся исключения, которые позволяют продолжить выполнение работы после программного сброса флага исключения. Программные исключения имеют приоритет от 8 до 12. К программным исключениям относятся: исключение АЛУ (которое генерируется ядром, например, при делении на 0) и ошибка стека.
При возникновении аппаратного исключения программа не может продолжить работу до тех пор, пока ошибка, которая вызвала исключение, не будет устранена – флаг аппаратного исключения не может быть сброшен программно. Аппаратные исключения имеют приоритет от 13 до 15. К аппаратным исключения относятся: ошибка адреса (не выровненный доступ к памяти программ или памяти данных) и ошибка тактового генератора (нестабильная работа PLL, отсутствие внешней тактовой частоты).
484
Система прерываний имеет фиксированное время реакции – 5 командных тактов. Возврат из прерывания осуществляется за 3 командных такта. Следует заметить, что при входе в прерывание часть статус-регистра SR автоматически сохраняется в стеке, это позволяет уменьшить объем кода и время выполнения обработчика прерывания. Все флаги прерываний устанавливаются вне зависимости от того, разрешено прерывание или нет.
Таблица векторов прерываний IVT размещается в памяти программ, начиная с адреса 0x000004, и содержит 126 векторов прерываний, из которых 8 используются системными прерываниями, а остальные 118 могут использоваться периферийными модулями. Системные прерывания позволяют выполнить обработку серьезных аппаратно программных сбоев в системе, поэтому их нельзя запретить или замаскировать.
Список векторов наиболее часто используемых пользовательских прерываний представлен в таблице 1.1. Каждый вектор прерывания содержит 24-битный адрес, по которому располагается соответствующая функцияобработчик прерывания (Interrupt Service Routine, ISR).
|
|
Таблица 1.1 |
|
Пользовательские прерывания |
|
Номер |
|
|
|
Адрес вектора |
Источник прерывания |
вектора |
|
|
8 |
0x000014 |
INT0 – Внешнее прерывание 0 |
9 |
0x000016 |
IС1 – Модуль захвата таймера T1 |
10 |
0x000018 |
OС1 – Совпадение таймера T1 |
11 |
0x00001A |
T1 – Таймер T1 |
13 |
0x00001E |
IС2 – Модуль захвата таймера T2 |
14 |
0x000020 |
OС2 – Совпадение таймера T2 |
15 |
0x000022 |
T2 – Таймер T2 |
16 |
0x000024 |
T3 – Таймер T3 |
19 |
0x00002A |
U1RX – Приёмник модуля UART1 |
20 |
0x00002C |
U1TX – Передатчик модуля UART1 |
21 |
0x00002E |
ADC1 – Модуль АЦП1 |
28 |
0x00003C |
INT1 – Внешнее прерывание 1 |
37 |
0x00004E |
INT2 – Внешнее прерывание 2 |
Любое пользовательское прерывание может быть разрешено или запрещено посредством установки или сброса соответствующего бита в одном из регистров разрешения прерываний IECx. Установка бита соответствующего прерывания в 1 разрешает прерывание, а сброс этого бита
— запрещает. В микроконтроллерах dsPIC33 предусмотрен ряд механизмов,
485
позволяющих разрешить или запретить все прерывания одновременно (кроме, естественно, немаскируемых прерываний).
При сбросе микроконтроллера все биты разрешения прерываний сбрасываются в 0, запрещая генерацию прерываний, поэтому программа пользователя должна сама устанавливать необходимые разрешения.
Каждому пользовательскому прерыванию может быть присвоен тот или иной уровень приоритета. Биты управления приоритетом располагаются на трех младших позициях каждой тетрады регистров IPCn (четвёртые биты тетрад не используются и читаются как 0). Соответственно уровень приоритета каждого прерывания может изменяться от 1 (самый низкий приоритет) до 7 (наивысший приоритет). Если все биты приоритета прерывания сброшены в 0, то прерывание запрещено. По умолчанию (после сброса микроконтроллера) приоритеты пользовательских прерываний устанавливаются равными 4.
Контроллер прерываний микроконтроллеров семейства dsPIC имеет 22 регистра:
INTCON1 – предназначен для настройки и управления системными немаскируемыми прерываниями.
INTCON2 – предназначен для настройки событий возникновения внешних прерываний.
IFSx3 – регистр флагов прерываний. Каждому источнику прерываний соответствует определённый бит данного регистра, который устанавливается аппаратнопериферией при возникновении условия прерывания и сбрасывается программно функцией-обработчиком прерывания.
IECx – регистр, содержащий биты разрешений прерываний. Данный регистр используется для индивидуальной настройки разрешения прерывания.
IPCx – регистр приоритета прерываний.
INTTREG – регистр настройки приоритета системных прерываний. При возникновении разрешённого прерывания происходит сохранение текущего значения счётчика команд в стеке, и далее управление передаётся процедуре обработки прерывания. В этой процедуре флаг возникшего прерывания должен быть очищен программно, в противном случае произойдёт повторный вызов процедуры. После завершения обработки прерывания выход из процедуры должен осуществляться с помощью специальной инструкции RETFIE. При этом происходит автоматическое восстановление значения счётчика команд, значения регистра SRL и установка прежнего приоритета ядра.
486
1.2 Внешние прерывания
Микроконтроллер dsPIC33fj32mc204 может генерировать прерывания при изменении внешнего сигнала на следующих входных линиях:
1.вход INT0;
2.входы CN0..CN30.
Вход INT0 имеет схему определения фронта сигнала. Регистр INTCON2 имеет бит INT0EP, с помощью которого можно выбирать, по какому из фронтов (положительному либо отрицательному) сигнала на линии INT0 будет генерироваться прерывание
(_INT0Interrupt).
Входы CN0..CN30 имеют функцию уведомления об изменении уровня сигнала (отсюда и название входов – Change notification – CN – уведомление об изменении). Эта функция позволяет определить изменение уровня сигнала даже в спящем режиме микроконтроллера, генерируя соответствующее прерывание. Управление функцией осуществляется с помощью регистров CNEN1 и CNEN2, биты которых разрешают генерирование прерывание для каждого из входов CN0..CN30. Однако, для всех входов при любом изменении сигнала генерируется одно общее прерывание (_CNInterrupt), разрешение либо запрещение которого настраивается с помощью бита CNIE регистра IEC1.
1.3Программирование прерываний
Вкомпиляторе MPLAB С30 предусмотрен механизм работы с прерываниями посредством макросов, определенных в заголовочных файлах.
Вчастности, биты разрешения прерываний определены как в структурах соответствующих регистров, так и в виде макросов. Например, для разрешения/запрета прерывания Таймера1 используется макрос _T1IE, для INT3 используется _INT3IE и т. д. Так, разрешить прерывание Таймера 1 в программе на Си можно с помощью оператора
_T1IE = 1;
либо посредством установки бита TON регистра T1CON:
T1CONbits.TON = 1;
Каждое прерывание, используемое в программе, должно иметь соответствующую функцию-обработчик, прототип которой в MPLAB C30 для можно представить следующим образом:
void __attribute__ ((__interrupt__)) isr0(void);
487
Из объявления прототипа функции-обработчика прерывания isr0 видно, что она не принимает никаких параметров и не возвращает никаких значений. При вызове функции-обработчика компилятор автоматически сохраняет в стеке все рабочие регистры, а также регистр состояния процессора SR. Остальные переменные можно сохранить, перечислив их в поле атрибутов. Например, для того чтобы компилятор автоматически сохранял и восстанавливал переменные var1 и var2, можно использовать такой прототип функции-обработчика:
void __attribute__((__interrupt__(__save__(var1, var2)))) isr0(void);
Название функции-обработчика прерывания начинается с двойного символа подчёркивания и имеют в своём названии обозначение источника прерывания и слово «Interrupt». Таким образом, объявление функцииобработчика прерывания таймера T1 будет иметь вид:
void __attribute__ ((__interrupt__)) __T1Interrupt(void);
А объявление функции-обработчика прерывания модуля АЦП1 будет следующим:
void __attribute__ ((__interrupt__)) __ADC1Interrupt(void);
2 Электрическая принципиальная схема к лабораторной работе
На рис. 2.1 приведена электрическая принципиальная схема к лабораторной работе.
Рис. 2.1. Электрическая принципиальная схема к лабораторной работе
488
A3 |
|
|
CNEN2bits.CN2 |
|
// разрешение прерывания по |
9IE |
= 1; |
изменению |
|
|
// входа CN29 |
CNEN2bits.CN3 |
|
// разрешение прерывания по |
0IE |
= 1; |
изменению |
|
|
// входа CN30 |
|
|
// разрешение прерываний по |
IEC1bits.CNIE |
= 1; |
событию |
|
|
// Change Notification |
while (1) |
|
|
{ } |
|
|
}
4 Варианты индивидуальных заданий к лабораторной работе
Разработать программу для учебного стенда, выполняющую следующие действия:
1.При изменении положения переключателя SA1 изменять состояние светодиода VD1, при изменении положения переключателя SA2 изменять состояние светодиода VD2.
2.Изменять состояние светодиода VD1 при появлении высокого уровня сигнала с любого из переключателей SA1, SA2.
3.Изменять состояние светодиода VD2 при появлении низкого уровня сигнала с любого из переключателей SA1, SA2.
4.Изменять состояние светодиода VD1 при появлении разных уровней сигнала
спереключателей SA1, SA2.
5.Изменять состояние светодиода VD2 при появлении одинаковых уровней сигнала с переключателей SA1, SA2.
5 Контрольные вопросы
1.Дайте определение механизму прерывания.
2.Какие виды прерываний присутствуют в микроконтроллере dsPIC33?
3.Каким образом определяется порядок обработки прерываний?
4.Каким образом настраиваются прерывания?
5.Как происходит программирование прерываний на языке Си?
490
