Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программное управление технологическим оборудованием

.pdf
Скачиваний:
1
Добавлен:
29.11.2025
Размер:
11.79 Mб
Скачать

for (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

В схеме два переключателя SA1 и SA2 подключены к выводам RA2 (CN30) и RA3 (CN29) микроконтроллера. Два светодиода VD1 и VD2 подключены к выводам RB15 и RB13 микроконтроллера соответственно.

3 Пример выполнения работы

Задача: Разработать программу для учебного стенда, позволяющую при любом изменении состояний переключателей SA1, SA2 изменять состояние светодиодов VD1, VD2.

Листинг программы для решения задачи:

#include <P33FJ32MC204.h> _FOSC(OSCIOFNC_ON & POSCMD_NONE)

//отключение дополнительной

//функции порта RA2 – выход

//тактирующего сигнала

//внутреннего генератора

char ison = 0; // хранение текущего состояния светодиодов void __attribute__ ((__interrupt__)) _CNInterrupt()

{

IFS1bits.CNIF = 0;

 

// Сброс флага прерывания

if (ison)

 

 

{

 

 

LATBbits.LATB15

= 0;

LATBbits.LATB13

= 0;

ison = 0;

 

 

}

 

 

else

 

 

{

 

 

LATBbits.LATB15 =

 

1; LATBbits.LATB13

 

= 1; ison = 1;

 

 

}

 

 

}

 

 

int main()

 

 

{

 

 

TRISBbits.TRIS

 

 

B15

= 0;

// настройка порта RB15 на выход

TRISBbits.TRIS

 

 

B13

= 0;

// настройка порта RB13 на выход

TRISAbits.TRIS

 

 

A2

= 1;

// настройка порта RA2 на вход

TRISAbits.TRIS

= 1;

// настройка порта RA3 на вход

489

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

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