Основы работы в 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г. Наш коллега Дмитрий не зажлобился 🙂  и поделился тестовой библиотекой для работы с ЖКИ на АБ. Принимайте, товарищи и задавайте ему вопросы.

Запись опубликована в рубрике Разное с метками . Добавьте в закладки постоянную ссылку.

37 комментариев: Основы работы в Algorithm Builder

  1. nml говорит:

    Работал с этой программой, даже покупал ее(ну не сам, а шеф). Согласен — по сравнению с чистым асмом — гораздо нагляднее, удобные макро, неплохой симулятор. Но — увы — ни с чем не совместимо…

  2. 12 апреля 2011 говорит:

    Очень ясное и точное изложение материала.

  3. 12 апреля 2011 говорит:

    Купил эту программу (сам),
    когда она была платной, шью мк
    для устройств только в ней; хотелось бы увидеть
    бумажную книгу с таким же названием.

  4. Сергей говорит:

    В Вашей схеме, качестве ключей, лучше использовать полевики с логическим уровнем управления. Возможно, тогда и схема упростится на две детальки (С3, С4).

  5. s_black говорит:

    Согласен, но под рукой были именно 44-е.

  6. Dust говорит:

    а может мне кто расскажит как подключить LCD типа WH1602. ато все пишут что АВ это легко и просто а описаний толком нет.. скачал оф сайта библиотеки для работы с дисплеем, а как его подключить ничего не написано. может мне кто на пальцах покажит как это сделать?

  7. s_black говорит:

    Не совсем понятен вопрос… Если вы имеете в виду распределение выводов МК по ногам LCD, то это задаётся в программе.

  8. Dust говорит:

    да именно расположение пинов на МК .. может у вас есть рабочий пример для LCD 16х2 желательно расписанный что да как.

  9. s_black говорит:

    Есть готовая библиотека на С в статье http://www.embed.com.ua/raznoe/fm-stereotyuner/ в архиве с исходниками. Если есть необходимость — могу написать в AB, но через пару дней

  10. Dust говорит:

    на С я делаю без проблем. мне хочется попробовать в AB это реализовать.

  11. Артур говорит:

    Ребята!! поднимаю тему для LCD 16х2, только у меня 8х2, но разницы особо нет. Я нахожу исходники на ассемблере, но реанимировать этот код для АВ крайне затруднительно для меня. Здесь уже год никто не писал… s_black, если ты тут, ответь что у тебя получилось на счет кода в АВ для LCD 16х2

  12. s_black говорит:

    Я, конечно же, здесь 🙂 У меня ничего не получилось насчёт кода в АВ для LCD 16×2 по той причине, что я его не делал — нету такой необходимости. Но я не вижу никаких проблем в его написании. Да и поискать по интернету думаю стоит — наверняка готовые библиотеки имеются!

  13. Артур говорит:

    очень жаль конечно)) я кое что раскопал, буду тестить, может отпишусь вскором

  14. s_black говорит:

    Так а что у Вас конкретно вызывает затруднение?

  15. Артур говорит:

    Затруднение в том, что я лучше ориентируюсь в написании программ в среде BASCOM-AVR))) здесь, чтобы сконцигурировать LCD нужно одной строки, а чтобы вывести символ, достаточно написать «LCD [переменная]». Я нашел пример, типа «привет, мир» на меге16, переписал его под таню2313, но как-то не вижу этих букв на дисплее. Могу ли я Вам отправить исходники, чтобы Вы посмотрели, в чем я не могу разобраться? Я в ассемблере для AVR не силен, но уже многое понимаю в коде AB. Мне предстоит написать свой проект в АВ, поскольку мне нужно знать каждый выполняемый шаг программы — ассемблер самое то. А на С++ или Bascom существуют системные подпрограммы, например, деления или умножения переменных, которые неизвестно как выполняются по времени. Если переменные с плавающей точкой, то можно будет заварить кофе, пока AVR считает деление цифр типа Double… Ну это грубый пример)) суть в том, что я хочу видеть каждый выполняемый шаг. И одна хорошая особенность АВ — пошаговая отладка.

  16. s_black говорит:

    Вот! Вот видите сами какое зло эти самые «визарды» кодвижена и генераторы кода разных ардуин и пр. Чтобы инициализировать или вывести достаточно написать … ля-ля-ля тополя… , а понимания сути построения ЖКИ и управления им нету никакой!!! А ведь достаточно вдумчиво почитать описание и всё станет ясно как Божий день! Конечно я Вам помогу — проблем не вижу. Но ведь Вам-то самому нужно разобраться в этом. У меня есть русское описание -могу сбросить Вам на почту (хотя в интернете их полно). Кроме того Вы сильно ошибаетесь насчёт отладки — не только в АВ можно смотреть пошаговое выполнение кода. В той же Студии есть все инструменты для этого. От операций с плавающей запятой тоже нужно уходить — все вычисления можно реализовать и без них.

  17. Артур говорит:

    у меня есть даташит на ks066, или ks077, который установлен в SC0802 LCD =) но толку от этого не прибавилось, поскольку я не особо и силен в последовательных интерфейсах, руками их не трогал (4х битный интерфейс в данном случае «таковым является»). И, конечно, нет на понятном языке описания команд чипа LCD, самое важное — примеров кусочков кодов конкретных операций, на том же ассемблере. Про студию я молчу, в ней используется голый ассемблер. АВ — привлекательней. Отладка в студии — тоже замечательно, я все там видел, там я был, но есть же АВ 😉 Вы говорили про русское описание, мне было бы интересно почитать про систему команд символьного LCD

  18. s_black говорит:

    Уважаемый Артур! Я на ассемблере почти не программирую, в основном на Си. В Студии отладка на Си идёт великолепно. Мне нравится Ваше стремление разобраться в данном вопросе, и, если Вы недельку-другую потерпите — я, пожалуй напишу статью в виде урока для Вашего конкретного примера.

  19. Alex говорит:

    Могу прислать PDFку по теме подключ. жки с AB

  20. Dima говорит:

    Здравствуйте Alex. Я столкнулся с той же проблемой и с большим удовольствием посмотрел бы ваш файл.

  21. Жека говорит:

    Парни, многие типы кричат- типа Си- великолепно, а АВ-отстой. Я модернизирую на АВ промышленное оборудование. Великолепно. По скорости-Си-отдыхает. Есть программка выводящая 32 символа из «видеопамяти» СРАМ. Выводит по одному символу в следующее знакоместоместо каждые 4 прохода. Всего проходов 32*4+8. Максимальное время одного прохода-48 тактов (без учета входа-возврата) . Таким образом может выполняться фоново по какому нибудь таймеру. При частоте ЦПУ 16 мгц и частоте обновления 10гц, хавает ( (14мкс*136) / 100000мкс) * 100% = 1.9 % времени.

  22. mcmega говорит:

    Alex, если Вас не затруднит, скинть и мне, пожалуйста инструкцию по подключ. жки в AB (oleg.perevyshin@mail.ru)

  23. Dmitry говорит:

    Как-то писал драйвер вывода на ЖКИ (если так можно выразиться) в этой среде.
    Сейчас снова планирую вернуться к этому вопросу. Еще интересует тема отладчика, сделаю в ближайшее время. Могу поделиться исходниками, почта micromega(at)ukr(dot)net

  24. s_black говорит:

    Конечно, пишите и выкладывайте! Народ неоднократно интересовался! Если захотите — я оформлю Ваши наработки в виде статьи.

  25. aahz говорит:

    на VRTP есть раздел форума про АБ, рекомендую туда наведаться

  26. s_black говорит:

    Добавлен архив с тестовой программой для обслуживания ЖКИ от Дмитрия. Выше по комментам народ активно интересовался данным вопросом.

  27. lesnik говорит:

    Подскажите пожалуйста: в attiny10 имеется 4-х канальное АЦП, а в Algorithm Builder-е почему-то компаратор. Что делать, менять среду программирования или можно самому составить план регистров АЦП?

  28. s_black говорит:

    Я не смотрел крайний релиз АБ — может там ошибка? Попробуйте на чистом асме написать.

  29. Аноним говорит:

    Подскажите пожалуйста: в attiny10 имеется 4-х канальное АЦП, а в Algorithm Builder-е почему-то компаратор. Что делать, менять среду программирования или можно самому составить план регистров АЦП?

    В ней нет ацп

  30. Arses говорит:

    to:lesnik
    Можно попробовать обратиться через регистры, видимо Громов немного ошибся.

  31. Arses говорит:

    Еще tiny10 не программируется через SPI, обратите внимание.

  32. Денис говорит:

    вот ещё инфа по АБ

  33. Vitalik_1984 говорит:

    Подскажите пожалуйста: в attiny10 имеется 4-х канальное АЦП, а в Algorithm Builder-е почему-то компаратор. Что делать, менять среду программирования или можно самому составить план регистров АЦП?

    >>В ней нет ацп

  34. Vitalik_1984 говорит:

    HTML тег почему то не добавился 🙁
    В инструкции на мк другое написано
    Там написано есть Adc только на ATtiny 5/10

    https://www.google.com/url?sa=t&source=web&rct=j&ei=i7xMVLv9DYaAzAP_5oCADg&url=http://www.atmel.com/images/atmel-8127-avr-8-bit-microcontroller-attiny4-attiny5-attiny9-attiny10_datasheet-summary.pdf&ved=0CCUQFjAB&usg=AFQjCNEddSjapbTM301oIMZ5yOdvvLkNaw&sig2=DDYG1Ogbe0mYA4ao38ub9g

Добавить комментарий

Ваш e-mail не будет опубликован.