Компьютеры Windows Интернет

Как подключить, написать программу и прошить микроконтроллер ATtiny2313. Подключаем кнопку к микроконтроллеру ATtiny2313, простая программа Восстановление конфигурации Fuse-битов ATtiny13

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

Восстановление конфигурации Fuse-битов ATtiny13

В радиолюбительской практике наибольшее распространение получили последовательные (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), могут быть установлены таким образом, что МК отключит внутренние цепи тактирования и будет требовать внешнего генератора — источника тактовых импульсов; а без тактирования SPI-программирование невозможно.

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

Если же такая неприятность все-таки произошла, и МК перестал устанавливать связь с компьютером, то исправить неправильно выставленные fuse-байты с помощью последовательного программатора уже не удастся. Тем не менее, вовсе не обязательно делать или приобретать новый параллельный программатор (или, тем более, отладочный комплект) только для того, чтобы «вылечить» пару «коматозных» МК, тем более, если старый SPI- программатор вполне устраивает — для этого удобнее воспользоваться простым устройством, схема которого приведена на сайте

Прибор предназначен для «лечения» МК ATtiny2313, но может быть переделан и для любой другой модели AVR — как Tiny, так и Меда — для чего прилагается хорошо закомментированный «исходник» микропрограммы, что дает возможность переписать ее применительно к тому МК, которому в данный момент требуется «скорая помощь». Суть работы такого устройства заключается в том, «пациента» в режим параллельного программирования, и эмулировать на его линиях те сигналы «настоящего» программатора, которые отвечают за изменение состояния fuse-ячеек; а затем записать в этот МК значения fuse-ячеек по умолчанию.

Данное устройство выставляет заводские значения для всех fuse-байтов: старшего, младшего и дополнительного; а вдобавок еще и стирает у «пациента» память программ и данных — в результате чего он приобретает состояние «чистой» микросхемы. В радиолюбительской литера-туре и интернете уже описывались подобные устройства (под названиями Fuse Doctor, AVR Doctor, AVR Reanimator, AVR Айболит и т.п.), но данное обладает несколькими особенностями, делающими работу с ним немного приятнее. Во-первых, во всех известных автору конструкциях «доктор» и «пациент» подключались друг к другу, практически, «нога к ноге» (за исключением некоторых выводов, которые у «доктора» и «пациента», согласно схеме, не должны соединяться).

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

В авторском варианте, который приведен на рис.2, она во многом повторяет принципиальную схему, и содержит всего три небольшие перемычки. Размер платы — 60×60 мм. Во-вторых, некоторые устройства требовали двух напряжений: 5 В — для питания МК, и 12 В — на линию reset «пациента», для ввода в режим программирования. Этой схеме требуется только одно напряжение, которое может иметь разброс в достаточно широких пределах — главное, чтобы оно было не менее 12 В. В-третьих, большинство описанных устройств не допускают «горячей» замены «пациентов» в случае, если нужно «вылечить» несколько МК подряд — после каждого «прошивания» у них нужно отключить питание, заменить «больного», затем включить питание вновь и т.д. Данное устройство устанавливает все выходы в лог.

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

