Среда программирования Algorithm Builder. Программа на языке Ассемблер в программной среде Algorithm Builder. Затем работоспособность проектируемого устройства было протестировано в программной среде proteus Программирование на алгоритм билдер

Мы вкратце рассмотрели среду программирования Algorithm Builder. В этом уроке мы создадим простой программатор для микроконтроллеров, а также напишем и проверим в работе первую программу.

Для начала немного теории

После компилирования (перевода на машинный язык), получается файл с расширением.hex. Этот файл называют прошивкой. Далее этот самый файл загружается в память микроконтроллера, при помощи программатора. Процесс загрузки прошивки в память микроконтроллера называют прошивкой (прожигом). Важно не путать эти два понятия!

  • Прошивка (сущ.) - скомпилированная программа
  • Прошивка (глагол) - процесс записи скомпилированной программы в память МК

Как я уже говорил, для загрузки прошивки в микроконтроллер необходим программатор. Самый простой вариант - это программатор на LPT порт.

Принципиальная схема программатора:

Вообще, резисторы можно и не ставить, но тогда риск спалить lpt порт становится еще выше.

О том, как правильно подключить программатор к микроконтроллеру и прошить в него программу я расскажу в конце статьи. А пока что сосредоточимся на создании программы.

Кратко пробежимся по элементам, из которых строится алгоритм

  1. Текст . Представляет из себя текстовую строку, в которую записываются некоторые команды для algorithm builder.
  2. Вершина блока . Алгоритм в Algorithm Builder делится на блоки. Для создания такого блока и служит этот элемент.
  3. Поле . Представляет из себя отцентрированную в блоке строку. Предназначен для записи большинства команд микроконтроллеру. (создается при нажатии клавиши ENTER).
  4. Метка . Просто вертикальная черта. Не несет в себе никакой информации микроконтроллеру,
  5. Условный переход . Просто говоря - условие. Если то, что записано в прямоугольнике правда, идем по стрелке вправо, если ложь - вниз.
  6. Безусловный переход . Просто стрелка, для перехода между элементами алгоритма.
  7. Настройщик управляющих регистров . Элемент, позволяющий удобно настраивать периферию микроконтроллера

Переходим к практике

  • Открываем Algorithm Builder
  • Создаем новый проект (Файл-Новый. Перед созданием нового проекта нужно закрыть старый!)
  • Клик правой кнопкой мыши по рабочей области - опции проекта. В выпадающем списке выбираем контроллер(Atmega88). В поле тактовая частота вводим 1000000 (Это 1 МГц). И жмем применить.

​Теперь все готово для написания программы!

Начнем с классики - мигание светодиодом

Последовательность действии очень проста:

  • Включить светодиод
  • Подождать немного
  • Выключить светодиод
  • Еще немного подождать

​Начнем по-порядку - как включить светодиод? (т.е установить логическую 1 на ножке)

Ответ: Все действия с периферией микроконтроллера (В т.ч с портами ввода/вывода) осуществляются через регистры.

Регистр - набор из 8 бит. Бит - элементарная единица информации, может быть 1 либо 0

1 0 0 1 1 1 0 1

Это - пример регистра. Самый левый бит называется старшим, и имеет номер 7, самый правый - младшим, имеет номер 0. Не 1, а 0, это важно! Каждый бит регистра за что-либо отвечает. Например, за запуск таймера. Так что регистр можно сравнить с набором тумблеров.

Запись значения в бит регистра осуществляется следующим образом:

Большинство ножек микроконтроллера Atmega88 разделены на 3 порта ввода/вывода. Ножка может настраиваться как на выход, так и на вход. Мы будем работать с портом с индексом C

Каждый регистр имеет свое название

Нас интересуют два регистра - PORTC и DDRC.

  • DDRC отвечает за то, будет ли ножка входом или выходом
  • PORTC управляет состоянием ножки, то есть задает 0 на ножке или 1.

Посмотрим на распиновку микроконтроллера:

Нас интересует 6 ножек с 23 по 28. Это и есть порт C. Светодиод будем подключать к выводу 5 порта C (PC5, 28 ножка)

Итак, нужно:

  • Настроить ножку PC5 на выход
  • Установить единицу на ножке PC5.

За то, будет ли ножка порта C входом или выходом отвечает регистр DDRC. Что бы ножка PC5 была входом, нужно записать в бит №5 лог. "0". Что бы ножка PC5 была выходом, нужно записать в бит №5 лог. "1".

"NOP" удаляем, он нам пока не нужен

Выделяем вершину блока, идем в раздел элементы-прерывания, выбираем из списка Reset

Жмем кнопку "S" (настройщик), выбираем Stack Pointer.

О том, зачем это нужно, я расскажу позднее.

Ставим элемент "label", жмем Enter

Вместо "NOP" пишем следующее:

То есть мы конфигурируем ножку 5 порта C (PC5) на выход

Как я уже говорил, регистр PORTC управляет состоянием ножек порта C, то есть задает 0 на ножке или 1. Записывая в бит 5 этого регистра единицу, на ножке 28(PC5) установится 1, записывая в бит 5 этого регистра ноль, на ножке 28(PC5) установится 0.

Мы сконфигурировали ножку порта на выход и вывели туда 1.

Теперь нужно сделать задержку.

Для создания задержек в папку с проектом нужно поместить специальный файл - waitings.alg(расширение.alg указывает, что это дополнительный алгоритм) и подключить его.

Подключается файл следующим образом. В верхней строке прописывается следующий код: +: Waitings.alg. Всё!

Задержка создается следующим образом:

где число в скобках - величина задержки (в миллисекундах)

Теперь можно написать полную программу:

Жмем кнопку (скомпилировать) - algorithm builder создаст файл прошивки в файлах проекта.

Полная схема устройства


Для прошивки достаточно просто соединить одноименные выводы программатора и микроконтроллера

Графический ассемблер

Программное обеспечение является источником жизни системы, основанной на микроконтроллере или микропроцессоре. Разработка его является центральным моментом общего процесса проектирования. Основным инструментом для профессиональной разработки программ является ассемблер, предполагающий детализацию на уровне команд микроконтроллера или микропроцессора. Только он позволяет максимально использовать ресурсы кристалла. Однако работать на ассемблере не слишком удобно. Существенным барьером между программистом и предметом программирования является текстовый редактор с его ограниченными возможностями.

