Pull to refresh

Микроконтролёры AVR и язык Ада

DIY
Sandbox
Tutorial
В этой статье я хочу поделиться ссылкой на проект 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-20100110\utils\bin» и «C:\WinAVR-20100110\bin», должны входить в переменную окружения 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


Листинг 1



Тот же код с комментариями:
Main.adb


Листинг 2



Расширим пример кодом чтения температуры из памяти датчика. К вышеописанным файлам необходимо добавить библиотеку One_Wire (файлы one_wire.ads, one_wire.adb, one_wire-init_comm.adb, one_wire-avr_wiring.ads), которую можно найти в папке «C:\WinAVR-20100110\lib\gnat\onewire». Особое внимание следует обратить на файл «one_wire-avr_wiring.ads». В нём нужно указать вывод микроконтролёра, используемый для подключения шины 1-wire. Для приведённой схемы это будет выглядеть так:
one_wire-avr_wiring.ads


Листинг 2



Расширенный код примера:
Main.adb


Листинг 3



Часть 4. Компиляция


Как было сказано ранее компиляция осуществляется при помощи утилиты «make», которая находится в директории «C:\WinAVR-20100110\utils\bin». Для компиляции требуется скопировать в папку с проектом «Makefile» из папки «C:\WinAVR-20100110\share\doc\avr-ada\apps\examples» и указать в нём нужные параметры:

Makefile
# целевой микроконтролёр
MCU := attiny13

# файл проекта компилятора GNAT (о нём ниже)
GPR := build.gpr

# главный модуль программы 
ADA_TARGETS := main

# прочее оставить без изменения
...


Компилятор GNAT (The GNU Ada Compiler) позволяет задавать различные опции через файл проекта с расширением "*.gpr". Примеры проектов так же можно найти в папке «C:\WinAVR-20100110\share\doc\avr-ada\apps\examples». В нашем случае он будет выглядеть следующим образом:
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. Декоративная


В качестве корпуса полученного устройства можно использовать маленький стеклянный стаканчик (нет, это не стопка для потребления водки, это подсвечник).
В качестве рассеивателя хорошо подходит горсть матового белого бисера. Он создаёт впечатление плавного разрастания и затухания огня при плавной регулировке яркости.
Для индикации отрицательных температур в моём градуснике добавлен синий светодиод.
Помимо простейшей унарной системы индикации, приведённой в примере, есть так же варианты унарно-десятичной, двоичной, троичной и унарной со смещением нуля индикаций.

Приложение


К сожалению Хабрахабр не поддерживает подсветку синтаксиса Ады (ну или я «начинающий пользователь») поэтому пришлось вставить код в виде картинок. Архив с кодом в текстовом виде здесь.
Tags:адаdiy или сделай саммикроконтроллеры avr
Hubs: DIY
Total votes 22: ↑22 and ↓0+22
Views24K

Popular right now

Top of the last 24 hours