Поделки с микроконтроллерами avr: примеры решений

Микроконтроллер своими руками

Пытаясь освоить контроллеры и уже владея навыками программирования ПЛИС, мне пришла в голову дурная мысль. Пришла, постучала и вошла. Всем тем, к кому приходят дурные мысли, и кому интересно как с этим явлением справляются другие, посвящается.

Возникла идея нарисовать свой контроллер, не ограниченный по количеству периферии, ОЗУ и другим параметрам, кроме ёмкости ПЛИС. Скажем контроллер содержит 5 UARTов, а позарез нужен шестой, придётся изворачиваться.

А зачем, если можно просто щёлкнуть мышкой и добавить необходимое? Или наоборот, задачка хорошо решается на пяти контроллерах с разрядностью 5, 32, 20, 32 и 20 с непредсказуемым количеством линий связи между ними. Жалко использовать пять 32 разрядников, ресурс всегда жалко, а совмещать две подзадачи на одно ядро – некрасиво, что ли.

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

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

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

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

Рис. 1. Таймеры. Добавляй сколько хочешь. Обратите внимание на грамматическую ошибку. Стыдно, но не хочется Builder устанавливать для перекомпиляции.

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

Да и денег это не пронесло, поэтому и делиться нечем. Сразу скажу, что контроллер состоялся, прошит в Спартаны всех поколений и успешно трудится на просторах СНГ и одной стране Прибалтики. Сейчас бы многое было сделано по другому, но любые изменения мне уже ленивы и, что случилось, то случилось. А случилось вот что. — Разрядность контроллера от 1 до 32, со знаком или без оного.

(Не помню проверял ли я работу на малых разрядностях). Используется дополнительный код. — Количество портов ввода/вывода ни чем не ограничена, разрядность ограничена разрядностью ядра. — Количество таймеров так же не ограничено. На каждый таймер можно установить свой обработчик прерывания.

— Обработчик прерываний с бесконечным количеством входов, каждый вход имеет приоритет от 0 до 99 (ограничение по причине «и так большого числа»). Возможность запрещать все прерывания или низкоприоритетные только. — Количество последовательных портов типа UART неограниченно, разрядность ограничена разрядностью ядра.

— Делитель частоты сделан плохо и неправильно, но исправно выдаёт любую частоту для любой периферии или просто наружу контроллера. — Сопроцессор. О нём ниже. То есть мы имеем контроллер, поддерживающий основные операции арифметики и прочего изменения битов в словах (плюс, минус, сдвиг, побитовая логика…).

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

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

Хотелось бы рассказать про код команд, но сам не помню из чего он состоит. Исходя из принципа «не использовать то, что не используется» даже длинна кода команды является величиной не константной, тем более его содержимое. Скажем, если в компилируемой программе встречается 14 команд, то каждая команда кодируется 4 битами, если используется 18 команд – выделяется пятый бит.

Плюс к каждой команде добавляется бит длинны, если он равен 0, то команда одинарная, если 1 – двойная, или наоборот, это не важно. Двойная команда нужна для операций, содержащих адрес ОЗУ или ПЗУ.

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

Ну, конечно, все конструкции языка не поддерживаются, только основные по пересылке данных и их изменении.
Рис. 2. Руководство достаточно скромное. Нескромное так и не написано.
Рис. 3. Вторая часть руководства. Не знаю почему, но окно расширить нельзя. Есть ещё и третья часть, но уж совсем скучная. И, естественно, мы имеем стековый контроллер.

То есть Форт функционирует в своей естественно среде – в стеке, в аппаратном стеке, а не медленном программном. «Всё за такт!» — второй девиз проекта. Аппаратный стек позволил при переходе в функции или вызове прерывания сразу приступать к выполнению команд обработки данных, без необходимости сохранять контент прерванного процесса.

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

Адрес прерванного кода сохраняется в другом стеке, и максимальное количество прерванных процессов зависит только ото глубины Стека Возвратов. Это величина настраивается при компиляции, хоть бы и «очень большое число». Параметры в функции передаются так же через стек. Stackcpu – именно так и называется контроллер, почему-то латиницей, хотя писать код можно и кириллицей. Что я и делаю, приведу пример функции «меняем_биты_в_слове»::меняем_биты_в_слове читаем_из_нужного_порта, меняем_прочитанное_из_нужного_порта, записываем_в_требуемую_ячейку_памяти;
Где: «читаем_из_нужного_порта», «меняем_прочитанное_из_нужного_порта», «записываем_в_требуемую_ячейку_памяти» — функции, выполняющие определённые действия.

Ну не псих ли я красиво ли? Приведу ещё доказательства, программа управления светофором:

\main BEGIN зелёный потушить, жёлтый потушить, красный зажечь. пятьдесят секунд ждём… зелёный потушить, жёлтый зажечь, красный потушить. четыре секунды ждём… зелёный зажечь, жёлтый потушить, красный потушить. сорок секунд ждём… зелёный уменьшить_яркость_до_нуля, жёлтый гори, а красный не_гори. четыре секунды ждём…
0 UNTIL бесконечный цикл

