Основы работы в Algorithm Builder

Основы работы в Algorithm Builder

Очень часто на радиолюбительских форумах я встречал горячие споры об эффективности написания программ для микроконтроллеров. Суть споров – на каком языке писать? С одной стороны приверженцы языков высокого уровня (Си, Паскаль, Баском и пр.), с другой, конечно же, писатели на ассемблере. Как всегда истина где-то посредине, и моё твёрдое мнение таково – ассемблер нужно знать обязательно, так как, не зная его, невозможно понять внутреннюю архитектуру микроконтроллера, суть происходящих процессов. А вот на чём писать – каждый выбирает для себя сам, и это исходит, прежде всего, из поставленной задачи. В этой статье я вкратце опишу процесс написания программы на ассемблере, используя графическую среду для разработки программного обеспечения для микроконтроллеров с архитектурой AVR фирмы ATMEL под названием Algorithm Builder. Разработала эту софтину группа российских товарищей под руководством небезызвестного Геннадия Громова, за что ему честь и хвала, а также наше эмбеддерское спасибо. Мнений об Algorithm Builder (далее по тексту AB) в инернете великое множество: от восторженных воплей до холодных порицаний. Лично мне AB очень нравится – процесс написания кода до предела ясный и вся программа очень наглядно смотрится, хотя это утверждение относиться к написанию небольших программ, до 1 – 2 –х килобайт. Повторюсь – это моё личное мнение. Программа в AB – это обычная программа на ассемблере, но мнемоники в ней заменяются на графические элементы, а векторные переходы (условные, безусловные, возврат из подпрограммы и пр.) – на визуальные связи (просто стрелки). Таким образом, разработка кода сводится к размещению на плоскости графических элементов и установлению между ними векторных связей из условных и безусловных переходов. Ну, это всё преамбула, переходим к практике. Заходим на страницу AB и качаем установочный файл. Отмечу, что с недавнего времени все ограничения в размере кода сняты (раньше размер разрабатываемой программы в свободной версии AB ограничивался 2к). Устанавливаем программу обычным образом на свой компьютер. Открываем главное окно.

Ничего особенного или свехоригинального: те же «Файл», «Отображение», «Редактировать» и пр. Кликните по значку «?» – здесь есть мануал по работе с AB, и, если Вы собираетесь работать в этой среде, то сразу распечатайте себе сей документ и внимательно прочитайте – написано всё до предела ясно. �?так, начинаем креатив. Для того, чтобы не создавать очередной «Hello, world», я решил совместить приятное с полезным. Часто в автомобильных поездках приходится сталкиваться с проблемой подзарядки мобильников или нетбука. Да ещё и мобильники у меня, жены и детей все разные (ну у каждого же свой вкус:)). Поэтому, чем плодить массу различных DC-DC адаптеров под каждое зарядное устройство, лучше сделать универсальный инвертор DC(12 В) – AC(220 В) и использовать штатные зарядные устройства. В качестве «сердца» инвертора я применил завалявшийся невесть где ATtiny15. На рисунке представлена схема устройства:

Контроллер формирует меандр 50 Гц и поочерёдно подаёт его в каждое плечо двухтактного усилителя мощности, выполненного на полевых транзисторах. Нагрузкой усилителя служит первичная обмотка обыкновенного советского накального трансформатора серии ТН – в данной конструкции он служит повышающим трансформатором. Трансформатор может быть любой, хоть самодельный, с двумя обмотками по 12 В, или одной 24 В с отводом посредине, с допустимым током, рассчитанным под Вашу нагрузку. В цепи затворов полевиков введены конденсаторы, которые обеспечивают быстрое их открытие. В 220-ти вольтовой обмотке трансформатора добавлен конденсатор, который шунтирует высокочастотную составляющую, возникающую в результате переходных процессов в индуктивности обмотки и резистор, разряжающий этот конденсатор. Цепь питания микроконтроллера стандартна до безобразия. В общем, мне кажется, по схеме вопросов быть не должно. Возвращаемся к софту. В главном окне AB щёлкаем «Файл» — «Новый». Создаём новый файл, сохраняем его под каким-нибудь именем (лучше латиницей) в заранее созданную папку – всё стандартно, как в любом редакторе. На открывшемся поле наблюдаем следующее: по умолчанию создался элемент «V» (вершина блока) и под ней пустая операция NOP. Затем щёлкаем «Опции» — «Опции проекта» и выбираем тип кристалла, тактовую частоту и др.

