Программное управление технологическим оборудованием
.pdf5.2Прерывание таймера T1 по совпадению
void __attribute__((interrupt,no_auto_psv)) _T1Interrupt()
{
Ind_Send(OFF); |
// Отключение индикатора |
|
|
|
// Переключение на |
LATB &= ~(0x0F << 6); |
следующий |
|
LATB |= (_i << 6); |
// индикатор |
|
if (_i < 8) |
|
|
{ |
|
|
|
Ind_Send(_ind[_i]); |
// Отправка кода цифры |
} |
|
|
_i++; |
|
|
if (_i == 8) |
|
|
{ |
|
|
|
_i = 0; |
|
} |
|
|
|
|
// Сброс флага прерывания |
IFS0bits.T1IF = 0; |
таймера |
|
TMR |
|
|
1 |
= 0; |
// Перезапуск таймера |
}
#define Delay_us(d) (__delay32 (((d)) * ((FCY) / 1000000uL)))
|
TRISAbits.TRIS |
|
#define SDA |
A8 |
|
|
TRISAbits.TRIS |
|
#define SCL |
A9 |
|
#define READ_SDA |
PORTAbits.RA8 |
|
// Инициализация портов I2C |
|
|
void I2C_Init() |
|
|
{ |
|
|
ODCAbits.ODC |
|
|
A8 |
= 1; |
// Открытый коллектор SDA |
ODCAbits.ODC |
|
|
A9 |
= 1; |
// Открытый коллектор SCL |
LATAbits.LAT |
= 0; |
|
571
A8 |
|
LATAbits.LATA9 |
= 0; |
SDA = 1; |
|
SCL = 1; |
|
}
// Формирование условия СТАРТ void I2C_Start()
{
SDA = 0; Delay_us(25);
}
// Формирование условия СТОП void I2C_Stop()
{
SCL = 1; Delay_us(25); SDA = 1; Delay_us(25);
}
// Передача байта по интерфейсу I2C char I2C_Send(unsigned char c)
{
char b;
for (b = 7; b >= 0; b--)
{
SCL = 0; Delay_us(25);
if ((c & (1 << b)) != 0)
{
SDA = 1;
}
else
{
SDA = 0;
572
}
Delay_us(25);
SCL = 1; Delay_us(50);
}
1.A
CK SCL = 0;
2.Отпустить линию
SDA = 1; Delay_us(25);
SCL = 1; Delay_us(25);
char result;
if (READ_SDA == 0)
{
result = 0;
}
else
{
result = 1; |
|
|
} |
|
|
|
Delay_us(2 |
|
SCL = 0; |
5); |
|
|
Delay_us(2 |
|
SDA = 0; |
5); |
|
return |
|
|
result; |
|
|
} |
|
|
void ADC_Init() |
|
|
{ |
|
|
AD1CON1bits.AD12B |
|
|
= 0; |
|
// 10-битный режим |
AD1CON2bits.V |
|
|
CFG |
= 0; // Опорное напряжение – Avdd |
|
AD1CON1bits.SS |
// Запуск преобразования после |
|
RC |
= 0; |
очистки |
|
|
// бита выборки |
AD1PCFG |
|
|
L |
= 0xFFFF; |
|
573
AD1PCFGLbits.P |
|
|
CFG0 |
= 0; |
// AN0 - аналоговый вход |
AD1PCFGLbits.P |
|
|
CFG1 |
= 0; |
// AN1 - аналоговый вход |
AD1CON1bits.A |
|
// Автоматический запуск выборки |
SAM |
= 1; |
после |
|
|
// предыдущего преобразования |
AD1CON3bits.A |
|
// Источник тактирования |
DRC |
= 0; |
преобразования - |
|
|
// источник тактирования МК |
AD1CON1bits.F |
|
// Формат данных - целый |
ORM |
= 0; |
беззнаковый |
AD1CON2bits.C |
|
|
HPS |
= 1; |
// Преобразование каналов CH0, CH1 |
AD1CON1bits.SIMSA |
|
|
M= 1; |
|
// Одновременная выборка CH0, CH1 |
AD1CHS123bits.CH123SA = 0;// Подключение входа AN0 на положительный // вход усилителя CH0
AD1CHS0bits.CH0SA = 1; // Подключение входа AN1 на положительный // вход усилителя CH1
AD1CON1bits.ADON = 1; // Включение модуля АЦП
}
void main()
{
AD1PCFGL = 0xFFFF; |
// Отключение входов АЦП |
||
I2C_Init(); |
// Инициализация шины I2C |
||
ADC_Init(); |
// Инициализация АЦП |
||
Ind_Init(); |
// Инициализация индикации |
||
Init_Timer1(); |
// Инициализация таймера |
||
while (1) |
|
|
|
{ |
|
|
|
AD1CON1bits.SAMP = 0; |
// Запуск выборки |
||
while (!AD1CON1bits.DONE); |
// Ожидание завершения |
||
|
|
// преобразования |
|
unsigned int val = ADC1BUF1; Ind_Show(val); // Отображение результата
574
val = val / 4; // Приведение результата к диапазону
0..255
// Отправление данных в ЦАП
I2C_Start(); I2C_Send(0x5 A); I2C_Send(0x0 0); I2C_Send(val) ; I2C_Stop();
__delay32(FCY / 5);
}
}
4 Варианты индивидуальных заданий к лабораторной работе
Разработать программу для учебного стенда, позволяющую выполнить следующие действия:
1.Отобразить на LLI количество включённых тумблеров VD1..VD10.
2.При любом изменении состояния тумблеров VD3..VD10 увеличивать количество включённых светодиодов на LLI.
3.При включении тумблера SA1 вывести на LLI периодичный сигнал вида:
4 При включении тумблера SA2 вывести на LLI периодичный сигнал вида:
5.При включении тумблера SA1 линейно увеличивать сигнал на LLI до максимального. При отключении тумблера SA1 – линейно уменьшать до ноля.
575
5 Контрольные вопросы
1.Какую функцию выполняют цифро-аналоговые преобразователи?
2.Какие применяются методы построения ЦАП?
3.Какого рода преобразование выполняет микросхема AD5241?
4.Из каких структурных элементов состоит микросхема AD5241?
5.Каким образом происходит управление микросхемой AD5241?
576
Лабораторная работа 15
Исследование технологии переназначаемых контактов и средств ввода квадратурного сигнала в микроконтроллер
Цель работы:
Изучить технологию переназначаемых контактов. Изучить алгоритм, способ настройки и принцип работы модуля квадратурного энкодера. Разработать и отладить программу для обработки квадратурного сигнала.
Порядок выполнения работы:
1.Изучить теоретические вопросы, связанные с технологией переназначаемых контактов и работой модуля квадратурного энкодера.
2.Изучить принципиальную электрическую схему к лабораторной работе.
3.Разработать программу в соответствии с индивидуальным заданием.
4.Отладить программу в среде MPLAB IDE.
5.Загрузить программу в учебный стенд.
6.Исследовать работу системы ввода квадратурного сигнала.
7.Оформить отчёт по лабораторной работе.
8.Ответить на контрольные вопросы.
1 Краткие теоретические сведения
1.1 Переназначаемые контакты
Технология переназначаемых контактов позволяет периферийным модулям использовать не фиксированные, заранее определённые выводы микроконтроллера, а любые из линий ввода-вывода микроконтроллера, помеченных как RPx5 (Remappable Pin). Таким образом, при программировании микроконтроллера существует возможность независимо сопоставлять входные и выходные линии периферийных модулей требуемым линиям портов. Функцией переназначаемых контактов могут воспользоваться следующие периферийные модули микроконтроллера:
1.16-битный таймер;
2.модуль захвата/сравнения;
3.модуль квадратурного энкодера;
4.модуль приёмо-передатчика UART;
5.модуль внешних прерываний;
6.модуль SPI.
Соответствия переназначаемых контактов линиям ввода-вывода
микроконтроллера настраиваются двумя группами регистров – для настройки входов и для настройки выходов периферийным модулей.
Для настройки функций входа используется группа регистров RPINRx6.
577
Каждый регистр содержит набор 5-битных полей, ассоциированных с входами периферийных модулей. Значение поля определяет номер переназначаемого контакта, который будет использоваться данной функцией периферийного модуля. Использование переназначаемого контакта как входной линии периферийного модуля требует предварительную настройку используемой линии порта на вход с помощью установки соответствующего бита регистра
TRISx7.
Условная структура входов периферийных модулей, использующих технологию переназначаемых контактов, показана на рис. 1.1. Биты регистров RPINRx представлены в таблице 1.1.
Рис. 1.1. Условная структура входов периферийных модулей
|
|
|
Таблица 1.1 |
|
Биты регистров RPINRx |
||
|
5-битное |
|
|
Регистр |
|
Обозначение |
Описание |
|
поле |
|
|
RPINR0 |
INT1R<4:0> |
INT1 |
Вход внешнего прерывания |
RPINR1 |
INT2R<4:0> |
INT2 |
Вход внешнего прерывания |
|
|
|
Вход внешнего тактирования |
RPINR3 |
T2CKR<4:0> |
T2CK |
таймера T2 |
|
|
|
Вход внешнего тактирования |
RPINR3 |
T3CKR<4:0> |
T3CK |
таймера T3 |
|
|
|
Вход сигнала А квадратурного |
RPINR14 |
QEA1R<4:0> |
QEA |
энкодера |
|
|
|
578 |
|
|
|
Окончание таблицы 1.1 |
|
|
|
|
|
|
|
Вход сигнала Б квадратурного |
RPINR14 |
QEB1R<4:0> |
QEB |
энкодера |
|
INDX1R<4:0 |
|
|
RPINR15 |
> |
INDX |
Вход сигнала индексной метки |
|
|
|
квадратурного энкодера |
RPINR18 |
U1RXR<4:0> |
U1RX |
Вход линии RX модуля UART |
RPINR18 |
U1CTS<4:0> |
U1CTS |
Вход линии TX модуля UART |
RPINR20 |
SDI1R<4:0> |
SDI1 |
Вход сигнала данных модуля SPI |
|
|
|
Вход сигнала тактирования модуля |
RPINR20 |
SCK1R<4:0> |
SCK1 |
SPI |
|
|
|
Вход сигнала выбора ведомого |
RPINR20 |
SS1R<4:0> |
SS1 |
модуля SPI |
Например, задание контакту RP2 (линии 2 порта RB) функции входа сигнала RX модуля UART осуществляется следующим образом:
TRISBbits.TRIS |
|
|
B2 |
= 1; |
// Настройка линии порта на вход |
RPINR18bits.U1 |
|
// Задание в качестве входа RX модуля |
RXR |
= 2; |
UART |
|
|
// контакта RP2 |
Для настройки функций выхода используется группа регистров RPORx8. Аналогично, каждый регистр содержит набор 5-битных полей, но каждое поле связано с одним переназначаемым контактом. Значение поля определяет функцию периферийного модуля, которая будет использовать данный вывод. Значение поля может быть так же нулевым для того, чтобы оставить контакт неподключенным ни к одному из выводов периферийных модулей.
Условная структура входов периферийных модулей, использующих технологию переназначаемых контактов, показана на рис. 1.2. Соответствие переназначаемых контактов и управляющих регистров приведено в таблице 1.2. Расшифровка функций периферийных модулей, использующих переназначаемые контакты в качестве выходов, представлена в таблице 1.3.
579
Рис. 1.2. Условная структура выводов периферийных модулей
Таблица 1.2 Соответствие переназначаемых контактов управляющим регистрам
Регист |
|
RPOR |
|
|
|
|
|
|
|
|
р |
|
0 |
|
RPOR1 |
RPOR2 |
RPOR3 |
RPOR4 |
RPOR5 |
||
Выводы |
|
RP1, RP0 |
|
RP3, RP2 |
RP5, RP4 |
RP7, RP6 |
RP9, RP8 |
RP11, RP10 |
||
|
|
|
|
|
|
|
|
|
||
Регист |
|
RPOR |
|
|
|
|
|
|
|
|
р |
|
6 |
|
RPOR7 |
RPOR8 |
RPOR9 |
RPOR10 |
RPOR11 |
||
|
|
RP13, |
|
RP15, |
|
|
RP20, |
|
||
Выводы |
|
RP12 |
|
RP14 |
RP16, RP17 |
RP18, RP19 |
RP21 |
RP22, RP23 |
||
|
|
|
|
|
|
|
|
|
|
|
Регист |
|
|
|
|
|
|
|
|
|
|
р |
|
RPOR12 |
|
|
|
|
|
|
|
|
|
|
RP24, |
|
|
|
|
|
|
|
|
Выводы |
|
RP25 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Таблица 1.3 |
|
Функций периферийных модулей |
|
|
|
|||||||
Обозначени |
|
|
|
|
Описан |
|
|
|||
е |
|
Значение |
|
|
ие |
|
|
|||
NUL |
|
|
|
|
Вывод PRn назначен линии порта ввода- |
|
||||
L |
|
00000 |
|
вывода |
|
|
|
|||
|
|
|
|
|
|
Вывод PRn назначен выходу TX модуля |
|
|||
U1TX |
|
00011 |
|
UART |
|
|
|
|||
|
|
|
|
|
|
Вывод PRn назначен выходу RTS модуля |
|
|||
U1RTS |
|
00100 |
|
UART |
|
|
|
|||
|
|
|
|
|
|
Вывод PRn назначен выходу данных |
|
|||
SDO1 |
|
00111 |
|
модуля SPI |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
580 |