В данной конструкции верификация предусмотрена, а для индикации ее результатов служит светодиод HL1, который может иметь три состояния:

  1. Горит непрерывно — программирование «пациента» прошло
    успешно, прочитанные fuse-байты соответствуют записанным;
    устройство ожидает очередного «пациента»;
  2. Мигает с частотой 2Гц — ошибка в
    программировании «пациента»:
    прочитанные fuse-байты не совпадают с записанными; «пациент» не вошел в режим программирования, не установлен или неисправен (в
    программе предусмотрена проверка на наличие «пациента» — исправный AVR устанавливает лог.1 на линии BSV/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 и др.; но для некоторых моделей придется изменить разводку платы. Предохранительный диод VD1 может быть любым, на ток не менее 150 мА. его задача — защитить схему от случайной переполюсовки питания. Все резисторы в схеме — малогабаритные, 0,125 Вт — их номинал может отличаться от указанного в довольно широких пределах. Светодиод HL1 — любой, индикаторный.

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

МК кажется вышедшим из строя, причем — ни с того, ни сего. Но если в данном сообщении нажать кнопку «Ignore», тем самым заставив «Пони» проигнорировать отсутствие ответа МК. и все равно попытаться прочитать/записать микросхему, то этот МК нормально прочитается или «прошьется». После такой вот принудительной «прошивки» большинство «прикидывающихся мертвыми» МК будут вполне нормально работать, притом без каких- либо сбоев (кроме описанного выше сообщения при попытке установить связь с ПК)!

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

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

Как собрать простейшую схему, как подключить программатор к микроконтроллеру 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, теперь не отключая провода от нашей схемы, можно делать изменения в программе, и как описывалось выше прошивать микроконтроллер и сразу видеть результат.

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

Описан простой эксперимент с подключением кнопки к 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.

AVR RISC архитектура:

RISC (Reduced Instruction Set Computer). Данная архитектура обладает большим набором инструкций, основное количество которых исполняются в 1 машинный цикл. Из этого следует, что по сравнению с предшествующими микроконтроллерами на базе CISC архитектуры (например, MCS51), у микроконтроллеров на RISC быстродействие в 12 раз быстрее.

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

Оперативно — Запоминающее Устройство (ОЗУ) и энергонезависимая память данных и программ:

  • 2 кБ самостоятельно программируемой в режиме Flash памяти программы, которая может обеспечить 10 000 повторов записи/стирания.
  • 128 Байт записываемой в режиме EEPROM памяти данных, которая может обеспечить 100 000 повторов записи/стирания.
  • 128 Байт SRAM памяти (постоянное ОЗУ).
  • Имеется возможность использовать функцию по защите данных программного кода и EEPROM.

Свойства периферии:

  1. Микроконтроллер Attiny2313 снабжен восьми разрядным таймер-счетчиком с отдельно устанавливаемым предделителем с максимальным коэффициентом 256.
  2. Так же имеется шестнадцати разрядный таймер-счетчик с раздельным предделителем, схемой захвата и сравнения. Тактироваться таймер – счетчик может как от внешнего источника сигнала, так и от внутреннего.
  3. Два канала. Существует режим работы быстрый ШИМ-модуляции и ШИМ с фазовой коррекцией.
  4. Внутренний аналоговый компаратор.
  5. Сторожевой таймер (программируемый) с внутренним генератором.
  6. Последовательный универсальный интерфейс (USI).

Особые технические показатели Attiny2313:


  • Idle — Режим холостого хода. В данном случае прекращает свою работу только центральный процессор. Idle не оказывает влияние на работу SPI, аналоговый компаратор, аналого-цифровой преобразователь, таймер-счетчик, сторожевой таймер и систему прерывания. Фактически, происходит только остановка синхронизация ядра центрального процессора и флэш-памяти. Возврат в нормальный режим работы микроконтроллера Attiny2313 из режима Idle происходит по внешнему либо внутреннему прерыванию.
  • Power-down — Наиболее экономный режим, при котором микроконтроллер Attiny2313 фактически отключается от энергопотребления. В этом состоянии происходит остановка тактового генератора, выключается вся периферия. Активным остается лишь модуль обработки прерываний от внешнего источника. При обнаружении прерывания микроконтроллер Attiny2313 выходит из Power-down и возвращается в нормальный режим работы.
  • Standby – в этот дежурный режим энергопотребления микроконтроллер переходит по команде SLEE. Это аналогично выключению, с той лишь разницей, что тактовый генератор продолжает свою работу.

Порты ввода — вывода микроконтроллера Attiny2313:

Микроконтроллер наделен 18 выводами ввода – вывода, которые можно запрограммировать исходя из потребностей, возникающих при проектировании конкретного устройства. Выходные буферы данных портов выдерживают относительно высокую нагрузку.

  • Port A (PA2 — PA0) – 3 бита. Двунаправленный порт ввода-вывода с программируемыми подтягивающими резисторами.
  • Port B (PB7 — PB0) – 8 бит. Двунаправленный порт ввода-вывода с программируемыми подтягивающими резисторами.
  • Port D (PD6 — PD0) – 7 бит. Двунаправленный порт ввода-вывода с программируемыми подтягивающими резисторами.

Диапазон питающего напряжения:

Микроконтроллер успешно работает при напряжении питания от 1,8 до 5,5 вольт. Ток потребления зависит от режима работы контроллера:

Активный режим:

  • 20 мкА при тактовой частоте 32 кГц и напряжении питания 1,8 вольт.
  • 300 мкА при тактовой частоте 1 МГц и напряжении питания 1,8 вольт.

Режим энергосбережения:

  • 0,5 мкА при напряжении питания 1,8 вольт.

(3,6 Mb, скачано: 5 958)

Принципиальная схема программатора на LPT порт показана на рисунке. В качестве шинного формирователя используйте микросхему 74AC 244 или 74HC244 (К1564АП5), 74LS244 (К555АП5) либо 74ALS244 (К1533АП5).

Светодиод VD1 индицирует режим записи микроконтроллера,

светодиод VD2 - чтения,

светодиод VD3 - наличие питания схемы.

Напряжение, необходимое для питания схема берёт с разъёма ISP, т.е. от программируемого устройства. Эта схема является переработанной схемой программатора STK200/300 (добавлены светодиоды для удобства работы), поэтому она совместима со всеми программами программаторов на PC, работающих со схемой STK200/300. Для работы с этим программатором используйтепрограмму CVAVR

Программатор можно выполнить на печатной плате и поместить её в корпус разъёма LPT, как показано на рисунках:




Для работы с программатором удобно использовать удлинитель LPT порта, который несложно изготовить самому (к примеру, из кабеля Centronix для принтера), главное "не жалеть" проводников для земли (18-25 ноги разъёма) или купить. Кабель между программатором и программируемой микросхемой не должен превышать 20-30 см.