Fast avr схему. Восстановление конфигурации Fuse-битов микроконтроллеров Tiny AVR (HVSP)

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

Разработанной плате я дал название FastAVR. Имея размеры 98x127 мм и односторонний печатный монтаж, она вполне пригодна для изготовления в домашних условиях. Применены микросхемы только в корпусах DIP, установленных в панели, что позволяет легко заменять их в процессе экспериментов. Микроконтроллер может тактироваться как от кварцевого резонатора, так и от установленного на плате тактового генератора с делителем частоты Предусмотрен разъем для подключения стандартного программатора STK-200 с селективной подачей на него питания и с возможностью подключения адаптера JTAG При необходимости можно запрограммировать и микроконтроллер, предназначенный для работы в другом устройстве.

На плате имеются самые необходимые для макетирования отлаживаемых конструкций периферийные устройства: двухразрядный семиэлементный светодиодный индикатор, символьный ЖКИ, интерфейсы RS-232, SPI, PS/2 (для подключения стандартной компьютерной клавиатуры или "мыши"), микросхема EEPROM, звуковой сигнализатор. Предусмотрена возможность подключения большинства этих устройств к любым выводам любых портов микроконтроллера в произвольных сочетаниях Все порты доступны и для подключения устройств, расположенных вне платы. Имеющиеся на плате устройства, в том числе кварцевый генератор и светодиодные индикаторы, можно подключить и к устройствам вне ее Все эти подключения не требуют пайки и выполняются установкой перемычек между имеющимися на плате штыревыми контактами или между ними и внешними устройствами.

Первоначально была задумана отладочная плата с дешевым микроконтроллером АТmega8, обладающим практически всеми присущими его семейству (AVR) возможностями Однако я решил не экономить и применить микроконтроллер этого же семейства в корпусе DIP с максимально возможным числом выводов (40) - ATmega16 или ATmega32. Расположение выводов у них одинаково, и на описываемую плату может быть установлен любой. Большое число выводов позволяет подключить больше различных периферийных устройств, которые могут потребоваться при отладке программы. Поскольку микроконтроллеры семейства AVR программно совместимы, отлаженную на более мощном из них программу несложно, как правило, перенести на менее мощный Учитывая, конечно, их различия.

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

Схема основного узла платы FastAVR изображена на рис. 1. Все подключение периферии к портам микроконтроллера DD2 производится через двухрядные 16-контактные штыревые колодки ХР1-ХР4. Четные штыри каждой из них подключены к выводам портов микроконтроллера, а нечетные - к имеющимся на плате периферийным устройствам. При сборке макета для отладки соседние штыри удобно соединять обычными джамперами, а находящиеся на удалении, в другой колодке или даже на другой плате, - перемычками из отрезков гибкого изолированного провода, снабженными на обоих концах гнездами от разъемов (рис. 2). На гнезда надеты термоусаживаемые трубки.


В процессе отладки к тем же штырям удобно подключать контрольно-измерительные приборы: осциллограф, частотомер, генератор испытательных сигналов. Расположение штырей в ряд в порядке возрастания номера разряда порта облегчает поиск нужного и значительно снижает риск их перепутать. Такое решение, по моему мнению, гораздо удобнее, чем использование в большинстве промышленных отладочных плат для внешних подключений десятиконтактных двухрядных разъемов IDC-10. Единственное их достоинство - наличие ключа, обеспечивающего правильную стыковку с ответной частью разъема. А при подключении единичного провода или щупа измерительного прибора приходится всякий раз считать контакты, вспоминая порядок их соответствия выводам микроконтроллера.

Если перемычки S2-S4 сняты, a S5 и S6 установлены, к внутреннему тактовому генератору микроконтроллера подключен кварцевый резонатор ZQ1, частота которого может быть выбрана любой, необходимой для решаемой задачи. На плате имеется также интегральный кварцевый генератор G1 на 16 МГц. Триггеры микросхемы DD1 делят его частоту на два и на четыре. Сняв перемычки S5, S6 и установив одну из перемычек S2-S4, можно подать на тактовый вход микроконтроллера (вывод 13) импульсы частотой 4, 8 или 16 МГц. Это обеспечит работу микроконтроллера при любой конфигурации, в которой внутренний тактовый RC-генератор выключен.

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

