Интересные схемы на attiny2313. Базовая схема для экспериментов с BLDC-моторами (на ATtiny2313). Настройка Geany под ATtiny2313

Описан простой эксперимент с подключением кнопки к AVR микроконтроллеру, разобрана не сложная программа на языке Си для обработки нажатий кнопки. Разберемся с особенностями подключения кнопки к портам МК, а также с методами считывания состояний кнопки на языке Си.

В предыдущих статьях были рассмотрены эксперименты со светодиодами, которые подключались к портам микроконтроллера, сконфигурированных на вывод (Output).

В этой статье мы подключим к микроконтроллеру кнопку, контакты которой при нажатии замыкаются, а при отжатии - размыкаются (замыкающая кнопка).

Принципиальная схема эксперимента

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

Рис. 1. Принципиальная схема эксперимента с микроконтроллером ATtiny2313 и кнопкой.

Как видим, к двум портам PB0 и PB1 через ограничивающие резисторы подключены два светодиода, а к порту PD2 - кнопка и она также с ограничивающим резистором. Для подключения программатора к МК используется разъем Conn 1 (AVR-ISP), а для подключения схемы к отдельному источнику питания +5В предназначены два контакта - P1 и P2.

Рис. 2. Собранная на беспаечной макетной панели схема эксперимента с микроконтроллером и кнопкой.

Важно заметить что для безопасного использования порта с кнопкой, последовательно ей подключен резистор с сопротивлением на 1 КОм (можно подключить и на другое сопротивление 600 Ом - 2 КОм). Примите это как правило хорошего тона в работе с пинами, которое обережет порт МК от выхода из строя в случае ошибочной подачи на пин высокого уровня и при замкнутой кнопке.

Структура портов ввода-вывода в AVR микроконтроллерах

Пины микроконтроллера являются универсальными GPIO (General Purpose Input Output), к ним можно подключать как исполнительные устройства (индикаторы, силовые ключи), так и разнообразные цифровые датчики (кнопки, переключатели).

Несколько пинов в МК могут быть подключены к АЦП/ЦАП (Аналогово-Цифровой-Преобразователь и наоборот), с их помощью можно выполнять анализ и генерацию аналоговых сигналов. Обычные GPIO не умеют работать с аналоговыми сигналами, у них на входе/выходе может быть только 0 (0В) или 1 (+5В).

К каждому пину GPIO внутри микроконтроллера подключены несколько блоков и электронных компонентов, о которых полезно знать:

  • Между пином порта и каждой из шин питания (GND и VCC) подключено по диоду . Они используются для "гашения" кратковременных помех, скачков напряжения относительно пина и каждой из шин питания;
  • Также между пином и GND включен конденсатор . Точно не знаю зачем он нужен, возможно для защиты от помех, для предотвращения дребезга контактов при использовании кнопок и переключателей подключенных к пину, или еще для чего-то;
  • К каждому пину подключен электронный ключ с резистором - это подтяжка пина к напряжению источника питания (Pull-UP) . Данный электронный ключ включается программно и служит для установки по умолчанию высокого логического уровня 1 (+5В) при работе с пином в режиме ввода (Input);
  • Между пином и каждой из шин питания (GND и VCC) включены еще два электронных ключа (без резисторов), они нужны для установки на пине высокого (+5В) или низкого (0В) логического уровня при работе пина в режиме вывода (Output).

Для программного управления и конфигурирования каждого из портов применяются три специальных регистра, к примеру для порта "B":

  • DDRB - регистр (8 бит) для установки режимов работы пинов - на ввод или вывод. Осуществляется установкой соответствующих бит в регистре;
  • PORTB - регистр для управление состоянием пинов порта в режиме вывода - высокий или низкий уровень. Также используется в режиме ввода, применяется для включения подтягивающих резисторов (Pull-UP) и установки высокого уровня на входе по умолчанию;
  • PINB - регистр, который содержит логические состояния пинов в порте, используется для чтения значений портов, которые сконфигурированы в режиме ввода.

