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

Методическое пособие 539

.pdf
Скачиваний:
8
Добавлен:
30.04.2022
Размер:
2.16 Mб
Скачать

Рис. 2.9. Анализ переменной COUNTER

Переменная COUNTER размещается во внутренней памяти данных микроконтроллера по адресу 0x10, который в симуляторе обозначается как I:0x10. После запуска программы в симуляторе при моделировании прерывания INT0 можно наблюдать изменения значения переменной COUNTER в области Memory. Определить адрес переменной COUNTER, размещенной в сегменте памяти типа IDATA, можно и напрямую, проанализировав MAP$файл, созданный компоновщиком. Вот интересующий нас фрагмент листинга:

LINK MAP OF MODULE: debug_memo (DEBUG_MEMO) TYPE BASE LENGTH RELOCATION SEGMENT NAME

—————————————————————————

———————————————————————————

—————————

* * * * * * * D A T A M E M O R Y * * * * * * *

REG 0000H 0008H ABSOLUTE “REG BANK 0”

REG 0008H 0008H ABSOLUTE “REG BANK 1”

61

IDATA 0010H 0001H UNIT ?ID?DEBUG_MEMO IDATA 0011H 0001H UNIT ?STACK

* * * * * * * C O D E M E M O R Y * * * * * * *

CODE 0000H 0003H ABSOLUTE

CODE 0003H 0003H ABSOLUTE

CODE 0006H 008CH UNIT ?C_C51STARTUP

CODE 0092H 0015H UNIT ?PR?INT0ISR?DEBUG_MEMO CODE 00A7H 0015H UNIT ?PR?MAIN?DEBUG_MEMO CODE 00BCH 0004H UNIT ?C_INITSEG

Здесь сегмент данных, в котором размещена переменная

COUNTER, обозначен как ?ID?DEBUG_MEMO (это стандартная форма записи, принципы формирования которой описаны в справке на компилятор Keil). Как видно из листинга, этот сегмент занимает один байт памяти с адресом 0x10, т.е. наша переменная размещена именно по этому адресу.

Заканчивая анализ возможностей среды разработки Keil uVision3 и компиляторов C51 и A51, стоит отметить, что детальное изучение этих инструментальных средств поможет не только при создании программ, но и позволит глубже понять принципы функционирования микроконтроллера 8051.

62

ГЛАВА 3. ОБРАБОТКА ДИСКРЕТНЫХ СИГНАЛОВ В МИКРОКОНТРОЛЛЕРАХ СЕРИИ 8051

Классический микроконтроллер 8051, как известно, имеет несколько портов ввода/вывода, позволяющих осуществлять обработку входных и генерировать выходные сигналы. Современные системы обработки данных манипулируют, как правило, с большим числом сигналов и требуют наличия намного большего количества портов ввода/вывода по сравнению с тем, что имеется в контроллере 8051. Есть несколько вариантов решения этой проблемы.

Один из вариантов – увеличить количество портов ввода/вывода за счет использования схемотехнических решений, применив, например, микросхемы расширителей интерфейсов или создав собственные аппаратные конфигурации, используя имеющуюся схемотехническую базу. В этих случаях для управления такими интерфейсами необходимо разработать соответствующее программное обеспечение (мы рассмотрим несколько вариантов таких решений).

Второй вариант предполагает использование специальных протоколов обмена данными, позволяющих подключать несколько устройств к ограниченному количеству сигнальных линий. В этом случае можно использовать, например, протоколы I2C, SMBus, SPI и др. Ведущими производителями электронных компонентов разработаны многочисленные устройства, совместимые с популярными протоколами, которые можно использовать в проектах на базе микроконтроллеров.

Рассмотрим оба варианта расширения интерфейсов. Вначале остановимся на реализации интерфейсов с устройствами на базе популярных протоколов SPI и I2C, а затем проанализируем возможности разработки собственных интерфейсов.

Интерфейс SPI (Serial Peripheral Interface) можно представить так, как показано на рис. 3.1

63

Рис. 3.1. Функциональная схема интерфейса SPI

Интерфейс SPI представляет собой стандарт последовательной передачи данных в синхронном режиме, допускающий работу в полнодуплексном режиме. В большинстве случаев интерфейс функционирует между двумя устройствами, одно из которых является ведущим (master), а другое ведомым (slave). При этом ведущий инициирует обмен данными и синхронизирует их прием и/или передачу. Несколько устройств могут функционировать как ведомые, при этом ведущий должен выбирать ведомого, устанавливая сигнал выбора (slave select, chip select) для конкретного устройства.

Сигнал SCLK (Serial Clock) представляет собой последовательность синхронизирующих импульсов, генерируемых ведущим. Передача/прием данных обычно привязана к фронтам или спадам синхросигнала. По линии

MOSI (Master Output, Slave Input ) передача данных осуществляется от ведущего к ведомому, а линия MISO (Master Input, Slave Output) служит для приема данных от ведомого. Сигнал SS (Slave Select) генерируется ведущим для конкретного ведомого, разрешая сеанс обмена данными, при этом активным уровнем такого сигнала является уровень логического нуля.

Очень часто ведущие производители оборудования используют и альтернативные обозначения сигналов интерфейса. Например, часто сигнал синхронизации SCLK обозначается как SCK, а MISO может обозначаться как SDI, DI или SI. Сигнал MOSI имеет альтернативные обозначения SDO, DO и SO. Наконец, сигнал выбора ведомого часто встречается под альтернативными обозначениями nCS и CS.

64

Интерфейс SPI является двунаправленным, тем не менее большинство устройств, выпускаемых промышленностью, использует обычно упрощенную однонаправленную версию этого протокола. Например, большинство аналогово-цифровых преобразователей использует модель, в которой ведущим является устройство, получающее данные (микроконтроллер, компьютер и т.д.), которое соответственно синхронизирует передачу или прием данных.

Стандарт I2C (читается как «I-square-C») реализован как двухпроводной последовательный интерфейс, разработанный Philips Corp. c максимальной скоростью передачи данных 100 Кбит/с. Впоследствии стандарт стал поддерживать более скоростные режимы работы шины(400 Кбит/с и 1 Мбит/с). При этом к одной шине I2C могут быть подключены устройства с различными скоростями доступа, если скорость передачи данных будет удовлетворять требованиям самого низкоскоростного устройства.

Протокол передачи данных по шине I2C разработан таким образом, чтобы гарантировать надежный и качественный прием/передачу данных. При передаче данных одно устройство является ведущим и инициирует передачу данных, а также формирует сигналы синхронизации. Другое устройство, ведомое, может начать передачу данных только по команде ведущего шины.

Протокол I2C использует две сигнальные линии, по одной из которых подается сигнал синхронизации, обычно обозначаемый как SCL, а по другой, обозначаемой обычно как SDA, передаются или принимаются данные. Линии SCL и SDA могут соединять два и более устройств, как показано на рис. 3.2.

65

Рис. 3.2. Схема взаимодействия устройств по шине I2C

К сигнальным линиям необходимо подключить так называемые подтягивающие резисторы, обозначенные на схеме как Rp, присоединив их к источнику питания (для стандартной TTL-огики это +5 В). Подтягивающие резисторы (их значение может находиться в диапазоне 1–10 K) нужны для фиксации уровня сигналов, поскольку спецификация I2C предусматривает использование устройств, имеющих выходные каскады с открытым коллектором (open collector) или стоком (open drain). Устройства могут быть или ведущими, или ведомыми. Ведущий обеспечивает синхронизацию обмена данными, генерируя синхроимпульсы по линии SCL. На шине I2C может быть один или несколько ведущих и один или несколько ведомых устройств. В подавляющем большинстве случаев на шине находится только один ведущий и несколько ведомых устройств.

Обмен данными по шине I2C инициируется ведущим, который должен обеспечить выполнение стартовой (в начале обмена) и стоповой (в конце обмена) последовательности сигналов. Эти последовательности сигналов показаны на рис. 3.3.

66

Рис. 3.3. Стартовая и стоповая последовательности на шине I2C

