Программирование AVR

Программирование AVR (94)

    Аппаратные таймеры/счетчики микроконтроллеров AVR ценный и ходовой ресурс. Чаще всего при их использовании возникает две проблемы – нехватка количества таймеров и невозможность получить временные интервалы большой длительности. Обе эти проблемы можно решить с помощью программных таймеров. Вариантов реализации программных таймеров существует довольно много. Один из них описан в этой статье.

   Память программ микроконтроллеров AVR, помимо своего прямого предназначения может быть использована для хранения константных данных. Для этого в AVR ассемблере есть специальные директивы .db и .dw. Первая определяет константный байт или несколько байтов, вторая константное слово или несколько слов. (слово - это 2 байта). Для того чтобы указать, что заданные константы расположены во flash памяти микроконтроллера,  используется директива .cseg 

   Таймеры/счетчики микроконтроллеров AVR имеют несколько режимов работы. Один из них, СТС  - сброс при совпадении, мы уже использовали. Давайте разберемся  с другим режимом - Fast PWM.
   PWM (Pulse-width modulation или по-русски широтно-импульсная модуляция) – это вид модуляции цифровых сигналов, при котором частота сигнала остается  постоянной, а длительность меняется. С помощью ШИМ можно регулировать мощность в нагрузке, а также генерировать аналоговые сигналы. 

   Один из наиболее частых способов применения директивы #define –  создание макроопределений замаскированных под функции. Для макросов состоящих из одной инструкции, это легко. Просто определяем макрос без  точки с запятой.

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

   В прошлый раз мы научились пользоваться таймером Т0 и заставили микроконтроллер подавать голос. Хоть мы и использовали при этом прерывания, суть программы мало чем отличалась от программы моргающего светодиода. Предлагаю усложнить задачу и заставить микроконтроллер играть мелодию. Попутно познакомимся с массивом и научимся его использовать.
   Микроконтроллер общается с внешним миром посредством портов ввода/вывода. В общем случае он может “воспринимать” только цифровые сигналы – логический ноль или логическую единицу. Например, для микроконтроллера ATmega8535 при напряжении питания 5 В логический ноль – это напряжение от 0 до 1,3 В, а логическая единица – от 1,8 до 5 В. Довольно часто возникает потребность измерять напряжения, которые могут принимать любое значение в диапазоне от 0 до напряжения питания. Для этих целей в составе микроконтроллеров AVR есть аналого-цифровой преобразователь (АЦП).
   При отладке встраиваемых приложений, наиболее сложно отловить ошибки,  проявляющие себя не постоянно, а лишь время от времени. Одна из причин подобных багов: переменные, доступ к которым осуществляется асинхронно. Такие переменные должны быть правильно определены, и иметь соответствующую защиту.

Итак, практический пример реализации меню на switch конструкции. Все нижеизложенное – пояснение к проекту.

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