Более детально узнать об устройстве портов для конкретной модели микроконтроллера можно из его даташита, в разделе "I/O-Ports", также там могут быть приведены примеры кода на Си и Ассемблере для работы с портами.

Пин RESET в качестве порта ввода-вывода

Полезно знать что пин "RESET" микросхемы (у нас на схеме это пин под номером 1), который предназначен для сброса выполнения программы микроконтроллера (перезагрузки), также можно использовать для подключения кнопок, светодиодов и других устройств ввода-вывода, то есть он может быть превращен в обычный GPIO.

Это может быть полезно если у микросхемы не хватает пинов для вашей конструкции. Например при сборке какого-то устройства на чипе ATtiny13 (8 выводов, 2шт - питание, 5шт - порты ввода-вывода, 1шт -для RESET) у вас оказалось что не хватает одного пина для светодиода. Здесь может быть несколько вариантов решения проблемы:

  1. Перепрограммирование пина с RESET под порт ввода-вывода;
  2. Подключение светодиода к одному из соседних уже использованных пинов, применив некоторые хистросты в схемном решении и с учетом возможности его общего использования;
  3. Использование другого МК у которого больше пинов, например ATtiny2313.

Что из этих вариантов проще и дешевле по финансам/времени - судите по своему случаю.

Для превращения пина "RESET" в порт ввода-вывода придется изменить специальный фьюз - RSTDISBL (Reset Disable). Но прежде чем это сделать нужно помнить что после данной операции перепрограммировать микроконтроллер станет возможным только с применением высоковольтного программатора (на 12В), обычный USB ISP или другой программатор с питанием от 5В сделать свою работу уже не сможет.

Программа на Си

Итак, у нас есть одна кнопка и два светодиода которые подключены к микроконтроллеру, что же с ними можно сделать? - а сделаем мы вот что (алгоритм):

  1. После включения питания светодиоды будут мигать попеременно и с задержкой в 300 миллисекунд;
  2. При нажатии и удержании кнопки будет светиться только синий светодиод;
  3. После отжатия кнопки синий светодиод мигнет 3 раза с задержкой 500 миллисекунд, после чего светодиоды снова будут мигать поочередно и с задержкой 300 миллисекунд.

Пример реализации такого алгоритма на языке Си под AVR приведен ниже. Создадим новый файл для нашей программы и откроем его для редактирования:

Nano /tmp/avr-switch-test.c

Поместим следующий код в тело файла:

/* Эксперимент с кнопкой на ATtiny2313 * https://сайт */ #define F_CPU 1000000UL // Частота ядра = 1 МГц #include #include // -- Макросы для управления светодиодами -- #define LED_BLUE_ON PORTB |= (1 << PB0) // Засвечиваем синий диод #define LED_BLUE_OFF PORTB &= ~(1 << PB0) // Гасим синий диод #define LED_RED_ON PORTB |= (1 << PB1) // Засвечиваем красный диод #define LED_RED_OFF PORTB &= ~(1 << PB1) // Гасим красный диод // Основная программа void main(void) { DDRD |= (0 << PD2); // Пин 6 - на вход PORTD |= (1 << PD2); // Включаем подтягивающий (Pull-UP) резистор для пина 6 DDRB |= (1 << PB0); // Пин 12 - на вывод DDRB |= (1 << PB1); // пин 13 - на вывод // -- Бесконечный цикл -- while(1) { _delay_ms(300); // Задержка 300 мс LED_BLUE_ON; // Включаем синий диод LED_RED_OFF; // Гасим красный диод _delay_ms(300); LED_RED_ON; // Включаем красный диод LED_BLUE_OFF; // Гасим синий диод if(!(PIND & (1 << PD2))) { // Проверяем нажата ли кнопка _delay_ms(50); // Задержка 50 мс (дребезг контактов) LED_RED_OFF; LED_BLUE_ON; while(!(PIND & (1 << PD2))); // Ждем пока кнопка не будет отпущена _delay_ms(500); // Дальше мигаем синим диодом LED_BLUE_OFF; _delay_ms(500); LED_BLUE_ON; _delay_ms(500); LED_BLUE_OFF; _delay_ms(500); LED_BLUE_ON; _delay_ms(500); LED_BLUE_OFF; _delay_ms(200); } // Конец блока работы с кнопкой } // Конец блока с вечным циклом }

Первым делом мы задаем константу F_CPU , которая укажет компилятору рабочую частоту ядра микроконтроллера, это нужно чтобы некоторые подпрограммы и функции работали корректно. В нашем примере используется функция задержки по времени - "_delay_ms" из библиотеки "util/delay.h", которая просчитывает время затраченное на холостые такты, опираясь на значение в константе F_CPU.

Посмотреть код библиотеки "delay" для организации задержки по времени и в котором используется константа F_CPU, можно в GNU Linux при помощи любого текстового редактора, к примеру можно выполнить вот такую команду:

Nano /usr/lib/avr/include/util/delay.h

Заводская установленная частота внутреннего RC генератора в микроконтроллере ATtiny2313 равняется 8000000Гц (8МГц), также по умолчанию установлен фьюз деления частоты - CKDIV8 (Clock Divide by 8), поэтому реальная рабочая частота кристалла = 8000000Гц / 8 = 1000000Гц = 1МГц.

Посмотреть какие фьюзы установлены в микроконтроллере можно при помощи avrdude или же графической оболочке к нему под названием AVR8 Burn-O-Mat .

Дальше в программе определены макросы для управления состоянием портов к которым подключены светодиоды: LED_BLUE_ON, LED_BLUE_OFF, LED_RED_ON, LED_RED_OFF. Вызвав подобный макрос в любом месте программы мы очень просто можем зажечь или погасить каждый из светодиодов, не придется повторять его код, что в свою очередь упростит программу и сделает ее более наглядной.

В основной программе "void main(void)" мы начинаем работу с конфигурации портов:

  • DDRD |= (0 << PD2) - установка разряда PD2 регистра DDRD на ввод, к нему подключена кнопка (пин 6);
  • PORTD |= (1 << PD2) - включение подтягивающего резистора для пина к которому привязан разряд PD2 регистра PORTD (пин 6);
  • DDRB |= (1 << PB0) - установка разряда PB0 в регистре DDRB на вывод, к нему подключен СИНИЙ светодиод (пин 12);
  • DDRB |= (1 << PB1) - установка разряда PB1 в регистре DDRB на вывод, к нему подключен КРАСНЫЙ светодиод (пин 13).

Дальше, используя макросы, мы гасим красный светодиод и зажигаем синий. Теперь при помощи еще одного вечного цикла но у же с условием мы выполним ожидание до того момента, пока кнопка не будет отжата: "while(!(PIND & (1 << PD2)));".

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

После этого выполняется трехразовое мигание (включение-выключение) синего светодиода с задержкой в 0,5 секунды и основной вечный цикл начинает работу по новому - будут поочередно зажигаться два светодиода.

Очень простая программа, но тем не менее, она является хорошим примером и почвой для дальнейших экспериментов.

Настройка Geany под ATtiny2313

В предыдущих публикациях я проводил эксперименты с микроконтроллером ATMega8, здесь же используется менее "нафаршированный" МК - ATTiny2313.

Для компиляции программы и прошивки ее в МК следует немножко перенастроить команды для сборки в интегрированной среде программирования Geany.

Идем в меню Build - Set Build Commands. В команде для компиляции (C commands) нужно изменить модель применяемого чипа: "-mmcu=attiny2313". В команде для прошивки МК нужно изменить тип чипа для avrdude: "-p t2313".

Рис. 3. Перенастройка Geany для работы с микроконтроллером ATTiny2313.

Все команды приведены для ОС GNU Linux, если у вас Windows то возможно придется прописать полные пути к бинарным файлам "avr-gcc.exe", "avr-objcopy.exe", "avrdude.exe".

Более подробно о том как настроить Geany в GNU Linux я рассматривал в одной из предыдущих статей цикла.

Компиляция и прошивка программы в МК

Компиляцию, сборку и прошивку программы можно выполнить нажав в среде Geany поочередно три кнопки: "Compile", "Build" и "Run". Также все эти операции можно выполнить из консоли, вот команды для данных действий (выполнять последовательно):

Avr-gcc -mmcu=attiny2313 -Os /tmp/avr-switch-test.c -o /tmp/avr-switch-test.o avr-objcopy -j .text -j .data -O ihex /tmp/avr-switch-test.o /tmp/avr-switch-test.hex avrdude -c usbasp -p t2313 -P usb -U flash:w:/tmp/avr-switch-test.hex

Все команды почти полностью (за исключением подстановок имен файлов) идентичны тем, которые мы исправляли в настройках Geany.

Заключение

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

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

Дисплей мы будем подключать стандартным способом 4-битным способом.

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

Откроем даташит контроллера ATtiny2313 и посмотрим его распиновку

Мы видим, что данный контроллер существует в двух видах корпусов, но так как мне в руки он попал в корпусе DIP, то будем мы рассматривать именно эту версию корпуса, да и в принципе, они и не различаются особо, кроме чем по виду, так как количество ножек одинаково — по 20.

Так как ножек 20 по сравнению с 28 ножками контроллера ATMega8, к которым мы уже на протяжении всего времени занимаемся и ещё будем заниматься, то, соответственно, и возможностей также будет меньше.

В принципе, всё, что было у ATmega8, здесь есть, единственное то, что поменьше лапок портов. Но так как задача перед нами стоит попробовать соединить его по шине SPI с другим контроллеров, то нас это удручает не сильно.

Есть ещё некоторые отличия, но они незначительны и мы с ними познакомимся по мере необходимости.

Соберём вот такую вот схемку (нажмите на картинку для увеличения изображения)

Дисплей подключен к ножкам порта D. PD1 и PD2 — к управляющим входам, а остальные к ножкам модуля дисплея D4-D7.

Проект создадим с именем TINY2313_LCD, перенесём в него всё кроме главного модуля из проекта по подключению дисплея к Atmega8.

Конечно, некоторые вещи надо будет переделать. Для этого нужно внимательно изучить, к какой ножке что подключено. Шина E дисплея подключена к PD2, а шина RS — к PD1, поэтому внесём изменения в файл lcd.h

#define e1 PORTD |=0b000001 00 // установка линии E в 1

#define e0 PORTD &=0b111110 11 // установка линии E в 0

#define rs1 PORTD |=0b0000001 0 // установка линии RS в 1 (данные)

#define rs0 PORTD &=0b1111110 1 // установка линии RS в 0 (команда)

Как мы видим из выделения жирным шрифтом, не такие уж и кардинальные изменения у нас произошли.

Теперь информационные входы. Здесь у нас используются ножки PD3-PD6, то есть на 1 пункт сдвинуты по сравнению с подключением к Atmega8, поэтому исправим ещё и кое что в файле lcd.c в функии sendhalfbyte

PORTD &=0b1 0000 111; //стираем информацию на входах DB4-DB7, остальное не трогаем

Но это ещё не всё. Мы раньше передаваемые данные сдвигали на 4, а теперь нам в связи с вышеуказанными изменениями придётся их сдвигать только на 3. Поэтому в той же функции исправим ещё и самую первую строку

c <<=3 ;

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

В главном модуле инициализацию порта D мы не трогаем, пусть весь встаёт в состояние выхода, как и в уроке 12.

Давайте попробуем собрать проект и посмотреть сначала результат в протеусе, так как для него я также сделал проект, который будет также находиться в приложенном архиве с проектом для Atmel Studio

У нас всё прекрасно работает! Вот как можно, оказывается быстро переделать проект для одного контроллера под другой.

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

Вот вся схема

Здесь всё стандартно. Подтягивающий резистор на RESET и т.д.

Теперь, прежде чем прошивать контроллер в avrdude, нам неоходимо выбрать контроллер и считать его флеш-память