Протокол I2C требует, чтобы сигнал на линии данных SDA оставался неизменным при высоком уровне сигнала SCL. Перепад сигнала на линии SDA из высокого в низкий уровень при высоком уровне сигнала на линии SCL инициируется ведущим и указывает на начало обмена данными. Если при высоком уровне сигнала на линии SCL сигнал на линии SDA переходит из низкого в высокий уровень, то эта последовательность сигналов интерпретируется как завершение операции обмена данными на шине.

Данные передаются по шине в виде последовательности из 8 бит, причем первым в последовательности идет старший значащий бит (MSB). Каждый бит передается по нарастающему фронту сигнала SCL, причем, как уже упоминалось, при высоком уровне сигнала SCL сигнал на линии SDA должен оставаться неизменным, если только это не стартовая или стоповая последовательность. После того как все 8 бит переданы, устройство, передающее данные, ожидает от устройства, принимающего данные, подтверждения приема (acknowledge). Бит ответа фиксируется по нарастающему фронту 9-го импульса SCL. Последовательность передачи данных показана на рис. 3.4.

67

Рис. 3.4. Передача данных по шине I2C

Схема, показанная на рисунке 3.4, демонстрирует общие принципы обмена данными по шине I2C. На практике, чтобы записать, например, байт данных в устройство, необходимо знать как минимум его адрес. В этом случае запись байта в устройство можно изобразить схемой, показанной на рис. 3.5.

Рис. 3.5. Запись байта в устройство на шине I2C

Цикл записи данных в устройство начинается со стартовой последовательности. Затем передаются первые 8 бит, содержащие 7-разрядный адрес устройства (биты A7 – A1) и команду чтения/записи (обозначена как R/W). Обычно команда записи передается низким уровнем, а команда чтения – высоким. Бит 9 – это ответ устройства (обозначен как ACK), который фиксируется по фронту 9-го синхроимпульса и анализируется ведущим. Следующие 8 бит являются битами данных. Как и при передаче адреса, 9-й бит также содержит ответ устройства. Цикл записи оканчивается стоповой последовательностью.

68

3.1. Обработка входных данных с использованием SPI

Рассмотрим некоторые практические аспекты реализации обработки входных дискретных сигналов в микроконтроллере на примерах применения интерфейса SPI в пользовательских разработках.

Наш первый проект позволяет измерить температуру объекта с помощью термопары K-типа, причем диапазон измерения лежит в пределах от 0 до 1024 °С. Измерения температур с помощью термопар (thermocouples), так же как, например, с помощью резистивных датчиков температуры (RDT), наиболее часто используются в промышленности и научных исследованиях.

Роль измерительного преобразователя сигнала термопары выполняет микросхема MAX6675, цифровой сигнал с которой по интерфейсу SPI передается в микроконтроллер, как показано на рис. 3.6.

Рис. 3.6. Измерение температуры по интерфейсу SPI

69

Микросхема MAX6675 осуществляет полную первичную обработку сигнала термопары K-типа, выполняя расчет компенсирующей ЭДС для холодного спая и преобразование полученного сигнала в цифровую форму. Далее 12-разрядный цифровой сигнал передается по SPIсовместимому интерфейсу в микроконтроллер или компьютер. Данный преобразователь позволяет измерить температуру вплоть до 1024 °C с разрешением 0,25 °C. Детальное описание принципа функционирования данной микросхемы можно найти на сайте фирмы-производителя Maxim Inc.

Микросхема подключается к термопаре следующим образом: вывод «T+» соединяется с хромелевым выводом термопары, а вывод «T–» с алюмелевым выводом термопары.

Вывод SCK микросхемы используется для приема синхронизирующих импульсов, которые инициируют прием данных по линии SO по нарастающему фронту. Сигнал CS, установленный в низкий уровень, разрешает прием данных по интерфейсу.

Сигналы SCK и CS являются входными для микросхемы, а SO – выходным. Временная диаграмма работы интерфейса показана на рис. 3.7. Как видно из временной диаграммы, для считывания данных требуется 16 синхроимпульсов, причем значение температуры закодировано в 12 битах, начиная с D14 и заканчивая D3. Бит данных считывается в микроконтроллер по нарастающему фронту импульсов SCK. Считывание битов данных выполняется только при низком уровне сигнала CS.

Рис. 3.7. Передача данных по SPI в измерителе температуры

70