Ну что, псих красиво? Третий принцип проекта: «Литературный язык в управление электроникой!» Хотя, как показала практика, писать так программы довольно утомительно. Для знатоков Форт сообщу, что точку мой компилятор воспринимает как разделитель, и запятую тоже. Конечно, лучше использовать язык С, но компилятор С мне не по зубам, а использовать сторонние компиляторы архитектура не позволяет.

Рис. 4. Среда разработки с отчётом компилятора и линковщика. Сколько ёмкости FPGA занимает контроллер? Да кто ж его знает. Всё зависит от разрядности числа, выбранной периферии, ещё чего-то, и от текста программы. В контроллере не будет умножителя, если он не встречается в программном коде, или не будет делителя, если его не использует программист. Под программистом я подразумеваю себя, так как других программистов данного контроллера не существует (принцип «не использовать тем, кто не использует»). По блочной памяти для ОЗУ данных и ПЗУ команд: минимум два блока, максимум вся блочная память кристалла. Максимальная частота работы высчитывается только опытным путём, под конкретную архитектуру. Один из моих 24 разрядных контроллеров не работал на частоте 48 Mhz в Spartan2, на частоте 40Mhz заработал. В Spartan6 на сотне Mhz работал 32 разрядный. А может и на паре сотен заработает, ничего в нём такого сложного нет.
Рис. 5. Вот такой код увидит процессор. Обратите внимание, одна команда FORTH – это одна команда ядра процессора – один системный такт.

Первый PS: упомяну одну возможность сопроцессора – фильтр. Обычный БИХ фильтр. Но вот, что необычного в нём, так это то, что он использует плавающую точку. Не то что б в этом был какой-то смысл, просто прочитал какую-то книжку про форму представления чисел, и решил: ерунда интересна эта ваша плавающая точка, сделаем.

Рис. 6. Моделирование результатов работы фильтра. Высчитывается логика кода VHDL с точностью до битика. Так же были планы по превращения проекта в систему на кристалле: добавление различных, писанных на VHDL блоков в периферию контроллера. И вроде не так уж и сложно, но запал иссяк. Дурные мысли меня покинули, и бродят где-то между программистами и электронщиками. И зовут их теперь Стартапами. Так что, если к вам кто-то придёт и представится Стартапом, подумайте, а не скрывается ли под ним какой-нибудь Времяубиватель.

И ещё одно PS: С другой стороны, за время работы над проектом Stackcpu я неплохо подучил три два языка программирования:

1. FORTH, точнее некое его подмножество, необходимое для проверки работоспособности контроллера. 2. С++, на чистом С было бы тяжело написать среду разработки и компилятор.

3. VHDL, именно буквы этого языка и есть контроллер.

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

Собственно контроллер (половина мегабайта): cloud.mail.ru/public/1cdf4b1d4799/StackCPU.rar

Источник: https://habr.com/post/229587/

Основы программирования микроконтроллеров AVR

Доброго дня уважаемые друзья!
Приветствую Вас на сайте «Мир микроконтроллеров»

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

Стартовый набор начинающего микроконтроллерщика

Для начала я бы разделил начинающих микроконтроллерщиков на три условные группы: — радиолюбители, желающие собирать готовые решения на микроконтроллерах, но не имеющие желания изучать программирование — желающие освоить программирование и собирать конструкции на микроконтроллерах, но выбравшие наиболее простой путь — Arduino

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

Для первой группы все очень просто:
— приобрести программатор и научиться с ним работать

Для второй группы остановлюсь немного подробнее. Arduino ориентированна на начинающих, непрофессиональных пользователей, и состоит из двух частей — программной и аппаратной.

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

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

Научиться программировать в Arduino очень просто (поэтому программы на Arduino называются «наброски») — весь процесс программирования сводится в основном к выбору необходимых готовых библиотек для получения конкретного результата.

Читайте также:  Что такое квадрокоптер и его применение - arduino+

Аппаратная часть состоит из готовой платы с микроконтроллером с необходимой обвязкой для нормальной работы микроконтроллера и плат расширения (шилды). Кроме того выпускается множество готовых датчиков и исполнительных устройств. Весь процесс сборки конструкции на Arduino напоминает конструктор «Лего» — выбираете необходимые платы расширения и устройства и стыкуете их с основной платой. Для загрузки программы отдельный программатор не требуется.

Arduino вещь конечно хорошая, но предназначена в основном только для тех, кто хочет собирать конструкции на микроконтроллерах, но не хочет загружать свои мозги лишними (по их мнению) знаниями (это сугубо мое мнение).

Ну а мы причислим себя к третьей группе и пойдем хотя и тернистым, но очень интересным путем.

Для того, чтобы начать практическое изучение как устройства, так и программирование микроконтроллера, нужно иметь минимальную материальную базу — стартовый набор. Стартовый набор, необходимый по моему разумению для освоения микроконтроллера можно приобрести в интернет-магазине сайта «МирМК-SHOP» (так-что эту статью можно считать и коммерческой рекламой :)):

Хочу отметить комментарий одного читателя сайта.

К сожалению комментарий куда-то улетучился, и не сохранилось даже имя читателя, но человек подметил очень точно — это не первый вариант набора, а уже третий, более дорогой — изменилась комплектация набора, она стала более расширенной, добавлены новые (нужные) комплектующие (прошу читателя сайта, оставившего комментарий, меня извинить за ошибку работы сайта). Я не пытаюсь навязать читателям сайта что-то купить в интернет-магазине сайта. Это совсем необязательно, можете заказать у Китайских товарищей.

