Как запрограммировать FUSE - биты.

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

Основных ошибок две:

1. "Запрограммированным" , то есть - оказываюшим воздействие, считается бит в который записан ноль. И наоборот, сброшен бит тогда, когда его значение равно единице.

2. При попытке изменить значение одного бита в окошке программатора меняется значение этого бита, а значения остальных битов - остаются "чистыми". Далее, команда - "Прошить FUSE!" ... и "повисший" кристалл... А дело в том, что область FUSE битов состоит из 1...3 байтов и не допускает побитного обращения, т.е. читается и "шьеся" побайтно!!! Справедливости ради, следует отметить, что некоторая защита предусмотрена изготовителем. Так например, бит SPIEN, который разрешает или запрещает последовательное (SPI ) программирование, в режиме оного, последовательного то есть, программирования - НЕ ДОСПУПЕН. То есть, даже если захочется, то "повесить" кристалл этим битом не удастся.

Отступление:

Нужно сказать, что SPI интерфейс программирования самый распространенный. По это интерфейсу программирует AVR910.....и вообще, большинство программаторов работают именно по SPI. Видимо, вызвано это тем, что это основной режим ВНУНРИСХЕМНОГО (In-System) программирования. Параллельное программировние не допускает внутрисхемного (возможно я ошибаюсь), да и "панель" (зажим для программатора) для корпуса TQFP я не видел. Есть еще два возможных режима программирования это - последовательное выcоковольтное, и с применением JTAG интерфейса. Но в первом режиме программируются лишь некоторые разновидности ATtiny, а вторым только начиная с ATmega16.

На мой взгляд, самым "опасным", или трудно восстанавливаемым, является неправильное программирование бита RSTDISBL, при активировании (установка в ноль) которого "запрешается" аппаратный сброс. Вывод RST начинает работать как вывод порта. Напомню, что это касается только кристаллов у еоторых вывод RESET имеет "альтернативную" функцию, ATmega16 это уже не касается, такого FUSE в ней нет вообще.

Так вот, если в этот FUSE-бит записан ноль, то помочь может только параллельное программирование. Из-за того, что в режим последовательного программирования кристалл переводится "сбросом".

Радует то, что если совершить ошибку №2 (см.выше), то в RSTDISBL будет записана 1, то есть кристалл будет по-прежнему доступен для последовательного программирования.

Чаще всего, кристалл "виснет" из-за того, что работает в схеме от внутреннего генератра, а при ошибке №2 происходит "переключение" на работу от внешнего кварца (FUSE-биты CKSEL0...3 = 1).

Выйти из такого положения можно или подключив кварц 3...8МГц (я подключал 4МГц) к выводам XTAL1 и XTAL2 (я конденсаторы не подключал - "голый" кварц и ...все пошло) или подать синхросигнал на вывод XTAL1 (по всей видимости, у "немецкого" AVR910 такой сигнал можно снять с вывода, к которому подключены светодиоды... разберусь, укажу точно..).

Если кристалл "оживает" его еще нужно привести "в норму", запрограммировав FUSE -биты, как они были "с завода". Где взять?.... :-) Смотрите Datasheet, главу "Memory
Programming", раздел "Fuse Bits", а там "Default Value"... :-)

Все вышеописанное (ошибка 2) я проделал сам. Результат положительный. Хотя (с перепугу :-) ) и перепаивал ATmega8 (планарную), но перепайка на работоспособности ни как не сказалась. Выпаяный, "повисший" кристалл был впаян в другую плату и там "оживлен" при помощи кварца. Оживленный кристалл работает до сих пор... :-)

(C)STAS633

03.06.06г.

Главная

Hosted by uCoz