Эти загадочные Fuse. | Печать | 21.02.2010 00:00 Вот устройство разработано, программа написана и отлажена в протеусе, само устройство смонтировано, остался последний штрих - зашить программу в контроллер. Вы подключаете к плате программатор, прошиваете микроконтроллер и... вместо того, чтобы созерцать работающее устройство, вы смотрите на "бездыханный" чип... К сожалению, такое часто происходит у начинающих AVR-щиков. В чем же дело? Ведь программа прекрасно работала в протеусе? Почему микроконтроллер не хочет запускаться? Такие вопросы, наверное, возникали у многих. Оказывается, причина в неправильной конфигурации фьюзов. Что же это за загадочные фьюзы, при виде одного названия которых у многих начинается панический страх? В этой статье мы попытаемся разобраться, для чего же нужны эти фьюзы и как с ними бороться. Что же такое фьюзы? В переводе с английского, фьюз - это плавкий предохранитель, но в микроконтроллере это специальный конфигурационный регистр, при помощи которого мы указываем микроконтроллеру, как нужно настроить свою внутреннюю схему для работы в нашем устройстве. Это, примерно, то же самое, как когда-то мы настраивали конфигурацию материнских плат ПК при помощи перемычек (поэтому их называю фьюзами: плавкий предохранитель похож на перемычку), выставляли тактовую частоту процессора, коэффициент умножения частоты, объем установленной памяти на материнке и т.д., только в микроконтроллере эти "перемычки" сделаны в виде флэш-регистра. Некоторые фьюзы можно изменить только параллельным программатором и они не доступны в ISP режиме программирования. Подробную информацию о фьюзах можно узнать в даташите на конкретный микроконтроллер, а мы попытаемся разобраться с фьюзами Mega8. Фьзы занимают два байта: младший и старший байты. Разберемся, за что же отвечает каждый бит. Начнем со старшего байта. Самый "опасный" бит 7 - RSTDISBL (Reset Disable). От него зависит, сможем ли мы запрограммировать МК в ISP режиме или нет. Этот фьюз настраивает вывод порта PC6 либо как вход/выход порта, либо как вход "reset" для перезагрузки МК. А сигнал "reset"используется для внутрисхемного программирования микроконтроллера. Естественно, если мы отключим функцию "reset" микроконтроллера, то мы не сможем его программировать последовательным программатором. Именно поэтому многие начинающие радиолюбители, случайно запрограммировав этот фьюз, "убивают" микроконтроллер. Кстати, фьюз считается запрограммированным, если он установлен в ноль и не запрограммированным, если установлен в единичку. В программаторе CodeVision галочка, установленная напротив соответствующего фьюза, означает, что фьюз будет запрограммированным (установленным в ноль). По умолчанию у нового МК фьюз RSTDISBL не запрограммирован (установлен в 1) и вывод порта PC6 работает, как вход "reset". Если этот фьюз запрограммировать (установить в 0), то вывод 1 МК будет работать как порт ввода/вывода. Идем дальше. Бит 6 - WDTON (Watch Dog Timer On). Включает/выключает регистр управления сторожевым таймером ( Watch Dog в переводе Сторожевой пес). О сторожевом таймере мы поговорим в отдельной статье. По умолчанию бит 6 не запрограммирован (установлен в 1) и регистр управления сторожевым таймером включен). Если этот бит запрограммировать (установить в 0), то мы отключим управление сторожевым таймером. Бит 5 - SPIEN (SPI Enable). Этот бит включает и выключает интерфейс SPI по которому осуществляется программирование в последовательном режиме, а также передача данных по SPI. По умолчанию этот фьюз запрограммирован (установлен в 0) и интерфейс SPI включен. Если этот бит установить в 1, то SPI будет отключен и вы не сможете программировать и передавать данные по SPI. Этот фьюз доступен только при параллельном программировании и не доступен в режиме ISP (в режиме внутрисхемного программирования). Бит 4 - CKOPT (Clock Optimise). Этот фьюз предназначен для оптимизации работы тактового генератора МК. По умолчанию он не запрограммирован (установлен в 1) Его нужно программировать (установить в 0), когда тактовая частота генератора больше 8 МГц. Бит 3 - EESAVE (EEPROM Save). Этот фьюз устанавливает или снимает защиту от стирания EEPROM. По умолчанию не запрограммирован (установлен в 1) и защита от стирания снята. Если этот фьюз запрограммировать (установить в 0), то EEPROM будет защищена от стирания и ваша программа не сможет в EEPROM ничего записать. Бит 2, 1 - BOOTSZ1, BOOTSZ0 (Boot Size). Этими фьюзами устанавливают размер блока памяти, отведенного под загрузчик BootLoader. Что такое BootLoader мы поговорим в одной из статей. По умолчанию эти фьюзы запрограммированы (установлены в 0). Бит 0 - BOOTRST (Boot Reset). Этот фьюз перенаправляет вектор прерывания по системному сбросу на загрузчик BootLoader, если он используется. По умолчанию не запрограммирован (установлен в 1). Программируется этот фьюз, когда используется BootLoader. В этой статье мы рассмотрели назначение фьюзов старшего байта. В следующей статье мы рассмотрим назначение фьюзов младшего байта. 23.02.2010 00:00 В прошлой статье мы говорили о старшем байте конфигурации фьюзов. Теперь поговорим о младшем байте. Бит 7 - BODLEVEL (Brown Out Detector trigger Level). В микроконтроллерах AVR в цепи питания стоит супервайзер, устройство, которое подает питание на микроконтроллер, когда напряжение достигнет определенного уровня. Сделано это для того, чтобы при неустановившемся напряжении питания не запускалась программа на выполнение, иначе могут быть сбои в работе устройства. Бит 7 устанавливает порог срабатывания супервайзера. По умолчанию бит 7 не запрограммирован (установлен в 1) и напряжение, при котором МК запускается равно 2,7 В. При запрограммированном бите 7 (установленным в 0) микроконтроллер будет запускаться при напряжении 4,0 В. Т.е. При запрограммированном бите 7, если напряжение питания станет меньше 4,0 В, в МК автоматически выработается сигнал "reset", который сбросит МК в начальное состояние и будет держать его в таком состоянии, пока напряжение питания не нормализуется. Бит 6 - BODEN (Brown Out Detector Enable). Включает или выключает отслеживание напряжения питания. По умолчанию этот бит не запрограммирован (установлен в 1) и супервайзер выключен. Для того, чтобы его включить, нужно запрограммировать бит 6 (установить в 0). Биты 5 и 4 - SUT1, SUT0 (Start Up Time). Эти биты выставляют время задержки между включением МК и началом выполнения программы. Это еще один метод защиты от сбоев при включении питания. Дело в том, что выполнение программы начинается не сразу после того, как детектор Brown Out подаст питание на внутренние узлы, а после небольшой задержки, которая выставляется битами 5 и 4. По умолчанию бит 5 не запрограммирован (установлен в 1), а бит 4 запрограммирован (установлен в 0).Такой комбинацией выставляется максимальная задержка при включении. Все возможные комбинации битов можно узнать в Datasheet'e на конкретный микроконтроллер. Биты 3, 2, 1 и 0 - CKSEL3, CKSEL2, CKSEL1, CKSEL0 (Clock Select). Этими битами выбирается тип тактового генератора и задается его частота. Именно они создают путаницу у начинающих радиолюбителей. По умолчанию не запрограммирован только бит 0 (установлен в 1), остальные три бита запрограммированы (установлены в 0), и тактовый генератор настроен как внутренний RC-генератор с частотой 1 МГц. Если используется внешний кварцевый резонатор, то фьюзы программируются такCKOPT CKSEL3..1 Диапазон частот (МГц) 1 101 0.4 - 0.9 (только для керамического резонатора) 1 110 0.9 - 3.0 1 111 3.0 - 8.0 0 101, 110, 111 Больше 8.0 Если используется внешний RC-резонаторCKSEL3..0 Диапазон частот (МГц) 0101 0.1 - 0.9 0110 0.9 - 3.0 0111 3.0 - 8.0 1000 8.0 - 12.0 Если используется внутренний RC-генераторCKSEL3..0 Номинальная тактовая частота (МГц) 0001 1.0 0010 2.0 0011 4.0 0100 8.0 При использовании внутреннего генератора, частоты могут быть только такими, как указано в таблице. Надеюсь, что после этой статьи путанницы с программированием фьюзов будет меньше. Главное, при программировании фьюзов, быть предельно внимательными. И помните - не запрограммированный фьюз установлен в 1 (галочка в программаторе снята), а запрограммированный установлен в 0 (галочка в программаторе установлена). И не забывайте о пословице: "Семь раз отмерь, один раз отрежь".