А теперь к главному: 1. Для практических опытов нам потребуется микроконтроллер (а лучше три): — наиболее популярные и востребованные микроконтроллеры — ATmega8A-PU и ATtiny2313A-PU, ATtiny13A- PU. Кстати, ATtiny13 очень популярный МК, и не зря его называют «малюткой» — малые возможности — но серьезные разработки. 2.

Для записи программы в микроконтроллер необходим программатор: — идеальное решение, на мой взгляд, — программатор USBASP, от которого мы к тому-же будем получать напряжение 5 Вольт для будущих конструкций. 3.

Для визуальной оценки и выводов результатов работы программы необходимы средства отображения информации: — светодиоды — семисегментный светодиодный индикатор — знакосинтезирующий (буквенно-цифровой) LCD дисплей 4.

Для изучения процессов общения микроконтроллера с другими устройствами: — цифровой датчик температуры DS18B20 и часы реального времени DS1307 (очень практичные устройства) 5.

Кроме того нам потребуются транзисторы, резисторы, кварцевые резонаторы, конденсаторы, кнопки: — биполярные транзисторы структуры NPN и PNP — набор резисторов различного номинала — кварцы (вот тут я выкинул лишнее) на 32,768 кГц, 8 МГц. — керамические конденсаторы на 22 pF — тактовые кнопки 6. Для сборки конструкций на микроконтроллере понадобится макетная плата для монтажа без пайки и набор перемычек к ней: — макетная плата МВ102 (идеально иметь две такие платы — они стыкуются между собой, что очень пригодится в дальнейшем)

— соединительные перемычки к макетной плате трех типов — гибкие (мама-мама, папа-папа) и жесткие П-образной формы

Получается вот такой набор:

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

С материальной базой разобрались, переходим ко второму вопросу.

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

Честно говоря, выбор языка программирования и среды разработки вопрос очень ответственный, навязывать кому-то свои предпочтения и что-то советовать дело довольно-таки трудное. Давайте попробуем подойти к этому выбору не предвзято, чисто с практической стороны. 1.

Существует два основных языка программирования микроконтроллеров — Ассемблер (язык низкого уровня) и Си (язык высокого уровня). Если мы хотим программировать микроконтроллеры используя полностью все их возможности (а мы это хотим), то необходимо изучать эти два языка. 2.

Среда разработки для программирования микроконтроллеров. Тут выбор большой и очень много мнений. Поэтому можно сказать: «Каждая лягушка хвалит свое болото».

Мне, к примеру, очень нравится малораспространенная графическая среда разработки «Algorithm Builder», и «квакать» о ее преимуществах перед другими программами я могу очень долго. Но будем делать выбор, как было сказано выше, не предвзято и практично.

Микроконтроллеры AVR выпускает фирма Atmel, она же предоставляет в наше распоряжение бесплатную среду программирования «Atmel Studio» (бывшая AVR Studio). На ней мы и остановимся.

