Войти
Все секреты компьютера для новичка и профессионала
  • Не запускается Total War: Rome II?
  • Китайские ПТ-САУ в игре World of Tanks Когда выйдут китайские пт сау
  • Читерские моды ворлд оф танкс
  • Модифицированный артиллерийский прицел на миникарте для World of tanks
  • Съемка с внешней вспышкой основные правила Выносная вспышка
  • Как фотографировать зеркалкой
  • Программа на языке Ассемблер в программной среде Algorithm Builder. Затем работоспособность проектируемого устройства было протестировано в программной среде proteus. Algorithm Builder fo avr, Начинаем Графический ассемблер Программирование таймеров avr н

    Программа на языке Ассемблер в программной среде Algorithm Builder. Затем работоспособность проектируемого устройства было протестировано в программной среде proteus. Algorithm Builder fo avr, Начинаем Графический ассемблер Программирование таймеров avr н

    Думаю, в наше время нет радиолюбителя, который никогда не сталкивался с микроконтроллерами. Рано или поздно, но это происходит. Когда я в первый раз увидел схему с микроконтроллером, тут же закрыл страницу браузера, с мыслью: "А, все равно не соберу". Но время шло, схем с применением микроконтроллеров становилось все больше, и я все-таки решил начать. На деле все оказалось совсем не таким сложным, как я думал.

    Для начала давайте разберемся: что вообще такое микроконтроллер (МК)? По сути, это миниатюрный компьютер, предназначенный для выполнения простейших задач. Все необходимое для работы микроконтроллера заключено в одном корпусе. В микроконтроллере имеется различная периферия - порты ввода\вывода, таймеры, интерфейсы связи и т.д. Микроконтроллер имеет три вида памяти, это RAM (оперативная память), FlashROM (Память программы), EEPROM (энергонезависимая память).

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

    Algorithm Builder - среда программирования

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

    Начнем с краткого обзора интерфейса программы

    Главное меню

    • Файл. Служит для открытия, сохранения, закрытия проектов и отдельных алгоритмов, а так же выхода из программы.
    • Редактировать. Действия, связанные с редактированием алгоритма: вырезать, копировать, выделить и т.д
    • Отображение. Переключение алгоритм/таблица с переменными(о ней ниже) + шаблоны операций и условий.
    • Поиск. Тут пояснять не нужно.
    • Элементы. Алгоритм рисуется из специальных элементов: Текст, Вершина, Поле, Метка, Условие, Вектор б/у (безусловного) перехода, Настройщик. Со всеми ними мы познакомимся в процессе обучения. В меню находится еще несколько важных пунктов: Деактивировать, Макро, Прерывания. Деактивировать - данный компонент не будет компилироваться. Макро - для создания макросов. Прерывания - содержит список названии всех прерываний микроконтроллера. Об этой функции вы узнаете в следующих уроках, сейчас лишь скажу, что это чрезвычайно важная и необходимая для работы вещь.
    • Программа. Действия, связанные с программой - компиляция (перевод на машинный язык), симуляция работы программы, чтение памяти контроллера (Flash и EEPROM) и т.д.
    • Опции. Настройки проекта и среды.
    • ?. Информация о Algoritm Builder и справка.

    Панель инструментов

    В пояснениях не нуждается. При наведении курсора на элементы панели всплывают подсказки.

    Открытый проект

    Тут есть особенность. Нельзя открыть два проекта одновременно.Чтобы открыть/создать новый проект нужно закрыть старый. После открытия проекта вы можете открыть/создать лишь отдельный файл-алгоритм. Файл проекта имеет расширение.alp, а отдельный файл-алгоритм имеет расширение.alg

    Работа с переменными и константами

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

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

    Симуляция работы программы

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

    Отладка

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

    Так почему же Algorithm Builder малоизвестен среди радиолюбителей? Во-первых, до 2010 программа была платной. Сегодня ПО распространяется абсолютно свободно. Во-вторых, отсутствие официальной поддержки программы. Вы не найдете ни одного апнота производителя в котором бы использовался Билдер. Интернет ресурсы, посвященные данной программе, можно пересчитать по пальцам.

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

    Первое что понадобится - это паяльник . Основной инструмент радиолюбителя. Мощность паяльника должна быть в приделах 30-60 Вт. Почему нельзя больше? Мощный паяльник нагревается сильней, и повреждает дорожки платы и применяемые детали. Да и паять им не так удобно - такой паяльник намного больше и тяжелее.

    Для того, чтобы загрузить программу в микроконтроллер нужен программатор - в простейшем варианте состоит всего из нескольких резисторов и диодов (на порт LPT и COM). Если у Вас на компьютере нет порта COM либо LPT, USB программатор можно заказать на , DealExtreame или (Поисковой запрос"avr programmer"; стоит примерно 4-6$). О выборе и сборке программатора я напишу в следующем уроке.

    Отличительные особенности:

    • Поддерживаемые операционные системы: Windows 95/98/2000/NT/ME/XP
    • Лицензия: Freeware
    • Язык интерфейса: английский, русский
    • Языки программирования: графический ассемблер
    • Основные функции:
      • графический редактор код программы
      • компилятор
      • симулятор для отладки введенного алгоритма
      • программирование через COM-порт с использованием простейшего адаптера (7 резисторов, 3 диода; схема приведена в документации)
      • отладка алгоритма на кристалле с использованием еще более простого адаптера (1 или 2 диода, 2 или 4 резистора; схема приведена в документации)
    • Адрес поддержки в Интернет: http://algrom.net/russian.html

    Описание:

    Algorithm Builder - бесплатная среда (условия распространения Freeware) для МК AVR, которая обеспечивает полный цикл разработки микропрограммного обеспечения, в т.ч. такие этапы как ввод алгоритма, отладка и внутрисхемное программирование. Разработку программы можно вести как на уровне ассемблера, так и на макро-уровне, при котором возможна работа со знакопеременными величинами произвольной длины. Это приближает возможности программирования к языку высокого уровня.

    Отличительной чертой Algorithm Builder является возможность ввода программы графическим способом, в виде алгоритм с древовидной структурой. В результате вся логическая структура программы становится полностью наглядной. Такой способ программирования максимально близок к природе человеческого восприятия и, поэтому, он намного проще в освоении, если сравнивать с классическим ассемблером. Ожидаемое время сокращения времени создания микропрограммного обеспечения по сравнению с классическим ассемблером составляет 3-5 раз.

    Среда предназначена для работы под ОС Windows 95/98/2000/NT/ME/XP. Для нормальной работы редактора требуется наличие шрифта "Courier".

    Файлы для скачивания:

    • Серия AT90
      • AT90CAN128, AT90PWM3, AT90S1200, AT90S2313, AT90S2323, AT90S2333, AT90S2343, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90USB64, AT90USB82, AT90USB128, AT90USB162
    • Серия ATmega
      • ATmega8, ATmega16, ATmega32, ATmega48, ATmega64, ATmega88, ATmega103, ATmega128, ATmega161, ATmega162, ATmega163, ATmega164P, ATmega165, ATmega168, ATmega323, ATmega324P, ATmega325, ATmega328P, ATmega603, ATmega640, ATmega644, ATmega644P, ATmega645, ATmega1280, ATmega1281, ATmega1284P, ATmega2560, ATmega2561, ATmega3250, ATmega6450, ATmega8515, ATmega8535
    • ATtiny
      • ATtiny10, ATtiny11, ATtiny12, ATtiny13, ATtiny15, ATtiny22, ATtiny24, ATtiny25, ATtiny26, ATtiny28, ATtiny44, ATtiny45, ATtiny84, ATtiny85, ATtiny261, ATtiny461, ATtiny861, ATtiny2313

    4.Технические требования.

    Данное микроэлектронное реле обладает определенными техническими данными.

    Данное микроэлектронное реле имеет один нормально замкнутый (тыловой) и один нормально разомкнутый (фронтовой) контакт для переключения двух нагрузок пульсирующего тока.

    При подаче внешнего переменного напряжения частотой 25, 50 и 75 Гц обеспечивается работа в диапазоне от 0,8В до 10В.

    Напряжение срабатывании на переменном токе частотой 25, 50 и 75 Гц составляет (2,9- 3,2)В, а напряжение отпадания (2,1-2,3)В.

    Примечание: Срабатывание - размыкание тылового контакта и замыкание фронтового контакта. Отпадание – размыкание фронтового контакта и замыкание тылового контакта.

    Для вывода информации о входном напряжении использован индикатор с общим анодом.

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

    Частота обновления информации на индикаторе происходит через 12,8 мс.

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

    5.Функциональная схема электронного реле.

    Импульсное микроэлектронное реле можно разделить на несколько функциональных узлов. Функциональная схема данного реле представлена на рисунке 5. По функциональному назначению в схеме можно выделить:


    • Выпрямитель построенный по схеме с общей точкой.

    • Микропроцессор (МП).

    • Индикатор предназначен для вывода информации.

    • Оптронная пара.
    Выпрямитель предназначен для выпрямления поступающего на его вход аналогового сигнала. В свою очередь Аналоговый сигнал поступает с защитного блок фильтра или другого аналогового элемента и представляет из себя переменное напряжение с частотой 25, 50 или 75Гц. С выхода выпрямителя получаем выпрямленное напряжение которое поступает на микропроцессор.

    Микропроцессор выполняет заложенные в программе функции. Попадая на вход микропроцессора с выхода выпрямителя выпрямленное напряжение начинает анализироваться при помощи встроенного в микропроцессор АЦП. Затем микропроцессор высчитывает среднее значение измеренного напряжения и выводит его на индикатор. Так же на один из выходов подключаются оптронные пары. Они представляют из себя аналог

    Рис.5.Функциональная схема микроэлектронного реле автоблокировки

    Контактов реле. В зависимости от порога срабатывания сигнал появляется на одной из оптронной пары.

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

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

    6.Алгоритм работы.

    Для создания микроэлектронного реле необходимо определить основную задачу. Для начала необходимо произвести настройку микропроцессора, настроить все порты ввода – вывода, установить таймер и АЦП. После этого начинает выполнятся основная задача которая заключается в сборе информации при помощи АЦП, после этого производим анализ полученных данных и выводим их на индикацию. Индикация в свою очередь должна показывать десятичное значении входного напряжения. Более подробный алгоритм работы представлен на рисунке 6.

    Алгоритм работы программы состоит из пяти подпрограмм:


    • Настройка микропроцессора

    • Подпрограмма АЦП

    • Подпрограмма таймера

    • Подпрограмма индикации

    • Подпрограмма деления
    Рассмотрим работу настройки микропроцессора. Для начала устанавливаем начального значения стека. После этого производим настройку АЦП. Тут мы устанавливаем предделитель СК/128 и устанавливаем режим непрерывного преобразования, когда запуск преобразований выполняется непрерывно через определенные интервалы времени. Затем производим настройку таймера. Устанавливаем режим работы СТС (сброс при совпадении). В этом режиме после достижения значения, записаного в регистре сравнения,счет продолжается со значения «$00». В этом же такте когда обнуляются значения происходит прерывание по таймеру. Потом настраиваем прерывание которое срабатывает от переполнения. После этого производится настройка портов ввода – вывода. Далее устанавливаем все значения флагов, знакоместо индикации, значение суммы, делителя и частного нулевое значение. И разрешаем глобальное прерывание, для чего устанавливает единицу в флаг i. После настройки нашего микропроцессора начинается наша программа. Для этого устанавливаем условие t=1. Пока значение t неравно единицы происходит цикл, как только он становится в значение единицу программа переходит в право где идет на подпрограмму индикации и после ее выполнении устанавливает флаг t в ноль и опять замыкается опять в цикл. Все последующие подпрограммы будут выходить по прерыванию и возвращаться в этот цикл проверки флага t.

    Теперь рассмотрим подпрограмму АЦП. Так как мы выше произвели настройку АЦП и сказали, что переход на подпрограмму АЦП производится по прерыванию через определенное значение тактовых импульсов. Так как у нас после настройки микропроцессора программа крутилась в цикле где проверялось значение флага t совместно с этим производился отсчет значений тактов генератора микропроцессора. После достижения определенного значения тактовых импульсов происходит прерывание и программа переходит на подпрограмму АЦП. Как только мы перешли на нее у нас произошло измерение значения входного напряжения. Для запоминания этого значения мы используем два регистра Yl (младший) для запоминания младших байтов и Yh (старший) для запоминания старших байтов. После этого пять проверяем значение флага t, если оно равно нулю то необходимо вывести значение на индикацию, а если флаг t находится в единице то это значит что модно производить перевод значения АЦП в десятичную форму. После этого производим сравнение порога значения измеренного напряжения, если это значение выше порога в 0,8В то мы записываем это значение в регистр и складываем его с последующими измерениями. При каждом сложении значений АЦП увеличиваем значение делителя на единицу. После проверяем значение делителя и если его значение равно 255 то необходимо обнулить значение делителя суммы, но если делитель не достиг значения 255 то происходит выход из подпрограммы АЦП.

    Но если у нас после сравнения значения АЦП ниже порога 0,8В то программа переходит в право и после чего выключаем АЦП. Это необходимо для того что бы значение напряжения успело вывестись на индикатор. Потом производим анализ значение делителя и если он не равен нулю то производим сложение значений АЦП и увеличение делителя на единицу. Потом переходим на подпрограмму деления. Это необходимо для вычисления среднего значения напряжения. Но если значение делителя равен нулю то программа переходит сразу после подпрограммы деления. После этого сравниваем значение порога срабатывания АЦП и если он выше порога то выводим в порт ввода – вывода значение единицы, что соответствует срабатыванию и замыканию фронтового контакта, а если значение меньше порога срабатывания то в порт выводится значение нуля что соответствует замыканию тылового контакта. Потом устанавливаем значение делителя и флаг t в ноль. Так же обнуляем значение АЦП и включаем его и выходим из подпрограммы АЦП.

    Далее рассмотрим подпрограмму деления переход в которую находится в подпрограмме АЦП. Подпрограмма деления необходима для вычисления среднего значения измеренного напряжения. Программа деления представляет из себя последовательное вычитание значение делителя из суммы всех значений АЦП. Столько раз сколько произошло это вычитание и будет значением среднего значения, то есть частным. Рассмотрим сам алгоритм этой операции. После перехода в подпрограмму обнуляем значение частного, потом проверяем флаг С. Если его значение неравно единице то мы увеличиваем значение частного на единицу и вычитаем значение делителя из суммы всех значений АЦП. В флаг С записывается значение 1 только после того как значение суммы станет меньше значения делителя. Как только в флаг С записалась единица программа выходит из цикла. Значение полученного частного заносим в регистр Х и обнуляем значение суммы. На этом заканчивается программа деления и происходит выход из нее.

    Также как подпрограмма АЦП переход на подпрограмму таймера происходит через определенное значение тактовых импульсов. Естественно переход на подпрограмму таймера по прерыванию производится в разное время с прерыванием на подпрограмму АЦП. Соответственно они не мешают друг другу. В подпрограмме таймера у нас происходит постепенный вывод информации на индикаторе. Так как у нас имеется четыре разряда, то нам необходимо выводить значения цифр последовательно друг за другом. Для этого имеется n в которое записываем значение от 0 до 3, что соответствует каждому разряду. После перехода по прерыванию начинается программа. Сначала проверяем значение n и если это значение равно нулю то происходит переход дальше, где подаем ноль для выключения четвертого знакоместа. В порт В выводим число. После этого подаем единицу для зажжения первого знакоместа. В результате этого первая цифра зажигается на индикаторе. Потом происходит переход по метке. Далее увеличиваем значение n на единицу и выходим из подпрограммы. Через определенное время происходит очередное прерывание по таймеру и программа переходит в подпрограмму таймера, где опять производим сравнение значения n.Так как мы его увеличили на единицу то соответственно происходит переход при n равное единице. Далее происходит выключение первого знакоместа, вывод в порт В значение цифры второго числа и зажигаем второе знакоместо. Потом опять происходит переход по метке и увеличивается значение n на единицу. Значение третей и четвертой цифры выводится аналогично, но при выводе четвертой цифры устанавливаем значение n в ноль, это для того чтобы в последующем опять начался вывод первой цифры. Также здесь записываем в флаг t значение единицы. После вывода четвертой цифры на индикаторе программа выходит и попадает в цикл проверки значения флага t.

    Так как флаг t установлен в единицу то происходит переход из цикла проверки флага, после этого происходит переход на подпрограмму индикации. В этой подпрограмме определяем значение тысяч, сотен, десятков и единиц, а также определяем значение полученной цифры для вывода ее в порт В. После перехода в подпрограмму индикации устанавливаем запрет на глобальное прерывание. Потом обнуляем значение регистра temp. Затем производим сравнение среднего значения АЦП которое находится в регистре Z. Если оно больше тысячи то производим вычитание 1000 из регистра Z. После вычитания в регистр temp заносим единицу. Единица заносится каждый раз когда из Z вычитается 1000. Содержимое регистра temp соответствует значению тысяч. Как только регистр Z станет меньше 1000 программа переходит дальше. После перехода значение регистра temp переписываем в регистр r0 и обнуляем его. Затем опять сравниваем значение регистра Z и если он больше 100 то опять вычитаем из него 100. При каждом вычитании заносим в регистр temp единицу. Как только значение регистра Z станет меньше 100 программа переходит дальше. После этого переписываем значение сотен в регистр r1. Потом обнуляем значение регистра temp. Потом сравниваем значение регистра Z и если оно больше 10 то вычитаем из регистра Z 10. При каждом вычитании заносим единицу в регистр temp. Как только значение регистра Z станет меньше 10 программа переходит дальше. Далее запоминаем значение десятков в регистре r2. Оставшееся значение в регистре Z является значением определяющее значение единиц. Это значение записываем в регистр r3. Теперь значения тысяч, сотен, десятков и единиц находятся соответственно в регистрах r0, r1, r2, и r3. После этого в регистр Z заносим адрес таблицы кодов в которой находится значение цифр для вывода на индикацию. Если значение тысяч при измерении равно нулю то необходимо погасить значение нуля в старшем разряде. После этого заносим значение первой цифры в регистр r0, потом заносится значение второй цифры в r1, потом значение третьей цифры в r2 и значение последней цифры в регистр r3. После этого разрешаем глобальное прерывание. На этом программа заканчивается и происходит выход из подпрограммы индикации. После этого устанавливаем флаг t в 0 и все начинает повторяться. На этом алгоритм работы программы для микропроцессора заканчивается.

    7.Программное обеспечение.

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


    • Высококачественный низкопотребляющий 8- битный AVR микроконтроллер

    • Передовая RISC архитектура
    - 130 команд, большинство которых выполняется за один тактовый цикл

    32 8 битных рабочих регистра общего применения

    Полностью статическая архитектура

    Производительность до 16 MIPS при тактовой частоте 16 МГц

    Встроенный двухцикловый умножитель


    • Энергонезависимая память программ и данных
    - 4КБ внутрисистемно программируемой Flash памяти программы, способной выдержать 10 000 циклов записи/стирания

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


    • внутрисистемное программирование встроенной программой-загрузчиком

    • реальная функция считывания при программировании
    - 256 байта EEPROM, способной выдержать 100 000 циклов записи/стирания

    512 байта встроенной SRAM памяти (статическое ОЗУ)

    Программируемая защита от считывания


    • Характеристики периферии
    - Два 8- разрядных таймера/счетчика с отдельным предделителем и режимом сравнения

    Один 16- разрядный таймер/счетчик с отдельным предделителем и режимом сравнения и режимом захвата

    Счетчик реального времени с отдельным генератором

    Пять ШИМ каналов

    6 10- битных каналов

    2 8- битных канала

    6 канальный АЦП у приборов в PDIP корпусе

    4 10- битных каналов

    2 8- битных канала

    Программируемый последовательный USART

    Ведущий/ведомый SPI интерфейс

    Байт- ориентированный последовательный 2- проводный интерфейс

    Программируемый сторожевой таймер со встроенным генератором

    Встроенный аналоговый компаратор

    Прерывание и пробуждение при изменении состояния выводов


    • Специальные характеристики микроконтроллера
    - Сброс при включении питания и детектор кратковременных пропаданий питания

    Встроенный откалиброванный генератор - Внешние и внутренние источники прерывания

    Пять режимов пониженного потребления: Idle, ADC Noise Reduction, Power-Save, Power-down и Standby


    • Порты ввода - вывода и корпусное исполнение
    - 23 программируемых линии портов ввода-вывода

    32 выводные TQFP и MFL корпуса


    • Диапазон напряжения питания
    - от 1.8 до 5.5 В у ATMega48V

    От 2.7 до 5.5 В у ATMega48L

    От 4.5 до 5.5 В у ATMega48


    • Различный диапазон рабочих тактовых частот
    - от 0 до 1 МГц у ATMega48V

    От 0 до 8 МГц у ATMega48L

    От 0 до 16 МГц у ATMega48


    • Сверх низкое потребление
    - Активный режим:

    300 мкА при частоте 1 МГц и напряжении питания 1.8 В

    20 мкА при частоте 32 кГц и напряжении питания 1.8 В

    Режим пониженного потребления

    0.5 мкА при напряжении питания 1.8 В

    ATMega48 - низкопотребляющие 8 битные КМОП микроконтроллер с AVR RISC архитектурой. Выполняя команды за один цикл, ATMega48 достигают производительности 1 MIPS при частоте задающего генератора 1 МГц, что позволяет разработчику оптимизировать отношение потребления к производительности.

    AVR ядро объединяет богатую систему команд и 32 рабочих регистра общего назначения. Все 32 регистра непосредственно связаны с арифметико-логическим устройством (АЛУ), что позволяет получить доступ к двум независимым регистрам при выполнении одной команды. В результате эта архитектура позволяет обеспечить в десятки раз большую производительность, чем стандартная CISC архитектура.

    ATMega48 имеют следующие характеристики: 4КБ внутрисистемно программируемой Flash память программы, 256 байтную EEPROM память данных, 512 байтное SRAM (статическое ОЗУ), 23 линии ввода - вывода общего применения, 32 рабочих регистра общего назначения, три гибких таймера/счетчика со схемой сравнения, внутренние и внешние источники прерывания, последовательный программируемый USART, байт- ориентированный последовательный 2- проводный интерфейс, 6 канальный АЦП, 4 канала которых имеют 10- битное разрешение, а 2- 8- битное, программируемый сторожевой таймер со встроенным генератором, SPI порт и пять программно инициализируемых режима пониженного потребления. В режиме Idle останавливается ядро, а SRAM, таймеры/счетчики, SPI порт и система прерываний продолжают функционировать. В Power-down режиме содержимое регистров сохраняется, но останавливается задающий генератор и отключаются все внутренние функции микропроцессора до тех пор, пока не произойдет прерывание или аппаратный сброс. В режиме Power-save асинхронные таймеры продолжают функционировать, позволяя отсчитывать временные интервалы в то время, когда микропроцессор находится в режиме сна. В режиме ADC Noise Reduction останавливается вычислительное ядро и все модули ввода-вывода, за исключением асинхронного таймера и самого АЦП, что позволяет минимизировать шумы в течение выполнения аналого-цифрового преобразования. В Standby режиме задающий генератор работает, в то время как остальная часть прибора бездействует. Это позволяет быстро сохранить возможность быстрого запуска приборов при одновременном снижении потребления.

    Прибор изготовлен по высокоплотной энергонезависимой технологии изготовления памяти компании Atmel. Встроенная ISP Flash позволяет перепрограммировать память программы в системе через последовательный SPI интерфейс программой-загрузчиком, выполняемой в AVR ядре, или обычным программатором энергонезависимой памяти. Программа-загрузчик способна загрузить данные по любому интерфейсу, имеющегося у микроконтроллера. Программа в загрузочном секторе продолжает выполняться даже при загрузке области памяти прикладной программы, обеспечивая реальный режим "считывания при записи". Объединив 8- битное RISK ядро и самопрограммирующейся внутри системы Flash памятью корпорация Atmel сделала приборы ATMega48 мощными микроконтроллерами, обеспечивающими большую гибкость и ценовую эффективность широкому кругу управляющих устройств.

    ATMega48 поддерживается различными программными средствами и интегрированными средствами разработки, такими как компиляторы C, макроассемблеры, программные отладчики/симуляторы, внутрисхемные эмуляторы и ознакомительные наборы.

    7.1.Расположение выводов ATMega48:

    Рис.7.1. Расположение конрактов микропроцессора ATmega48

    На рисунке 7.1. приведено назначение выводов микропроцессора, но мы будем использовать только часть из них. Так весь порт В настраиваем на вывод и к нему подключаем индикацию для вывода значения цифр. Порт D0-D3 так же настроен на вывод и к нему подключаем индикатор для зажжения четырех знакомест индикатора. Выводы порта D4-D5 настроены на вывод и к нему подключены светодиоды для отображения замыкания фронтового и размыкания тылового контактов и наоборот для размыкания фронтового и замыкания тылового контактов. Вывод порта С0 использована для АЦП. К выводу AREF подключен источник внешнего опорного напряжения, а к выводу AVCC подключен фильтрующий конденсатор для повышения помехозащищенности.

    После того как определились с выбором микропроцессора и составлением алгоритма работы необходимо написать программу для него по данному алгоритму.

    Для написания программы я буду использовать программное обеспечение под названием Algorithm Builder. Но перед написанием программы рассмотрим это программное обеспечение.

    7.2.Среда разработки Algorithm Builder

    ПО "Algorithm Builder",была написанна русским программистом Геннадием Громовым. Данная среда обеспечивает полный цикл разработки, начиная от ввода алгоритма, включая отладку, и заканчивая внутрисхемным программированием кристалла. Вы будете иметь возможность разрабатывать программы как на уровне ассемблера, так и на макро-уровне, при котором возможна работа со знакопеременными величинами произвольной длины. Это приближает возможности программирования к языку высокого уровня. Скачать Algorithm Builder ,последнюю версию, можно с сайта автора http://algrom.net/russian.html .

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

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

    Рис. 7.2.1. Гравное окно програмного обеспечения Algorithm Builder.

    Ассемблером.

    Среда предназначена для работы под ОС Windows 95/98/2000/NT/ME/XP.

    Для нормальной работы редактора требуется наличие шрифта “Courier”.

    На рисунке 7.2.1. показано, как выглядит главная панель программы "Algorithm Builder".

    Конструкция алгоритма

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

    Элементы алгоритма

    Для построения алгоритма в Algorithm Builder предусмотрено семь элементов:

    FIELD – Поле;

    LABEL – Метка;

    VERTEX – Вершина блока;

    CONDITION – Условный переход;

    JMP Vector – Относительный безусловный переход;

    SETTER – Настройщик периферийных устройств;

    TEXT – Строка локального текстового редактора.

    Элемент «FIELD» - поле

    Представляет собой отцентрированную в блоке строку. Объект предназначен для записи большинства операторов микроконтроллера. Для того чтобы добавить поле, выберите либо пункт меню “Elements\Field”, либо нажмите кнопку на панели инструментов, либо клавишу “Alt+F”, либо клавишу “Enter” (если курсор находится вне локального текстового редактора).

    В представленном ниже примере алгоритма элементы “Field” обведены овалами.

    Элемент «LABEL» - метка

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

    Для изменения расположения имени метки на противоположное нажмите клавишу “Tab”.

    В приведенном ниже примере элемент “Label” обведен овалом.

    Как правило, к метке должен примыкать один из векторов перехода (со стрелкой на конце). В этом

    Случае имя метке давать необязательно. Но Algorithm Builder допускает классическую адресацию переходов с использованием имен меток. В этом случае метке имя дать необходимо. Например:

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

    Элемент «VERTEX» - вершина блока

    По своему отображению и назначению полностью идентичен метке, но, в отличие от нее, задает

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

    В приведенном ниже примере элементы “Vertex” обведены овалами:

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

    Элемент «CONDITION» - условный переход

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

    Конец вектора должен либо заканчиваться на какой-либо метке, или вершине, либо на отрезке другого вектора, либо иметь имя адресуемой метки.

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

    В приведенном ниже примере элементы “Condition” обведены овалами:

    Элемент «JMP Vector» - безусловный переход

    Этот элемент предназначен для реализации коротких безусловных переходов (в базовом ассемблере это оператор “RJMP”). Представляет собой ломаную линию, исходящую из середины блока со стрелкой на конце, аналогичную вектору объекта “Condition”. Чтобы добавить новый безусловный переход, либо выберите пункт меню “Elements\JMP Vector”, либо нажмите клавиши “Alt+J”, либо кнопку на панели инструментов.

    В приведенном ниже примере элемент “JMP Vector” обведен линией.

    Элемент «SETTER» - настройщик

    Этот объект представляет собой серый прямоугольник, внутрь которого вписано имя настраиваемого периферийного компонента микроконтроллера, такого как Таймер, АЦП, регистр маски прерываний и пр. Настройщик предназначен для формирования последовательности операций микроконтроллера, которые обеспечивают загрузку необходимых констант в соответствующие управляющие регистры ввода-вывода в соответствии с выбранными свойствами.

    Перед использованием этого элемента тип микроконтроллера должен быть определен (пункт меню “Options\Project options”, закладка “Chip”)

    Для добавления в алгоритм настройщика, либо выберите пункт меню “Elements\Setter”, либо нажмите клавиши “Alt+S”, либо кнопку на панели инструментов. Для редактирования уже введенного настройщика, активизируйте редактор двойным щелчком мыши, либо клавишами “Shift+Enter”.

    Объект “Setter” является макро-оператором. После компиляции он преобразуется в последовательность команд микроконтроллера, которые обеспечат загрузку необходимых констант в соответствующие управляющие регистры. При этом следует иметь в виду, что в этих операциях будет использован регистр-посредник r16.

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

    В приведенном ниже примере элементы “Setter” обведены овальной линией.

    Элемент «TEXT» - строка локального текстового редактора

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

    Строки предназначены для записи в них ряда директив компилятора, а также для комментариев. Для добавления нового локального текстового редактора либо выберите пункт меню “Elements\Text”, либо нажмите клавиши “Alt+T”, либо кнопку на панели инструментов.

    Комментарии должны начинаться с двух косых: “//”.

    В приведенном ниже примере элементы “Text” обведены овальной линией.

    После того как мы знакомились с основными элементами программного обеспечения Algorithm Builder приступим к созданию программы. Для создания нового проекта выберите пункт меню “File\New”. При этом появится первая закладка и на рабочем поле элемент “TEXT”, “VERTEX” и прикрепленный к нему один элемент “FIELD” с пустым оператором (рис.7.2.2.) “NOP”:

    Рис. 7.2.2. Окно новогопроекта.

    Затем задаем тип микропроцессора, в нашем случае это ATmega48. Для задания типа микропроцессора выбираем пункт меню “Options\Project options…” (рис7.2.3) :

    Рис. 7.2.3. Окно опции проекта.

    Здесь мы выбираем наш микропроцессор и нажимаем кнопку применить.

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

    Рассмотрим построение программы. Для начала необходимо задать установить счетчик адреса стека на последнюю ячейку SRAM. Сделать это просто, для этого выбираем элемент SETTER где выбираем Stack Point после

    Чего выходит окно Control Register Setting (рис. 7.2.4), где устанавливаем

    Рис. 7.2.4 Окно настройки стека.

    Галочку и нажимаем кнопку Ok. На рабочем поле появился серый прямоугольник SP. Затем производим настройку значений АЦП для чего выбираем элемент SETTER где выбираем Analog to Digits Converter (ADC) после чего выходит окно Control Register Setting (рис. 7.2.4.) в котором и происходит настройка АЦП. Здесь мы задаем предделитель СK/128. Выбираем ножку микропроцессора на который будем подавать значение АЦП. Здесь же выбираем режим работы микропроцессора для чего

    Рис. 7.2.4. Окно настроцки АЦП.

    Устанавливаем AVCC with external capacitor at AREF pin. На этом настройка АЦП заканчивается.

    Теперь настраиваем таймер/счетчик. Для настройки опять заходим в элемент SETTER где выбираем Timer/Counter 0 после чего появляется окно с настройками таймер/счетчика (рис. 7.2.5). Здесь определяем значение предделителя CK/1024 и выбираем один из режимов его работы. В данном случае выбираем режим CTC, то есть сброс при совпадении. В этом режиме счетный регистр тоже функционирует как обычный сум­мирующий счетчик, инкремент которого осуществляется по каждому им­пульсу тактового сигнала clk T 0 . Однако максимально возможное значение счетного регистра и, следовательно, разрешающая способность счетчика определяется регистром сравнения OCRO. После достиже­ния значения, записанного в регистре сравнения, счет продолжается со зна­чения «$00». В том же такте сигнала

    Рис. 7.2.5. Окно с настройками таймер/счетчика.

    Clk T 0 , в котором обнуляется счет­ный регистр, устанавливается флаг прерывания TOV0 регистра TIFR. В регистр OCRO записываем значение 100 по достижению которого произойдет прерывание и программа перейдет по метке Timer_0_Compare_Match_A.

    .

    Рис 7.2.6. Окно настройки прерывания.

    Затем конфигурируем прерывание выбираем прерывание от переполнения. Для этого опять выбираем элемент SETTING где выбираем Timer/Counter interrupt Mask (TIMSK). В появившемся окне в поле Timer/Counter устанавливаем галочку на Output compare A match (рис. 7.2.6). На этом конфигурирование прерывания заканчивается. Теперь производим настройку портов ввода – вывода, так как нам нужно настроить весь порт B на вывод записываем а него значение 255 и устанавливаем его в единицу. Также производим настройку порта D, но здесь мы используем только первые 6 выводов D0 – D5 для этого записываем в него значение 127. Потом устанавливаем на этом выводе значение логического 0. Порт С настраиваем на вход для чего записываем в него 0. На этом настройка портов ввода – вывода заканчивается. Теперь устанавливаем флаг t в 0. Потом устанавливаем первое знакоместо индикатора, в n записываем 0. Затем сбрасываем значение суммы для этого в sum записываем 0. Так же устанавливаем значение делителя записывая в m значение 0. Обнуляем значение частного chast записывая в него 0. После этого разрешаем глобальное прерывание устанавливая во флаг i значение 1.Это позволить прерывать программу через определенное значение тактовых импульсов и переходить на подпрограмму АЦП или таймер/счетчика.

    Потом с помощью элемента LABEL (метка) устанавливаем метку и назначаем ей имя start. Затем нажатием на элемент CONDITION (условный переход) и внутрь вписываем условие для перехода, этим условием будет установка флага t в 1. Если флаг t не равен 1 то программы уходит ниже и затем через элемент JMP Vector (безусловный переход) переходим по метке start. Тем самым создаем цикл в котором программа крутится до того как во флаг t занесется 1. Как только флаг t равен 1 программы уходит по стрелке. Ниже находится вход в подпрограмму преобразования двоичного числа в десятичное, чему соответствует надпись Z_to_Digits. После выполнения подпрограммы преобразования двоичного числа в десятичное которую мы рассмотрим ниже программа возвращается после надписи Z_to_Digits, где опять в флаг t заносится 0. Затем опять выбираем элемент JMP Vector и переходим по метке start.

    Теперь рассмотрим подпрограмму прерывания АЦП. Переход на подпрограмму АЦП осуществляется через определенное время. Как только АЦП произвел измерения он записал данные в adcl и adch. Данные из этих двух регистров необходимо переписать в другой регистр для дальнейшего преобразования. Этими регистрами будут zl и zh. Для переписи мы будем использовать строчку adcl → zl , соответственно следующая строчка будет adch→ zh. Затем используем элемент CONDITION (условный переход) с условием t=1. Это условие необходимо для запрета на изменение числа пока не произойдет преобразование числа в десятичную форму. Если t=0 то программа проходит ниже где записана строчка x → z это говорит о том, что число хранящееся в регистре z изменится только после вывода числа на индикацию. Затем используя элемент CONDITION (условный переход) создаем условие y
    Далее рассмотрим условие y adc_max то и если условие верно то программа переходит по стрелке. Затем производим вывод информации в порты D.5 и D.4. Записывается это как 1 → D.5 . По этой надписи видно, что на выводе порта D.5 выводится значение логической единицы. В следующей строчке 0 → D.4 выводим в порт D.4 значение логического нуля. Затем программа идет про стрелке. Проверка условия x adc_max. Потом записываются три строчки 0 → m, 0 → t, 0 → y следующие друг за другом. В них сбрасываем значения делимого (m), флага t и содержимое регистра y в котором хранится значение измеренного АЦП. Потом опять запускаем АЦП, после чего выходим из подпрограммы АЦП. На этом подпрограмма измерения входного напряжения заканчивается.

    Вход в подпрограмму деления находится в подпрограмме АЦП. После того как программа перешла в подпрограмму деления по div32_8 происходит вычисление среднего значения всех измеренных значения АЦП. Первым делом производим обнуление значения содержимого частного. Для этого записывается 0 → chast. Затем вводим условие где флаг С=1. Во флаг С будет занесена единица только после того как содержимое суммы будет меньше делителя. Но так как во флаге С пока содержится 0 программа идет ниже. Ниже записана строчка chast++ в которой мы увеличиваем значение частного на единицу. Потом производим вычитание из регистра содержащего сумму значений АЦП значение делителя. Затем с помощью элемента JMP Vector (безусловный переход) создаем цикл который приходит перед условием где проверяется флаг С. И как только значение суммы будет меньше делителя во флаге С будет записана единица и программа пойдет по стрелке. Потом значение частного переписываем в регистр х. Этому соответствует строчка chast → х. Ниже записана строчка в которой обнуляем значение суммы 0 → sum. На этом подпрограмма деления заканчивается и программа выходит из нее попадая в подпрограмму АЦП после строчки div32_8.

    Рассмотрим подпрограмму прерывания по таймеру в которой определяется зажжения четырех знакомест индикатора. После того как произошло прерывание от таймера и программа перешла по метке Timer_0_Compare_Match_A начинается проверка условий значение знакомест индикатора. Для этого с помощью элемента CONDITION (условный переход) проверяем условие n=0 и если оно верно то программа переходит по стрелке. После этого записываем в порт D.3 значение 0 командой 0 → portd.3. Затем выводим число содержащееся в digit_0 в весь пост В для этого записываем digit_0→ portb. И записываем единицу в порт D.0 для зажжения первого знакоместа индикации, в программе это будет выглядеть 1 → portd.0. Затем с помощью элемента JMP Vector (безусловный переход) производим переход по метке m0. Метка m0 стоит после всех условий содержимого n. Затем увеличиваем значение n для того чтобы следующее число выводилось во второе знакоместо индикатора. После этого выходим из подпрограммы таймера. В следующий раз как произойдет прерывание по таймеру программа вернется в нее но пойдет немного по другому, так как необходимо вывести информацию на второе знакоместо индикатора. Это произойдет после проверки условия где в регистре n должно содержатся единица которая записалась после вывода первой цифра и увеличения значения n на единицу. Так как в n записана единица то программа переходит по условию n=1. После перехода по этому условию необходимо выключить первое знакоместо и для этого записываем в порт D.0 значение нуля. В программе этому соответствует строчка 0 → portd.0. Затем также выводим число содержащееся в digit_1 в весь порт В для этого записываем digit_1→ portb. И записываем единицу в порт D.1 для зажжения первого знакоместа индикации, в программе это будет выглядеть 1 → portd.1. Потом переходим по метке m0 и увеличиваем значение n на единицу как было описано выше. Вывод третей и четвертой цифра на индикаторе аналогичен выводу первых двух, но после вывода четвертой цифры обнуляем значение содержимого регистра n. Для этого записываем 0→n . И устанавливаем значение флага t в единицу чем говорится об окончании вывода числа на индикацию. Для этого записываем 1→t. На этом заканчивается полный цикл вывода числа на индикаторе.

    Осталось рассмотреть только подпрограмму индикации переход на которую осуществляется только после проверки условия флага t=1 в основной программе. Так как во флаг t занесена единица после вывода последней цифры на индикаторе. При опросе условия программа переходит по стрелке и затем попадает на Z_to_Digits это и является условием перехода в подпрограмму индикации. Программа переходит по метке и попадает в подпрограмму Z_to_Digits. После перехода первым делом отключаем глобальное прерывание для этого в флаг i вводим значение 0. Записывается это как 0→i. Ниже заносим ноль в рабочий регистр temp. в программе это выглядит как 0→ temp. Теперь используя элемент CONDITION создаем условие в котором регистр Z сравниваем с 1000 и как только значение регистра Z будет меньше 1000 программа перейдет по стрелке. А пока регистр Z больше условие не выполняется и программа уходит ниже. Здесь вычитаем из регистра Z тысячу и записываем это как Z – 1000. Потом увеличиваем значение регистра temp на единицу. С помощью элемента JMP Vector создаем цикл который приходит перед условием сравнивания регистра Z. Как только условие выполнилось и регистр Z стал меньше тысячи программа уходит по стрелке. Теперь содержимое регистра temp переписываем в регистр r0 и в нем теперь хранится значение тысяч числа. Запись выглядит как temp→r0. После этого обнуляем значение регистра temp записывая в него 0. Теперь программа повторяется как и в вычислении тысяч, но теперь необходимо вычислить значение сотен. Опять задаем условие Z
    После написания программы ее можно проверить в симуляторе которы имеет программная среда Algorithm Builder. Для исполнения алгоритма в симуляторе нажмите клавишу “F9” или кнопку на панели нструментов.

    При этом в начале произойдет компиляция и, если отсутствуют ошибки, запустится симулятор. Открытие необходимых окон компонент микроконтроллера делается через пункт меню “View…”. Для наблюдения процессов во введенном алгоритме достаточно открыть окна “Processor”, “PortD” , “Working registers”, “ADC”, “Timer/Counter 0” и “Process time #0” (рис. 7.2.7).

    Рис.7.2.7.Вио симулятора Algorithm Builder.

    Метка возле оператора означает текущее положение программного счетчика. Метка располагается перед оператором, который должен быть исполнен в следующем шаге. Сразу после запуска, она располагается на первом операторе программы, располагающемся по адресу $0000. При запуске симулятора содержимое рабочих регистров и SRAM всегда заполняется случайными величинами, поскольку в реальном микроконтроллере их содержимое после подачи питания непредсказуемо. Пошаговое исполнение алгоритма с входом в подпрограммы осуществляется кнопкой “F7” или кнопкой на панели инструментов. Пошаговое исполнение без входа в подпрограммы – клавишей “F8” или кнопкой

    Рис 7.2.8 Окно программирования кристалла.

    Данное программное обеспечение имеет возможность запрограммировать микропроцессор. Algorithm Builder содержит встроенный внутрисхемный программатор, обеспечивающий последовательное программирование микросхем. Выбор пункта меню “Program\Run with Chip” или нажатие клавиш “Ctrl+Shift+F9” или нажатие кнопкина панели инструментов запускает компиляцию алгоритма, и, в случае отсутствия ошибок, открывает окно программирования (рис 7.2.8).

    Программирование микропроцессора производится через COM порт.

    Графическая среда программирования для разработки приложений под микроконтроллеры с архитектурой AVR.

    Algorithm Builder представляет собой мощный инструмент, позволяющий провести полный цикл по созданию и проверке программного кода. Среда включает в себя: графический редактор, симулятор микрочипа для отладки алгоритма, компилятор и внутрисхемный программатор для загрузки кода в кристалл. Программа представляет собой отечественный аналог Ассемблера и подходит как для опытных разработчиков, так и для тех, кто только начинает осваивать прошивку устройств.

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

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

    Основное окно позволяет размещать необходимые объекты и изменять их, вставлять, перемещать и т.п., как в любом графическом редакторе. В отдельной части экрана в виде таблицы формируется окно с перечнем всех констант и переменных, освобождая, таким образом, алгоритм от дополнительных записей. Для настройки параметров периферийных устройств (UART, SPI, ADC, таймеры) предусмотрен особый элемент с раскрывающимся оконным интерфейсом. Набор инструкций, обеспечивающих выбранные параметры работы устройства, самостоятельно формирует компилятор. Кроме этого поддерживается автоперекодировка ANSI-кодов Windows в коды русскоязычного буквенно-цифрового ЖКИ. Программа поддерживает широкий спектр микроконтроллеров семейств: ATtiny, ATmega, AT90.

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

    Режим мониторной отладки на ядре с помощью еще одного адаптера (все схемы имеются в документации к софту) позволяет отслеживать внутреннее состояние реального кристалла в любой точке останова. Для связи контроллера с компьютером по выбору пользователя выделяется всего один вывод. Отладка On Chip debug применяется к любому типу микросхем, имеющему SRAM-память.

    Несмотря на свои явные достоинства, Algorithm Builder малоизвестен в радиолюбительской среде. Отчасти это объясняется тем, что до 2010 года среда визуального программирования была платной, бесплатная демоверсия ограничивала код до двух килобайт. Сегодня ПО распространяется абсолютно свободно. Папка с установленной программой может копироваться на другие носители и работать портативно. К софту прилагается руководство по использованию. В статье рассматривается ряд простейших работ и приведены схемы программаторов для USB- и COM- портов.

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

    Интерфейс программы Algorithm Builder и руководство пользователя представлены на русском и английском языках.

    Программное обеспечение работоспособно в операционных системах Microsoft Windows 95, 98, 2000, NT, ME, XP, Vista и 7.

    Распространение программы: бесплатная

    Материалы статьи подготовлены на кафедре «Автоматика, Информатика и Системы Управления» (АИиСУ) Московского Государственного Индустриального Университета (ГОУ МГИУ) .
    (С 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-программатора можно прочитать тут.