Хотя микроконтроллер содержит собственную энергонезависимую память данных, зачастую ее объем оказывается недостаточным для решаемой задачи. Проблему можно решить подключением к микроконтроллеру внешней микросхемы памяти нужного объема. На плате FastAVR это сделано по схеме, изображенной на рис. 3 Микросхема DS1 серии 24С или 24LC - перепрограммируемая энергонезависимая память с интерфейсом I2C. Входы АО-А2 подключены таким образом, что младший разряд ее адреса ведомого на интерфейсной шине равен 1, а два следующих за ним - нулевые.

На рис. 4 показана схема имеющихся на плате FastAVR узлов управления и индикации. Счетверенный DIP-выключатель SA1 с помощью перемычек подключают к выводам портов микроконтроллера. Резисторы R4-R7 предохранят эти выводы, если они случайно запрограммированы как выходы от перегрузки при замкнутых выключателях. Резисторы сборки DR1 поддерживают высокий логический уровень на входах микроконтроллера, когда выключатели SA1.1-SA1.4 разомкнуты. Пятый "лишний" резистор сборки также может быть использован для подачи такого уровня в какую-либо цепь
Четыре сигнальных светодиода HL1 -HL4 светятся при высоких логических уровнях на выходах, к которым они подключены, и не светятся при низких. Резисторы R8-R11 ограничивают ток.

Коммутаторы общих электродов двухразрядного семиэлементного светодиодного индикатора HG1, собранные на транзисторах VT1-VT4. могут управлять индикаторами как с общими анодами (например, DA56-11), так и с общими катодами элементов (например, DC56-11) Нужно лишь обеспечить нужную полярность программно формируемых управляющих импульсов, подаваемых на резисторы R12-R21. Подобные индикаторы несложно найти в отслуживших свой срок кассовых аппаратах и системных блоках компьютеров. Сняв перемычку S7, можно отключить элемент Н (десятичную точку) младшего разряда индикатора HG1.

Разъем ХР5 служит для подключения к плате FastAVR распространенных символьных ЖКИ с встроенными контроллерами. Фактически это двухрядный 34-контактный разъем IDC-34MS, но используются только 14 из 17 контактов одного ряда. Их номера, показанные на схеме, не соответствуют стандартным для этого разъема, но совпадают с номерами выводов наиболее распространенных ЖКИ. Наличие такого разъема позволяет воспользоваться для связи с индикатором стандартным компьютерным 34-про-водным плоским кабелем, предназначенным для соединения привода гибких дисков с материнской платой. В отверстия интерфейсных контактных площадок ЖКИ вставлена и припаяна к ним 14-контактная штыревая колодка. На нее надевают один разъем плоского кабеля, а второй вставляют в разъем ХР5. Контакты ЖИЖИ 1 соединяют с выводами портов микроконтроллера в соответствии со схемой включения ЖКИ в отлаживаемом устройстве. Плата с подключенным индикатором показана на рис. 5.

Описанная методика подключения ЖКИ сравнительно сложна, но удобна тем, что индикаторы разных типов, имеющие одинаковую цоколевку, можно быстро менять, не рискуя перепутать порядок соединения их выводов с портами микроконтроллера. Подстроечный резистор R23 служит регулятором контрастности.

Звуковой сигнализатор НА1 - электромагнитный излучатель сопротивлением 80 Ом, найденный на материнской плате компьютера. Диод VD1 подавляет выбросы напряжения самоиндукции, возникающие на обмотке сигнализатора при ее питании импульсным напряжением. Уменьшать сопротивление резистора R22, чтобы повысить громкость звука, не следует. Это приведет к перегрузке выхода микроконтроллера.

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

Схема внешних интерфейсов отладочной платы изображена на рис. 6. К разъему XS1 можно подключить компьютерную клавиатуру или "мышь", а разъем XS2 соединить с СОМ-портом компьютера. Микросхема DA1, включенная по типовой схеме, согласует уровни сигналов RS-232 и микроконтроллера. Перемычки S8-S10 представляют собой ограниченные контактными площадками тонкие участки печатных проводников, которые можно перерезать, если возникнет необходимость использовать в отлаживаемом устройстве не только информационные, но и управляющие сигналы интерфейса RS-232.
Дроссели L1-L5 подавляют высокочастотные помехи. Это - надетые на провода небольшие ферритовые трубки. Такие легко найти на компьютерных платах.