Интегральная среда разработки (IDE — Integrated development environment) Atmel Studio позволит нам: — писать программы как на Ассемблере, так и на Си (Почему на Си. Программа «Atmel Studio» позволяет писать программы на трех языках (О чем мы и погорим в первой статье), но есть одно но: программы на Си++ мы рассматривать не будем, по одной причине, и в следующей статье я расскажу об этом — отладить программу — перевести программу в машинный код (откомпилировать)

— записать программу в микроконтроллер

Все, выбор мы сделали:

Теперь осталось выполнить два пункта: 1. Обзавестись каким-нибудь стартовым набором (для начала хватит и микроконтроллера ATmega8, нескольких светодиодов, пары кнопок и сопротивлений к ним). 2.

Установить (именно установить, а не скачать, и с регистрацией) с официального сайта Atmel (http://www.atmel.com/ru/) программу Atmel Studio.

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

Отдельной статьи по Atmel Studio я писать не буду, будем изучать ее постепенно, по мере надобности и в связке со статьями по устройству и программированию микроконтроллеров.

3. Я добавил в набор очень нужную вещь, она Вам в дальнйшем очень пригодится — USB-TTL преобразователь (конвертер).

Почему пригодится:
— русифицируя программу мы установили «Visual Studio-2015», кто не русифицировал программу — установите последнюю версию «Visual Studio», мы не только будем изучать базовую программу «Atmel Studio».

К сожалению, на сегодняшний день только программа 2015 года позволяет перейти на русский язык в «Atmel Studio», но а мы с Вами, в «Visual Studio», будем создавать оболочки для работу с МК.

Следующие статьи

1. Русификация программы Atmel Studio

Источник: https://microkontroller.ru/programmirovanie-mikrokontrollerov-avr/programmirovanie-avr/

Проекты Altera Quartus II для плат Марсоход, Марсоход2 и Марсоход3

Меня часто спрашивают: “Чем отличается микроконтроллер от ПЛИС?” Ну что тут можно ответить? Это как бы разные вещи… Микропроцессор последовательно выполняет команды, описанные в его программе. Работа ПЛИС в конечном счете определяется принципиальной электрической схемой, реализованной внутри чипа.

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

В ПЛИС можно, например, попробовать реализовать даже и микроконтроллер! Попробуем?

Один из самых распространенных микроконтроллеров – это 8-ми разрядные RISС процессоры семейства AVR компании Atmel. В этой статье я расскажу как реализовать “почти” совместимый с AVR микроконтроллер внутри нашей ПЛИС на плате Марсоход.

Прежде, чем начинать делать свою реализацию микроконтроллера, конечно, следует изучить внутренности контроллера AVR. Нужно как минимум знать систему команд микропроцессора AVR. На нашем сайте можно скачать его описание:

Система команд микроконтроллера AVR ( 703303 bytes )Мы не будем ставить себе целью полностью повторить поведение чипа Atmel, мы хотим сделать наш микропроцессор лишь частично совместимым. Полностью повторить можно, но нужна ПЛИС гораздо большего объема.

У нас на плате Марсоход стоит CPLD EPM240T100C5, значит у нас есть всего-навсего 240 триггеров и логических элементов.

Кроме триггеров и логики в нашей ПЛИС имеется последовательная флеш память UFM объемом 512 слов по 16 бит.

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

У нас был проект для ПЛИС платы Марсоход, который выполнял чтение из UFM памяти.

“Оперативной памяти” в нашей ПЛИС нет. Ну значит не будет памяти у нашего микроконтроллера, жаль но это нас не остановит.

У микроконтроллера AVR имеется 32 восьмиразрядных регистра общего назначения. Нижняя группа регистров r0-r15 может быть использована только в командах с операндами-регистрами.

Верхняя группа регистров r16-r31 может использоваться в командах и с непосредственными операндами. Поскольку места внутри нашего чипа на плате Марсоход действительно не много, нам придется реализовать только некоторые регистры.

Это довольно существенное ограничение, и его нужно будет учитывать при написании программ для нашего микроконтроллера.

Мы реализуем только 7 регистров: r16-r22:

  • Первые 4 регистра r16…r19 – это просто регистры.
  • Регистр r20 – это тоже обычный регистр, только его биты мы подключим к 8-ми светодиодам платы Марсоход.
  • Регистр r21 – это тоже обычный регистр, но его биты мы подключим к выводам управления шаговых двигателей на плате Марсоход.
  • Регистр r22 – только для чтения. К нему подключены входы от 4-х кнопочек платы Марсоход.

Схема нашего микроконтроллера создана в среде Altera QuartusII и выглядит вот так (нажмите на картинку, чтобы увеличить):

Наш микроконтроллер работает по простому алгоритму:

  1. Считывает из флеш памяти UFM очередную команду.
  2. Декодирует команду и выбирает для нее нужные операнды из регистров или непосредственно из кода команды.
  3. Выполняет команду в арифметико-логическом устройстве.
  4. Запоминает результат исполнения команды в регистре приемнике, определяемом командой.
  5. Переходит к исполнению следующей команды.

У нас сейчас нет цели сделать высокопроизводительный микроконтроллер, мы не будем делать конвейерную обработку данных. Это объясняется тем, что команды из флеш памяти чипа мы можем считывать только в последовательном формате, то есть на чтение одной команды нужно как минимум 16 тактов. Быстрее здесь сделать нельзя (да нам и не нужно сейчас).

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

Перечислим команды микроконтроллера AVR, которые мы собираемся реализовать:

ADD  0000 11rd dddd rrrr
SUB  0001 10rd dddd rrrr

AND  0010 00rd dddd rrrr

EOR  0010 01rd dddd rrrr
OR   0010 10rd dddd rrrr
MOV  0010 11rd dddd rrrr

CP   0001 01rd dddd rrrr

LSR  1001 010d dddd 0110

SUBI 0101 KKKK dddd KKKK

ANDI 0111 KKKK dddd KKKK
ORI  0110 KKKK dddd KKKK
CPI  0011 KKKK dddd KKKK
LDI  1110 KKKK dddd KKKK

BREQ 1111 00kk kkkk k001

BRNE 1111 01kk kkkk k001
BRCS 1111 00kk kkkk k000
BRCC 1111 01kk kkkk k000

Слева написаны названия команд, а справа – их бинарное представление (кодирование). Так буква “r” обозначает регистр источник, буква “d” – регистр приемник, “K” – это непосредственно операнд.

Читайте также:  Все аналоги ардуино - arduino+

Конечно – это только малая часть от “настоящей системы команд”, но уже и эти команды позволять писать вполне работающие программы.
У нас будет упрощенное АЛУ (Арифметико-Логическое Устройство). Оно реализует только некоторые, наиболее употребительные команды, а так же всего 2 флага для условных переходов: “Z” и “C”.

Флаг “Z” устанавливается, если результат АЛУ это ноль. Если результат из АЛУ не нулевой, то флаг “Z” сбрасывается. Флаг “C” устанавливается при возникновении переноса в арифметических операциях ADD и SUB/SUBI или сравнения CP/CPI. Флаги влияют на исполнение команд условных переходов: флаг “Z” влияет на BREQ, BRNE, а флаг “C” влияет на BRCS, BRCC.

Вообще всеь проект мы уже реализовали и его можно взять здесь:

Ядро микропроцессора Atmel AVR ( 109584 bytes ).
Исходный текст нашего ядра AVR написан на языке Verilog и его можно посмотреть здесь.

Теперь посмотрим, как мы сможем написать программу для нашего микроконтроллера? Для написания программы на языке ассемблер воспользуемся средой разработки компании Atmel AVRStudio4.

Эту среду разработки можно скачать прямо с сайта компании Атмел (после регистрации), вот здесь. Или поищите в яндексе – наверняка найдете в свободном доступе.

Создаем проект в AVRStudio4 и пишем простую программу. Программа будет моргать светодиодом на плате Марсоход и опрашивать состояние нажатых кнопочек. Если нажать одну кнопочку, то моргающий светодиод “побежит” в одну сторону, а если нажать другую кнопочку, то светодиод “побежит” в другую сторону. Вот исходный текст на ассемблере для нашего примера:

.include “1200def.inc”.device AT90S1200.cseg.org 0start:

;initial one bit in register

ldi    r16,$80rd_port:

;read port (key status)

mov    r17,r22 cpi r17,$0f

;go and blink one LED if no key pressed

breq do_xor cpi r17,$0e

;go and right shift LEDs if key[0] pressed

breq do_rshift cpi r17,$0d

;go and left shift LEDs if key[1] pressed

breq do_lshift

;jump to read keys

or    r16,r16 brne rd_portdo_rshift: cpi r16,1 breq set80 lsr    r16 mov    r20,r16 brne pauseset80:     ldi    r16,$80 mov    r20,r16 or    r16,r16 brne pausedo_lshift: cpi r16,$80 breq set1 lsl    r16 mov    r20,r16 brne pauseset1:     ldi    r16,$01 mov    r20,r16 or    r16,r16 brne pausedo_xor: eor    r20,r16pause: ldi    r18,$10cycle2: ldi r19,$FFcycle1: or    r19,r19 or    r19,r19 subi r19,1 brne cycle1 subi r18,1 brne cycle2 or    r16,r16     brne rd_port

Видите? Чтение состояния кнопочек – это чтение из регистра r22. Изменение состояния светодиодов – это запись в регистр r20.Настройте AVRStudio так, что бы выходной формат был “Generic”. Это в свойствах проекта, “Assembler Options”, настройка “Hex Output Format”.

После компиляции программы получается вот такой текстовый файл с кодами программы:

000000:e800000001:2f16000002:301f000003:f0c1000004:301e000005:f021000006:301d000007:f059000008:2b00000009:f7b900000a:300100000b:f01900000c:950600000d:2f4000000e:f47100000f:e800000010:2f40000011:2b00000012:f451000013:3800000014:f019000015:0f00000016:2f40000017:f429000018:e001000019:2f4000001a:2b0000001b:f40900001c:274000001d:e12000001e:ef3f00001f:2b33000020:2b33000021:5031000022:f7e1000023:5021000024:f7c9000025:2b00

000026:f6d1

Этот файл нам почти подходит для QuartusII. В нашем проекте для ПЛИС есть файл avr_prog.mif (Memory Initialization File), куда мы и вставляем полученный из AVRStudio код (только нужно добавить точку с запятой в конце каждой строки). Таким образом, после компиляции QuartusII эти коды попадут во флеш  UFM нашей ПЛИС.

Теперь можно компилировать и пробовать наш проект в плате Марсоход. Вот видеоролик, демонстрирующий работоспособность нашего процессора:

Все работает так как и задумывалось!
Обратите внимание, что после компиляции, весь проект занимает только 205 логических элемента из 240 имеющихся в нашей ПЛИС. Это значит, что наш микроконтроллер можно и дальше усложнять или добавить какую-то новую логику. Так что проект может быть полезен для создания Ваших устройств.

Источник: https://marsohod.org/projects/66-makeavr

Работа с АЦП на микроконтроллерах AVR. Измеряем напряжение. Пример на Attiny13 — Community «Электронные Поделки» on DRIVE2

Здравствуй, любитель микроконтроллеров!

Zoom

Готовая плата

Пролог

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

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

Схема и алгоритм

Для отладки прошивки набросал схему в протеусе. Сверху светодиод, который мы будем зажигать при поднятии напряжения. Чуть ниже индикатор поднятия напряжения из 6 светодиодов.

Ниже для АЦП собран делитель напряжения на резисторах R4 и R5.

Чтобы эмитировать изменение напряжения в бортовой сети автомобиля, добавил еще резистор R6, и переменный резистор RV1 — на готовой плате их, конечно же, не будет.

Zoom

Примерная схема в протеусе

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

Здесь хотелось бы отметить, что конденсатор 100n правильнее было бы поставить параллельно резистору R5, а не так как он стоит сейчас.

Ну и резисторы на светодиоды индикатора я поставил по 200 Ом (какие уж были), все равно достаточно ярко.

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

25В, то загорается второй светодиод. Поднялось на 0.5В — загорается третий и т.д. Т.е. шакала деления индикатора — 0.25В. Для нашей задачи этого достаточно. При поднятии напряжения минимум на 0.5В, мы реагируем на это и включаем верхний светодиод.

Да не просто включаем, а подаем ему ШИМ сигнал с эффектом дыхания (Хотел проверить, не будет ли ШИМ давать помехи на АЦП). Если напряжение снижается, то ШИМ сигнал на светодиод отключается.

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

Чтобы не было совсем скучно, добавил анимацию индикатора поднятия напряжения каждые 10 секунд. Бегущий огонек в сторону повышения и обратно.

Видео работы в автомобиле

А мне нужен индикатор-вольтметр, как сделать?

Да легко и просто, немного подправив прошивку.

А если еще освободить ногу контроллера, на которую мы подаем ШИМ сигнал, и использовать ее в индикаторе, то мы получим целых 12 светодиодов вместо 6! При реализации вольтметра стоит посмотреть: достаточно ли точно держит напряжение стабилизации стабилитрон при изменении температуры или же стоит заменить параметрический стабилизатор на что-то другое.

Исходный код, прошивку, модель в протеусе, макет платы можете скачать здесь.

Желаю творческих успехов!

Источник: https://www.drive2.com/c/457511737193688175/

Программирование AVR микроконтроллеров для начинающих

материалы в категории

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

часть1

Эта статья предназначена для начинающих, и тех, которые немного имеют представление о том, что такое микроконтроллер, и понимают что такое алгоритм. Вы узнаете насколько легко и быстро можно создавать цифровые устройства на основе микроконтроллеров AVR и, “вдыхать” в них жизнь, подчиняющуюся Вашим законам (алгоритму).

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

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

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

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

, всегда запускаю Flowcode и алгоритм быстро,  как бы сам собой, превращается в готовую прошивку.

Версии используемых в статье программ: ISIS Proteus Professional 7, и Flowcode AVR v4.3.6.61. Установите указанные программы на Ваш компьютер, и начнём работать.

1. Создадим схему нашего устройства, используя ISIS Proteus Professional.

Для начала создайте папку для выходных файлов проектов в корневом каталоге любого из дисков С или D или другого (например с именем “myprojects”), причём имя папки должно быть латинским (это для того что бы не ругался Flowcode, и не было потом проблем с компиляцией программы). Да и Вам будет удобно, будете знать, где лежат файлы Ваших проектов.

Открываем или запускаем (кому как нравиться называть) ISIS Proteus Professional. Далее в выпадающем меню файл выбираем «сохранить проект как», или на английском «save as …», указываем путь сохранения файлов проекта (наша папка в корневом каталоге диска “myprojects”). Ну и вводим имя файла “svetofor” например, жмём кнопку сохранить. (см. рис.1,2)

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

Для этого в выпадающем меню «Библиотека» выбираем «выбор устройства» (рис.3), можно просто нажать кнопку «Р», в появившемся окне в поле «маска» набираем “attiny”(рис.4), и два раза кликнем по “attiny13”.

Микроконтроллер теперь добавлен в список наших устройств. (рис.5)

Далее выберем чем управлять микроконтроллеру, (в светофоре красный, желтый, зелёный) свет. Выбираем светодиоды, в поле «маска» набираем “led” , в категории “optoelectronics” выбираем (два раза кликаем на каждом) “led-red”, “led-green”, “led-yellow” .(рис.6)

Теперь поскольку падение напряжения на светодиодах 2.2в, а питание у нас 5в., то нужно ставить ограничительные резисторы, для того, чтобы не вывести из строя порты (выходы) микроконтроллера. В поле маска “resistor”, в  категории “modeling primitives” находим наш резистор “analog resistor primitive” и тоже два раза кликаем. (рис.7)

Всё! Для построения модели нашего устройства у нас почти все есть (рис.8). Почему почти спросите Вы? Казалось бы, всё есть – «мозг» и «исполнительное устройство», но это не совсем так, поскольку нужен еще источник питания устройства, а точнее его модель. Ну об этом ниже. Начинаем собирать схему.

Правой кнопкой мыши кликаем на чистом листе и в появившемся меню выбираем «разместить», «компонент», “attiny13”(рис.9,10). Затем наши три светодиода и три резистора (рис.11). Далее выбираем «разместить», «терминал», “ground” .

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

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

Теперь выбираем выводы микроконтроллера, которые нам нужно будет запрограммировать на вывод данных (выход).

Но нужно учесть, что вывод 1 (порт В5) нужен ещё и в качестве “RESET” для программатора, поэтому если мы его задействуем, то запрограммировать микроконтроллер сможем один только раз.

Поэтому его трогать не будем, по крайней мере пока. И так обозначим себе следующее:А.  порт В0 будет управлять красным светодиодом(вывод 5);Б.  порт В1 – желтым(вывод 6);

Читайте также:  Уроки ардуино: создаем своими руками бесконтактный переключатель

В.  порт В2 – зелёным(вывод 7).

Устанавливаем карандашик на нужный вывод, кликаем левой кнопкой мыши и соединяем порты микроконтроллера с ограничительными резисторами(рис.12,13).

 Аналогично соединим светодиоды по схеме с общим катодом, и подключим каждый анод на нужный резистор: красный на R1; желтый на R2; зелёный на R3 (рис.14).

Любуемся созданной схемой, и замечаем что номиналы резисторов сильно велики для зажигания светодиодов, нужно где то порядка 300 Ом, а у нас 10кОм. Кликаем правой кнопкой на резисторе, выбираем в выпадающем меню «правка свойств», и устанавливаем нужный номинал резисторов (рис.15,16,17).

Вот теперь уже схема модели устройства под названием «светофор» готова. Можно на всякий случай нажать на дискетку и сохранить файл нашего проекта.

Ниже- все тоже самое, только уже видео

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

Источник: http://radio-uchebnik.ru/txt/15-avr-mikrokontrollery/124-prostye-proekty-na-avr-mikrokontrollerakh

4-канальный ШИМ-контроллер на микроконтроллере AVR. Часть 1

» Схемы » Применение микроконтроллеров

01-02-2010

John Giffard, Mark Lewin

Широтно-импульсная модуляция очень часто используется для регулировки/управления источниками света, двигателями. Целью данного проекта было создание дешевого устройства – ШИМ-контроллера, которое будет полезно во многих областях.

Изначально основой конструкции был выбран микроконтроллер компании Atmel ATMega32, т.к.

имеющаяся периферия легко позволяла организовать не только многоканальный ШИМ с управлением по последовательному интерфейсу, но и добавить аналоговый интерфейс управления, клавиатуру и LCD-индикатор для организации пользовательского интерфейса, а также получить дополнительные выходные линии общего назначения. Однако, не проигрывая в функциональности, может использоваться и микроконтроллер ATMega16 (это учтено при разработке программного обеспечения). Рабочая частота выбрана из расчета возможности использования микроконтроллеров ATMega32L и ATMega16L.

Данная версия 4-канального 8-битного ШИМ-контроллера сконструирована с использованием микроконтроллера ATmegа16.

Устройство сдержит интерфейс RS232 для управления с компьютера, интерфейс для 12-кнопочной клавиатуры и 4 аналоговых 10-битных канала для подключения потенциометров. Для отображения текущих режимов работы и параметров имеется 4-х строчный LCD-дисплей.

Дополнительно ШИМ-контроллер имеет: 4 выхода на светодиоды, для индикации режимов управления (могут быть задействованы в роли выходов общего назначения), 3 выхода общего назначения.

Устройство имеет очень гибкие настройки.

Например, параметры работы каналов ШИМ могут управляться посредством команд с компьютера, посредством аналоговых регуляторов (потенциометры) или с помощью клавиатуры (с отображением пользовательского интерфейса на LCD-индикаторе). Самим LCD-индикатором также возможно управлять через RS232, отображение текущих установок и режимов возможен в числовом, либо в графическом формате.

Основные характеристики устройства:

  • 4-канала ШИМ, разрешение 8 бит, частота ШИМ – 31 кГц;
  • интерфейс RS232 для управления и контроля с PC;
  • простое схемотехническое решение с минимальным количеством внешних элементов;
  • 12-кнопочная клавиатура;
  • возможность аналоговой регулировки;
  • до 7 выходных линий общего назначения;
  • 4-строчный LCD-дисплей;
  • управление LCD-дисплеем через последовательный интерфейс;
  • пользовательское меню;
  • гибкие настройки;
  • программная реализация буферов FIFO для ускорения работы.

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

Благодаря таким гибким настройкам, выбирая соответствующую настройку, ШИМ-контроллер может использоваться в различных приложениях и как самостоятельное устройство.

В конструкции используется микроконтроллер ATmega16, минимальное количество внешних элементов, поскольку весь контроль и управление выполняет сам микроконтроллер.

Для пользователя возможно использование только необходимых компонентов, например, LCD-индикатор, если в нем нет необходимости, может быть исключен.

Логическая схема устройства.

Принципиальная схема устройства

Кликните для увеличения

Схемотехническое решение очень простое. Для тактирования микроконтроллера выбран кварцевый резонатор 8 МГц, источник питания +5.0 В собран на интегральном стабилизаторе LM7805, индуктивность 10 мкГн и конденсатор 100 нФ – образуют фильтр, предотвращающий проникновение помех при переключениях в аналоговых цепях.

Преобразователь логических уровней MAX232 используется для реализации последовательного интерфейса. LCD-индикатор на чипсете Hitachi (HD44780) с разрешением 20×4 либо 40×2. Узел управления подсветкой индикатора реализован на транзисторе MJE3055T (возможно использование более дешевого аналога).

Матрица клавиатуры, стандартная, 4×3.

После подачи питания, микроконтроллер устанавливает последние сохраненные параметры в EEPROM: режимы управления каналами ШИМ (аналоговое управление, управление по последовательному интерфейсу, управление с клавиатуры), формат отображения параметров на индикаторе (управление по последовательному интерфейсу, отображение значений ШИМ, отображение аналоговых значений), а также состояние выходных линий общего назначения, состояние подсветки дисплея.

ШИМ генерация присутствует всегда на всех четырех каналах после подачи питания.

Пользователь может настроить все параметры ШИМ-контроллера, используя последовательный интерфейс, посылая управляющие команды, а затем сохранить все сделанные настройки в EEPROM памяти микроконтроллера.

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

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

Для примера практической реализации устройства и ШИМ управления различными внешними устройствами приведена следующая схема.

В данном примере показаны схемотехнические решения для подключения к 4 каналам ШИМ двигателя вентилятора, мощного светодиода семейства Luxeon Star, преобразователь ШИМ-напряжение на операционном усилителе LM358.

А также для возможности тестирования выходных линий общего назначения подключены светодиоды.

Пример реализации выходных каскадов ШИМ-контроллера

Кликните для увеличения

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

 circuitcellar.com

Источник: https://www.rlocman.ru/shem/schematics.html?di=62862

Записки программиста

Видели когда-нибудь светодиодную матрицу с бегущей по ней строкой текста? Такие можно увидеть в метро, автобусах, аеропортах, да много где. В одной матрице содержатся сотни светодиодов.

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

Так как же это тогда работает?<\p>

Матричная схема

Первой способ заключается в использовании матричной схемы:

Резисторы на этой схеме имеют сопротивление, типичное для подключаемых последовательно со светодиодом резисторов. Например, 220 Ом.

Светодиоды объединяются в матрицу, в соответствии с приведенной схемой. Строки и столбцы подключаются к пинам микроконтроллера. Например, если у микроконтроллера есть 16 свободных пинов, это позволяет сделать матрицу 8×8. Таким образом, используя всего лишь 16 пинов, можно управлять матрицей из 64 светодиодов.

Фокус заключается в том, что на самом деле одновременно горят светодиоды, принадлежащие только одной строке или одному столбцу. Допустим, что микроконтроллеру нужно зажечь LED1, LED3, LED5 и LED8. Сначала он подает высокое напряжение на первый столбец и низкое на второй и третий.

В первом столбце нужно зажечь LED1 и LED3, поэтому микроконтроллер подает низкое напряжение на первую и третью строку, на вторую подается высокое. В результате ток начинает течь через LED1 и LED3. Через все остальные светодиоды ток не идет, так как диод пропускает ток только в одну сторону.

Затем эти светодиоды гаснут и аналогичным образом зажигаются светодиоды в других столбцах.

При достаточно частой смене «кадров» человеческому глазу кажется, что светодиоды горят одновременно. Минимальный FPS в случае со светодиодами составляет 60, но на всякий случай лучше взять 70.

В частности, при FPS 60 присутствует еле-еле заметная рябь. Кроме того, при FPS меньше 70-и если вы сфотографируете светодиоды на iPhone, то на фотографии скорее всего увидите мусор.

В кино и видеоиграх требования к FPS попроще по той причине, что кадры похожи между собой.

Пример использования матричной схемы для управления семисегментными индикаторами:

Смотрите, все работает безо всяких счетчиков 4026, магия! Семисегментные индикаторы идеально вписываются в матричную схему. Как раз у нас три индикатора, в каждом по 7 светодиодов (светодиоды, зажигающие точку, в данном примере не используются) с общим катодом. Получаем матрицу 3×7. Всего при помощи десяти пинов происходит управление 21-м светодиодом.

В общем случае, используя N пинов, можно управлять до (N/2)**2 светодиодами. Кроме того, матричную схему легко модифицировать для считывания состояния кнопок. Наконец, ничто не помешает по аналогии сделать кубическую схему или схему еще большего порядка. В таких схемах дополнительно может потребоваться использовать транзисторы или чипы стандартной логики 74xx.

Чарлиплексинг

Чарлиплексинг (он же метод Чарли) легко объяснить на примере следующей схемы:

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

Если в приведенной схеме подать высокое напряжение на первую строку, низкое на второю и перевести оставшуюся строку в Z-состояние, то ток пойдет через светодиод LED10, а все остальные светодиоды гореть не будут. Часто переключая горящий светодиод, можно создать иллюзию одновременного горения нескольких светодиодов.

Пример использования чарлиплексинга для создания электронных игральных костей:

Чтобы было интереснее, в этом проекте я использовал микроконтроллер ATtiny85, который имеет лишь 8 пинов. Из них два используется для питания и еще один представляет собой Reset. Итого остается 5 пинов. Тем не менее, их оказывается достаточно для управления 14-ю светодиодами, и еще один пин остается для считывания кнопки.

На самом деле, при наличии N пинов, чарлиплексинг позволяет управлять до N*(N-1) светодиодов. То есть, если N равен 4, как в нашем случае, то можно управлять лишь 12-ю светодиодами. К счастью, специфика игральных костей такова, что все светодиоды, кроме центральных, загораются в паре с другим светодиодом. Поэтому получилось аж 14 светодиодов, и при этом довольно удобная разводка.

Чарлиплексинг позволяет управлять куда большим числом светодиодов, чем матричный метод. Однако он сложнее в разводке, и его применимость для управления семисегментными индикаторами или RGB-светодиодами ограничена из-за использования в них общего катода.

Кроме того, его нельзя использовать для считывания состояния кнопок, как матричный метод. Тем не менее, можно исхитриться, и без использования дополнительных пинов считывать пару лишних кнопок, используя пины, находящиеся в данный момент в Z-состоянии.

Заключение

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

Как всегда, буду рад любым вашим вопросам и дополнениям.

Дополнение: В продолжение темы мультиплексирования см Как я спаял электронные игральные кости на базе ATtiny85 и Больше чипов 74xx: сдвиговые регистры и декодеры.

Источник: https://eax.me/avr-multiplexing/

Ссылка на основную публикацию
Adblock
detector