В данной публикации я хотел поговорить о технологии графической разработки программного обеспечения для микроконтроллеров и микропроцессоров. Такая технология освобождает программиста от целого ряда неудобств, свойственных классическому ассемблеру, а также предполагает существенное упрощение работы при сохранении уровня его детализации. Рассмотрение темы я буду вести с использованием в качестве примера среды разработки "Algor ithm Builder", в частности адаптированной под микроконтроллеры фирмы ATMEL с архитектурой AVR.

Вначале немного о мнемонике. Мнемоника представляет собой короткий набор букв латинского алфавита, однозначно определяющий соответствующую ему операцию в ядре микропроцессора. Конечно, разработчики старались вложить в этот набор букв смысл выполняемой операции, чтобы максимально облегчить жизнь программисту. И в ряде случаев им это вполне удалось, например, MOV, CALL, ADD, JMP и так далее. Но таких ситуаций немного. А появившиеся позже команды SBI, XTHL, BRBC, ADIW, XCHD и другие начинают соперничать с китайской письменностью. Разумеется, можно попытаться их запомнить, но и без того проблем достаточно.

Кроме того, те, кто имел дело с разными микропроцессорами, конечно, обратил внимание, что общность мнемоник их ассемблеров составляет не более трети. Среди присутствующих практически во всех ассемблерах, можно перечислить MOV, ADD, SUB, CALL, AND, OR, INC, DEC, PUSH, POP и еще некоторые. Основная же масса представлений эксклюзивна даже для ряда совершенно одинаковых операций. Например, в одном случае операция "исключающее или" записывается как XOR, в других - EOR. В одном случае обозначение операций переходов построено на основе слова JUMP, в другом - на основе BRАNCH. И таких примеров можно привести множество. Но ведь редко кому удается пользоваться только одним ассемблером. В реальной жизни "коней" приходится менять, и с таким нежелательным разнообразием сталкиваешься неизбежно.

С учетом всего этого, в среде "Algor ithm Builder" представление операций микроконтроллера построено иначе - по визуально-функциональному принципу. Запись операции содержит образ выполняемого действия. Например:

вместо "MOV R0,R1" записывается

вместо "LDI R16,63" - "63->R16",

вместо "ST X,R2" - "R2->[X]",

вместо "LSR r7" - "r7>>",

вместо "SBI PortB,3" - "1->PortB.3" и так далее.

В результате, время освоения системы команд сокращается до минимума, а смысл операций становится понятным даже неподготовленному человеку. Кроме того, в среде предусмотрен оперативный вызов через меню таблицы шаблонов всех имеющихся операторов, который позволяет легко найти необходимый.

Одно из основных неудобств ассемблера (и не только его) состоит в том, что в редакторе программа записывается и отображается в виде одной сплошной вертикальной полосы. И логическая структура тех или иных фрагментов может быть построена только в воображении программиста. В особо сложных случаях приходится предварительно прорисовывать необходимую структуру на бумаге. Это дополнительно загружает программиста совершенно ненужной работой.

Главное предназначение графических сред - приведение интерфейса разработки в соответствие с природой человеческого восприятия, освобождение пользователя от лишних рутинных действий для чисто творческого процесса. Элементы этих технологий мы наблюдаем в таких языках программирования, как Visual Basic, C-Builder, Delphi и других. Но там этот процесс ограничивается в основном конструированием содержимого окна. А с полным правом к этой категории можно, пожалуй, отнести такие среды, как PCAD, OrCAD и прочие. Можно, конечно, электрическую схему описать в текстовом редакторе, вводя список соединений, но гораздо удобнее это делать в специализированном графическом редакторе.

Любая программа, написанная на уровне ассемблера, состоит из ряда законченных монотонных (или условно монотонных) цепочек, в которых ее исполнение возможно без ветвлений. Такие фрагменты всегда начинаются с метки (если это не само начало программы), а завершаются либо оператором безусловного перехода, либо оператором возврата из подпрограммы (RET или RETI), то есть оператором, который безо всяких условий осуществляет перевод хода исполнения программы в иной фрагмент. Такие участки программы представляют собой первичные логически завершенные блоки.

Например, приведенная ниже подпрограмма содержит три таких блока:


SubName: LDI XL,96

Label0: LD R16,X

Label1: SBI PortA,0

Label2: SBI PortA,2


Первый блок начинается с оператора "LDI XL,$20" с меткой "SubName", а завершается оператором безусловного перехода "RJMP", два других - начинаются с оператора "SBI" с метками "Label1" и "Label2", соответственно, а заканчиваются оператором "RET".

Визуальное разделение таких блоков на плоскости является одним из принципов графических методов. Другим принципом является возможность графического отображения алгоритма программы. Благодаря этому, обеспечивается возможность ввода программы на плоскости в двух измерениях в виде алгоритма с древовидной структурой, с визуальным отображением направления условных и безусловных переходов. В результате - вся логическая структура как на ладони.

На рис. 1 показано отображение вышеприведенной программы в графической среде "Algorithm Builder".

Рис. 1. Отображение программы в среде "Algorithm Builder"

Поскольку основная масса условных и безусловных переходов вводится и отображается графически, программа освобождается от бесчисленных имен меток, которые в ассемблере являются неизбежным балластом, загромождающим текст программы. Необходимость имен для меток остается только для входов в подпрограммы.

Графическая технология ассемблера в среде "Algorithm Builder" реализуется посредством нескольких базовых объектов, из которых выстраивается конструкция алгоритма. Среди них:


  • "Label" (метка) - отображается в виде вертикального штриха, расположенного на оси блока операторов. Метка может иметь необязательное имя, которое располагается слева или справа от штриха. Метки предназначены для подвода концов векторов переходов;

  • "Vertex" (вершина) используется в качестве начала блока, а по своему отображению и назначению аналогичен метке;

  • "Field" (поле) предназначен для записи операторов алгоритма и представляет собой отцентрированную строку в блоке;

  • "Condition" (условие) предназначен для обозначения операторов условных переходов. Конструктивно наиболее сложный. Графически представляет собой контур, располагающийся посредине блока, внутри которого вписывается текст с условием перехода и возможный вектор перехода в виде ломаной линии, исходящей от одного из краев контура, со стрелкой на конце, которая должна заканчиваться на метке или вершине. Действие интерпретируется как ветвление, если вписанное условие выполняется;

  • "JMP Vector" предназначен для представления безусловного перехода. Графически представляет собой ломаную линию, исходящую из середины блока операторов, аналогичную вектору объекта "Condition".