Затем зайти во вкладки FUSES и установить правильно фьюзы. Так как у нас нет кварцевого резонатора, то мы устанавливаем фьюзы именно так

Представленная ниже схема является основой для экспериментов с bldc-моторами. Для тех, кто не в курсе, BLDC — это одна из разновидностей синхронных моторов, которая используется, например, в винчестерах, сидирумах, дисководах и т.п. (типа таких, как на картинке справа).

Теорию работы синхронных движков в общем виде можно почитать , чуть конкретнее про BLDC — .

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

Никаких специальных возможностей управления работой мотора (по датчикам Холла или по обратной ЭДС обмоток) в этой схеме не предусмотрено. Про различные варианты такого управления мы поговорим позже, а здесь я постараюсь подробно описать исходя из каких соображений и как рассчитываются элементы именно базовой схемы.

Итак, схема:

Как видите, нам понадобятся: 1 контроллер ATtiny2313, 3 микрухи спаренных полевиков FDS4542 (N- и P-channel в одном восьминогом корпусе), 6 биполярных транзисторов (я использовал FMMT2222 — маленькие биполярнички в корпусах SOT23 c маркировкой 1P), 3 диода (я взял LL4148) и некоторое количество всяких резисторов и кондёров. (их номиналы будут указаны ниже).

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

То есть каждое из плеч можно включать и выключать независимо от другого, что даёт возможность получить на выходе полумоста три разных состояния: Hi — выход полумоста подключен к питанию (верхний полевик открыт, нижний — закрыт), Lo — выход полумоста подключен к общему проводу (верхний полевик закрыт, нижний — открыт) и Z — выход полумоста отключен и от питания, и общего провода (оба полевика закрыты).

В принципе, можно получить ещё и четвёртое состояние — когда оба полевика открыты, но в этом случае получится КЗ и один из полевиков просто сгорит. Поэтому такое состояние мы будем считать запрещённым и с ним нам как раз придётся всеми способами бороться.

В схеме предусмотрено отдельное питание для схемы управления (+5В) и для силовой части (+12В), поэтому для верхнего плеча пришлось делать развязку на транзисторах T1, T2. Два транзистора были использованы для того, чтобы умощнить эту развязку и сделать её характеристику симметричной, чтобы она могла не только быстро заряжать, но и разряжать затвор верхнего полевика (то есть это ещё и драйвер).

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

Резисторы R7, R8 — это необязательные подтяжки, назначение которых — предотвратить самопроизвольные открытия полевиков в тот момент, когда ноги микроконтроллера ещё не настроены на выход и находятся в Z-состоянии (при старте). Соответственно, номиналы этих резисторов не очень важны, они просто должны быть намного больше номиналов резисторов R5 и R6, чтобы не мешать нормальной работе схемы после запуска контроллера. Более того, поскольку нам главное, чтобы полевики оба сразу не открылись (если один откроется — шут с ним), можно оставить только R8. Я так и сделал, — взял номинал резистора R8 равным 10 кОм, а резистор R7 вообще выкинул.

Стоит отметить, что помимо функции подтяжки, R7 может выполнять ещё и функцию борьбы с наводками на линию управления транзистором T2. Ток в этой линии очевидно будет гораздо меньше, чем через R5 и в случае, если такие наводки всё же будут, резистор R7 придётся вернуть (это если вы свою разводку платы будете делать).

Ну что, дальше давайте считать. Исходить будем из двух предпосылок: 1) полевиками нужно рулить максимально быстро, но без фанатизма; 2) высшая математика — удовольствие на любителя (особенно когда есть осциллограф и можно всё проверить на практике). В связи с этими, особой точностью и правильностью я увлекаться не буду, но, по крайней мере, рассчёты позволят на что-то ориентироваться.

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

