Программное управление технологическим оборудованием
.pdf
|
|
// предыдущего преобразования |
AD1CON3bits.A |
|
// Источник тактирования |
DRC |
= 0; |
преобразования - |
|
|
// источник тактирования МК |
AD1CON1bits.FO |
|
// Формат данных - целый |
RM |
= 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() |
|
{ |
|
ADC_Init(); |
// Инициализация АЦП |
Ind_Init(); |
// Инициализация индикации |
Init_Timer1(); |
// Инициализация таймера |
while (1) |
|
{ |
|
AD1CON1bits.SAMP = |
|
0; |
// Запуск выборки |
while |
|
(!AD1CON1bits.DONE) |
// Ожидание |
; |
завершения |
|
// преобразования |
Ind_Show(ADC1BUF1, |
// Отображение |
ADC1BUF0); |
результата |
__delay32(FCY / 10); |
|
} |
|
} |
|
541
4 Варианты индивидуальных заданий к лабораторной работе
Разработать программу для учебного стенда, позволяющую выполнить следующие действия:
1.Отобразить на LED сумму значений аналоговых сигналов RP1 и RP2.
2.Отобразить на LED мгновенное и усреднённое за 2 секунды значение аналогового сигнала RP1.
3.Отобразить на LCD мгновенное и усреднённое за 5 секунд значение аналогового сигнала RP2.
4.Отобразить на VD2..VD10 значение аналогового сигнала RP1 в двоичном виде. В случае RP1 > RP2, вывести на LCD предупреждение.
5.Отобразить значение аналогового сигнала RP1 на VD2..VD10, используя VD2..VD10 в качестве линейной шкалы. В случае RP1 < RP2, вывести на LED предупреждение.
5 Контрольные вопросы
1.Для чего предназначены аналого-цифровые преобразователи?
2.Какие существуют схемы построения АЦП?
3.Какие достоинства и недостатки присущи параллельным АЦП?
4.Какими основными характеристиками обладают АЦП?
5.Какие параметры АЦП микроконтроллера dsPIC33fj32mc204?
6.Каким образом происходит настройка модуля АЦП микроконтроллера?
542
Лабораторная работа 13
Исследование работы энергонезависимой памяти и интерфейса I2C
Цель работы:
Изучить принцип функционирования интерфейса I2C, а так же алгоритм и принцип работы энергонезависимой памяти. Разработать и отладить программу для обмена информацией между микроконтроллером и микросхемой внешней памяти.
Порядок выполнения работы:
1.Изучить теоретические вопросы, связанные с принципом функционирования интерфейса I2C и работой энергонезависимой памяти.
2.Изучить принципиальную электрическую схему к лабораторной работе.
3.Разработать программу в соответствии с индивидуальным заданием.
4.Отладить программу в среде MPLAB IDE.
5.Загрузить программу в учебный стенд.
6.Исследовать работу микросхемы внешней памяти.
7.Оформить отчёт по лабораторной работе.
8.Ответить на контрольные вопросы.
1 Краткие теоретические сведения
1.1 Интерфейс I2C
Интерфейс I2C (Inter-Integrated Circuit) является одним из наиболее популярных среди разработчиков оборудования. В настоящее время выпускается огромное число микросхем, использующих этот интерфейс. Стандарт I2C реализован как двухпроводной последовательный интерфейс, разработанный компанией «Philips Corp.» для работы c максимальной скоростью передачи данных 100 Кбит/с. Впоследствии стандарт стал поддерживать более скоростные режимы работы шины (400 Кбит/с и 1Мбит/с). При этом к одной шине I2C могут быть подключены устройства с различными скоростями доступа, если скорость передачи данных будет удовлетворять требованиям самого низкоскоростного устройства.
Протокол передачи данных по шине I2C разработан таким образом, чтобы гарантировать надежный качественный прием/передачу данных. При обмене данными одно устройство является «ведущим» и инициирует такой обмен, а также формирует сигналы синхронизации. Другое устройство, «ведомое», может начать передачу/прием данных только по команде ведущего шины.
543
Протокол I2C использует две сигнальные линии, по одной из которых, обычно обозначаемой как SCL, подается сигнал синхронизации, а по другой, обозначаемой обычно как SDA, передаются или принимаются данные. К шине I2C можно подключать несколько устройств, при этом линии SCL и SDA являются общими (рис. 1.1).
Рис. 1.1. Схема подключения устройств по интерфейсу I2C
К сигнальным линиям необходимо подключить так называемые подтягивающие резисторы, обозначенные на схеме как Rp, присоединив их к источнику питания. Подтягивающие резисторы нужны для фиксации уровня сигналов, поскольку спецификация I2C предусматривает использование устройств, имеющих выходные каскады с открытым коллектором или стоком (open drain). Кроме того, что более существенно, поскольку линии SCL и SDA являются двунаправленными, то такая аппаратная конфигурация обеспечивает функцию «монтажного» И (AND), что позволяет передавать сигналы в обоих направлениях.
Конфигурация шины I2C позволяет работать с одним или несколькими ведущими, что дает возможность создавать разветвленные высокоскоростные сети обмена данными. В подавляющем большинстве случаев на шине находится только одно ведущее и несколько ведомых устройств. «Ведущий» обеспечивает синхронизацию обмена данными, генерируя синхроимпульсы по линии SCL.
Обмен данными по шине I2C инициируется ведущим устройством, которое должно обеспечить формирование стартовой (в начале обмена) и стоповой (в конце обмена) последовательностей сигналов (рис. 1.2).
SCL
SDA
Старт |
Стоп |
Рис. 1.2. Стартовая и стоповая последовательности сигналов интерфейса
I2C
544
Протокол I2C требует, чтобы сигнал на линии данных SDA оставался неизменным при ВЫСОКОМ уровне сигнала SCL. Перепад сигнала на линии SDA из ВЫСОКОГО уровня в НИЗКИЙ при ВЫСОКОМ уровне на линии SCL формируется «ведущим» и указывает на начало обмена данными. Если при ВЫСОКОМ уровне сигнала на линии SCL уровень сигнала на линии SDA меняется с НИЗКОГО на ВЫСОКИЙ, то эта последовательность сигналов интерпретируется как завершение операции обмена данными на шине.
Данные передаются по шине в виде последовательности из 8 бит, причем первым в последовательности идет старший значащий бит (MSB). В практическом плане каждый бит удобно передавать по нарастающему фронту сигнала SCL. После того как все 8 бит переданы, устройство, передающее данные, ожидает от устройства, принимающего данные, подтверждения приема (acknowledge - ACK) по линии SDA. Бит ответа фиксируется по нарастающему фронту 9-го импульса SCL. В момент передачи бита подтверждения отвечающее устройство принимает управление линией SDA на себя, а затем возвращает управление инициатору обмена.
Поскольку к шине I2C можно подключать несколько устройств, то для обмена данными с конкретным устройством вначале нужно указать его адрес. В простейшем случае, например, для передачи данных в устройство вначале нужно передать адрес, а затем и сам байт данных. Цикл передачи данных в устройство в таком случае начинается со стартовой последовательности. Затем передаются первые 8 бит, содержащие 7-разрядный адрес устройства (биты A7…A1) и бит команды чтения-записи (обозначается как R/W). Обычно команда записи передается низким уровнем, а команда чтения — высоким, но для микросхем различных производителей могут быть отличия. Бит 9 — это ответ устройства (ACK), который фиксируется по фронту 9-го синхроимпульса и анализируется «ведущим». Следующие 8 бит являются битами данных. Как и при передаче адреса, 9-й бит также содержит ответ устройства. Цикл записи оканчивается стоповой последовательностью.
1.2 Подтверждение приёма
Как уже было упомянуто, передача 8 бит данных от передатчика к приемнику завершаются дополнительным циклом (формированием 9-го тактового импульса линии SCL), при котором приемник выставляет низкий уровень сигнала на линии SDA, как признак успешного приема байта.
Подтверждение при передаче данных обязательно, кроме случаев окончания передачи ведомой стороной. Соответствующий импульс синхронизации генерируется ведущим. Передатчик отпускает линию SDA на время синхроимпульса подтверждения. Приёмник должен удерживать линию SDA в стабильном НИЗКОМ состоянии в течение ВЫСОКОГО состояния синхроимпульса подтверждения.
545
1.3 Адресация в шине I2C
Каждое устройство на шине I2C имеет собственный идентификатор – адрес устройства. Часто производителями микросхем 7-битный адрес делится на две части: контрольный код и биты выбора микросхем. Контрольный код одинаков для однотипных микросхем, а биты выбора микросхемы реализованы в виде дополнительных цифровых входов селектора адреса. Способ подключения дополнительных цифровых входов и определяет биты выбора микросхемы. Таким образом, имеется возможность подключения к одной линии данных нескольких однотипных устройств.
1.4 Микросхема энергонезависимой памяти AT24C128
Микросхема AT24C128 представляет собой электрически стираемое и перепрограммируемое постоянное запоминающее устройство (ППЗУ), содержащее 16384 8-битных ячеек. Память организована в виде 256 страниц по 64 байта. Износостойкость ячеек памяти – не менее 1 миллиона циклов записи. Цикл записи данных длится не более 5 мс. Условное обозначение микросхемы приведено на рис. 1.3, назначение выводов представлено в таблице 1.1.
Рис. 1.3. Условное обозначение микросхемы AT24C128
Таблица 1.1
Назначение выводов микросхемы AT24C128
Номер вывода |
Обозначение |
Назначение |
8 |
Vcc |
Напряжение питания |
4 |
Gnd |
Общий провод |
5, 6 |
SCL, SDA |
Линии интерфейса I2C |
1, 2 |
A0, A1 |
Дополнительные адресные входы |
7 |
WP |
Вход защиты от записи |
546
Управление микросхемой осуществляется по интерфейсу I2C. Микросхема имеет 7-битный идентификатор, старшие 4 бита которого равны 10100. Младшие 2 бита определяются состоянием входов A1, A0.
Любое обращение к микросхеме по шине I2C начинается с цикла посылки идентификатора устройства.
Операция записи байта
Для выполнения операции записи требуется дополнительно передать два 8-разрядных слова адреса. После приема адреса микросхема памяти отвечает нулем, затем при поступлении импульсов синхронизации принимает 8 бит слова данных. После приема 8 бит слова данных микросхема передает подтверждение приёма. После этого ведущее устройство прерывает последовательность записи передачей условия стоп. В этот же момент времени в EEPROM активизируется внутренне синхронизируемый цикл записи в энергонезависимую память. Все входы отключаются в процессе выполнения цикла записи, и до завершения записи микросхема не реагирует на внешние запросы (рис. 1.4).
Рис. 1.4. Запись байта
Страничная запись
Микросхема памяти AT24C128 поддерживают запись 64-байтных страниц. Страничная запись инициируется таким же способом, что и побайтная запись, за исключением того, что ведомое устройство не отправляет условие останова после приема первого слова данных. Взамен этого, микросхема памяти подтверждает прием первого слова данных, после чего может передавать до 63 слов данных. После приема каждого
последующего слова данных микросхема памяти передает подтверждение приёма. Ведомое устройство прекращает последовательность страничной записи путем передачи условия останова.
Опрос подтверждения
Сразу после инициирования внутренне-синхронизируемого цикла записи и отключения входов микросхемы памяти можно начать опрос подтверждения. Для этого необходимо отправить условие старта после адресного слова. Бит чтения/записи определяет выполнение желаемой
547
операции. Микросхема памяти передает подтверждение приёма только по завершении внутреннего цикла записи, тем самым, позволяя продолжить последовательность записи.
Операции чтения инициируются тем же способом, что операции записи за исключением того, что бит выбора операции чтения/записи в адресном слове равен единице. Поддерживаются три операции чтения: чтение по текущему адресу, чтение по произвольному адресу и упорядоченное чтение.
Чтение по текущему адресу
Внутренний счетчик адреса слова данных хранит адрес, который использовался при последней операции чтения или записи, увеличенный на 1. Данный адрес остается действительным то тех пор, пока на микросхему подано питание. При выполнении инкрементирования после чтения последнего байта последней страницы, устанавливается адрес первого байта первой страницы.
Сразу после приема адреса микросхемы с битом выбора чтения/записи равным единице и подтверждения приема со стороны микросхемы памяти передается слово данных по текущему адресу. Ведущее устройство не отвечает подтверждением, а передает условие останова (рис. 1.5).
Рис. 1.5. Чтение по текущему адресу
Чтение по произвольному адресу
Для чтения по произвольному адресу необходимо предварительно выполнить процедуру загрузки адресного слова данных. Как только микросхема примет адресное слово микросхемы, адресное слово данных и отправит подтверждение, микроконтроллер должен генерировать новое условие старта. После этого необходимо инициировать операцию чтения по текущему адресу путем отправки адреса микросхемы с установленным в единичное состояние битом выбора чтения/записи. Микросхема памяти подтверждает адрес микросхемы и последовательно передает слово данных. Ведомое устройство не отвечает нулем, а должно генерировать условие останова (рис 1.6).
548
Рис. 1.6. Чтение по произвольному адресу
Упорядоченное чтение
Упорядоченное чтение инициируется после операции чтения по текущему адресу или после операции чтения по произвольному адресу. После приема ведущим устройством слова данных оно отвечает подтверждением. Когда микросхема памяти примет подтверждение, выполняется инкрементирование адреса слова данных и передается очередное слово данных. По достижении границы адресного пространства адрес слова данных переходит в начальное состояние и упорядоченное чтение продолжится. Упорядоченное чтение прекращается, когда микроконтроллер не отвечает подтверждением, но продолжает генерировать условия останова (рис. 1.7).
Рис. 1.7. Упорядоченное чтение
2 Электрическая принципиальная схема к лабораторной работе
На рис.2.1 приведена электрическая схема подключения микросхемы энергонезависимой памяти к микроконтроллеру по интерфейсу I2C.
Рис. 2.1. Электрическая схема подключения микросхемы памяти
Линия тактирования SCL подключена к порту RA9 микроконтроллера, линия данных SDA – к порту RA8. Линии SCL и SDA имеют подтягивающий резистор.
549
Адрес микросхемы формируется из фиксированной части и битов, формируемых аппаратно в зависимости от схемы подключения дополнительных адресных входов микросхемы. Фиксированная часть представляет собой 10100 в двоичном коде. Дополнительные адресные входы имеют нулевой потенциал, соответственно вторая часть адреса равна 00. Таким образом, при инициализации цикла чтения управляющее слово будет 10100000 (A0 в шестнадцатеричном коде), а при инициализации цикла записи
– 10100001 (A1 в шестнадцатеричном коде).
3 Пример выполнения работы
Задача: Разработать программу для учебного стенда, позволяющую с клавиатуры вводить последовательно адрес ячейки и число для записи в данную ячейку памяти. Клавишу «#» использовать как подтверждение ввода, клавишу «*» – для отмены ввода. После записи данных в ПЗУ ввести адрес для чтения, произвести чтение данных из ячейки памяти по введённому адресу, и вывести результат. Для отображения информации использовать ЖКИ.
Анализ задачи: Операции по работе с интерфейсом I2C (чтение, запись данных, формирование стартовой и стопой последовательности) удобней организовать в виде соответствующих функций. Для определения нажатой клавиши используется двумерный массив, каждый элемент которого содержит код кнопки, расположенной на пересечении соответствующей строки и столбца матричной клавиатуры.
Листинг программы: #include <P33FJ32MC204.h> #include <stdlib.h> #define FOSC 7370000 #define FCY (FOSC / 2)
#define Delay_ms(d) (__delay32 (((d)) * ((FCY) / 1000uL))) #define Delay_us(d) (__delay32 (((d)) * ((FCY) / 1000000uL)))
_FOSCSEL(FNOSC_FR
C) // настройка работы микроконтроллера // от внутреннего тактового генератора
#define |
|
LCD_EN |
LATAbits.LATA10 |
#define |
|
LCD_RW |
LATCbits.LATC2 |
#define |
|
LCD_RS |
LATAbits.LATA7 |
550
