В этой статье я хочу поделиться ссылкой на проект AVR-Ada ( sourceforge.net/projects/avr-ada/ ) за авторством Rolf Ebert и привести пример применения языка Ада в любительском проекте на микроконтролёре. Статья может быть полезна тем, кто как и я, совершенно не дружит с языком «Си». В качестве примера возъмём банальное устройство — термометр на датчике DS18B20 и микроконтролёре ATtiny13 со светодиодной индикацией.
Часть 1. Программные компоненты
Для разработки прошивки потребуются скачать следующее:
1.1. WinAVR-20100110 ( sourceforge.net/projects/winavr/files/WinAVR/20100110/ ) — SDK для разработки прошивок на Ассемблере и Си. Включает в себя «Programmers Notepad» с подсветкой синтаксиса Ады.
1.2. AVR-Ada-1.1.0 ( sourceforge.net/projects/avr-ada/files/avr-ada/bin_windows/ ) — компилятор GNAT и библиотеки Ады для WinAVR. Включает в себя примеры программ.
1.3. Программа-программатор. В моём случае это AvrOSPII, поставлявшаяся в комплекте с программатором.
В разделе загрузок AVR-Ada присутствуют версии 1.1 и 1.2. Для простоты установки рекомендую использовать более старую версию, поскольку новая требует несколько дополнительных библиотек (dll), отсутствующих в инсталляторе. Если есть желание установить версию 1.2, то недостающие части можно найти в составе MinGW ( sourceforge.net/projects/mingw/files/ ).
AVR-Ada следует установить поверх WinAVR в ту же директорию. Компиляция осуществляется с помощью утилиты «make», поэтому директории «C:WinAVR-20100110utilsbin» и «C:WinAVR-20100110bin», должны входить в переменную окружения PATH.
Часть 2. Аппаратные компоненты
Требуются следующие устройства:
2.1. Программатор — в моём случае — Inex PX-400 обусловлен ассортиментом «деревенских» магазинов.
2.2. Блок питания для термометра и программатора — подойдёт любое зарядное устройство для мобильного телефона на 5 В.
2.3. Собственно термометр.
Устройство состоит из микроконтролёра ATtiny13 ( www.atmel.com/devices/attiny13.aspx ), датчика температуры DS18B20, токоограничивающего резистора не менее 100 Ом и светодиода. Датчик подключается по шине 1-wire к выводу PB4 микроконтролёра. Обратите внимание, что датчик нельзя подключать к выводам, используемым для подключения программатора (RESET, SCK, MOSI, MISO), поскольку вмешательство датчика в обмен данными может привести к непредсказуемым последствиям. Описание шины 1-wire требует наличия подтягивающего резистора 4,7 кОм, или меньше для режима с паразитным питанием. Так же рекомендуется уменьшать это значение при большой длинне шины. В нашем случае длинна шины минимальна и паразитное питание не требуется, поэтому достаточно подтягивающего резистора в 20-50 кОм, встроенного в микроконтролёр. Светодиод подключается к выводу PB3. Возможно так же подключение светодиодов к выводам SCK, MOSI, MISO, но при этом понадобится выполнить ряд дополнительных требований.
Для включения светодиода необходимо перевести соответствующий вывод микроконтролёра в режим «выхода» и подать на него высокий уровень. Для обмена данными с термодатчиком используется готовая библиотека, которая самостоятельно настроит выход. Для корректной работы выдержек времени нужно установить тактовую частоту микроконтролёра в 8 МГц («fuse bit» CKDIV8=1). По умолчанию ATtiny13 настроен на частоту 1 МГц. Установка производится в соответствии с инструкцией на программатор.
Часть 3. Программирование
Как следует из названия статьи программировать будем на языке Ада. Язык прост в освоении, исходные коды легко читаются. Учебник на русском языке можно почитать здесь ada-ru.org/V-0.4w/index.html
Начнём с мигания светодиодом. Весь проект будет состоять из исходного текста (файл «Main.adb»), файла проекта (build.gpr) и конфигурации утилиты «make» (Makefile). О двух последних написано в части посвещённой компиляции. Файл «Main.adb» будет выглядеть так:
Main.adb
Тот же код с комментариями:
Main.adb
Расширим пример кодом чтения температуры из памяти датчика. К вышеописанным файлам необходимо добавить библиотеку One_Wire (файлы one_wire.ads, one_wire.adb, one_wire-init_comm.adb, one_wire-avr_wiring.ads), которую можно найти в папке «C:WinAVR-20100110libgnatonewire». Особое внимание следует обратить на файл «one_wire-avr_wiring.ads». В нём нужно указать вывод микроконтролёра, используемый для подключения шины 1-wire. Для приведённой схемы это будет выглядеть так:
one_wire-avr_wiring.ads
Расширенный код примера:
Main.adb
Часть 4. Компиляция
Как было сказано ранее компиляция осуществляется при помощи утилиты «make», которая находится в директории «C:WinAVR-20100110utilsbin». Для компиляции требуется скопировать в папку с проектом «Makefile» из папки «C:WinAVR-20100110sharedocavr-adaappsexamples» и указать в нём нужные параметры:
Makefile
# целевой микроконтролёр
MCU := attiny13
# файл проекта компилятора GNAT (о нём ниже)
GPR := build.gpr
# главный модуль программы
ADA_TARGETS := main
# прочее оставить без изменения
...
Компилятор GNAT (The GNU Ada Compiler) позволяет задавать различные опции через файл проекта с расширением "*.gpr". Примеры проектов так же можно найти в папке «C:WinAVR-20100110sharedocavr-adaappsexamples». В нашем случае он будет выглядеть следующим образом:
build.gpr
project Build extends "avr_app" is -- проект "наследуется" от проекта "avr_app",
-- входящего в состав AVR-Ada
for Object_Dir use "obj"; -- для объектных файлов используется подпапка obj,
-- чтобы не захламлять корневую
for Exec_Dir use "."; -- откомпилированная программа будет лежать в корневой папке
for Source_Dirs use ("."); -- исходные файлы будут искаться в корневой папке
end Build;
Теперь можно перейти в папку с проектом и попробовать откомпилировать:
>cd "папка с проектом"
>make
Что бы не лазить в консоль «Programmers Notepad» имеет команду «Tools>[WinAVR] Make all».
С большой вероятностью компиляция с первого раза выполнена не будет. Это связано с очень жёстким синтаксисом Ады и дотошностью компилятора. Придётся исправлять множество синтаксических ошибок, которые в других языках ошибками не считаются.
Если компиляция всё же удалась, то в корневой папке появится файл «main.hex», который нужно прошить в микроконтролёр в соответствии с инструкцией на программатор.
Часть 5. Декоративная
В качестве корпуса полученного устройства можно использовать маленький стеклянный стаканчик (нет, это не стопка для потребления водки, это подсвечник).
В качестве рассеивателя хорошо подходит горсть матового белого бисера. Он создаёт впечатление плавного разрастания и затухания огня при плавной регулировке яркости.
Для индикации отрицательных температур в моём градуснике добавлен синий светодиод.
Помимо простейшей унарной системы индикации, приведённой в примере, есть так же варианты унарно-десятичной, двоичной, троичной и унарной со смещением нуля индикаций.
Приложение
К сожалению Хабрахабр не поддерживает подсветку синтаксиса Ады (ну или я «начинающий пользователь») поэтому пришлось вставить код в виде картинок. Архив с кодом в текстовом виде здесь.
Автор: Cubik71