Пиковый ток на ногу в документации на ATtiny2313 не указан, поэтому будем исходить из значений, указанных в Absolute maximum ratings — 40 мА. При этом максимальный ток у нас будет протекать в самом начале заряда, когда разность потенциалов на затворе и ножке микроконтроллера максимальна. Таким образом, получается R5=5В/40мА=125 Ом. Ближайшее большее значение стандартного номинала — 150 Ом, но мы возьмём 200 Ом, чтобы был небольшой запас. Максимальный ток при этом получится 5/200=25 мА.

Теперь давайте оценим время переключения нашего полевика с резистором 200 Ом в затворе. Оценить это время можно по формуле t=Qg/I, где Qg — total gate charge (берём из документации на FDS4542), I — ток драйвера (мы возьмём максимальный расчётный зарядный ток, чтобы точно не ошибиться в меньшую сторону). Получаем t=28 нК / 25 мА = 1,12 мкс.

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

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

Резисторы R1 и R3 в обвязке p-канальника — это просто высокоомные подтяжки и их номиналы не должны нас особо сильно волновать, поэтому я для начала взял их по 10 кОм (чтобы токи через них можно было не учитывать) и про них забыл.

Затворные токи здесь определяются резисторами R2 и R4, а сама обвязка работает следующим образом: при открытии транзистора T2 потенциал базы транзистора T1 падает ниже потенциала его эмиттера, T1 закрывается, а затвор полевика разряжается через диод и резистор R4; при закрытии транзистора T2 потенциал базы транзистора T1 растёт быстрее, чем на его эмиттере, что приводит к открытию T1 и резкому заряду затвора через R2.

Сначала разберёмся с зарядом. По документации ток через FMMT2222 может быть до 600 мА, а для LL4148 — до 450 мА импульсный и до 150 постоянный, поэтому ориентироваться будем на диод и возьмём для расчётов, скажем 150 мА (чтобы ничего сильно не грелось). Исходя из этого, получим сопротивление резистора R4 = (12-0,5)В/150мА = 76,6 Ом. Далее аналогично, — возьмём ближайший стандартный номинал больше расчётного — 100 Ом. Пересчитываем обратно в ток, получаем I = 115 мА. Ну что ж, пусть будет так. При этом время заряда можно оценить на уровне t = 36 нК / 115 мА = 313 нс.

Чтобы сильно не заморачиваться, возьмём R2 такого же номинала, как и R4, и будем считать, что время закрытия будет примерно такое же, как и время открытия.

Теперь проверим, насколько правильно мы выбрали R1. Чтобы транзистор T1 нормально открывался, ток базы должен быть не более чем в h21 раз меньше тока коллектора. Ток коллектора у нас 100 мА, h21 (из доки) не менее 35, значит ток базы нам нужен не менее 2,86 мА. А он у нас получается 12В/10кОм = 1,2 мА. Ну, тогда возьмём R1 = 3,3 кОм. В этом случае ток базы = 12/3,3 = 3,6 мА. Так и оставим.

Тот же расчёт проделаем для транзистора T2. Ток коллектора у него такой же, как и у T1, значит ток базы тоже должен быть не менее 2,86 мА. Значит R6 должен иметь номинал менее 5/2,86=1,75 кОм. Возьмём с запасом резистор на 1 кОм.

В итоге получилось: R1=3,3 кОм, R2=R4=100 Ом, R3=10 кОм, R5=200 Ом, R6=1 кОм, R7 мы выкинули, R8=10 кОм. При этом время переключения нижнего полевика мы ожидаем на уровне 1,12 мкс, а верхнего — на уровне 313 нс.

Что у нас осталось? Во-первых, конденсаторы. С1=С2=20 пФ, С3=100 мкФ, С4=0,1 мкФ. При проектировании платы C3,C4 нужно расположить как можно ближе к силовым ногам ключей. Во-вторых, на схеме не полностью показана обвязка микроконтроллера. Нужно подтянуть ногу MCLR к питанию через резистор 1 — 10 кОм, а так же поставить конденсатор 0,1 мкФ между питанием и общим проводом поближе к ножкам контроллера.

Что ж, — собираем и тестим.

Скачать плату в формате DipTrace 2.3 , демонстрирующее работу устройства