Редактор среды позволяет свободно вносить на рабочее поле любые необходимые объекты, модифицировать их, вставлять и так далее. Принципы редактирования аналогичны используемым в других графических редакторах.
Для удобства, конец вектора ветвления разрешается останавливать на отрезке другого вектора, если конечно адрес у них общий. Но при большом нежелании рисовать вектор ветвления, либо, если это ветвление слишком длинное, всегда остается возможность адресовать переход классическим способом, на имя метки.

Рис. 2. Основное окно редактора

Рис. 3. Окно программиста

В целом данная среда программирования является самодостаточной системой. Она содержит в себе компилятор алгоритма, симулятор микроконтроллера и внутрисхемный программатор, обеспечивающий загрузку откомпилированного алгоритма в кристалл. Кроме того, обеспечивается режим мониторной отладки, при котором к откомпилированному коду программы добавляется скрытый код, обеспечивающий вывод всего внутреннего состояния реального микроконтроллера в заданных точках останова в соответствующие окна, как при работе в симуляторе. При работе мониторного отладчика и программатора микроконтроллер непосредственно подключается к параллельному порту LPT несколькими цепями.

Рис. 4. Окно настройки таймеров

В числе дополнительных возможностей, не связанных непосредственно с графическими технологиями, можно назвать метки со стандартным именем прерывания. Встретив такую метку, компилятор автоматически вставит в соответствующее вектору прерывания место программы код необходимого безусловного перехода. Имя таких меток можно выбрать через соответствующий пункт меню. Реализован также удобный интерфейс настройки таймеров, который избавляет от необходимости помнить назначение каждого бита управляющего регистра и ряд других сервисных возможностей.

Рис. 5. Работа симулятора

Среда "Algor ithm Builder" предна- значена для работы в операционной системе Windows 95/98.

На рис. 6 приведен более сложный пример фрагмента программы. Слева - в классическом ассемблере, а справа - полная его копия в среде "Algor ithm Builder".

Рис. 6. Ассемблер: классика и графика

Конечно, в рамках одной статьи невозможно достаточно подробно описать все особенности работы в графической среде.

В ближайшее время среда "Algor ithm Builder" будет адаптирована под иные типы микропроцессорных архитектур.

Переход к использованию такой среды труден психологически. В голове многих проскользнет мысль: "может, ассемблер и не располагает этими возможностями, но я к нему очень привык, мне и с ним хорошо". Это чем-то сродни переходу от командной (DOS) к графической оболочке (Windows). Однако, освоение этого инструмента и последующая работа с ним заметно проще классического ассемблера. Во всяком случае, те, кто его уже используют, пути назад не ищат.

Algorithm Builder fo AVR, Начинаем

Качаем и устанавливаем Algorithm Builder fo AVR http://algrom.net/russian.html
Внимательно читаем Manual.pdf

Материалы статьи подготовлены на кафедре «Автоматика, Информатика и Системы Управления» (АИиСУ) Московского Государственного Индустриального Университета (ГОУ МГИУ) .
(С 2011 года МГИУ носит название - ФГБОУ ВПО "МГИУ").
Авторы: Крюков А.И., Шубникова И.С., Тройков С.М.

Кафедра АИиСУ уже более 35 лет готовит профессионалов в области разработки и эксплуатации электронных, микропроцессорных, компьютерных, робототехнических, мехатронных и информационных систем управления для автомобильной и аэрокосмической техники, машиностроения и бизнеса. Научно-исследовательская работа сотрудников кафедры ведется в областях, связанных с разработкой систем поддержки принятия решений на основе технологий искусственного интеллекта, анализа и синтеза процессов управления сложными системами, контроля и интеллектуального выявления сбоев аппаратуры. Важным направлением научной деятельности кафедры является проведение исследований в области автоматических и электронных систем транспортных средств.
Существует большое количество всевозможных приложений для написания управляющих программ для МК фирмы Atmel - это среды разработки и отладки на языках низкого уровня (например, бесплатный пакет AVR Studio для разработки программ на языке AVR Assembler), среды разработки на языках высокого уровня (такие как среда WinAVR для разработки программ на С-подобном языке) и есть даже графическая среда разработки и отладки программного обеспечения под названием "Algorithm Builder".

Algorithm Builder стоит особняком среди всех других сред и именно на нем мы и остановимся. Изюминка этого приложения даже не в том, что оно бесплатно, а в том, что код в нем даже не пишется, а рисуется в виде блок-схем алгоритмов, что значительно сокращает время на разработку приложения. Данная среда обеспечивает полный цикл разработки, начиная от ввода алгоритма, включая отладку, и заканчивая внутрисхемным программированием кристалла. В результате вся логическая структура программы становится полностью наглядной.

Разработка программного обеспечения в среде Algorithm Builder сводится к формированию таких блоков задач, размещению их на плоскости и установлению между ними связей из условных и безусловных переходов.

Дабы не переписывать весь мануал по работе со средой Algorithm Builder советую прочитать его самостоятельно, тем более, что приложение отечественного производства и содержит подробнейшее описание на русском языке на основе примеров по работе с ним. Основываясь на личном опыте, можно с уверенностью сказать, что данного мануала (кстати, далеко не объемного - всего на 20-30 мин. изучения) вполне хватает, чтобы полностью понять и разобраться в данном программном продукте.

Скачать Algorithm Builder можно по адресу http://algrom.net/russian.html . А процесс разработки управляющей программы можно посмотреть по ссылке . Таким образом, представим далее готовую программу в описанной среде разработки с подробнейшими комментариями к ней.

Для начала необходимо выбрать тип кристалла (в нашем случае Atmega8) в меню Опции/Опции проекта и там же задать тактовую частоту 8000000 Гц (8 МГц). Далее выполняем сброс кристалла при запуске (Элементы/Прерывания/Reset). После чего инициализируем стек, выбрав Элементы/Настройщик…/Stack Pointer (SP), откроется окошко с которым нужно будет просто согласиться, нажав "ОК" (рис. 2).

