AVR: Введение

AVR: Введение

Это первая глава переведенного пособия по микроконтроллерам AVR. Оглавление и информацию об оригинале можно найти здесь.

Что такое микроконтроллер?

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

Микроконтроллеры отличаются в первую очередь по ширине внутренней шины данных (по количеству бит шины данных): 4-х, 8-ми, 16-ти и 32-х битные. Это количество бит можно интерпретировать как размер (длину) данных, которые микропроцессор может обработать в одной команде. Самое большое число, которое можно закодировать 8-ю битами (одним байтом), равно 255. Таким образом, 8-битный микроконтроллер, например, за один вызов команды сложения может обрабатывать только числа меньше или равные 255. Для обработки больших чисел необходимо исполнить команду сложения большее количество раз, что, конечно же, увеличивает время сложения чисел. Микроконтроллер, как и любой другой процессор, нуждается в задании такта. Максимальная тактовая частота процессор различается от 1МГц у старых контроллеров до 100МГц у дорогих 32-х битных микроконтроллеров. Однако эта частота еще ничго не говорит о действительной скорости микропроцессора. Так, например, у большинства 8051-микроконтроллеров частота делится на 12; получается, что микроконтроллер с частотой 24МГц работает в действительности с частотой 2МГц. Например, если для одной команды этот микроконтроллер требует двух тактов, то получается, что за секунду может быть обработан «всего» 1 миллион таких команд. В то же время микроконтроллер с частотой 8МГц без внутреннего деления частоты, которому требуется для такой же команды всего один такт, может за секунду обработать 8 миллионов команд.

Где применяются микроконтроллеры?

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

  • Устройства зарядки
  • Устройства управления моторами
  • Роботы
  • Измерительные приборы (например, измеритель частоты вращения в автомобиле)
  • Устройства контроля за температурой
  • MP3 плеер
  • Таймерные переключатели
  • Сигнализации
  • LED-матрицы (наружная реклама и т.п.)
  • Управление и регулирование жидкостями

Какой микроконтроллер лучше выбрать?

Есть несколько типичных требований к микроконтроллерам со стороны любителей (некоторые требования противоречат друг другу):

  • Наличие на рынке и низкая цена.
  • Простота конструкции: микроконтроллер с 20 контактными выходами проще в использовании, нежели устройство со 128-ю выводами.
  • Flash-ROM: контроллер должен быть рассчитан минимум на 1000 циклов «прошивки» (загрузки программного кода).
  • Внутрисхемное программирование (ISP): не обязательно наличие дорогостоящего программатора; для загрузки программы не обязательно вынимать микроконтроллер из разъема.
  • Наличие бесплатного ПО: ассемблер практически всегда доступен бесплатно.

Другие критерии выбора приведены в статье «Выбор микроконтроллера» (немецкая версия).

Многие из этих требований удовлетворяются 8-битными AVR-котроллерами от Atmel. Поэтому примеры в этом пособии будут строиться на микроконтроллере AVR, а именно ATmega8.

Ну, и чтобы не было недопонимания: как такового «лучшего» микроконтроллера в принципе не существует. Для каждой задачи лучше подходит тот или иной микроконтроллер. Конечно же, некоторые контроллеры зарекомендовали себя на практике как стандартные, которые подходят во многих случаях и с помощью производительности которых можно покрыть также и другие области. Одним из таких (но не единственным — есть много других) контроллеров является, например, ATmega8.

На каком языке лучше программировать?

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

Замечание

Почему это пособие написано для ассемблера, когда есть бесплатные С-компиляторы (WinAVR, AVR-GCC) и даже относительно дешевый Basic-компилятор?

Ассемблер подходит лучше всего для полного погружения с ходу. Только применяя ассемблер можно понастоящему детально познакомиться с устройством микроконтроллера, а следовательно научиться применять его более эффективно. Кроме того, при использовании компиляторов других языков рано или поздно приходится сталкиваться с проблемой, которую можно легче решить с помощью ассемблера (а иногда только с его помощью). Нередко приходится вникать в сгенерированный компилятором ассемблерный код, чтобы решить, как переписать C-код, чтобы код скомпилировался лучше/оптимально.

Однако стоит отметить, что программирование на ассемблере требует большего внимания и подвержено ошибкам, а значит требует больше времени до того момента, когда программа даст первые правильные результаты. Именно по этой причине были созданые т.н. «высокие» языки программирования: чтобы не изобретать колесо каждый раз заново. Особенно это относится к готовым программным блокам, которые можно комбинировать между собой. Преимущество в скорости работы программы, написанной на ассемблере, довольно редко и только в критичных случаях действительно является преимуществом. Современные компиляторы генерируют зачастую более быстрый и меньший код в сравнении с «рукописными» ассемблерными комндами. Поэтому тем, кто собирается регулярно программировать и писать длинные программы, рекомендуется после этого пособия изучить и применять для программирования микроконтроллеров язык С, например, с помощью пособия по AVR-GCC (немецкая версия; вероятно, тоже будет переведена).

Читатели, уже знакомые с С, могут пробовать выполнять упражнения этого пособия параллельно на С и на ассемблере. Большинтво представленных здесь ассемблерных программ довольно легко реализуются на С. При этом следует обратить особое внимание на детальное понимание идеи программы: важен осмысленный перенос ассемблерной программы на С (и наоборот). Неправильно было бы полагать, что заменив ассемблерные команды аналогичными командами С (если такие вообще найдутся), можно переписать ассемблерную программу на С.

Ассемблер

Мы уже называли преимущества ассемблера. Остановимся на основных плюсах и минусах еще раз:

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

Basic

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

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

C

Оптимальным компромисом является язык C, т.к. с помощью функций и процедур очень легко использовать структуры и типы данных «высокого» языка, но в то же время есть возможность генерировать эффективный ассемблерный код. Однако С сложен для понимания. (Здесь с автором можно не согласиться: большинство технических ВУЗов в России дает основным языком программирования именно С, а не Java как в Германии. — прим. переводчика).

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

С операционной системой или без?

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

С операционной системой

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

Без операционной системы

  • Нет затрат на внедрение многозадачной ОС,
  • Многозадачность должна реализовываться самостоятельно,
  • Реализация многозадачности требует больше времени,
  • Части кода, связанные с многозадачностью, полностью портируемы на другие контроллеры,
  • Общий код лучше портируется на другие контроллеры,
  • Микроконтроллер не перегружен лишними функциями
  • Свойства систем реального времени также реализуемы: с одной стороны им приходится уделять больше внимания, с другой стороны их можно реализовать более эффективно и с большим запасом ресурсов.
  • Можно обойтись дешевым (более медленным) процессором.