Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч. пос. МПТ (2.04.12).pdf
Скачиваний:
403
Добавлен:
22.03.2015
Размер:
10.95 Mб
Скачать

5.Инициализация системы прерываний состоит в записи единицы в бит CR2I регистра T1IR.

Схема основной программы приведена на том же рисунке 3.17.3

1.С помощью регистра PINSEL1 перевести портовые линии P0.16– P0.18 в режимы MAT0.2, CAP1.2 и CAP1.3 соответственно.

2.Выполнить инициализацию ЖКИ, вызвав функцию LCDInit().

3.Настроить таймер 0. Для этого:

а) разрешить сброс таймера по совпадению MAT2 (регистр T0MCR); б) разрешить формирование внешнего электрического сигнала CAP2

при совпадении (регистр T0EMR); выбрать инверсию сигнала;

в) установить порог устройства совпадения равным , что при

тактовой частоте МГц даст совпадение через 1 с; г) включить таймер 0 (регистр T0TCR).

4.Настроить таймер 1. Для этого:

а) выбрать режим счетчика с инкрементом по обоим фронтам импульсов на счетном входе CAP1.3 (регистр T1CTCR);

б) включить захват по обоим фронтам сигнала CAP1.2, разрешить прерывание по захвату (регистр T1CCR);

в) включить таймер (регистр T1TCR).

5.Включить прерывание от таймера 1 через регистры VICVectAddr0,

VICVectCntl0, VICIntEnable (раздел 1.11.5).

6.С помощью конструкций цикла while и ветвления if организовать циклическое ожидание появления единицы в флаге готовности результата

Refresh.

7.Сбросить флаг готовности в ноль.

8.Создать строку символов для индикации S командой

snprintf(S,17,"f=%10.4f kHz",f);

Получим формат

f=xxxxx.xxxx kHz

9. Вывести строку функцией PrintSymbol.

3.17.4 Повышение точности измерений

При измерении высоких частот основным источником погрешности является погрешность образцовой меры (кварцевого резонатора). Об уменьшении этой составляющей погрешности путем введения поправочного коэффициента сказано в разделе 3.16.6. Случайная составляющая, связанная с неизбежной дискретизацией времени уменьшается выбором большего интервала счета, например 10 с. Для этого потребуется задать пороговое значение в регистре T0MR2 (при 60 МГц), и разделить результат на 10.

3.18 Опрос цифрового датчика температуры. Интерфейс I2C

3.18.1 Задание

Разработать программу, считывающую результат измерения температуры с цифрового датчика LM75 через интерфейс I2C, и отображающую его на жидкокристаллическом индикаторе.

220

3.18.2 Общие рекомендации

Учебная плата EA-EDU-001 оснащена цифровым измерителем температуры LM75 фирмы National Semiconductor. Микросхема содержит датчик температуры, действующий по принципу изменения ширины запрещенной зоны; сигма-дельта АЦП; блок поддержки интерфейса I2C; дискретный выход двухпозиционного регулятора температуры с программируемой шириной петли гистерезиса (не используется). Разрешающая способность датчика 0,5º, абсолютная погрешность ±2º.

LM75 подключена к модулю I2C0. Адрес микросхемы складывается из фиксированных двоичных разрядов 1001 (старшая часть) и адресных входов A2–A0, которые на плате соединены с общей точкой. Таким образом, адрес микросхемы 0x28.

Рассмотрим основные приемы работы с микросхемой LM75. Обмен данными с микросхемой осуществляется с помощью нескольких управляющих регистров. Каждый их них характеризуется номером, который передается по шине I2C, как указатель регистра, к какому регистру производится обращение. Перечень регистров с кратким описанием их назначения приведен в таблице 3.18.1.

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

а) сформировать на шине I2C состояние START;

б) передать адрес устройства 0x28 и флаг записи (); в) передать указатель регистра 0x00;

г) повторно сформировать состояние START;

д) передать адрес устройства 0x28 и флаг чтения ();

е) принять два байта температуры, причем второй не подтверждать; ж) сформировать состояние STOP.

Таблица 3.18.1 – Перечень управляющих регистров датчика температуры

Регистр

Номер

Разряд-

Назначение

ность

 

 

 

 

 

 

9 старших разрядов содержат двоич-

Температуры

0x00

16

ный код измеренной температуры. Из

них 8 старших обозначают старшую

 

 

 

 

 

 

часть, а младший дробную 0,0 или 0,5

 

 

 

Содержит биты для отключения пи-

Конфигурации

0x01

8

тания, управления активным уровнем

 

 

 

транзисторного выхода и другие

Порогов

 

 

Задают пороги температуры для от-