Чтобы загрузить в установленный на плате FastAVR микроконтроллер коды программы, разъем ХР6 соединяют с программатором. На время работы с ним перемычку S1 (см. рис. 1) рекомендуется снять, отключив этим имеющуюся на плате цепь начальной установки микроконтроллера. Если программатор имеет собственный источник питания, необходимо снять перемычку S11. Когда она установлена, программатор питается от отладочной платы.

Я использовал программатор, аналогичный STK-200. Его схему и чертеж печатной платы можно найти на рис. 8 и 9 в . В этом программаторе всего одна микросхема КР1564АП5 (74HC244AN), подключают его к порту LPT компьютера. Устанавливать в программаторе кварцевый резонатор нет необходимости, он имеется на отладочной плате. При работе с этим программатором и программой PonyProg на компьютере с процессором Core2Duo+, чипсетом 1965 и операционной системой Windows XP SP3 никаких проблем не возникло.

Схема узла питания отладочной платы показана на рис. 7. На контакт 3 разъема ХР7 от внешнего источника можно подать стабилизированное напряжение +5 В. Перемычки S12, S13 обязательно должны быть сняты. Если имеется источник постоянного напряжения 9... 16 В, его плюсовой вывод соединяют с контактом 2 того же разъема и устанавливают перемычки S12, S13. В этом случае внешнее стабилизированное напряжение +5 В не требуется, его получают с помощью интегрального стабилизатора DA2.

Когда светодиодный индикатор HG1 не используется и к плате не подключены какие-либо потребляющие большой ток внешние устройства, температура корпуса стабилизатора DA2 невелика. Если же, несмотря на наличие теплоотвода, стабилизатор сильно нагревается, рекомендуется перейти на питание от внешнего достаточно мощного источника напряжения 5 В. О наличии напряжения питания сигнализирует светодиод HL5.

Диоды VD2 и VD3 защищают от неправильной полярности подключения источника питания. Дроссели (ферритовые трубки) L6 и L7 подавляют высокочастотные помехи. Установленные в различных местах платы контакты ХТ12-Х17 (+5 В) и ХТ18-ХТ22 (общий) позволяют питать напряжением 5 В различные внешние устройства. Кроме того, к контактам ХТ18-ХТ22 удобно подключать общий провод измерительных приборов.

Чертеж печатной платы изображен на рис. 8. Она односторонняя из фольгированного стеклотекстолита толщиной 1,5 мм. Обратите внимание, что две изображенные штриховыми линиями перемычки из изолированного провода устанавливают со стороны печатных проводников. Остальные делают из провода без изоляции и располагают со стороны деталей. Для микросхем DA1, DD1, DD2, DS1 и светодиодного индикатора HG1 на плате установлены панели, что позволяет при необходимости быстро заменять эти элементы. При отсутствии ферритовых трубок вместо дросселей L1-L7 можно установить перемычки.

Рядом с разъемом XS1 имеется посадочное место для еще одного такого же разъема, обозначенного XSV. Хотя его выводы никуда не подключены, это позволяет без проблем установить здесь снятую с компьютерной материнской платы сдвоенную розетку MDN-6F. Разъем XS2 - розетка DB-9F.

Штыревые колодки ХР1 -ХР4, штыри ХТ1 -ХТ22 и предназначенные для установки перемычек S1 - S7, S11-S13 изготовлены из двухрядных разъемов серии PLD или однорядных серии PLS. Чтобы получилось нужное число контактов, от них отделены отрезки соответствующей длины или добавлены отрезки с недостающими контактами.

Обратите внимание, что рядом с контактными площадками для штырей ХТ4- ХТ11 имеются свободные контактные площадки. Это позволяет установить здесь двухрядную штыревую колодку, не подверженную "расшатыванию" при частых перекоммутациях. О разъеме ХР5 (IDC-34MS) было сказано ранее. Разъем ХР6 (для программатора) - десятиконтактный той же серии (IDC-10MS). Трехконтактный разъем питания ХР7 снят с материнской платы, где он использовался для подключения вентилятора. Это сняло проблему поиска ответной части разъема, нужной для подключения к плате источника питания.

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

