Fast avr схему. Восстановление конфигурации Fuse-битов микроконтроллеров Tiny AVR (HVSP). Подключение выводов микроконтроллеров в режиме высоковольтного последовательного программирования

Универсальная отладочная плата FastAVR для начинающих в программировании МК ATMEL разработана на основе анализа около десятка подобных конструкций. Плата представляет собой разумный компромисс между избыточной функциональностью большинства из них или слишком примитивных возможностей других. Имея некоторый опыт в работе с разными микропроцессорными системами, ниже я буду комментировать свои мысли,- как был задуман тот или иной узел платы. Соглашаться с ними или нет - ваше дело, но может быть частично они будут полезны осваивающим AVR в дальнейшем...

В основу конструкции легли разработки и аппноуты Микроэлектроники (http://www.mikroe.com/ru/). Но платы EasyAVR (да и не только) содержат слишком много компонентов, которые привлекают пестротой и качеством изготовления новичков в микропроцессорной технике, на самом деле половина из них становится ненужной после удачной компиляции 5-6 примеров программ и получения опыта. Посудите сами- зачем вам на плате куча светодиодов и кнопок подключенных на каждый порт? Все это актуально пока вы не научитесь управлять пинами порта и помигать индикаторами, а это произойдет весьма быстро;-) На этот случай на плате имеются 4 светодиода и переключатель, для начала вполне достаточно...

Итак, возможности отладочной платы:

  • основной набор периферии для поддержки ATmega: RS-232 конвертер, бипер, SPI EEPROM, LCD и LED-индикаторы, встроенный тактовый генератор + кварц, клавиатура PS-2, ADC тестер, логические тестеры;
  • возможность повторения в домашних условиях, односторонняя печатная плата оптимизированная под лазерно-утюжную технологию, небольшие размеры;
  • применение всех компонентов только в DIP корпусах- позволяет легко заменять их в процессе экспериментов либо запрограммировать сам процессор для других схем (например для JTAG);
  • полная функциональная достаточность для создания несложных прототипов устройств и их отладка;
  • разъем стандартного SPI программатора STK-200 с селективной подачей питания на программатор, возможность внешнего подключения JTAG;
  • возможность включения платы в режиме JTAG ICE простой перекоммутацией;
  • возможность независимой коммутации набортной периферии в любых сочетаниях благодаря линейной технологии расположения всех портов МК;
  • возможность легкого подключения любой внешней периферии и использования на 100% ресурсов ATmega в DIP-40, все порты поразрядно доступны, более того - вся внутренняя периферия платы позволяет использовать ее для внешних устройств (например тактовый генератор или LED индикаторы;

Все это не требует доработок платы или пайки. Т.о. на начальном этапе освоения МК возможностей FastAVR вполне достаточно. Тот, кто задумает двигаться дальше, уже после создания собственного ПО сможет самостоятельно решить, что ему нужно конкретно и делать прототип конструкции с собственным набором периферии. Еще раз повторяюсь- плата создана для начала изучения МК AVR, более никаких целей не преследовалось. Появление самой документации связано с интересом, который проявляют многие начинающие осваивать данный тип контроллеров или еще думают с чего начать. А начинать нужно естественно с тест-платы;-)

МК AVR- самодостаточные контроллеры, однако процессор это еще не вся система. "Кубики" обслуживающие его или управляемые им, сами по себе можно рассматривать как отдельные блоки будущих конструкций. Объединив их на основной плате все вместе можно комбинируя получить нужные результаты. Сначала плата задумывалась на основе ATmega8, т.к. он дешев и имеет практически все возможности AVR. Однако, вняв советам, я решил не экономить и поставить максимально доступный в DIP-корпусе микроконтроллер- ATmega16 либо 32. Цоколевка обоих МК идентична. Себестоимость такого решения сторицей окупается количеством портов ввода-вывода, к которым можно подключиться хотя бы на время отладки. Совместимость снизу-вверх для всех поколений AVR позволяет производить написание и отладку программ используя более мощный чип, а затем произвести компиляцию для целевого кристалла. Достаточный ресурс флеша позволяет не "зацикливаться" на ограниченности в возможностях перепрограммирования Меги, тем более что можно достаточно поупражнявшись, отправить доживать МК в рабочую конструкцию, прошив его в последний раз (JTAG ICE тому первый претендент)

Для изготовления платы потребуется немного недефицитного компьютерного "хлама", которого хватает в кладовках любого электронщика. Большинство компонентов применено от старых либо отказавших материнских плат IBM PC либо околокомпьютерной техники, в последнее время железо такого рода все больше приходит в негодность и выбрасывается либо валяется без применения. Т.к. с SMD мелочевкой практически ничего сделать не получается (отсортировать проблема, да и время...), я распаиваю такие девайсы целиком либо строительным феном, либо на электроплитке.

Основное описание FastAVR ниже по блочно:

Питание. Встроенный стабилизатор на 78(М)05 позволяет запитывать плату от широко распространенных адаптеров 9-12В взятых от другой аппаратуры, которые обычно простаивают. В обычном включении этого достаточно (Мега-16/32 + LCD + RS232 + TXO), при использовании набортного 7-ми сегментного LED, либо сильно прожорливой внешней периферии (сложного программатора) стабилизатор уже очень горячий. Подключение внешнего стабилизированного напряжения +5В возможно через pin-3 X1 (применен разъем от кулеров матплат). Предварительно необходимо отключить джамперы JP1-JP2 группы VCC_SEL. Х1 такого типа выбран по нескольким причинам, основная- почти всегда приходится делать переходник для питания платы от разных адаптеров что есть в наличии либо лабораторного БП. Проходные ферритовые дроссели (балун) FB1,FB2 фильтруют импульсные помехи и ВЧ наводки. На диодах VD1,VD2 выполнена защита от "переплюсовки". В нескольких местах платы установлены джамперы VCC_EXT и GND_EXT. Через них достаточно просто при подключении периферии снимать питающее напряжение и общую "землю".

Внешняя память реализована на стандартной I2C EEPROM 24cXXX. Хотя сам AVR содержит собственную энергонезависимую память, однако во многих конструкциях внешний чип может быть предпочтительней из-за объема либо ресурса. Схема включения стандартная, адрес кристалла 0x01.

Линейные LED индикаторы состояния портов HL2-HL5 выполнены на 4-х дискретных светодиодах. Для начала экспериментов с AVR этого достаточно, большее их количество считаю не оправданным и скорее украшательством. Светодиоды включаются при записи в порт лог."1", т.о. состояние порта отображается без инверсии сигнала, что удобно и наглядно.

Подключение к плате индикатора LCD сделано через 2 разъема, возможно использовать как 8-ми битный так и 4-х битный режим. Первый из них - 34-х пиновый Х2 (от 3,5" дисковода) позволяет использовать стандартные перепрессованные шлейфы от дисководов нужной длинны, соответственно на самом индикаторе лучше распаять штыревую джамперную линейку (пин-блок), это позволяет быстро менять разные индикаторы без боязни перепутать выводы. Подключение к портам авра осуществляется через пин-блок Х10, т.о. помимо самого режима подключения LCD можно гибко выбрать выводы МК. Такая конструкция позволяет легко адаптироваться к свободным портам контроллера, даже "набрать" их по-одному из разных групп портов, что бывает необходимо при соответствии конкретному отлаживаемому прототипу или вновь конструируемая печатная плата получается от этого удобнее в разводке.


Во многих случаях применение ЖК-индикатора может быть не оправдано по цене, габаритам либо надежности. Например, в простейшем зарядном устройстве или таймере вполне может потрудиться и 2-х разрядный LED индикатор. Имеющиеся у меня в наличии сдвоенные 7-сегментные индикаторы распространенного типа с высотой знака 14мм оказались как с общим анодом, так и с общим катодом (списанные кассовые аппараты и системные блоки 486 компьютеров). Пришлось применить 2-х тактные ключи на VT1-VT4 для подключения индикаторов любого типа и соответственно панельку под сам индикатор, чтобы в дальнейшем не ломать голову со схемотехникой.

Все подключение периферии к портам ATmega, как отмечалось ранее, выполнены через линейные пин-блоки X3-X6. В основном на отлаживаемых платах я наблюдал применение разъемов типа IDC-10 (2х5). Единственное их преимущество в этом случае- наличие "ключа", дабы не попутать местами шлейф при подключении. На этом достоинства такого способа кончаются и начинаются недостатки- даже визуально неудобно работать с 8-ми разрядными портами, т.к. выводы не расположены в ряд, невозможно кроме шлейфа ничем подключить встроенную периферию. Применение пин-блоков дает прямо противоположный результат, кроме того- через стандартную перемычку-джампер легко контролировать любые сигналы сверху, например логическим пробником или осциллографом, не нужно тыкаться и считать по ножкам порта боясь случайно "коротнуть" выводы. Прибавьте сюда максимальную дешевизну и многоразовость данного соединения, ведь гораздо проще заменить шлейф или джампер, чем разъем впаянный с плату. Тем более, что сейчас в продаже даже в нашей глубинке можно найти вот такие ответные части разъемов (либо использовать от старых системных блоков), что позволяет легко и быстро комбинировать соединители (рис):


Для звука применен распространенный бипер сопротивлением около 80 Ом от матплат. Сигнал не очень громкий, но достаточный для контроля (R23 и так выбран на пределе). Отдельный ключ я не стал ставить, желающие могут распаять его на местах для макетирования, обозначенных как TEMP. Небольшой совет - работая со звуком, не забывайте в конце процедуры генерации сигнала ставить команду, сбрасывающую в лог."0" вывод PD7, иначе после прекращения генерации там может остаться "1" и ток через динамик будет продолжать идти, что не есть good хотя бы по соображениям общего потребления AVR-а.

На 4-х разрядном DIP-переключателе SW4 собран задатчик логических сигналов для портов. Здесь ситуация с количеством аналогична LED светодиодам. Т.к. входы авров имеют внутренние подключаемые pool-up сопротивления, то соответственно "подтяжки" к питанию ставить нет нужды. На резисторах R18-R21 собрана защита от ошибок случайного включения портов МК на вывод. В ревизии платы 1.03 и выше дип-переключатель при отсутствии может быть заменен джамперами. Недавно мне понадобилось быстро сделать из платы JTAG ICE. В связи с чем в rev 1.4 введена резисторная матрица RN1, которая позволяет аппаратно формировать лигическую "1" на нескольких входах контроллера. Если вам это не нужно - можно не устанавливать RN1.

Тактирование МК выбирается пин-группой CL_SEL и может осуществляться от внешнего кварцевого резонатора Z1 (устанавливаются только JP37, JP38), интегрального кварцевого генератора G1 (16МГц), либо с делителя на:2 и:4. Т.о. помимо кварца можно тактировать процессор частотами 16, 8, 4 МГц. Можно легко прикинуть быстродействие отлаживаемой программы, либо получить стандартную тактовую частоту при запаянном спец. кварце. В-принципе при отсутствии TXO на данную частоту можно применить любой другой генератор до 16МГц. Генератор также может пригодиться вам при "поднятии" МК из-за неправильно прошитых фьюзов микроконтроллера, в этом случае частота тактирования не играет роли.

Преобразователь уровней последовательного интерфейса RS-232 для UART - неизменный атрибут большинства систем на AVR. Здесь не нужно "изобретать велосипед", достаточно стандартной MAX232. Задействованы только сигналы RX-TX, что вполне достаточно для большинства применений. Практически можно подключить CTS-RTS для аппаратного управления потоком без переделки платы, гибкими проводами на JP31-JP32 со стороны дорожек. В схеме проверены м/сх Maxim MAX232, TI MAX232 и SIPEX SP3232- ставьте любые совместимые по цоколевке аналоги.

Внешняя матричная клавиатура может быть выполнена на отдельной плате и подключаться шлейфами к МК (я решил применить из манипуляторов "мышь", как правило 2 микрика там всегда исправны). На самой отладочной плате установлен двойной блок разъемов PS-2. Стандартная клавиатура IBM PC подключается без аппаратных доработок, естественно при соответствующей программной поддержке со стороны AVR. Второй разъем свободен, используйте на свое усмотрение. Как правило клавиатура - весьма специфичная вещь, зависящая от отлаживаемого прототипа, поэтому после некоторых раздумий я решил не ставить даже простейшие кнопки на плате. Свои варианты плат выложу после разводки и их испытаний.

Индикатор HL7 установлен для экспериментов со встроенным аппаратным ШИМ-контроллером.

Разъем для внутрисхемного последовательного программирования X7 сделан в соответствии STK-200. Питание на программатор можно селективно выбирать через JP43. В моем случае используется простейший программатор от PonyProg на буфере 74ALS(LS,F)244 с подключением через LPT. Все проверялось на Core2Duo + i965чипсете под управлением XP SP2, никаких проблем не возникло. Программатор запитывается через разъем с отладочной платы и удобен в работе, т.к. буферы в нормальном режиме "уходят" в Z-состояние и абсолютно не мешают в работе FastAVR. Подключение адаптера JTAG для внутрисхемного программирования и отладки в реал-тайм также возможно без доработки платы через соответствующий линейный пин-блок порта C.

Осталось упомянуть еще несколько нужных элементов:

Цепь внешнего Reset, которая у AVR достаточно простая. Ее можно отключать через JP42, хотя эксплуатация совместно с программатором нисколько не мешает. Вход сброса может быть перепрограммирован через фьюз как стандартный порт ввода-вывода и использован для периферии, однако нужно помнить что в этом случае уже невозможно повторно запрограммировать кристалл через X7 .

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

Немного о самой печатной плате и конструкции. Как уже отмечалось, плата односторонняя. Мной пока проверены 2 экземпляра, изготовленные по лазерно-утюжной технологии (одна при печати на фотобумаге от струйников, другая на основе от самоклейки), т.о. при желании все должно получаться;-) Если задумаете фотоспособом- прекрасно! Джамперные линейки разведены с учетом "запретных зон" и применения стандартных 16-ти пиновых шлейфов (планки от GAME-PORT) даже при подключении одним крайним рядом. При отсутствии ферритовых дросселей (я применяю от старых 286 матплат или горелых мониторов) можно смело ставить перемычки. Рекомендую сразу под все чипы поставить панели дабы потом не курочить плату. Не забудьте 2 перемычки с ключей на индикатор HL6.

А вот так выглядит интерфейс для проверялки ТТЛ/КМОП логики, по мере возможностей я постараюсь рассказать, что из этого получилось.

В общем у таймера есть регистр сравнения OCR** и когда значение в таймере совпадает со значением регистра сравнения OCR** может произойти 2 вещи:

  • Прерывание
  • Изменение состояния внешнего вывода сравнения OC**

Теперь мы можем настроить ШИМ когда счётчик досчитает до значения OCR** напряжение на выбранной нами ножке OC** измениться от 5 до 0. Когда таймер досчитает до конца и начнёт считать сначала изменим напряжения с 0 до 5, на выходе у нас будут прямоугольные импульсы

Есть 3 режима работы ШИМ

СТС (сброс при совпадении) - Это можно назвать ЧИМ частотно-импульсно моделированный сигнал, когда таймер досчитает до значения OCR** он сбрасывается и меняет значение OC** на противоположное. Таким образом скважность ШИМ всегда одинаковая.

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

Fast PWM (быстрый ШИМ) - счётчик считает от 0 до 255, после чего сбрасывается в 0.

Когда значение таймера совпадает с OCR** соответствующий вывод сбрасывается в 0, при обнулении ставиться 1.

Чаще всего используется как обычный ШИМ.

Phase Correct PWM (ШИМ с точной фазой) - в этом режиме счётчик считает от 0 до 255, а потом считает в обратном направлении до нуля. При первом совпадении с OCR** вывод сбрасывается в 0, при 2 совпадении (когда счётчик идёт обратно), ставиться 1.

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



Если мы хотим работать с выводом OC1A ставим биты в COM1A1 COM1A0
Вообще "/" означает ИЛИ. TCNT1 = OCR1A для ШИМ на выводе OC1A

Timer/Counter Mode of Operation - режим работы таймера/счетчика.

Top - значение TCNT1 при котором происходит переключение значения вывода OC**.

TOV1 Flag Set on - при каких значениях устанавливается бит регистра GIFR

Выбираем из последней таблицы тот режим который нам нужен, не смотрим на Top . Из 2 таблицы выбираем любой из 2 последних вариантов. Остаётся только расставить нужные биты в регистрах.

#define F_CPU 8000000UL #include #include int main() { DDRD = 0xFF; OCR1A=0xC0; // Сравниваем с этим значением OCR1B=0x40; //Настройка ШИМ и таймера TCCR1A|=(1<CS10 выставили 1, он считает с частотой МК про то как настроить частоту таймера

Один из лучших компиляторов Basic-подобного языка для серии восьмибитных микроконтроллеров AVR .

Среда разработки FastAVR характеризуется удобным, продуманным интерфейсом и включает в себя редактор, ассемблер, компилятор и программатор микроконтроллеров. Приложение имеет подсветку команд, дружелюбный интерфейс, а также множество других решений, предназначенных для облегчения процесса создания и отладки программ. FastAVR использует восьми-, а не шестнадцатибитную адресацию и выгодно отличается от других компиляторов созданием чрезвычайно компактного кода (особенного для контроллеров с ОЗУ менее 256 байт). Кроме того в программу встроены дополнительные функции знакогенератора для LCD, калькулятора таймеров, терминала. Список поддерживаемых микроконтроллерных устройств компании AVR включает в себя серии: 2313, 2323, 2333, 4433, 8515, 8535, ATiny13, ATiny26, ATmega163, Atmega8, Atmega16, Atmega32, ATmega64, ATmega128 и многие другие.

Используемый в FastAVR язык состоит из знакомых команд Basic, значительно расширенных дополнительными полезными функциями (I2C, 1-Wire, LCD и некоторыми другими). Компилятор поддерживает структурное программирование, улучшающее читаемость программ. Данное приложение компилирует программу, расположенную в активном окне редактора, в стандартный ассемблерный код AVR, используя бесплатный ассемблер от Atmel (входящий в состав набора программ ). В результате компиляции и в том случае, если в исходном тексте нет ошибок, создается файл с расширением *.asm. Среда программирования выводит сгенерированный код на ассемблере, что пригодиться опытным разработчикам.

FastAVR может использовать фактически любой из существующих внутрисхемных программаторов для контроллеров AVR, подключаемых к последовательному или к параллельному порту. Исходный код программы набирается подобно обычному тексту в виде символов во встроенном редакторе данного ПО. Помимо отображения исходного текста редактор FastAVR самостоятельно правит программу, выделяет цветом команды, переменные и другие данные. Также он поддерживает отключаемую возможность выравнивания блоков текста. Код программы можно просмотреть и отредактировать в любом обычном редакторе. Тем не менее, при написании программы нужно соблюдать ряд правил, заданных синтаксисом FastAVR. Например, в каждой программе компилятору необходимо указывать тип используемого контроллера, тактовую скорость и размер программного стека. Подобные специальные команды (метадирективы) не преобразуются в ассемблерный код.

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

Программа FastAVR была создана Bojan Ivancic из Словении и является продуктом компании MicroDESIGN. К сожалению, автор забросил свой проект, его сайт не работает, а телефоны поддержки не отвечают. Само приложение давно не обновляется и, как следствие, компилятор не поддерживает последние модели контроллеров Atmel.

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

Данный продукт был написан на английском языке. Русификатора к нему не имеется.

FastAVR работает под Microsoft Windows. Приложение корректно фунуционирует в операционных системах 98SE, NT4, 2000 и XP.

Данное устройство - Attiny fusebit doctor - позволяет восстановить конфигурацию Fuse-битов (заводские установки, согласно техническому описанию) микроконтроллеров семейства Tiny фирмы Atmel. Поддерживает все микроконтроллеры, которые имеют интерфейс высоковольтного последовательного программирования (HVSP):

  • в 8-выводном корпусе: , , ;
  • в 14-выводном корпусе: , ;
  • в 20-выводном корпусе, со специальным адаптером: , .

Если Вам необходимо устройство для восстановления конфигурации fuse-битов микроконтроллеров семейства ATtiny, ознакомьтесь с проектом: .

Устройство очень простое в изготовлении, не содержит дорогостоящих компонентов. Основой является микроконтроллер , а также несколько резисторов и транзисторов ( , ), регулятор напряжения +5 В (7805T). Стоит заметить, что для питания устройства необходим стабилизированный источник питания с выходным напряжением +12 В (что важно для инициализации режима высоковольтного программирования).

При программировании Fuse-битов микроконтроллера следует учитывать, что используется внутренний осциллятор 4 МГц без делителя на 8. А также можно включить опцию «fast rising power».

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

Печатная плата

Плата с установленными компонентами

Подключение выводов микроконтроллеров в режиме высоковольтного последовательного программирования

Восстановление конфигурации микроконтроллера (пациента) начинается по нажатию кнопки Start. Для индикации статуса предусмотрены два светодиода, состояния которых обозначают:

  • включен зеленый светодиод - конфигурация Fuse-битов восстановлена. Если установлены Lock-биты, то проверяется только соответствие текущей конфигурации битов заводским установкам и если она совпадает, то включается зеленый светодиод;
  • включен красный светодиод - ошибка при считывании сигнатуры микроконтроллера: невозможно прочитать, отсутствует микроконтроллер в сокете или сигнатура не совпадает с имеющимися в базе данных устройства;
  • мигает зеленый светодиод - сигнатура верна, конфигурация Fuse-битов не верная. Lock-биты установлены, требуется операция стирания Flash-памяти;
  • мигает красный светодиод - сигнатура верна, lock-биты не установлены, но по некоторым причинам Fuse-биты не могут быть записаны, не проходит проверка после 10 попыток.

Устройство для восстановления Fuse-битов действует согласно протокола высоковольтного последовательного программирования. Первоначально при запуске процесса, восстанавливаемый микроконтроллер (пациент) переключается в режим высоковольтного программирования памяти, затем считывается сигнатура чипа и проверяется возможность работы устройства с ним. После этого выполняется операция стирания, если пользователь указал это. Следующий этап - считывание lock-битов и, если они не установлены, то «пациент» получает новую конфигурацию Fuse-битов, соответствующую модели микроконтроллера-пациента. После этого выполняется проверка установки (верификация) Fuse-битов и, если тест проходит удачно, устройство заканчивает свою работу. В противном случае устройство повторяет цикл запись-верификация Fuse-битов 10 раз.

На плате установлены две перемычки (джамперы) «chip erase» и «unknown signature»:

  • chip erase - разрешает операцию стирания всей Flash-памяти чипа. Это необходимо в том случае, если установлены lock-биты, т.е. нет возможности исправить Fuse-биты, пока не будут сняты lock-биты. Джампер включен - операция стирания разрешена.
  • unknown signature - неизвестная сигнатура чипа - явление очень редкое, но все же случается, что чип стер свою сигнатуру. Сигнатура, байты калибровки и другие данные не могут неизменно храниться в структуре чипа, они могут быть случайно повреждены (стерты) в случае нестабильного электропитания в процессе программирования. Обычно в таких случаях получаемые значения сигнатуры - FF FF FF, но чип работает нормально, Flash-память можно считать и записать. Если считанная сигнатура не совпадает ни с одной из базы данных устройства (включая значения FF FF FF и 00 00 00), то при включении этого джампера устройство запишет универсальную конфигурацию Fuse-битов. Универсальная конфигурация означает, что будет восстановлен ISP (включение бита SPIEN) и функциональность вывода Reset (отключение бита RSTDISBL) микроконтроллера, опции осциллятора затронуты не будут. При таких действиях микроконтроллер получит возможность дальнейшего восстановления, но уже при помощи обычного SPI программатора.

Внимание! Не используйте опцию «unknown signature» с микроконтроллерами ATtiny11 или ATtiny15.

Приложение:

  1. Файлы проекта (формат Eagle 5.4.0), принципиальная схема и рисунок печатной платы (pdf, png), .hex-файл и.bin-файл для программирования микроконтроллера - .
  2. Обновленная прошивка для микроконтроллера (Версия 2): исходный код (BASCOM v.1.11.9.0), .hex-файл и.bin-файл для программирования микроконтроллера - .

Достаточно часто появляется необходимость использовать управление какого-либо устройства (будь то лампочка накаливания, двигатель, ТЭН или простой светодиод) посредством ШИМ.

Наверно объяснять что это такое и в чем прелесть управления ШИМом не нужно, информации в интернете накопилось уже достаточно много, да и врядли мне получиться разжевать эту тему лучше. Поэтому сразу перейдем к делу, а именно запустим ШИМ на Attiny2313 средствами Bascom-AVR.

Шим в микроконтроллерах AVR работает на таймерах-счетчиках, в мк Tiny2313 таких таймеров всего 2: 8-и битный Timer0 считающий до 255 и 16-и битный Timer1 способный считать до 65535. Каждый таймер управляет двумя ШИМ-каналами, таким образом всего аппаратно можно реализовать целых 4 канала ШИМ.

Информацию о количестве каналов ШИМ и разрядность каждого канала можно глянуть на страницах даташита на микроконтроллер.

Так, на борту Attiny2313 имеются два 8-и битных канала ШИМ работающих от Timer0 и еще два канала под управлением таймера Timer1 имеют программируемую разрядность от 8 до 10 бит. В даташите эти ноги подписываются следующим образом:

Для того чтобы сконфигурировать таймер Timer1 на генерацию ШИМ в Bascom достаточно записать следующую строку:

Config Timer1 = Pwm, Pwm = 8 , Compare A Pwm = Clear Up, Compare B Pwm = Clear Down, Prescale = 64

Pwm = 8 выбирается разрядность ШИМ, для Timer1 как писалось выше может быть также Pwm = 9 или Pwm = 10.

Compare A/B Pwm = Clear Up/Clear Down здесь конфигурируем активное состояние для каждого канала ШИМ (А и В).

Prescale = 64 - уже знакомая строка конфигурации таймера, отвечающая за предварительное деление частоты переполнения таймера, в данном случае делитель будет задавать частоту ШИМ. Можем менять на свое усмотрение Prescale= 1|8|64|256|1024


Скважность генерируемого сигнала определяется значением, которые мы записываем в регистры сравнения OCR1A и OCR1B (каналов ШИМ же у нас два на одном таймере, вот по одному регистру на канал А и В). Со значениями, которые лежат в этих регистрах постоянно сравнивается значение счетного регистра (туда оно копируется с таймера), при их совпадении происходит переключение ноги мк в активное состояние, а счетный регистр продолжает считать до своего максимального значения. Досчитав до максимума, таймер начинает считать в обратном направлении, и дойдя до момента когда значения счетного регистра и регистра сравнения снова совпадут, произойдет обратное переключение на ноге микроконтроллера (см. рисунок ниже)



Для нас регистры сравнения OCR1A и OCR1B всего-навсего переменные, в которые мы можем положить какое-нибудь значение. Например, так:


OCR1A = 100
OCR1B = 150


В баскоме для удобства предусмотрено и другое название этих регистров: PWM1A и PWM1B, так предыдущие строки будут равнозначны следующим:


PWM1A = 100
PWM1B = 150

Теперь разберемся, как влияет конфигурация активного состояния Clear Up/Clear Down на то, что происходит на выходе ШИМ в зависимости от значения регистра сравнения.

Когда выход сконфигурирован как Compare A Pwm = Clear Down активным состоянием выхода является высокий уровень и при увеличении значения регистра OCR (PWM) пропорциональное напряжение на этой ноге будет расти. С точностью до наоборот все будет происходить, если выход сконфигурирован как Compare A Pwm = Clear Up. Все это хорошо проиллюстрировано на картинке ниже



Значения, которые могут принимать эти регистры сравнения зависят от того, какую разрядность канала ШИМ мы выбрали. При PWM = 8 (8-и битный шим) возможно значение от 0 до 255; при PWM = 9 от 0 до 511; при PWM = 10 от 0 до 1023. Тут я думаю, все понятно.


Теперь небольшой пример: подключим к микроконтроллеру светодиоды как показано на схеме (питание мк на схеме не указано)


И напишем небольшую программку:


$crystal = 4000000

Config Timer1 = Pwm, Pwm = 9 , Compare A Pwm = Clear Down, Compare B Pwm = Clear Up, Prescale = 8
Config PORTB.3 = Output
Config PORTB.4 = Output

Incr Pwm1a "плавно увеличиваем значение регистра сравнения OCR1A
Incr Pwm1b "плавно увеличиваем значение регистра сравнения OCR1B

Waitms 20 "добавим задержку

Loop

End

После того как откомпилировали и прошили программу в контроллер один из светодиодов (D1) будет плавно набирать яркость, а другой (D2) плавно гаснуть


Если сейчас ткнуть осциллографом на выходы ШИМ, то можем увидеть такую вот картину с изменяющейся скважностью импульсов (синий сигнал на ОС1А, красный на ОС1В):


Конфигурация таймера Timer0 для генерации ШИМ практически такая же, за исключением того, что timer0 это 8-и битный таймер, и поэтому ШИМ генерируемый этим таймером будет всегда иметь разрядность 8. Поэтому конфигурируя этот таймер, разрядность ШИМ не указывается:

Config Timer0 = Pwm, Compare A Pwm = Clear Up, Compare B Pwm = Clear Down, Prescale = 64



Теперь аналогичный пример со светодиодами, но теперь шим сгенерируем при помощи Timer0:


$regfile = "attiny2313.dat"
$crystal = 4000000

Config Timer0 = Pwm, Compare A Pwm = Clear Down, Compare B Pwm = Clear Up, Prescale = 8
Config PORTB.2 = Output
Config PORTD.5 = Output

Incr Pwm0a " плавно увеличиваем значение регистра OCR0A
Incr Pwm0b " плавно увеличиваем значение регистра OCR0B

Waitms 20 "добавим задержку

Loop

End

Подключим светодиоды к выходу ШИМ Timer0, как показано на схеме:

Тут все аналогично: первый светодиод (D1) будет плавно набирать яркость, а второй (D2) будет плавно гаснуть.


Подсчет частоты генерации ШИМ

Если требуется узнать частоту генерации ШИМ, то сделать это не сложно. Смотри на формулу ниже:

Частота ШИМ = (частота кварца/предделитель) / (размер счетного регистра *2)

Для примера подсчитаем несколько значений:

1. Частота кварца = 4000000 Гц, предделитель = 64, разрядность ШИМ 10 бит => размер счетного регистра = 1024

Частота ШИМ = (4000000/64)/(1024*2) = 122 Гц

2. Частота кварца = 8000000 Гц, предделитель = 8, разрядность ШИМ 9 бит => размер счетного регистра = 512

Частота ШИМ = (8000000/8)/(512*2) = 976,56 Гц

3. Частота кварца 16000000 Гц, предделитель = 1, разрядность ШИМ 8 бит => размер счетного регистра = 256

Частота ШИМ = (16000000/1)/(256*2) = 31250 Гц



Понравилась статья? Поделиться с друзьями: