GrabDuck

«Программирование мышкой» для микроконтроллеров

:

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

При использовании такого конфигуратора вы существенно упрощаете начальный этап программирования, но делаете это не в ущерб пониманию процессов, происходящих на кристалле.
Ниже приведен пример использования конфигуратора для микроконтроллера C8051F930 от Silicon Labs. Будем управлять яркостью светодиода с потенциомера, написав руками всего две строчки кода. Just for fun, конечно.


Исходные данные


Все программные средства разработки для микроконтроллеров Silicon Labs доступны в составе программной платформы Simplicity Studio. Платформа распространяется бесплатно и содержит IDE, документацию, массу примеров программ, а также дополнительные утилиты вроде профайлера энергопотребления и конфигуратора. В этом примере будут использоваться конфигуратор и среда разработки.
В качестве аппаратной платформы послужит отладочная плата C8051F930-TB, так как на ней установлены потенциометр и светодиод, а микроконтроллер C8051F930 имеет необходимые блоки АЦП и ШИМ. В общем, к плате предъявляется нехитрый набор требований, под который подходит множество средств отладки. Но C8051F930-TB таки была под рукой :)
Шаг 1. Подготовка

Подготовка заключается в установке и запуске Simplicity Studio на компьютере и включении отладочной платы. Плата запитывается от батареи или от сети и, за неимением встроенного отладчика, подключается к компьютеру через программатор DEBUGADPTR1-USB.

image

После корректного подключения плата детектируется средой, и все инструменты для 8-разрядных кристаллов становятся доступны.

image

Шаг 2. Создание проекта

Для известной отладочной платы диалог создания нового проекта появляется сразу после нажатия на иконку конфигуратора. Мастер создания проекта не содержит никаких необычных элементов, только выбор целевого контроллера, названия и расположения проекта и т.п.
Интерфейс самого конфигуратора состоит из трех основных частей:
  • Конфигуратор периферийных устройств
  • Конфигуратор портов ввода/вывода
  • Граф состояний микроконтроллера

image
Шаг 3. Настройка периферии

Конфигуратор периферийных устройств представляет собой список доступных на выбранном кристалле периферийных модулей и функций ядра. Для реализуемой задачи понадобится:
  1. Активировать и настроить АЦП чтобы обрабатывать сигнал с потенциометра;
  2. Активировать и настроить таймер чтобы инициировать преобразование на АЦП с нужной частотой;
  3. Активировать и настроить блок PCA (т.н. программируемый массив счетчиков), на котором в микроконтроллерах C8051Fxxx доступен аппаратный ШИМ-генератор.

Но начнем с включения тактового генератора контроллера. Достаточно поставить галочку на Clock Conrol — встроенный генератор частоты на 25 МГц с делителем на 8 нас вполне устраивает, поэтому доступные в окне справа настройки блока оставляем с параметрами по умолчанию.

image

После настройки тактирования переходим к таймерам-счетчикам. Опрашивать АЦП будем раз в 1 мс, поэтому настраиваем TIMER2 на переполнение с соответствующей частотой: ставим галочку на блоке TIMER2, указываем частоту в микросекундах, задаем Start в поле Run Control чтобы работа таймера начиналась автоматически.

image

При активации TIMER2 модуль Timer Setup загорелся красным цветом. Timer Setup должен быть активирован для работы таймеров/счетчиков, ставим галочку.

image

По переполнению таймера будет начинаться преобразование на блоке АЦП. Настройка АЦП включает разрешение работы блока, указание события для старта работы, указание линии ввода/вывода для приема измеряемого сигнала и выбор 8-битного режима преобразования без усиления.

image

Опорное напряжение для АЦП указывается в отдельном блоке Voltage Reference. В соответствующем пункте указываем напряжение питания платы.

image

Итак, при корректном выполнении описанных настроек мы получим работающий кристалл, на котором раз в миллисекунду значение в регистре результата АЦП обновляется в соответствии с положением колесика потенциометра. Чтобы использовать это значение для формирования ШИМ-сигнала необходимо, кроме настройки блока ШИМ, разрешить прерывание от АЦП и настроить обработчик этого прерывания (копирование значения из регистра результата АЦП в регистр данных блока ШИМ). Средствами утилиты Configurator можно только настроить контроллер прерываний: активируем блок Interrupts и прерывание от ADC0, разрешаем все прерывания.

image

Осталось настроить блок PCA на генерацию ШИМ-сигнала. Выбираем нужный режим на Channel0 и задаем автоматический (т.е. сразу после включения или reset'а) старт работы.

image

Шаг 4. Настройка портов ввода/вывода

Режим работы контроллера создан. Переходим на соседнюю вкладку чтобы настроить порты ввода/вывода — понадобится определить вход АЦП и выход ШИМ в соответствии с топологией платы.

Линия P0.6, подключенная к потенциометру, была указана в качестве входа для сигнала ещё при настройке ADC0. Она отмечена на распиновке кристалла. Справа, в окне настройки режима работы выбранной «ножки», два красных крестика недвусмысленно намекают что нужно поправить два параметра.

image

Режим Open Drain не подходит для аналогового входа, меняем его на Analog I/O. Параметр Skip относится к CROSSBAR'у — цифровому коммутатору, который устанавливает связи типа «периферийный модуль -> порты ввода/вывода» в микроконтроллерах C8051Fxxx. Поскольку линия P0.6 является входом микроконтроллера, в CROSSBAR'е она не должна учитываться. Выбираем Skipped.

Переходим к настройке выхода для ШИМ-сигнала — нулевой канал блока PCA должен быть выведен на линию P1.6, к желтому светодиоду. Такая связь как раз задается через CROSSBAR. Разрешаем его работу.

image

Появилось меню настройки CROSSBAR'а. Ставим галочку на нулевом канале PCA, ШИМ автоматически оказалась на линии P0.0.

image

ШИМ нужно «передвинуть» на P1.6, а для P1.6 указать режим работы Push-Pull Output вместо Open Dain.

image

Шаг 5. Генерация и дополнение исходного кода

Генерация и обновление исходного кода из заданной конфигурации происходит при сохранении проекта или по команде Generate Source, доступной из меню по нажатию правой кнопки мыши. Исходный код нужно дополнить обработчиком прерывания, причем шаблон обработчика создан автоматически благодаря разрешению прерывания от АЦП.

image

Пишем те самые две строчки кода: снимаем флаг прерывания по окончанию преобразования, копируем содержимое регистра данных АЦП в регистр ШИМ.

ADC0CN_ADINT = 0;
PCA0CPH0 = (U8) (ADC0 >> 2);

Кроме конфигураторов периферии и портов, для 8-разрядных микроконтроллеров доступен инструмент задания графов состояний. Инструменты, которые использовались выше, описывают дефолтный режим работы контроллера, а в графе состояний есть возможность создать несколько режимов, каждому из них будут соответствовать собственные конфигураторы периферии и портов. Впрочем, в этом примере C8051F930 функционирует в единственном режиме.
Шаг 6. Компиляция, запуск

Проект создан, остались сборка, компиляция и программирование кристалла.
Результат работы — на видео.

Использованный ресурс