Интерфейс RS-232 очень удобно использовать при отладке, дополнив отлаживаемую программу модулем, посылающим необходимую информацию через USART микроконтроллера. Запустив на компьютере, с СОМ-портом которого соединен разъем XS2 отладочной платы, терминальную программу, можно наблюдать на экране принимаемые сообщения.


Я использовал программу Terminal v1.9b, которую можно найти в Интернете с помощью любой поисковой системы. Окно этой программы с примерами сообщений, принятых от отлаживаемого устройства и переданных ему, показано на рис. 9. Для нормального отображения русского текста необходимо, нажав на экранную кнопку "Set font", выбрать в открывшемся окне шрифт - Arial, начертание - обычный размер - 8, набор символов - кириллический.

Файл печатной платы в формате Sprint Layout 5.0 и примеры программ, демонстрирующих работу имеющихся на плате узлов:

ЛИТЕРАТУРА
1 Баранов В. Восстановление конфигурации микроконтроллеров AVR. - Радио. 2009, № 11, с. 26-29.

С. БОРИСОВ, г. Узловая Тульской обл.
"Радио" №№8-9 2010г.

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

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

В радиолюбительской практике наибольшее распространение получили последовательные (SPI - Serial Peripheral Interface) программаторы, имеющие ряд достоинств:

  • Их схемы, как правило, проще, чем у параллельных программаторов (в крайнем случае, можно обойтись даже пятью проводниками и двумя резисторами);
  • Имеется множество вариантов как самих программаторов, так и управляющих программ под различные ОС;
  • Для подключения программатора можно выбрать практически любой порт компьютера -существуют схемы как LPT и СОМ, так и USB-программаторов.

К тому же, такой программатор позволяет "прошить" МК, не выпаивая его из устройства (ISP - In System Programmable).

Тем не менее, SPI-режим программирования является, все-таки, урезанным; и некоторые возможности полноценного параллельного программирования в нем не доступны.

Наиболее распространенной проблемой последовательного программирования считается невозможность произвести какие-либо действия с МК, если определенные fuse-ячейки этого МК были изменены относительно значений по умолчанию, - в таком случае чип "объявляет забастовку", и не выходит на связь с компьютером: его уже нельзя ни прочитать, ни "прошить" последовательным программатором.

И он кажется вышедшим из строя, при этом программа PonyProg, например, выдает такое вот сообщение об ошибке: "Device missing or unknown device (-24), хотя в конечной схеме этот МК может работать вполне нормально.

Причиной такой "необщительности" может быть, к примеру, установка в ноль (а ноль в fuse-битах у AVR означает, что данный бит запрограммирован) бита RSTDISBL - что приводит к отключению внешнего входа сброса и превращению его в обычную линию ввода-вывода; а без внешнего сброса МК не сможет войти в SPI-режим программирования, и будет недоступен для ПК.

Еще одна причина, по которой МК становится "невидимым" для SPI-программатора - отсутствие тактирования: fuse-биты, управляющие тактовым генератором (CKSEL0-3), могут быть установлены таким образом, что МК отключит внутренние цепи тактирования и будет требовать внешнего генератора - источника тактовых импульсов; а без тактирования SPl-программирование невозможно.

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

Если же такая неприятность все-таки произошла, и МК перестал устанавливать связь с компьютером, то исправить неправильно выставленные fuse-байты с помощью последовательного программатора уже не удастся.

Тем не менее, вовсе не обязательно делать или приобретать новый параллельный программатор (или, тем более, отладочный комплект) только для того, чтобы "вылечить" пару "коматозных" МК, тем более, если старый SPI-программатор вполне устраивает - для этого удобнее воспользоваться простым устройством, схема которого приведена на рис.1.

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

Прибор предназначен для "лечения" МК ATtiny2313, но может быть переделан и для любой другой модели AVR - как Tiny, так и Mega - для чего прилагается хорошо закомментированный "исходник" микропрограммы, что дает возможность переписать ее применительно к тому МК, которому в данный момент требуется "скорая помощь".

Суть работы такого устройства заключается в том, чтобы ввести "пациента" в режим параллельного программирования, и эмулировать на его линиях те сигналы "настоящего" программатора, которые отвечают за изменение состояния fuse-ячеек; а затем записать в этот МК значения fuse-ячеек по умолчанию.

