Attiny2313 reset как подключить

Volkswagen Golf Black Panther › Бортжурнал › Attiny fusebit doctor (HVSP) — Восстановление конфигурации Fuse-битов микроконтроллеров Attiny AVR

При разработке устройств на микроконтроллерах AVR часто требуется изменение конфигурации Fuse-битов (например, для изменения источника тактовой частоты, включения/выключения дополнительных функций). Все микроконтроллеры AVR имеют возможность внутрисхемного программирования (последовательный протокол). Однако при конфигурировании Fuse-битов легко допустить ошибку, что очень часто случается у новичков, и в итоге, при следующей попытке внутрисхемно запрограммировать микроконтроллер, программатор сообщает об ошибке (например, микроконтроллер не обнаружен). Распространенными случаями является ошибочное отключение вывода Reset микроконтроллера (Fuse-бит RSTDISBL, для возможности использовать его как линию ввода/вывода) или отключение режима ISP программирования (Fuse-бит SPIEN) – в этих случаях внутрисхемное программирование станет невозможным.

Я долго выбирал устройство для лечения. Короче, хочу попробовать собрать Attiny fusebit doctor. Если получиться вылечить микроконтроллер, то хорошо.

Данное устройство Attiny fusebit doctor – позволяет восстановить конфигурацию Fuse-битов (заводские установки, согласно техническому описанию) микроконтроллеров семейства Attiny фирмы Atmel. Поддерживает все микроконтроллеры, которые имеют интерфейс высоковольтного последовательного программирования (HVSP):
в 8-выводном корпусе: Attiny11, Attiny12, Attiny13, Attiny15, Attiny25, Attiny45, Attiny85, Attiny22, AT90s2323, AT90s2343;
в 14-выводном корпусе: Attiny24, Attiny44, Attiny84;

При программировании 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 программатора.

READ  Как подключить принтер wifi direct

Изготовление платы (подробно писать не буду). Если вы хотите знать как изготавливать платы — нажмите сюда.

Источник

Подключаем кнопку к микроконтроллеру ATtiny2313, простая программа

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

READ  Как подключить юсб модем к смартфону на андроиде

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

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

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

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

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

Источник

Мало выводов? Используем RESET

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

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

Однако есть способ найти «лишний» порт, который прост, работает стабильно и может быть применен во многих случаях. Это — использование вывода RESET.

На самом деле мне известны целых два способа.

Первый состоит в том, что у МК есть специальный флаг (fuse) RSTDISBL, который, будучи запрограммированным (установленным в «0») превращает вывод RESET в обычный порт ввода-вывода, который можно использовать наряду с другими. Этот способ прост, но имеет один существенный недостаток: после такого переключения МК невозможно будет запрограммировать с помощью низковольтного программатора, обычно самого распространенного типа устройств. Если вы вдруг захотите зашить в МК новую программу, потребуется программатор, использующий напряжение 12Вольт на выводе RESET. Поскольку такие программаторы менее распространены (собственно, их достоинство проявляется только в такой ситуации с переключенным RESET, в остальном они ничем не лучше низковольтных), я считаю этот метод не очень подходящим при разработке (а не копировании готового) устройства.

Второй способ был придуман мною при разработке игрушки «Светофор». По задумке светофор должен был сигналить на два направления (2 красных, 2 зеленых, 1 общий желтый сигнал) и кроме того хотелось, чтобы была возможность переключть режимы работы между обычным и «ночным» (мигающий желтый). Поэтому мне были нужны 5 выходов для управления светодиодами и один вход для кнопки переключения режима.

Самым маленьким в линейке 8-битных AVR-микроконтроллеров является Attiny13 и его современные аналоги ATtiny25, ATtiny45, Attiny85, отличающиеся, в первую очередь, большим объемом памяти. Эти устройства изготовлены в 8-контактном корпусе, поэтому, если вычесть выводы для подачи напряжения питания, остается максимум 6 портов ввода-вывода, но один из них занят RESET, значит остается 5 портов. Этого достаточно для управления светодиодами, но остается нерешенным вопрос с кнопкой.

READ  Как подключить светодиодную ленту к ноутбуку через usb 12 вольт

И тогда мне пришла в голову идея использовать вход сброса для подключения кнопки (см. схему).

Работает такой вариант следующим образом (обозначения на примере ATtiny13): в МК есть регистр статуса MCUSR, биты 0..3 которого устанавливаются в «1» в зависимости от того, какая причина вызвала сброс МК:

бит 0 — сброс при включении питания.
бит 1 — сброс по низкому уровню на выводе RESET.
бит 2 — сброс по срабатыванию детектора низкого напряжения питания.
бит 3 — сброс по срабатыванию сторожевого таймера.

В процедуре начальной инициализации МК (вектор прерывания 0) можно проверить регистр MCUSR и выяснить, из-за чего произошел сброс. После проверки нужно очистить регистр, записав в его биты «0».

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

Обратите внимание: независимо от причины перезагрузки МК, все его внутренние устройства будут переведены в исходное состояние. Это означает, что процедура начальной инициализации должна всякий раз заново запустить нужные устройства (таймеры, порты ввода-вывода и т.п.) в нужных режимах. Состояние же регистров и памяти при сбросе по низкому уровню на выводе RESET не меняется (что и позволяет переключать режим или делать другое управляющее действие), однако при сбросе по включению питания или по понижению напряжения питания нужно проинициализировать память и регистры, поскольку значения в них могут быть неопределенными.

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

UPD: Раз уж в комментах зашла речь, приведу еще одну схему, не совсем по теме, но думаю, будет полезно. Стояла задача сделать часы-таймер для игры «Брейн-Ринг». Поскольку дело было в почти полевых условиях и под рукой было мало провода, нужно было придумать, как сделать пульты, чтобы по двухпроводной линии и управлять светодиодом и контролировать нажатие кнопки. Была разработана такая схема:

Работает следующим образом: когда надо проверить состояние кнопки, подаем на PD0 уровень «0» и проверяем PD1. Когда кнопка будет нажата, там появится «0». Чтобы зажечь светодиод, подаем на PD0 «1», а на PD1 «0». Поскольку специфика игры в том, чтобы ждать, когда кто-то нажмет кнопку, и только потом зажигать его светодиод, то не понадобилось даже динамической индикации — сначала ждем нажатия, потом зажигаем светодиод.

При этом был интересный момент: в отладчике все отлично работало, а при тестировании на макете при старте сразу обнаруживалась нажатая кнопка. Поломав голову, я попробовал добавить задержку между инициализацией порта PD1 на ввод (с подтягивающим резистором) и проверкой его состояния. Оказалось, что из-за емкости длинных проводов до пульта (порядка 10 метров) уровень сигнала не сразу достигал «1» за счет подтягивающего резистора. Задержка была всего в пару микросекунд, но МК работает быстро и это оказалось существенным 🙂

UPD2: Прошивка для светофора (исходник на ASM и скомпилированный код) лежит здесь. Обратите внимание на строки 56-72, в них находится описанная логика распознавания типа сброса.

Источник

Поделиться с друзьями
Как подключить и установить...
Adblock
detector