Применение микроконтроллеров AVR

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

Микроконтроллеры AVR отличаются размерами, функциями и количеством ножек. На картинке справа большая микросхема это Atmega8535 с самым большим количеством выводов и набором функций. Самая маленькая - Attiny12L - имеет всего несколько выводов, но мощный процессор и ничтожные габариты (3х4х2 мм) позволяют использовать ее, например, в радиоуправляемых вертолетах. Устроены все AVR одинаково, программируются тоже. О некоторой специфике конкретного МК можно прочитать все на сайте производителя, а пока мы поработаем с наиболее универсальным чипом Atmega8535.

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

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

Использовать микроконтроллер очень просто. Надо создать программу, отладить ее на виртуальном МК, а затем подключить и запрограммировать реальный МК. После чего можно его использовать, а когда надоест повторить все заново с другой схемой и программой.

Пусть слова "создать и отладить программу" не пугают вас. Геннадий Громов своей программой Algorithm Builder упростил это так, что дальше некуда. Это просто рисование блок-схем. Подробная русская инструкция, понятный интерфейс и тщательно прокомментированные примеры от МНТЦ помогут вам подружиться с микроконтролерами.

Первый практический проект: 8-битный АЦП с выводом бегущего графика на экран ПК.

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

Установим Algorithm Builder и создадим программку. Видите, какая она компактная!

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

Она состоит из двух подпрограмм: Reset и ADC_Complete. Кто знает английский, тот уже догадался, что первая запускается при загрузке МК, а вторая - по завершении аналого-цифрового преобразования. Дело в том, что чем дольше микроконтроллер сможет "взвешивать" аналоговую величину, тем точнее получится результат. Поэтому длительность преобразования можно регулировать в зависимости от задачи, и чтобы это не мешало работе процессора, можно дать команду начать преобразование, и продолжать работу пока АЦП не сообщит прерыванием о готовности результата. Для создания подпрограммы нажмите розовую кнопку "V" на панели инструментов. Сразу же назначьте ей прерывание из меню Элементы/Прерывания, или назоваите ее как-ниюудь по-своему, чтобы обращаться из других подпрограмм.

Подпрограмма заканчивается бесконечным циклом (обычно это основная программа, начинающаяся с Reset), оператором Ret или RetI (для подпрограмм связанных с прерываниями).

Серый элемент с надписью ADC - это "настройщик" АЦП. Нажмите на него и откроется экран, показанный ниже. Установите галочки и значения такие же, как в нашем примере. Справа в графе "Operations" вы видите участок кода, записывающий в нужные регистры соответствующие настройки в виде байтов. Галочки и комментарии выглядят понятнее, но при желании, прочитав описание МК и инструкцию к Algorithm Builder вы будете владеть исчерпывающей информацией о том, какой бит за что отвечает.

Настройщик SP настраивает стек (там всего одна галочка, пусть она будет установлена). Поместить настройщики в пограмму можно нажав розовую кнопку "S" на панели инструментов.

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

Подпрограмма Reset после настройки АЦП записывает байт $FF (в двоичном представлении: 1111 1111) в регистр DDRC, определяющий направление работы порта C. В каком месте байта единицы, те ножки порта С будут работать на выход, то есть в данном случае все. Затем командой 1->I в микроконтроллере разрешаются прерывания, после чего начинается бесконечный цикл.

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

В цикле выясняется, чему равен седьмой бит регистра ADCSRA (установив этот бит в 1 мы запустим работу АЦП, а когда она закончится, АЦП сам сбросит этот бит в 0). Копируем ADCSRA в рабочий регистр R16 и совершаем над ним побитную операцию "И" с числом 0100 0000. Если искомый бит не равен нулю, то и результат не будет равен нулю, на что сработает оператор условного перехода, отправляя нас в начало цикла. Иначе процессор совершит побитную операцию "ИЛИ" с числом 0100 0000 уже над самим регистром ADCSRA, запуская работу АЦП.

Каждый раз когда АЦП завершает преобразование, выскакивает прерывание ADC_Complete, в обработчике которого всего одна команда: вывести старший байт результата АЦП на ножки порта С.

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

Нажав кнопку скомпилируем программу и посмотрим сообщение об успешном завершении.

Если есть сообщение об ошибке в каком-то операторе - исправьте. Если вообще никакого сообщения нет, но что-то мигнуло, то в WinXP в панели управления Система/Быстродействие/Предотвращение выполнения данных надо разрешить программе Algorithm Builder выполнять данные.

Нажав кнопку запустим отладчик. В меню "Открыть" укажите, за какими регистрами хотите наблюдать. Для нашего примера существенны: AD Converter, Working Registers, и конечно PortC в подменю I/O registers. Посмотрите что еще есть там, в недрах МК.

Отладим программу. Поставьте курсор на команду RetI и нажмите клавишу F5 - теперь программа будет останавливаться каждый раз на этой точке, чтобы вы могли уследить за ее работой. Установите какой-нибудь входной сигнал АЦП бегунком в окне AD Converter, и понажимайте F7, наблюдая за регистрами, пока программа не войдет в цикл. Тогда нажмите F9 и при остановке программы на команде RetI проверьте - вывелось ли в порт С значение с АЦП. Поменяйте входное значение и нажмите F9 снова.

Подключим микроконтроллер. Практически всегда он подключается именно так.

Соберем программатор. Нынешняя версия Algorithm Builder поддерживает только интерфейс RS-232 (COM-порт), либо USB с переходником на COM порт. Это хорошо, потому что LPT и USB остаются не заняты и можно программировать и отлаживать управляемые с компа приборы без постоянных отключений-подключений кабеля. Программатор работает только при нажатой кнопке, чтобы не мешать микроконтроллеру в остальное время.

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

Закроем отладчик, включим питание и запрограмимируем МК нажатием кнопки и затем кнопки "Старт". Не забудьте про кнопку на макетной плате - программирование возможно только когда она нажата! Если выдается ошибка, то внимательно проверьте наличие питания, правильность собранной схемы и настроек порта в программе. Микроконтроллеры AVR очень надежны и выходят из строя только если обращаться с ними совсем скверно.

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

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

Напишем программу для ПК. За пару минут из стандартной LPT-заготовки появляется программа считывания с АЦП.

Включаем питание МК, запускаем программу, крутим ручку резистора. Работает!

Попробуйте подсоединить ко входу АЦП генератор импульсов, микрофон, термистор, датчик Холла, фототранзистор, самодельные датчики, RC-цепочку. ТОЛЬКО НЕ РОЗЕТКУ!!!

Вот вы и прошли весь цикл создания микроконтроллерного проекта: от постановки задачи, до ее решения. Теперь самое время изучить описание МК и инструкцию к программе Algorithm Builder!