После этого производим непосредственно ввод кода. Небольшое отступление… Я не буду рассказывать здесь назначение элементов AB и порядок их редактирования. Любители, работавшие с микроконтроллерами и знающие их хоть немного, разберутся сами, используя вышеуказанный манул… После набора моя программа имеет следующий вид. �?меться два блока операторов, начинающиеся элементом «V» — «Вершина блока» и озаглавленные соответственно RESET и Timer_0_Overflow. То есть наборы операндов обработчиков прерываний, сброса и переполнения таймера 0. Записи типа «$FF -> DDRB» добавляются кнопкой «F» — элемент «Поле» и вводятся с помощью клавиатуры. Знак стрелки «->» — левая верхняя клавиша клавиатуры «ё» (под ESC). Серые прямоугольники, подписанные элементами периферии, добавляются с помощью кнопки «S» — элемент «Настройщик управляющих регистров». В нём (Настройщике) простой отметкой необходимых галочек настраивается работа соответствующего модуля периферии, а справа отображается элементарные операции, которые при этом выполняются. Вертикальная линия, куда упирается вектор безусловного перехода, — это метка, создаётся с помощью кнопки «L» — элемент «Метка». Стрелки переходов – кнопка «J» — элемент «Переход». Ещё есть кнопка «C» — «Условный переход» и кнопка «T» — «Текст», но в своём примере я их не использовал. Подведя курсор к любой строке можно наблюдать всплывающее окно, в котором указаны наборы элементарных операндов и описание используемых регистров. Откомпилируем проект, нажав кнопку «Компилировать». Если всё сделано правильно, вылезет окно с результатами компиляции.

Ещё AB имеет встроенный симулятор и программатор. Симулятор (кстати, удобнейшая штука!) запускается кнопкой «Запуск с симулятором». В режиме симулятора кнопкой «Открыть» можно пооткрывать различные окна, отображающие всю периферию: регистры, ОЗУ, таймеры и пр., и наблюдать изменения в регистрах и ячейках памяти.

Симулировать можно пошагово, с заходом в функции и без такового, а также выполнять до точки останова и до выделенного. В общем, всё как и в большинстве подобных программ. Записать код в кристалл можно используя встроенный программатор. Для этого нужно собрать простейший адаптер для COM-порта, состоящий из трёх диодов и семи резисторов. А можно прошить, используя любой имеющийся у Вас в наличии программатор, ведь после компиляции в папке проекта пропишется hex-файл. Пару слов о самой программе.

RESET (После сброса) — Стек инициализировать не нужно, т.к. в семействе ATtiny1x он аппаратный. 1) Переводим порт В на выход. 2) Корректируем рабочую частоту микроконтроллера записью числа в регистр OSCCAL. (Значение этого числа удобно определять с помощью программатора AVRISP mkII. Коннектимся в AVRStudio и на соответствующей вкладке считываем это значение.) 3) Записываем в счётный регистр таймера 0 начальное значение счёта, чтобы переполнение происходило через 10 мс (одна полуволна). 4) В порт В записываем начальное значение (единицы на паре управляющих одним из полевиков выходах). 5) Настраиваем и запускаем таймер 0 с коэффициентом деления 64. 6) Разрешаем прерывание таймера 0 при переполнении. 7) Разрешаем прерывания контроллера. 8)Пустой бесконечный цикл в ожидании прерывания таймера 0.

Timer_0_Overflow (переполнение таймера 0). 1) Переключаем управляющий сигнал с одного входа полевика на другой, посредством операции �?СКЛЮЧАЕЩЕЕ �?Л�?. 2) Обновляем начальное значение счёта таймера 0. 3) Выходим из функции обработчика прерывания.

Сборка описанного инвертора подтвердила его полную работоспособность. Для подтверждения вышеуказанного были одновременно заряжены два мобильных телефона. В этом режиме при напряжении АКБ 13,6 В, напряжение на выходе было 215 В при токах 800 мА и 40 мА соответственно. Таким образом КПД составил около 80 %, что вполне неплохо. Пусть Вас не пугает, что вместо синусоиды на выходе имеем меандр. Абсолютное большинство современных зарядок импульсные, а им всё равно – синус или меандр. Да и другие, неиндуктивные нагрузки, можно запитывать меандром. В своём случае я применил в качестве выходного ТН-36 220/50. Он рассчитан на ток 1,2 А в накальных обмотках. Для моей задачи вполне достаточно. Если поставить ТН-61, то можно получить на выходе до 120 Вт, но силовые транзисторы, возможно, придётся поставить на радиаторы. Также по своему усмотрению можно добавить индикаторы наличия 12 В на входе и 220 В на выходе (на схеме я их не показал). Кроме того, возможно применение 400-герцовых трансформаторов (в этом случае уменьшатся габариты устройства), т.к 50-ти герцовые трансформаторы в 400-герцовой сети работают нормально, а вот наоборот не получится. Фото готового устройства пока не выкладываю, т.к. не нашёл подходящий корпус.

Вывод: с помощью простейшего микроконтроллера можно сделать такое полезное устройство, написав при этом 33 слова кода.

UPLOAD за 19.02.2013г. Наш коллега Дмитрий не зажлобился 🙂 и поделился тестовой библиотекой для работы с ЖК�? на АБ. Принимайте, товарищи и задавайте ему вопросы.

📎📎📎📎📎📎📎📎📎📎