Привет всем!
Наш новый урок будет гораздо сложнее предыдущих.
Мы научимся работать с двумя типами LCD-дисплеев: с параллельным интерфейсом стандарта HD44780 и последовательным интерфейсом I2C, часами реального времени (RTC) и радио интерфейсом CC1101, интегрированным в CC430F5137, на котором основывается платы TiTAN и TiTAN-I.
В результате мы получим вот такой стенд
В нижней части стенда мы видим плату TiTAN-I с подключенным по интерфейсу I2C LCDдисплеем и антенной. Микропрограмма запускает часы реального времени, устанавливает режим «будильник» на 23:59:00, выводит дату и время на дисплей, и передает эту информацию по радио.
В верхней части стенда плата TiTAN принимает по радио информацию о времени от TITANI, отображает принятую информацию на подключенном по параллельному интерфейсу LCDдисплее и, в случае срабатывания режима «будильник», включает зуммер.
Давайте сделаем все по очереди. В этом уроке мы построим нижнюю часть стенда. Визуально она выглядит обманчиво просто. Но это далеко не так. Приступим?
Для начала научимся запускать часы реального времени. Тут есть небольшая особенность, которая описана в списке ошибок от Texas Instruments под номером 5438. Суть этой ошибки в том, что при записи в регистры RTC нарушаются внутренние циклы микроконтроллера. Эта проблема устраняется применением специальной библиотеки, написанной на ассемблере. К сожалению эти библиотеки адаптированы под другие процессоры, поэтому мы сделаем по-другому. Наша цель – понимание работы.
Итак, мы дважды запишем в регистры RTC необходимые значения и выдержим небольшую паузу между записями в регистры.
Давайте разберем, что же тут происходит.
Здесь все просто:
- запрещаем прерывания;
- останавливаем RTC;
- включаем режимы: календарь, будильник и прерывания по событиям;
- устанавливаем по очереди год, день, месяц, час, минуты, секунды;
- установим будильник на 59 минут;
- запускаем RTC.
Все, с этого момента наши часы запущены.
Как же нам теперь получить текущее время? Опять обратимся к помощи прерываний. Создадим обработчик прерываний по событиям RTC.
Каждую секунду и минуту мы будем забирать данные из регистров с датой и временем, каждую минуту будем сбрасывать состояние «будильник», а по событию «будильник» мы установим признак будильника.
На этом мы заканчиваем работу с часами реального времени.
Не сложно? Тогда пойдем дальше.
Теперь нам необходимо запустить интерфейс I2C. К нему мы подключим LCD-дисплей TIC107 с контроллером PCF2119x.
Для этого нам потребуется создать несколько функций. В дальнейшем вы будете пользоваться HAL-библиотеками. Но пока наша задача научиться управлять микроконтроллером. По этой причине создадим эти функции сам, и они не будут использовать прерывания. Во они.
Функция инициализации интерфейса I2C. Порт P1.2 будет выполнять роль SCL, а порт P1.3 будет выполнять роль SDA.
Функции передачи данных, формирования стартового и стопового сигнала для интерфейса I2C.
На интерфейсе I2C он имеет адрес 0x74.
Объявим его в определениях.
Еще нам понадобятся функции вывода данных на LCD-дисплей.
Так выглядит функция перемещения курсора.
А так функция вывода текста.
Обратите внимание как выглядит передача данных по интерфейсу I2C.
Сначала передается стартовый сигнал с адресом получателя данных, потом передается команда, за ней данные, и в конце формируется стоповый сигнал.
Наберитесь терпения, осталось совсем немного. Нам необходимо добавить необходимые переменные
И в основное тело программы написать инициализацию LCD-дисплея и выводить на него время и дату
Все эти «магические» команды описаны в документации на PCF2119x.
Что у нас осталось не описанным? Ну конечно! Осталось выводить информацию на LCD-дисплей и передавать по радио. А сделаем мы это вот как. Сначала будем ждать события RTC.
А выводить на дисплей будем вот так.
Тут необходимо важное замечание. По умолчанию в проектах Code composer Studio функция printf включена с минимальной поддержкой. И модификаторы «%02» или «%4» работать не будут. Необходимо изменить параметры линковщика как показано на картинке.
Осталось только передать данные по радио. Продолжим?
С сайта https://titan-project.com в разделе «программное обеспечение» нам понадобится пример
В этом примере есть необходимая библиотека RF1A для работы с приемопередатчиком. Добавим ее в наш проект. В этой же библиотеке вы найдете массив rfSettings с настройками радио, которые были получены при помощи программы SmartRF Studio от компании Texas Instruments. Кстати, необходимые для работы LCD-дисплея функции мы используем в примере
Определим размер передаваемых данных.
И организуем передачу данных. Это мы сделаем вот так.
Мы заполняем массив TXBuff передаваемыми данными и отправляем их. Для нормальной работы радио добавим пустой обработчик прерывания по событиям радио.
Подведем итоги. Мы создали функции и обработчики прерываний для работы с часами реального времени, интерфейса I2C, LCD-дисплея и приемопередатчика.
Основное тело программы будет выглядеть так.
Остается собрать наш проект и запустить на плате TiTAN-I.
Поздравляем!
Вы освоили 5 очень важных функций. Часы реального времени, интерфейс I2C, LCD-дисплей на контроллере PCF2119x, встроенный в CC430F5137 приемопередатчик CC1101, расширенную функцию printf.
В следующем уроке мы создадим принимающую часть нашего стенда и проанализируем некоторое скрытые моменты.