Данное устройство выставляет заводские значения для всех fuse-байтов: старшего, младшего и дополнительного; а вдобавок еще и стирает у "пациента" память программ и данных - в результате чего он приобретает состояние "чистой" микросхемы.

Рис. 1. Принципиальная схема устройства для лечения FUSE битов в AVR микроконтроллере.

В радиолюбительской литературе и интернете уже описывались подобные устройства (под названиями Fuse Doctor, AVR Doctor, AVR Reanimator, AVR Айболит и т.п.), но данное обладает несколькими особенностями, делающими работу с ним немного приятнее.

То есть, линии РВ0-РВ7 - к линиям РВ0-РВ7, линия PD6 - к линии PD6 и т.д. Что, в случае сборки схемы печатным способом, значительно усложняло монтаж - требовалось множество перемычек, или же двухсторонняя разводка (правда, некоторые авторы предлагали просто устанавливать микросхемы друг на друга, отгибая не соединяемые выводы в сторону и паяя на них резисторы/проводники; но надежность контакта при такой вот "микроконтроллерной камасутре" ставится под сомнение; а к чему приводит отгибание-загибание выводов у микросхем, мы все прекрасно знаем...

Здесь же микросхемы расположены как бы "бок об бок", "валетом", что делает разводку печатной платы очень простой. В авторском варианте, который приведен на рис.2, она во многом повторяет принципиальную схему, и содержит всего три небольшие перемычки. Размер платы - 60x60 мм.

Во-вторых, некоторые устройства требовали двух напряжений: 5 В -для питания МК, и 12 В - на линию reset "пациента", для ввода в режим программирования.

Этой схеме требуется только одно напряжение, которое может иметь разброс в достаточно широких пределах -главное, чтобы оно было не менее 12 В. В-третьих, большинство описанных устройств не допускают "горячей" замены "пациентов" в случае, если нужно "вылечить" несколько МК подряд - после каждого "прошивания" у них нужно отключить питание, заменить "больного", затем включить питание вновь и т.д.

Данное устройство устанавливает все выходы в лог.О после каждого "прошивания", что позволяет "лечить" микросхемы "конвейером" - подключил питание, установил "пациента", нажал на кнопку "старт", посмотрел результат "лечения" по HL1, снял, вставил нового "пациента", нажал, глянул HL1, снял, вставил и т.д. И все это без отключения питания (хоть "палатку" на радиорынке открывай!).

Ну и, в-четвертых, часто в подобных устройствах отсутствует верификация записанных fuse-битов и индикация результата "лечения" (по типу "удачно/неудачно"). В данной конструкции верификация предусмотрена, а для индикации ее результатов служит светодиод HL1, который может иметь три состояния:

  1. Горит непрерывно - программирование "пациента" прошло успешно, прочитанные fuse-байты соответствуют записанным; устройство ожидает очередного "пациента";
  2. Мигает с частотой 2Гч - ошибка в программировании "пациента": прочитанные fuse-байты не совпадают с записанными; "пациент" не вошел в режим программирования, не установлен или неисправен (в программе предусмотрена проверка на наличие "пациента" - исправный AVR устанавливает лог.1 на линии BSY/RDY (вывод 3 для ATtiny2313) при вхождении в режим параллельного программирования); устройство ожидает очередного "пациента";
  3. Не горит - идет процесс программирования и верификации. Программирование исправного "пациента" длится менее секунды, и это состояние светодиода в нормальных условиях не должно быть заметно. Если же светодиод находится в погашенном состоянии относительно долго, то, скорее всего, процесс "прошивания" зациклился из-за того, что неисправный "пациент” завис в режиме записи и не выставляет сигнал готовности BSY/RDY, ожидаемый "доктором".

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

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

Переходник представляет собой панельку DIP-20, которая вставляется своими "ножками" в панель для "пациента" на плате устройства.

Сверху к такой панельке (к контактам для выводов микросхемы) подпаивают (или просто вставляют) проводники в тех местах, в которых подходят линии питания и управления к "пациенту" на плате.

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

Получается своеобразный разъем, штекер (просто панелька DIP-20) которого вставляется в панельку DIP-20 для "пациента" на плате, а уже в его гнездо (еще одна панелька) вставляется новый "пациент".

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

К тому же и сами fuse-байты (в т.ч. и их количество) у разных моделей МК различны - более подробную информацию можно получить в [Л.1,2,3], или в фирменной документации. А чтобы было проще разобраться в исходной программе, я снабдил ее подробными комментариями.

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

Для работы в этом устройстве все fuse-биты "доктора" должны быть такими, какие установлены в нем по умолчанию (с завода); единственное - для более стабильной работы (особенно при нестабильном напряжении питания), в "докторе" можно включить систему BOD, настроив на уровень 2,7 В (установкой fuse-бита BODLEVEL1 в ноль). Внешний кварц "доктору" не требуется, он работает от встроенного RC-генератора.

Детали

Микросхему DA1 (78L05) можно заменить отечественным аналогом КР1157ЕН502, либо более мощной 7805 - но она гораздо дороже, а ее мощность для данной схемы не требуется.

Транзистор VT1 здесь работает в ключевом режиме, и может быть любым, структуры NPN - например, КТ315, 2SC1815, 2SC9014, 2SC1749S и др.; но для некоторых моделей придется изменить разводку платы.

Рис. 2. Печатная плата устройства для восстановления фьюзов.

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

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

В заключение

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

Суть проблемы состоит в следующем: иногда, при попытке прочесть или записать МК, программа PonyProg выдает сообщение об ошибке "Device missing or unknown device (-24)" - и это притом, что никакие fuse-биты в данном МК не изменялись -более того, микросхема может быть даже новой, ни разу еще не "прошитой"! "Лечение" при помощи описанного выше устройства никаких результатов не дает -при повторной попытке чтения/записи сообщение об ошибке появляется вновь. МК кажется вышедшим из строя, причем -ни с того, ни сего...

Но если в данном сообщении нажать кнопку "Ignore", тем самым заставив "Пони” проигнорировать отсутствие ответа МК, и все равно попытаться прочитать/записать микросхему, то этот МК нормально прочитается или "прошьется".

После такой вот принудительной "прошивки" большинство "прикидывающихся мертвыми" МК будут вполне нормально работать, притом без каких-либо сбоев (кроме описанного выше сообщения при попытке установить связь с ПК)!

По видимому, дело здесь в том, что некоторые экземпляры МК не генерирует корректное подтверждение в ответ на запрос программатора, в результате чего PonyProg делает вывод об их неисправности; при этом остальные команды программатора эти МК воспринимают нормально и выполнят корректно.

Вполне возможно, что это является особенностью (а точнее сказать, "болезнью") МК AVR (не просто же так в PonyProg включили такую кнопочку - "Ignore") - у автора данной статьи три из десяти МК вели себя подобным образом, причем чаще начиналось это не сразу, а спустя несколько "проши-вок".

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

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

Прошивка для микроконтроллера - Скачать (9 КБ).

Матин А. РК-08-16.

Литература:

  1. Евстифеев А.В. - Микроконтроллеры AVR семейства Tiny. Руководство пользователя. 2007. Cmp.386 - Параллельное программирование;
  2. Евстифеев А.В. - Микроконтроллеры AVR семейства Mega. Руководство пользователя. 2007. Стр.526 - Параллельное программирование;
  3. Евстифеев А.В. - Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL. 2008. Стр.498 - Параллельное программирование.

Широтно-Импульсная Модуляция (ШИМ, PWM). Урок AVR 8

Наверное, вы не раз задавались вопросом, как можно регулировать мощность потребителя, например управлять яркостью светодиода или регулировать обороты двигателя. Самый простой способ - последовательно нагрузке, например светодиоду, включить резистор, но ведь он будет греться и забирать драгоценную энергию, и чем мощней светодиод, тем сильней будет греться наш резистор, такой вариант не для нас. А что если светодиод очень быстро включать и выключать, при этом меняя длительность включений при константной частоте? Например, включать светодиод на 0,2 милисекунди каждую милисекунду, то светодиод засветится, но не на полную яркость. Аналогично с двигателем - включать движок на 30 секунд каждую минуту - тогда двигатель раскрутится, но не на полную скорость - относительно большой вес ротора сгладит рывки от включающегося двигателя, а сопротивление от трения будет его притормаживать. Таким образом, двигатель будет крутится на половину своей мощности.

Широтно-импульсная модуляция

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

Основной причиной внедрения ШИМ является сложность обеспечения произвольным напряжением. Есть какое-то базовое постоянное напряжение питания (сети, от аккумуляторов и пр.). И на его основе нужно получить более низкую и уже им питать электродвигатели или иное оборудование. Самый простой вариант - делитель напряжения, но он имеет пониженное КПД, повышенное выделением тепла и расходом энергии. Другой вариант - транзисторная схема. Она позволяет регулировать напряжение без использования механики. Основное преимущество ШИП - высокий КПД его усилителей мощности, который достигается за счет использования исключительно в ключевом режиме. Это значительно уменьшает выделение мощности на силовом преобразователе (СП).

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

Самое главное находится в прошивке:

void main(void)
{ PORTB=0x00; //Выставляем все выходы порта B на 0 DDRB=0xFF; //Делаем порт B как выход, чтобы мы могли менять лог уровень на ножках (устанавливать или 0 или 1) while (1) //Организовываем бесконечный цикл { PORTB.1=1; //Включаем светодиод на 1 выходе порта B delay_us(5); //разрешаем светодиоду посветится 5 микросекунд PORTB.1=0; //Выключаем светодиод на 1 выходе порта B delay_us(5); //Делаем задержку на 5 микросекунд }; }

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

Апаратный ШИМ
Таймер может генерировать ШИМ в нескольких режимах:

Итак, для наших нужд (регулировка яркости светодиода) подходит режим Fast PWM . Запускаем CodeWizard AVR, переходим на вкладку timers->timer1, выставляем все, как показано на скриншоте

  • Clock Source - выбор источника тактирования таймера, выбираем System Clock - таймер тактируeтся частотой, на которой работает микроконтроллер
  • Clock Value - выбор частоты работы таймера, здесь мы установили 1000000 hz, это значит, что переменная TCNT1 будет переполнятся с частотой 1000000/255 = 3921 hz, частота ШИМ будет 3921 khz
  • out A (вывод А) определяет состояния ножки OC1A при совпадении счетного регистра и регистра сравнения
  • Comp. A значение регистра сравнения
Кликаем File->Generate and save.

#include void main(void) { // Port B initialization PORTB=0x00; DDRB=0x02; // Timer/Counter 1 initialization TCCR1A=0x81; TCCR1B=0x09; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x64;// число 100 в шестнадцатеричном виде OCR1BH=0x00; OCR1BL=0x00; while (1) { }; }

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

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

Таймер мы установим в режим Fast PWM и будем плавно менять частоту от 0 - 4 khz.
Код такой программы выглядит следующим образом:

#include #include void main(void) { // Port B initialization PORTB=0x00; DDRB=0x02; // Timer/Counter 1 initialization TCCR1A=0x40; TCCR1B=0x09; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x64; OCR1BH=0x00; OCR1BL=0x00; while (1) { OCR1AL++; // увеличиваем регистр сравнения на 1, чтобы изменилась частота delay_ms(100); }; }

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

  1. Программирование через SPI запрещено
  2. Ножка RESET стала обычным пином порта
  3. Неправильно выбран источник тактирования

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

  • Кварц ~4 МГц
  • Конденсаторы от 12 пФ до 22 пФ (2 шт)
  • Резистор 10 кОм
  • Микросхема 74HC00
  • Прямые руки:-)

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

  • Кварцевый резонатор
  • Внешняя RC цепочка
  • Внешней генератор

Есть еще внутренний RC генератор но по понятным причинам он нам не интересен. Для воскрешения контроллера нужно последовательно перебирать возможные варианты.

Кварцевый резонатор

Кварцевый резонатор подключается к ногам XTAL2 и XTAL1. Каждая нога кварца подсоединена к конденсатору который в свою очередь подключен на землю. Конденсаторы любые от 12 до 22 пф.

Если подключение кварца не помогло то пойдем дальше

Внешняя RC-цепочка

Использовать ее для тактирования я бы не стал, ибо частота будет плавать как сами знаете что в проруби. Подключается она к контроллеру вот таким образом:

ВАЖНО: Вывод XTAL2 должен болтаться в воздухе! Подключать его никуда не надо. Если и это не помогает то остается последний вариант

Внешний генератор

Этот генератор можно сделать практически из любой логики или например из таймера 555. Под рукой оказалась микросхема 74HC00. Вместо нее можно использовать нашу к155ла3. Схема предельно проста и не требует наладки:

Генератор работает на частоте около 1.3 МГц. Естественно ее можно подстроить меняя номиналы резистора и конденсатора, но вряд-ли в этом будет необходимость. Плату я для него не делал т.к. смысла не было. Ногу XTAL2 нужно оставить болтаться в воздухе. Если и после этого контроллер не завелся, то это значит что контроллер умер или программирование по SPI запрещено или отключен RESET. Помочь тут может только параллельный программатор.

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

ШИМ (PWM) — широтно-импульсная модуляция. Не нужно пугаться данного термина. Это всего навсего способ регулирования напряжения. Допустим подсветка монитора горит слишком ярко, вы меняете яркость. А что же происходит в этот момент на самом деле?

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

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

В цифрах это просто — было 5В постоянного напряжения прогнали через ШИМ — получили 2,5В. Если заполнение импульса равно 75%, то эквивалентное постоянное напряжение будет 3,75В. Думаю идея понятна.

Теперь приступим к практической реализации. Будем при помощи микроконтроллера изменять заполнение от 0 до 100%, потом от 100% до нуля. Конечный результат должен выглядеть так:

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

Запускаем наш любимый CodeVision. Создаем проект при помощи мастера. В разделе таймеров (Timers), выбираем Timer 2 и выставляем настройки как на рисунке.

Если попробовать сгенерировать проект, то прога может ругнуться. Соглашаемся, ведь у нас нога 3 порта В должна быть настроена как выход.

Приводим код к следующему виду:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include void main(void ) { PORTB= 0x00 ; DDRB= 0x08 ; // Timer/Counter 2 initialization ASSR= 0x00 ; TCCR2= 0x6C ; TCNT2= 0x00 ; OCR2= 0x00 ; TIMSK= 0x00 ; while (1 ) { } ; }

#include void main(void) { PORTB=0x00; DDRB=0x08; // Timer/Counter 2 initialization ASSR=0x00; TCCR2=0x6C; TCNT2=0x00; OCR2=0x00; TIMSK=0x00; while (1) { }; }

Уделим внимание строке OCR2=0x00; Эта переменная как раз и отвечает за величину заполнения импульса. Изменяется данная величина от 0 до 255(0хFF), т.е. 255 соответствует 100% -му заполнению (постоянный ток). Следовательно, если нужно 30% заполнение (255/100)*30=77. Далее 77 переводим в шестнадцатеричную систему OCR2=0x4D;

TCCR2=0x6C; Изменяя данную величину мы можем регулировать частоту ШИМ. Величина частоты работы ШИМ кратна частоте, на которой работает микроконтроллер. В проекте использована частота микроконтроллера 8 МГц, частоту ШИМ использовали 125кГц, следовательно делитель равен 8/125=64
0x6C в двоичной системе счисления 1101100, открываем даташит на Atmega8 и видим описание регистра TCCR2, так вот 1101100 последние цифры 100 и отвечают за выбор частоты работы ШИМ

Приступим непосредственно к программе:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include #include void main(void ) { PORTB= 0x00 ; DDRB= 0x08 ; ASSR= 0x00 ; TCCR2= 0x6C ; TCNT2= 0x00 ; OCR2= 0x00 ; TIMSK= 0x00 ; while (1 ) { while (OCR2< 0xff ) { OCR2= OCR2+ 0x01 ; delay_ms(5 ) ; } while (OCR2> 0x00 ) { OCR2= OCR2- 0x01 ; delay_ms(5 ) ; } } ; }

#include #include void main(void) { PORTB=0x00; DDRB=0x08; ASSR=0x00; TCCR2=0x6C; TCNT2=0x00; OCR2=0x00; TIMSK=0x00; while (1) { while(OCR2<0xff) { OCR2=OCR2+0x01; delay_ms(5); } while(OCR2>0x00) { OCR2=OCR2-0x01; delay_ms(5); } }; }

Код прост до безобразия: сначала в цикле увеличиваем заполнение от 0 до 255(ff), потом уменьшаем от 255 до 0.
И напоследок видосик, как это все должно работать. Успехов в изучении)