Данное устройство на микроконтроллере позволяет рисовать в воздухе текст и несложную графику. В англоязычной литературе данные устройства называют POV или FlyText. Принцип действия устройства основан на инерционности нашего зрения.

Электрическая принципиальная схема состоит из микроконтроллера ATtiny2313, 8 светодиодов, пары резисторов и двух батареек формата АА. Собрать данное устройство сможет даже начинающий радиолюбитель. Устройство имеет малые размеры.

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

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

Печатная плата очень проста и настолько мала, что крепится непосредственно к панели для батарей формата АА.


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

Работать с программой довольно просто. Для редактирования картинки достаточно кликать на матрицу пикселей, а потом подключить устройство и перепрошить память EEPROM. Подключить к компьютеру схему можно через переходник USB-to-UART или на основе микросхем преобразователей интерфейсов FT232R или MAX232.

Затем выбирает нужный номер com-порта и нажимаете кнопку "Upload".

Ниже приведено расположение ножек для подключения.

Программа для микроконтроллера AVR ATtiny2313 написана с использованием AVR Studio и WinAVR. Программа для компьютера написана под Microsoft Visual C# 2010 Express. Печатная плата нарисована в Eagle Cadsoft и все что необходимо в архиве качайте ниже.

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

Первым делом нам нужен программатор, разновидностей программаторов много, какой программатор выбрать?
Есть обычные программаторы в который нужно вставлять микроконтроллер, прошивать, вынимать микроконтроллер и потом вставлять его в нашу плату, чтобы увидеть результат и эту последовательность придется делать первое время сотни раз, этот вариант на мой взгляд не удобный.
Наш микроконтроллер ATtiny2313 поддерживает функцию внутрисхемного программирования ISP (In-System Programming) через SPI порт, этот вариант использования внутрисхемного программирования ISP на мой взгляд самый удобный и быстрый, т.к. микроконтроллер из нашей платы вынимать не нужно после каждой прошивки, можно программировать микроконтроллер сотни раз и сразу же не отключая программатор от компьютера и платы, видеть результат после прошивки микроконтроллера, процесс отладки программного обеспечения радиолюбительского устройства заметно упрощается и сокращается затрачиваемое на это время.
Внутрисхемный программатор ISP можно сделать самому, в интернете есть множество простых схем как это делается через LPT,COM порт, например программатор PonyProg в интернете можно найти схемы как его сделать.

В данной статье будет рассматриваться работа с внутрисхемным ISP программатором для микроконтроллеров AVR (PX-400) он работает через COM порт.
Если у вас нет COM порта в компьютере, нужен будет еще переходник с USB порта на COM порт, переходников таких тоже много разновидностей, я рекомендую переходник с которым я работал: UCON-232S USB to Serial port converter board
Фото программатора PX-400 , переходника UCON-232S USB , Datasheet ATTiny2313

Разберем подробнее все детали данной схемы:
(На всякий случай, все детали, программатор, переходик (с USB на COM порт) я покупал в chipdip.ru)