Рис. 2. Настройщик стека

Следующим этапом следует инициализировать приемопередатчик USART (не стоит удивляться появлению буквы «S» в аббревиатуре – это более современный вариант UART, отличающийся от него возможностью передавать/принимать данные не только в асинхронном режиме, но и в синхронном) путем выбора меню Элементы/Настройщик…/USART. В открывшемся окошке (рис. 3) в разделе Receiver ставим галочки напротив Enable (включаем приемник данных) и Complete interrupt enable (разрешаем прерывания по окончании приема данных), далее ставим галочку напротив Double Speed, задаем размер символа Character Size: 8 – bit и выставляем скорость передачи данных Baud Rate = 9615 bps (когда нажмете на выбор скорости передачи данных в меню следует выбирать 9600 bps, 9615 bps получается в связи с пересчетом тактовой частоты на 8 МГц).


Рис. 3. Настройщик USART

Основное тело программы будет состоять из последовательности проверок управляющих кодов (листинг №1). Идея в том, что ПК будет присылать по UART код операции, а МК принимать его и вырабатывать соответствующие управляющие воздействия на привод лопастей вентилятора и сервопривод. Всего таких кодов будет три (сами коды можно придумать абсолютно любые):

  • $31 - включить привод лопастей вентилятора;
  • $20 - выключить привод лопастей вентилятора;
  • $A1 - обращение к сервоприводу.

  • Если с первыми двумя кодами все понятно, то с третьим не все так просто - $A1 - это только команда обращения к сервоприводу, далее необходимо получить еще код угла поворота. Экспериментальным путем было установлено, что он колеблется в приделах от $05AF до $154F. При чем отсылать с ПК и соответственно принимать со стороны МК будем начиная с младшего байта. Так же будем запрещать прерывания по приему данных по USART на время исполнения команды - иначе может получиться "каша" из данных.

    Листинг №1

    На листинге №2 приведен код подпрограммы задержки (Delay). Временная задержка необходима для точной и полной отработки команды и формируется путем зацикливания программы на N циклов (методом проб и ошибок мы подсчитали, что в нашем случае наиболее удачное число циклов 84FF в 16-тиричной системе счисления).

    Листинг №2

    Окончание приема данных по UART вызывает прерывание USART_Receive_Complete (если оно в данный момент не запрещено в основном теле программы), которое в коде можно задать через меню Элементы/Прерывания/ USART_Receive_Complete. В теле обработчика следует сохранить все используемые в нем регистры в стек, а в конце обработчика обратно их восстановить из стека. Так же в этом обработчике можно получить байт статуса (регистр UCSRA) для проверки данных на ошибки и, естественно, сами данные из регистра UDR (листинг №3).

    Листинг №3

    Угол поворота сервопривода зависит от ширины подаваемого на него импульса при сохранении периода постоянным (период 20 мс, а длительность управляющего импульса от 0,8 до 2,2 мс, хотя для разных сервоприводов эти значения могут немного отличаться) для этого нам и понадобится подпрограмма отработки угла поворота сервопривода (листинг №4). Время управляющего импульса и время паузы будем задавать аналогично подпрограмме задержки. Как мы уже писали выше, экспериментальным путем для частоты кристалла 8 МГц мы определили, что время импульса задается кодом в приделах от $05AF до $154F. Таким образом, зная время всего периода – $9E3C (определили так же экспериментально), можно рассчитать время паузы как разницу между длительностью периода и длительностью импульса. Остается только аналогично подпрограмме задержки отработать последовательно время импульса и время паузы, а затем повторить такой сигнал несколько раз (в нашем случае мы повторили сигнал $10 раз, т.е. 16 раз в десятичной системе счисления)

    Листинг №4

    После написания кода (прорисовки алгоритма) управляющей программы необходимо ее откомпилировать и прошить в микроконтроллер. Компиляцию программы можно произвести нажатием Ctrl+F9 либо через меню Программа/Компилировать. В случае успешной компиляции появится информационное окно в котором будет указан объем занятой памяти МК.

    Далее необходимо прошить результат компиляции (файл с расширением *.hex без приписки «EE_» вначале, лежащий в той же папке, что и исходник программы) в контроллер. Это можно сделать с помощью бесплатной утилиты AvrProg, входящей в так же бесплатный пакет AVR Studio. Скачать ее можно с сайта mymcu.ru либо с atmel.com (англоязычный сайт).

    Помимо утилиты для прошивки МК потребуется еще и программатор. Его можно либо купить (простые версии стоят относительно недорого) либо спаять самостоятельно.

    Рис. 4. Схема LPT-программатора
    Самый простой из мне известных – LPT-программатор, но он соответственно потребует наличие порта LPT на компьютере, что на данный момент становится редкостью. Идея программатора проста и состоит в соединении порта LPT с интерфейсом ISP и линией Reset контроллера напрямую (рис. 4).

    Другой вариант программатора для самостоятельной сборки – USB-программатор (схема показана на рис. 5), он конечно сложнее, но в последствии может оказаться значительно более удобным. Тем не менее есть одно «но» – для его сборки все равно потребуется LPT-программатор, правда однократно. Он будет необходим для прошивки управляющего контроллера самого программатора с целью прошивки FUSE-битов. Необходимо, чтобы были запрограммированны (установленны в «0») биты SPIEN, CKOPT и SUT0. Обычно МК, идущие с завода, т.е. новые, имеют уже запрограммированный бит SPIEN. Так же желательно (но не обязательно) запрограммировать (установить в «0») бит BODEN. Остальные биты должны быть незапрограммированны (установленны в «1»). Для этого может потребоваться приложение Codevision AVR V2.03.4. Подробное описание сборки USB-программатора можно прочитать тут.

    Операторы алгоритма делятся на две группы.

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

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

    Операторы алгоритма в основном записываются в объектах “Field”, условные переходы реализуются посредством объекта “Condition”, а безусловный переход – посредством объекта “

    JMP Vector”. Формат записи операторов существенно отличается от классического ассемблера. Он построен по визуально-функциональному принципу и содержит образ выполняемого действия. Запись операторов должна соответствовать шаблону, воспринимаемому компилятором.

    Ниже, в таблице, приведены шаблоны всех возможных элементарных операторов для микроконтроллеров AVR. Следует иметь в виду, что некоторые простые типы микроконтроллеров содержат не весть представленный набор.

    Символ “#” в шаблоне операторов предполагает константу, представленную либо непосредственно, либо в виде алгебраического выражения, “Rd” и “Rr” – рабочие регистры, “Pn” – регистр ввода-вывода.

    Операторы представлены в виде таблицы.

    Операнд Комментарий

    R Рабочий регистр, стандартный или объявленный в секции Working registers: (...)

    # Константа (...)

    SRAM Var Переменная, объявленная в секции SRAM: (...)

    EEPROM Var Переменная, объявленная в секции EEPROM: (...)

    [#] Ячейка SRAM, адресуемая непосредственно

    [X] Ячейка SRAM, адресуемая косвенно, по X

    [--X] Ячейка SRAM, адресуемая косвенно, по X с предекрементом

    Ячейка SRAM, адресуемая косвенно, по X с постинкрементом

    [Y] Ячейка SRAM, адресуемая косвенно, по Y

    [--Y] Ячейка SRAM, адресуемая косвенно, по Y с предекрементом



    Ячейка SRAM, адресуемая косвенно, по Y с постинкрементом

    Ячейка SRAM, адресуемая косвенно, по Y со смещением адреса на # байт

    [Z] Ячейка SRAM, адресуемая косвенно, по Z

    [--Z] Ячейка SRAM, адресуемая косвенно, по Z с предекрементом

    Ячейка SRAM, адресуемая косвенно, по Z с постинкрементом

    Ячейка SRAM, адресуемая косвенно, по Z со смещением адреса на # байт

    P Регистр ввода-вывода (...)

    EE[#] Ячейка EEPROM адресуемая непосредственно

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

    Операнды с косвенной адресацией являются однобайтными. Для многобайтных операций с косвенной адресацией необходимо приведение их формата. Для этого к записи необходимо добавить двоеточие и объявление формата, например:

    #hAB3E->[Y]:Word

    такой макро-оператор будет преобразован в следующую последовательность операторов:

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

    Для операций, которые начинаются с младшего байта невозможно использование операндов с предекременом, например: [--X]:Word+24000

    Для операций, которые начинаются со старшего байта (сдвиги вправо) невозможно использование операндов с постинкрементом, например: :Int24>>

    Кроме того, невозможно создание многобайтного макро-оператора с операндом [X], поскольку для регистра X в системе команд AVR отсутствуют косвенная адресация со смещением (

    ). Используйте или [--X].

    Если создание макро-операции окажется невозможным, то компилятор выдаст сообщение: “

    Such macro-operation can not be created” (“Такая макрооперация не может быть реализована”).

    Макро-операторы записываются исключительно в объектах “Field”. Шаблоны возможных макро-операторов представлены в таблице:

    Шаблон Коментарий

    * -> * Копирование

    * + * Арифметическое сложение

    * - * Арифметическое вычитание

    * & * Побитная операция “И”

    * ! * Побитная операция “ИЛИ”

    * ^ * Побитная операция “Исключающее ИЛИ”

    * Сброс (запись нуля)

    * ++ Инкремент

    * -- Декремент

    - * - Побитная инверсия

    * >> Логический сдвиг вправо

    > * >> Логический сдвиг вправо с переносом

    ± * >> Арифметический сдвиг вправо

    << * Логический сдвиг влево

    << * < Логический сдвиг влево с переносом

    При использовании операндов, принадлежащих к EEPROM, компилятор автоматически загрузит необходимый код, обеспечивающий чтение и запись в нее. При этом следует иметь в виду, что если производится запись в EEPROM, то в код включается ожидание окончания записи. При работе это потребует несколько миллисекунд.

    При компиляции макро-операторы преобразуются в набор элементарных инструкций микроконтроллера. При этом для реализации такого набора, как правило, используются регистры-посредники r16 и r17. Поэтому, при использовании макро-операторов, во избежание недоразумений, эти регистры использовать не рекомендуется и в подпрограммах обработки прерываний целесообразно их содержимое предварительно сохранять в стеке.

    Если в макро-операторе предполагается операция с непосредственной константой, то в этом случае целесообразнее использовать рабочие регистры, объявленные в старшей половине. В противном случае будут использоваться промежуточные инструкции загрузки частей константы в регистр r16. Это может привести к увеличению размера кода, вплоть до удвоения, хотя ошибочной такая запись не будет.

    Следует иметь в виду, что возбуждаемые макро-операциями флаги неадекватны аналогичным операциям на уровне элементарных операций микроконтроллера и их использование для условий переходов будет некорректно.

    Для реализации циклов удобно использовать макро-условие: “R--”. Оно включает в себя декремент однобайтного регистра и ветвление, если результат не равен нулю.

    Объект “Label” – (метка)

    Представляет собой вертикальный штрих, расположенный внутри блока операторов и необязательное имя, располагающееся слева или справа от штриха. Предназначена метка для обозначения мест в алгоритме, куда возможно осуществление условных и безусловных переходов. Для ее введения, необходимо либо выбрать пункт меню “Object\Label”, либо нажать клавиши “Alt+L”, либо нажать кнопку с изображением буквы L на панели инструментов. При необходимости метке может быть назначен конкретный адрес программы, для этого перед именем (если оно есть) необходимо записать константу или алгебраическое выражение, которое определяет этот адрес. Для изменения расположения имени метки на противоположное нажмите клавишу “Tab”.

    Метки обслуживания прерываний.

    Для удобства программирования Algorithm Builder поддерживает специальный вид меток – метки обслуживания прерываний. Для обслуживания прерывания обычным путем необходимо размещение по адресу вектора прерывания кода безусловного перехода на соответствующую подпрограмму. При использовании специального вида меток компилятор проделывает все это автоматически. Для этого вам необходимо дать метке (вершине) стандартное имя прерывания, и пометить ее как макро-образование, нажав клавишу “F2”, при этом имя будет отображаться жирным шрифтом. Тот же результат можно проще получить, выбрав пункт меню “Objects\Interrupt vectors\…”.

    Встретив хотя бы одну такую метку, компилятор заполнит свободное пространство векторов прерывания кодом возврата из подпрограммы обслуживания прерывания (“RETI”), а по соответствующему прерыванию адресу разместит код безусловного перехода на данную метку.

    Объект “Vertex” – (вершина блока)

    По своему отображению и назначению полностью идентичен метке, но, в отличие от нее, задает расположение блока на рабочей плоскости и всегда является его началом. Для того, чтобы создать вершину необходимо либо выбрать пункт меню “Object\Vertex”, либо нажать клавиши “Alt+V”, либо нажать кнопку с изображением буквы V на панели инструментов, либо с помощью мыши, нажав левую кнопку на необходимое место поля в комбинации с клавишами “

    Alt+Ctl+Shift”.

    Объект “Condition” – (условный переход)

    Конструктивно наиболее сложный. Предназначен объект для реализации условных переходов. Представляет собой овальный контур, внутри которого вписывается условие перехода и возможный вектор в виде ломаной линии со стрелкой на конце, возле которой возможно необязательное имя вектора. Для того, чтобы вектор был правильно адресован, его конец должен либо заканчиваться на метке, или вершине, или на отрезке другого вектора, либо иметь имя адресуемой метки.

    Редактирование вектора производится либо при помощи клавиш направления в комбинации с клавишей “Alt”, либо при помощи мыши при нажатой левой кнопке так же в комбинации с клавишей “Alt”. Для перехода от редактирования условия к редактированию имени вектора и, затем, изменения его расположения на противоположное, нажмите клавишу “Tab”. Для того, чтобы ввести новый объект, необходимо либо выбрать пункт меню “Object\Condition”, либо нажать клавиши “Alt+C”, либо нажать кнопку с изображением буквы C на панели инструментов.

    Операторы условного пропуска следующего оператора.

    Здесь возможны три варианта конструкции объекта “Condition”:

    1. Вектор объекта отсутствует, а имя вектора – либо отсутствует, либо содержит зарезервированное слово “Skip”. В нижеследующих примерах выполнение операции:

    “[X]->r2” будет пропущено, если выполнится условие “r1=r2”.

    “[X]->r2”

    2. Записывается инверсное условие, вектор отсутствует, а подлежащая пропуску инструкция вписывается как имя вектора. В этом случае объект будет интерпретирован как: выполнить инструкцию, если условие выполняется. Нижеследующие примеры полностью идентичны.

    “[X]->r2”

    3. Если последующая инструкция является коротким безусловным переходом (RJMP), допускается запись инверсного условия, а вектор этого условия будет интерпретирован как последующий безусловный переход, таким образом, объект будет интерпретироваться как: произвести короткий безусловный переход, если условие выполняется. Далее приводятся три полностью идентичных примера.

    R1=R2 стрелка к той строку куда необходимо перейти

    Отладочная среда AVR STUDIO.

    Отладочная среда разработки приложений для микроконтроллеров семейства AVR содержит:

    • Транслятор ассемблера (Atmel AVR macroassembler)
    • Отладчик (Debugger)
    • Программное обеспечение верхнего уровня для поддержки внутрисхемного программирования.(In-System Programming) ISP)

    Отладочная среда поддерживает выполнение программ как в виде ассемблерного текста так и в виде исходного текста языка С. Отладочная среда AVR поддерживает все типы микроконтроллеров AVR и имеет два режима работы:

    • режим программной симуляции
    • режим управления различными типами внутрисхемных эмуляторов фирмы Atmel (In Circuit Emulators)

    Интерфейс пользователя не изменяется при выборе между режимами отладки.

    Отладочная среда AVR STUDIO позволяет производить отладку приложений с использованием встроенного программного симулятора или внешнего внутрисхемного эмулятора При запуске происходит автоматическое определение наличия эмулятора на одном из последовательных портов компьютера. При обнаружении эмулятора выбирается базовая система отладки При отсутствии эмулятора отладка выполняется на встроенном программном симуляторе AVR.

    Внутрисхемный эмулятор позволяет производить отладку приложения непосредственно на готовом изделии. при работе в режиме реального времени отладка на эмуляторе осуществляется быстрее чем в программном симуляторе. информация о текущем режиме отладки выводится в строке состояния AVR STUDIO

    В AVR STUDIO для отладки программ предусмотрены две команды пошагового режима Step Over и Trace into Разница между ними в том что команда Step Over не работает в подпрограммах.

    Для наблюдения за работой программы предусмотрен режим открытия нескольких окон окна открываются через меню View или кнопок на панели инструментов.

    отладочная среда не поддерживает следующие режимы и узлы МК

    • аналого цифровой преобразователь
    • аналоговый компаратор
    • режим часов реального времени
    • режим пониженного энергопотребления

    Для аппаратной поддержки AVR STUDIO применяются

    • стартовые и специализированные наборы разработчика
    • внутрисхемные программаторы
    • внутрисхемные эмуляторы

    В процессе отладки можно инициализировать внутренне ОЗУ и EEPROM (в трансляционном файле формата.EEP) или сохранять их содержимое в формате.HEX Для этого служит пункт Up/Download Memory в меню File

    Через меню File можно открывать выполненные другими пользователями прошивки Open распечатывать написанные программы Print проверять состояние устройств подключенных к последовательному порту COM Port setting .

    Меню Tool инструменты содержит команды запуска управляющих программы

    меню View содержит средства просмотра:

    • ячеек памяти программ Program Memory
    • памяти данных окно Data
    • EEPROM окно Eeprom
    • регистров портов ввода вывода окно new IO
    • хода исполнения программы окно Memory
    • контроля за изменениями переменных Watch
    • отображения состояния программного счетчика, указателя стека содержимого регистра статуса SREG и индексных регистров X, Y и Z текущего времени исполнения программы тактовой частоты ядра микроконтроллера окно Processor
    • просмотра состояния регистров Registers (Если в процессе выполнения программы в очередном цикле значение, какого либо регистра изменится то этот регистр будет выделен красным цветом. При этом если в следующем цикле значение регистра останется прежним то цветовое выделение будет снято. Аналогичный контроль за изменениями применен в окнах ввода вывода памяти и переменных.)
    • контроля за состоянием периферийных устройств окно I/O window

    Меню Edit правка аналогична стандартному текстового редактора.

    Меню Windows позволяет регулировать размещение открывающихся окон

    Help содержит справочную информацию на английском языке

    project позволяет открывать и создавать новые проекты и сохранять их содержимое

    Меню debug отладчик позволяет осуществлять

    breakpoint регулирует выбор точек останова

    Trace& triggers осуществляет трассировку

    Option позволяет осуществлять симуляцию или эмуляцию программы

    Создание программы

    Открыть AVR studio 3.56

    Открыть меню новый проект в меню проект в появившемся окне create new project ввести имя проекта в строку project name. Это же имя будет автоматически скопировано в окно initial file

    Для определения папки в которой будет находится проект необходимо щелкнуть на кнопке …. Справа от окна location в открывшемся окне select folder в строке current folder необходимо написать имя папки. И щелкнуть на select после чего произойдет возврат в окно create new project

    Затем выберите тип проекта Atmel AVR Assembler à Next à select deug platform and device à debug platform à avr Simulator в окне device тип микроконтроллера если частота будет выше появится сообщение

    Таким образом мы активируем окно ассемблера с проетом

    Символ “. “ директива ассемблера

    «;» коментарии не влияющие на работу программмы

    F2 поиск маркеров команд в программе

    Ctrl +F2 установка маркеров отладчика

    F7 ассемблирование программы с сохранением в формате. hex

    F11 отладка открытие workspace

    Shift +F5 – Reset сброс

    Ctrl +F5 - Break назад остановка отладки

    F9 – установка метки точки останова

    F5 – выполнение программы до точки останова

    Ctrl +F10 переход к выполнению команды помеченной курсором

    Трансляция и проверка правильности написания.

    Project à AssembleàProject Output в этом окне содержатся информация о количестве слов кода и данных о наличии ошибок и другая информация. Для локализации ошибок надо установить курсор мыши на сообщение и два раза щелкнуть левой кнопкой мыши. В результате курсор будет установлен на строку вызвавшую сообщение об ошибке и эта строка будет выделена цветом. Если исходный ассемблерный текст содержал сегмент энергонезависимых данных то при трансляции будет создан файл с разрешением.еер. Этот файл содержит даннные для внутренней ЕЕPROM МК и имеет тот же формат что и выходной файл.

    Результатом трансляции является выходной файл

    Отладка проекта

    Для отладки необходим объектный файл object

    Запуск отладчика выполняется через процедуру

    Build and run на панели управления

    В начале осуществляется трансляция входного ассемблерного файла при которой генерируется и объектный файл а затем объектный файл помещается в отладчик.

    Для старых версий предусмотрен вариант трансляции объектного файла на при этом варианте нельзя редактировать исходный файл программы непосредственно в отладчике

    Для генерации объектного файла необходимо указать формат выходного файла транслятора

    При первом запуске отладчика в окнеOption à Simulator Option выбирается тип микроконтроллера Device и частота процесссорного ядра frequency

    В процессе отладки программа может выполняться

    Полностью debug àavto step

    В пошаговом режиме debug àtrace

    Трассируя блоки функций debug àmulti step

    До точки указанной курсором debug àRun to cursor

    По точкам останова breakpoints à toggle Breakpoint

    Для отладки в пошаговом режиме применяются команды

    Ster Over (не работающая в под программах) и trace into

    Просмотр программы осуществляется в меню View вид, регистров registers, переферийных устройств в окне I /O Windows

    Лекция 15 программаторы Программатор ХХХ prog

    Программатор поддерживает следующие форматы файлов:

    Standard/Extended Intel HEX

    Они предназначены для программирования:

    · микросхем памяти ,

    · внутреннего ППЗУ микроконтроллеров,

    · микросхем программируемой логики (только для ChipProg+, MultiProg).

    Программатор рассчитаны на совместную работу с IBM PC совместимым компьютером. Связь с компьютером осуществляется через стандартный принтерный порт.

    Порядок работы с программатором:

    · Удалить микросхему из колодки программатора (если она была

    установлена).

    · Подключить программатор к сети переменного тока 220В.

    Для MultiProg переключателем на корпусе программатора включить

    питание. Должен загореться зеленый светодиод, индицирующий подачу

    питания на программатор.

    · Подсоединить программатор к стандартному принтерному порту

    компьютера c помощью кабеля связи, входящему в комплект поставки

    программатора.

    · На компьютере запустить программную поддержку xxxProg.

    · В программной поддержке установить требуемый тип микросхемы.

    · Установить микросхему в розетку программатора (микросхемы

    устанавливаются в розетку в соответствии с рисунком на корпусе

    программатора).

    · Выполнить необходимые действия с микросхемой. Если в

    процессе работы с микросхемой на корпусе программатора загорится красный

    светодиод "ALARM", а на экране компьютера появится предупреждающее

    сообщение о срабатывании схемы защиты тока, то это означает, что

    микросхема неисправна.

    · Перед выключением программатора или сменой типа микросхемы

    необходимо удалить микросхему из розетки.

    · Выключить питание программатора.

    · Отсоединить программатор от компьютера.

    Интерфейс связи программатора с компьютером разработан с таким учетом, чтобы не только минимизировать нагрузку на порт компьютера, но и позволить производить коммутацию программатор - компьютер в любой последовательности.

    Программное обеспечение xxxProg в плане взаимодействия с микросхемами построено по классической схеме программаторов "файл" - "буфер" - "микросхема". В программной поддержке программатора реализованы буфера памяти. Буфер памяти является промежуточным звеном между файлом и микросхемой:

    Файл <----> Буфер <----> Микросхема

    Одним из основных элементов программатора являются буфера памяти. Буфер памяти - это объект, предназначенный для хранения данных. Буфер памяти программатора является промежуточным звеном между файлом и микросхемой.

    В xxxProg реализована гибкая структура буферов памяти:

    · допускается создания бесконечного количества активных буферов.

    Ограничением на количество может служить только отсутствие свободной

    памяти в системе.

    · каждый буфер в своем составе имеет определенное количество

    подслоев. Каждый подслой ассоциируется с конкретным адресным пространством

    установленной микросхемы.

    Например,

    - для микросхемы Intel 87C51FA каждый буфер имеет в своем составе

    два подслоя: подслой кодовой памяти и подслой таблицы кодирования

    (encryption table);

    - для микросхемы Microchip PIC16F84 каждый буфер имеет в своем

    составе три подслоя: подслой кодовой памяти, подслой памяти данных

    EEPROM, подслой пользовательских идентификаторов.

    · допускается иметь неограниченное количество окон просмотра

    содержимого каждого буфера.

    Такая гибкая реализация системы буферов позволяет пользователю очень легко манипулировать с несколькими разными массивами данных, поместив их в разные буфера. Все операции с файлом (загрузка/сохранение файла) взаимодействуют только с буфером. Т.е. можно загрузить файл в буфер, а также сохранить содержимое буфера в файл. Аналогичным образом построено взаимодействие с микросхемой. Все манипуляции с микросхемой (как, например, чтение, запись, сравнение) используют только буфер. Таким образом, можно прочитать микросхему в буфер, записать содержимое буфера в микросхему, сравнить содержимое буфера и микросхемы и т.п. Взаимодействие файла и микросхемы напрямую не допускается.

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

    Система тестов разделена на две группы:

    · тестирования качества связи с аппаратурой программатора,включает в себя только тестирование качества связи с аппаратурой программатора.

    · полное тестирование всей аппаратуры программатора.включает в себя полное тестирование всей аппаратуры программатора. Она запускается сразу по окончании работы первой группы тестов. При выполнении полного тестирования на тестовой DIP колодке программатора появляются различные тестовые сигналы, способные вывести из строя установленные в нее микросхемы. Поэтому, перед активизацией теста, пользователь будет предупрежден о необходимости удаления микросхемы из колодки.

    При выявлении тестовой системой дефекта оборудования, пользователь будет предупрежден о случившемся, и дальнейшая работа с программатором окажется невозможной.

    Если две предыдущие программы я рекомендовал как оптимальный вариант для начала работы с электроникой вообще и микроконтроллерами в частности, то эта программа лишь мое личное предпочтение и честно говоря, для повторения конструкций с этого ресурса она Вам не понадобится. Но не упомянуть приятную во всех отношениях программу я не могу.

    Итак что имеет Algorithm Builder в своем арсенале?
    Полный цикл разработки. Algorithm Builder предназначен для производства полного цикла разработки начиная от ввода алгоритма, включая процесс отладки и заканчивая программированием кристалла.

    Algorithm Builder довольно нетрадиционная программа в плане языка программирования. Автор немного лукавит, называя программу Построителем Алгоритмов. На самом деле, алгоритма, в привычном понимании этого слова, нет. Есть ассемблер, завернутый в красивую обертку визуального программирования. Правильнее было бы назвать программу – визуальный ассемблер или построитель ассемблера. А раз это ассемблер то Вы получите на выходе максимально эффективный код.


    Работа с переменными
    и константами организована гениально просто. Инициализация производиться в отдельном окне в виде таблицы – освобождая алгоритм от лишних записей. В буквальном смысле слова все разложено по полочкам. Удобно иметь в любой момент под рукой перечень всех переменных и констант.

    Настройщик периферии. Algorithm Builder имеет удобный настройщик периферии (таймеры, UART, ADC, SPI и т.д.) позволяющий, не читая даташитов, просто выбрать необходимые параметры работы устройства в окне настройки. В этом же окне Билдер честно покажет набор инструкций, обеспечивающих эти параметры.


    Переходы
    осуществляются в программе очень наглядно – вектором. Если нужно перейти по условию в какую либо точку программы – просто проведите вектор в эту точку. Это освобождает программу от бесчисленных имен меток, которые в классическом ассемблере являются неизбежным балластом. Переходы по именованным меткам так же возможны.

    Внутрисхемное программирование кристалла. При использовании внутрисхемного программатора микроконтроллер подключается к COM порту компьютера через несложный адаптер (три диода и несколько резисторов).Также есть вариант USB подключения. Программатор ведет подсчет числа перепрограммирований кристалла, сохраняя счетчик непосредственно в кристалле. Процесс программирования кристалла очень прост — в два «тыка».

    Мониторная отладка на кристалле. Algorithm Builder обеспечивает мониторную отладку на кристалле (On Chip debug) которая позволяет наблюдать содержимое реального кристалла в заданной точке останова. При этом для связи микроконтроллера с компьютером используется только один вывод, причем по выбору пользователя. Мониторная отладка может быть применена к любому типу кристалла, имеющего SRAM. Это софтверный вариант debugWIRE. Я без этой штуки просто не представляю себе отладку программ.

    Так почему такая хорошая программа так малоизвестна?
    Первая причина — программа до 2010 года была платной. Бесплатная демоверсия имела полную функциональность, но ограничивала код откомпилированной программы до 2 килобайт. В 2010 году автор программы сделал новогодний подарок – версия 5.43 вышла свободной от ограничений.
    Вторая причина — отсутствие поддержки программы. Вы не найдете ни одного апнота производителя в котором бы использовался Билдер. Интернет ресурсы, посвященные данной программе, можно пересчитать по пальцам.
    Жаль, конечно – программа действительно интересна.

    Выводы:
    Ассемблерщики при переходе на Algorithm Builder будут писать кипятком, так как они будут иметь все тот же ассемблер, но управляться им станет на порядок легче и наглядней. Одно плохо – придется распрощаться с наработанными библиотеками и писать новые.
    Сишникам однозначно Билдер не понравится, так как придется опускаться до уровня ассемблера, а какому сишнику понравится возюкаться с регистрами.
    Наверное, наилучшая целевая аудитория — начинающие осваивать микроконтроллеры. Программа проста и поэтому будет легко осваивать программирование.
    В общем, конечно, выводы получились неоднозначные. Думайте сами… 🙂

    Программа имеет мануал, написанный в форме обучающей статьи. В мануале рассмотрено создание простого проекта – вольтметра, даны схемы программаторов COM и USB. Скачать версию без ограничений можно здесь

    Среда визуального программирования


    Кому интересно посмотреть мануал, а устанавливать программу лениво – вот выкладываю его отдельно


    Программа активно развивается, поэтому смотрите свежие версии на сайте программы www.algrom.net . Кроме того, там же есть небольшая подборка библиотек.

    P.S. Программа портативная. Тесть после установки папку с программой скидываем на флешку и работаем с нее.

    (Visited 17 675 times, 18 visits today)

    Понравилась статья? Поделитесь ей
    Наверх