включения/

0x02/0x03

16

пирания и запирания выходного

отключения

 

 

транзистора

Идентификации

0x07

8

Содержат идентификатор типа мик-

росхемы, равный 0xA1

 

 

 

221

Адресный байт

 

 

7

 

 

4

3

1

1

0

0

1

 

A2:A0

 

 

 

 

 

Адрес

0

/W R

Указатель регистра

 

7

 

 

 

3

2

0

0

0

0

0

0

 

REG

 

 

 

 

 

Указатель регистра

Направление передачи

Регистр температуры (REG = 0)

 

 

 

15

8

7

6

0

 

TEMP

 

 

 

 

Целая часть

 

 

Неопределенное значение

 

 

Дробная часть

 

Рисунок 3.18.1 – Схема основных регистров управления цифрового датчика температуры LM75

S

 

 

 

S

 

 

 

 

 

 

P

Адрес

R/W

A

Указатель

A

Адрес

R/W

A

Целая часть

A

Дробная часть

A

Рисунок 3.18.2 – Временные диаграммы сигналов на лини SDA (вверху) SCL (внизу) при считывании результат измерения

Рисунок 3.18.3 – Осциллограммы сигналов интерфейса I2C при считывании результата измерения температуры

с цифрового датчика LM75. Скорость передачи данных 50 кбит/с. Осциллограммы приведены для температуры T = 31,5º.

222

3.18.3 Алгоритм программы

Как правило, температура меняется медленно и строгая периодичность в ее измерении не требуется. Поэтому предлагается команды опроса датчика и индикации результата поместить в основную программу, не прибегая к механизму прерываний. Блок схема алгоритма программы показана на рисунке 3.18.4.

К программе потребуется подключить файлы STDIO.h и LCD.c дирек-

тивой #include.

Программа использует следующие данные:

Начало

1

Инициализация

ЖКИ

2Настройка режима линий P0.2 и P0.3

3

Настройка I2C

Нет 4 Готовность I2C

Да

5

Состояние I2C

Нет

14

 

BusyFlag=0?

 

Да

15 Формирование строки символов на

основе байтов TH и TL

16

Обновление ЖКИ

17

Установка START

18

BusyFlag=1

0x08

6 Сброс START,

передача адреса и W

0x18

7Передача указателя регистра t˚ (0x00)

0x28

8 Повторный Start

0x10

9 Сброс START,

передача адреса и R, разр. подтверждение

0x50

10

Сохранить байт в TH, запрет подтверждения

0x58

11

Сохранить байт в TL, установить STOP

12 BusyFlag=0

Иначе

13Сбросить флаг готовности I2C

Рисунок 3.18.4 – Схема алгоритма программы измерения температуры

223

а) целочисленные переменные TH и TL для хранения старшего и младшего байтов температуры;

б) строка S (ее длина будет определена ниже);

в) целочисленный флаг занятости BusyFlag (0 — выполняется обмен по I2C, 1 — результат получен и готов к индикации).

1.Инициализация ЖКИ производится вызовом функции LCDInit().

2.Перевести портовые линии P0.2, P0.3 в режимы SCL0 и SDA0 (ре-

гистр PINSEL0).

3.Настроить модуль I2C:

а) выбрать скорость передачи данных в соответствии с выражениями

(1.18.1, 1.18.2) (регистры I2C0SCLH, I2C0SCLL);

б) включить приемопередатчик установкой бита EN в регистре

I2C0CONSET.

4.Записать конструкцию проверки готовности приемопередатчика (разряд SI регистра I2C0CONSET). Далее блоки 5–13 выполняются, если

.

5.Записать конструкцию множественного ветвления по значению состояния I2C (регистр I2C0STAT). Рекомендуется использовать следующий шаблон

switch (I2C0STAT)

{

case Состояние 1 : Команды 1 ; break;

case Состояние 2 : Команды 2 ; break;

...

case Состояние N : Команды N;

}

Взаимодействие с микросхемой подробно рассмотрено в предыдущем разделе. Состояния, которые необходимо проверять указаны на блок-схеме алгоритма (см. также таблицу 1.18.2). Команды, отдаваемые приемопередатчику I2C также ясны из алгоритма. Здесь приведем выборочно описания блока 6

I2C0CONCLR=0x20; // Сбросить состояние START (бит STA) I2C0DAT=0x90; // Передать адрес 1001000R (R/W = 0) break;

блока 9

I2C0CONCLR=0x20; // Сбросить состояние START (бит STA) I2C0CONSET=0x04; // Разрешить подтверждение (Бит AA) I2C0DAT=0x91; // Передать адрес 1001000R (R/W = 1) break;

224