1 - PBD-20 гнездо на плату 2.54мм 2х10 прямое - Это я сделал для удобства, чтобы проще было проверять сигналы с выводов микроконтроллера, этот пункт можно было не делать.
2 - SCS-20 DIP панель 20 контактов - панель припаиваем к плате, чтобы была возможность заменить микроконтроллер в плате если потребуется,
ATtiny2313-20PU, DIP20, МCU, 5V, 1K-Flash, 12MHz - Микроконтроллер вставляем в DIP панель.
3 - Кварцевый резонатор 4.000 МГц (усечен.) HC-49S - Кварцевый резонатор 4 МГц
4 - Керамический конденсатор К10-17Б имп. 22пФ NPO,5%,0805 - Два керамических конденсатора по 22пФ
5 - 78M05 (+5В, 0.5А) TO220 - Стабилизатор напряжения 5В, подает на микроконтроллер стабилизированное питание не более +5В, в данном случае у меня получилось 4,4В, этого вполне хаватает.
6 - NP-116 штекер питания 1.3х3.4х9.5мм MP-331 (7-0026c) - Штекер питания припаял к старому зарядному устройству от мобильного телефона DC 5.7V/800mA
7 - DS-213 гнездо питания на плату - гдездо питания для штекера NP-116, для удобства подключения питания
8 - IDC-10MS (BH-10), вилка прямая - Вилка для подключения внутрисхемного ISP программатора
9 - Резистор постоянный 0,25Вт 150 Ом - Три резистора по 150 Ом на выводы MISO,SCK,MOSI
10 - Резистор постоянный 0,25Вт 47 Ом - Один резистора 47 Ом на вывод RESET
11 - Кнопка тактовая h=5мм, TC-0103 (TS-A2PS-130) - Кнопка сброса RESET, после нажатия на кнопку программа в микроконтроллере запускается с начала, кнопку можно было не делать.
12 - Светодиод зеленый d=3мм, 2.5В, 2мА - Выполняет функцию индикатора, этот пункт можно было не делать.
13 - Резистор постоянный 0,25Вт 110 Ом - Резистор для светодиода, чтобы на светодиоде было 2В, этот пункт можно было не делать
14 - Два провода подключенные к светодиоду, для проверки сигналов с выводов микроконтроллера, этот пункт можно было не делать
15 - Дип-Рм печатная макетная плата 100х100мм

Пункты 3 и 4 Работают как единое целое, как внешний тактовый генератор,эти пункты можно не делать, если вы не предъявляете высоких требований к точности и стабильности внутреннего RC-Генератора, внутренний RC-Генератор имеет погрешность около 10% и на точность может влиять изменение температуры.

Итак, вы скачали и установили Atmel Studio :
Запускаем Atmel Studio и напишем простейшую программу на языке Си мигание светодиодом:
Нажимаем: New project... \ AVR GCC \ C \ C Executable Project
Указываем папку где сохранить проект и название проекта например Test1 и нажимаем ОК.
Из списка выбираем наш микроконтроллер ATtiny2313 и нажимаем ОК.
Стираем все что появилось в окне и вставляем наш код программы который ниже:

#define F_CPU 4000000L //Указываем частоту нашего внешнего кварца 4 МГц
#include
#include
int main(void)
{
//Устанавливаем все выводы PORTB как выходы
DDRB=0xFF;//Регистр направления передачи информации (1-выход, 0-вход)
while(1)
{
//Регистр данных PORTB (используется для вывода информации)
PORTB=0b00000001;//Подаем 1 на 12 порт МК PB0 - включаем светодиод
PORTB=0b00000000;//Подаем 0 на 12 порт МК PB0 - выключаем светодиод
_delay_ms(1000);//Задержка 1 сек.
}
}

Заходим в меню Build \ Configuration manager \ Active solution configuration \
Выбираем Release , нажимаем Close
Это мы сделали для того, чтобы у нас появилась в проекте папка Release , о которой я расскажу ниже.

Нажимаем F7 , готово, наше приложение откомпилировалось!
Для прошивки микроконтроллера ATtiny2313 нам нужен только один файл с расширением HEX
Он находится в папке нашего проекта: ...
Обратите внимание, файл Test1.hex нуно взять именно из папки Release !
Не перепутайте, т.к. папке Debug лежит тоже файл Test1.hex , но в этом файле еще содержится отладочная информация и из-за этого вы прошить этим файлом не сможете т.к. он обычно бывает большого размера и не поместится в памяти МК.

Файл.hex нашли, теперь нужна программа для прошивки микроконтроллера ATtiny2313, программ таких много, но мы воспользуемся программой: Avr-Osp II
Скачать:

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

Запускаем программу Avr-Osp II , указываем в разделе FLASH путь к файлу...\Test1\Test1\Release\Test1.hex ,устанавливаем галочки в программе и нажимаем кнопку Program вот и все, микроконтроллер ATtiny2313 прошит!

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

Вопросы и комментарии оставляйте пожалуйста на нашем форуме