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

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

   При программировании микроконтроллеров разработчики иногда сталкиваются с проблемой вычисления квадратного корня. Например, данная операция требуется при выполнении быстрого преобразования Фурье или вычислении среднеквадратического значения сигнала. 
   В стандартной библиотеке Си – math.h, есть функция для вычисления квадратного корня sqrt(), которой при желании можно воспользоваться. Она работает с числами типа float, обеспечивает высокую точность результата, но требует для своей работы длительного времени. Для микроконтроллера AVR это порядка 3000 циклов тактовой частоты (проверено в компиляторе IAR на разных уровнях оптимизации). 
   Если к точности вычисления корня не предъявляются высокие требования, можно воспользоваться упрощенным алгоритмом, занимающим меньше места в памяти и выполняющим вычисления в несколько раз быстрее.

   Когда АЦП делает выборки сигнала, он кодирует его дискретными шагами. Это вносит некоторую ошибку, известную как ошибка квантования. Использование нормального усреднения будет только сглаживать флуктуации сигнала, тогда как метод оверсемплинга и децимации будет увеличивать разрешение. Суть метода заключается в дискретизации сигнала с более высокой частотой и вычислении новой выборки сигнала на основе полученных дополнительных выборок. Требуемая частота дискретизации может быть найдена по формуле 3-1. Сложение дополнительных выборок и сдвиг результата вправо на n, будет давать результат с разрешением, увеличенным на n разрядов. 

   Микроконтроллеры AVR фирмы Atmel имеют в своем составе 10-ти разрядный аналого-цифровой преобразователь (АЦП). В большинстве случаев такой разрядности достаточно, но иногда возникают ситуации, когда требуется более высокая точность. 
   Существуют специальные методы обработки сигналов, позволяющие увеличить разрешение измерений. С помощью метода называемого “оверсемплинг и децимация” данная задача может быть решена без использования внешнего АЦП. 
   В этом руководстве рассмотрена теория и практическое применение данного метода.
   Микроконтроллеры AVR имеют возможность самопрограммирования, то есть могут самостоятельно изменять содержимое своей flash памяти. В практическом плане это означает, что, написав для микроконтроллера специальную программу-загрузчик (так называемый бутлоадер), мы можем обновлять его прошивку, не используя программатор. Причем интерфейс, по которому в микроконтроллер будет передаваться код программы, может быть совершенно произвольным. Обычно для этих целей используется один из аппаратно поддерживаемых интерфейсов, например, SPI, I2C или RS-232. Однако существуют и загрузчики, основанные на программной реализации таких интерфейсов как USB и 1-Wire.
   Для микроконтроллеров AVR существует несметное количество готовых бутлоадеров, и в большинстве случае мы можем спокойно использовать их в своих устройствах, не утруждая себя написанием собственного загрузчика.  В этой статье мы рассмотрим один из таких бутлоадеров, который разработан и свободно распространяется фирмой Chip45, и разберемся как его использовать. 
  При разработке электронных устройств иногда бывает ситуация, когда выводов микроконтроллера не хватает, а использовать другой чип нет возможности. В таких случаях обычно прибегают к схемотехническим трюкам или используют дополнительные внешние микросхемы, например, расширители портов, сдвиговые регистры или мультиплексоры.
   Расширители портов позволяют добавить микроконтроллеру “полноценные”  выводы, работающие как на выход, так и на вход, и, как правило, управляются с помощью стандартных интерфейсов - SPI  или I2C. Это очень удобно, но подобные микросхемы не из дешевых. 
   Бюджетный вариант – использование сдвиговых регистров и мультиплексоров, однако в этом случае полученные дополнительные выводы будут работать только на выход или на вход (исключение составляют универсальные сдвиговые регистры). Впрочем, в большинстве приложений этого вполне достаточно.  
   В этой статье мы рассмотрим расширение портов микроконтроллера с помощью сдвигового регистра 74HC595.  Им можно управлять как стандартными выводами  микроконтроллера, так и с помощью SPI модуля. Также его можно каскадировать, соединяя несколько микросхем в один большой регистр. 
   Чтобы пример был наглядным, с помощью регистров 74HC595 к микроконтроллеру будет подключен семисегментный индикатор. 


   Теперь вы имеете общее представление о последовательном периферийном интерфейсе и можно перейти к рассмотрению SPI модуля. 
   SPI модуль микроконтроллера AVR atmega16 использует для своей работы 4 вывода - MOSI, MISO, SCK и SS. Когда модуль не задействован, эти выводы являются линиями портов ввода/вывода общего назначения. Когда модуль включен, режим работы этих выводов переопределяются.

   Микроконтроллеры AVR имеют в своем составе модули, реализующие стандартные интерфейсы. Эти модули используются для обмена данными с различными периферийными устройствами, например, цифровыми датчиками, микросхемами памяти, ЦАП, АЦП, другими микроконтроллерами и так далее. В этой статье, на примере микроконтроллера atmega16, мы разберемся, как работать с модулем последовательного периферийного интерфейса или модулем SPI (serial peripheral interface).


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

  Перейдем к модификации описанного программного UART`a под конкретный камушек. Поскольку пишу я в основном про 8-ми разрядные AVR, то эти контроллеры и будем рассматривать. 
   Во всех микроконтроллерах семейства mega есть аппаратный модуль UART, а вот в микроконтроллерах семейства tiny нет. По идее программный UART может потребоваться именно для младшего семейства, но не исключаю возможность использования этого кода и в mega`ах. Пути эмбеддера неисповедимы.       
   Проекты написаны в двух вариантах – для ATTiny45 и для ATmega16. Впрочем, отличия там очень незначительные и касаются только инициализации и прерывания задействованного таймера. 

 Иногда возникает ситуация, когда аппаратных ресурсов микроконтроллера не хватает или требуемый ресурс в его составе отсутствует. Решить эту проблему можно двумя способами – заменить используемый микроконтроллер на другой или реализовать требуемый ресурс программно. Оба способа имеют свои достоинства и недостатки, однако второй вариант часто более предпочтительный, а иногда и единственно возможный. Например, как в случае с 1-Wire интерфейсом, который не поддерживается аппаратно ни в одном 8-ми разрядном микроконтроллере AVR. 
   В этой статье рассмотрена реализация программного UART`а, которую можно модифицировать под любой микроконтроллер, программируемый на Си.