Воскресенье, 17.08.2025, 17:21
Приветствую Вас Гость | RSS
Главная | Ещё один сброс фьюзов микроконтроллера ATMega8. | Регистрация | Вход
Меню сайта
Поиск
Вход на сайт
Календарь
«  Август 2025  »
ПнВтСрЧтПтСбВс
    123
45678910
11121314151617
18192021222324
25262728293031
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Друзья сайта
MisterGemix

<На главную>

Устройство для перепрограммирования фьюзов микроконтроллера ATMega8 в режиме параллельного программирования.

Введение

Для начала скажу что речь пойдёт об устройстве не являющимся чем-то законченным и удобным в использовании. Это скорее эксперимент, некая альтернатива существующему устройству под названием Fuse Bit Doctor.

Почему я не повторил существующую схему, а начал придумывать что-то своё? Потому что наткнулся на обсуждения в форумах, где на десятках страниц новички обсуждают что и как у них не работает. Я тоже новичок и не захотел сталкиваться с теми же трудностями. Тем более что после прочтения раздела даташита на микроконтроллер ATMega8 в котором говорится о параллельном программировании (начиная со страницы 226), я понял что я уже обладаю устройством пригодным для параллельного программирования.


Этим устройством оказалось вот это. Автор устройства назвал его "UniCOM - управление устройствами через COM-порт компьютера".

Собрал я его давно, когда ещё не имел дело с микроконтроллерами. Мне оно понравилось своей идеей управлять чем-то используя компьютер. То есть управлять чем-то по заранее написанной программе. Программу пришлось писать самому, поскольку софт выложенный в той статье годился только для гирлянд. Языком программирования выбрал Python. Почему - не спрашивайте, не могу дать точного ответа. В результате получилась не программа, а скрипт. Скрипт который можно менять как душе угодно. Легко изменяя алгоритм работы устройства.

Вкратце о UniCOM . Основной его частью является регистр сдвига 74HC595. Программируется он с помощью изменения уровня сигналов на выводах COM-порта DTR (4-й вывод), TxD (3-й вывод), RTS (7-й вывод). Уровень сигналов между COM-портом и регистром согласуется с помощью стабилитронов на 5,1 вольт. Управление выводами COM-порта осуществляется программной частью. Как будет выглядеть программная часть и на каком языке будет написана не имеет значения. Восемь выходов сдвигового регистра переходят в запрограммированное состояние, на них появляется либо высокий уровень сигнала (5 вольт), либо низкий уровень сигнала (около 0 вольт). Также есть возможность подключения последовательно нескольких сдвиговых регистров и получения устройства с большим количеством выходов. Как это сделать можно прочитать вот тут.

В своё время я собрал UniCOM на двух регистрах, с шестнадцатью выходами которые по желанию могли быть запрограммированы на появление на них напряжения 5 вольт. Это как раз то что нужно для осуществления параллельного программирования ATMega8 (и не только его). Поэтому я не стал заниматься созданием схемы на микроконтроллере, тем более что прошивка Fuse Bit Doctor является "чёрным ящиком", её исходники отсутствуют в свободном доступе, отладка этого устройства не возможна. Я решил доработать свой UniCOM до состояния параллельного "недопрограмматора".

Схема устройства

Основой схемы конечно же является UniCOM. Схемы я ранее не рисовал. Получилось не самым лучшим образом.

Питание устройства должно осуществляться стабилизированным напряжением 12 вольт. Отклонения в большую или меньшую сторону не должны превышать 0,5 вольта. Это важно, поскольку напряжение от источника питания напрямую подаётся на 1-ю ногу микроконтроллера. В случае выхода напряжения за указанные рамки, микроконтроллер не перейдёт в режим программирования. А максимальное напряжение на 1-й ноге по даташиту не должно превышать 13 вольт относительно минусового провода.

Так же для перехода в режим программирования важно подавать напряжение +12 вольт и +5 вольт одновременно. Поэтому напряжение на 1-ю ногу и напряжение на микросхему 7805 подаётся через один выключатель SW1.

Светодиод D20 на 3-м выводе микроконтроллера загорается когда микроконтроллер готов принимать новую команду. И может косвенно сигнализировать о входе в режим параллельного программирования. Во время выполнения команды D20 гаснет, это служит признаком правильности подачи команд на входы микроконтроллера. К сожалению момент угасания едва заметен.

LM7805 при переполюсовке может разорваться и нанести травму. Имейте ввиду.

Программная часть

Как писал ранее, для управления COM-портом я решил использовать язык программирования Python. У меня установлена старая версия языка 2.7.7. Для работы с COM-портом в Python необходимо установить дополнительный модуль PySerial, у меня установлен модуль версии 2.7. Скачать используемые мной версии программ можно по этой и по этой ссылке.

Для начала скачиваем и устанавливаем Python. Для проверки работоспособности запускаем командную строку CMD и набираем в ней python, жмём Enter. Должен запуститься интерпритатор языка Python и появиться приглашение >>>. Если ничего не произошло, то добавляем исполняемый файл питона из папки куда он установился в переменную окружения Path операционной системы. Для установки PySerial распакуем скачанный архив. Запустим командную строку. С помощью команды cd перейдём в папку с распакованным модулем. Выполним команду python setup.py. Модуль автоматически установится. Для проверки правильности установки запустим командную строку, запустим интерпритатор языка Python, набрав команду python. В интерпритаторе наберём import serial. Если после этого не появилось никаких сообщений, то модуль установлен правильно.

Скачиваем скрипт на языке python. Открываем его любым текстовым редактором. Видим в нём строку def output(out): Это по сути та функция, которая управляет COM-портом. Внутри неё устанавливаются высокие либо низкие логические уровни на выводах порта DTR, RTS, Break.

Функция clear_registers() очищает регистры перед началом программирования.

Функции oe(level), wr(level), bs1(level), xa0(level), xa1(level), pagel(level), bs2(level), xtal1(level) устанавливает высокий (параметр level=1) либо низкий (параметр level=0) логический уровень на одноимённом входе микроконтроллера (смотри раздел о параллельном программировании в даташите).

Функция data(data) устанавливает заданный байт (последовательность нулей и единиц) на выводах микроконтроллера 24, 23, 19, 18, 17, 16, 15, 14. Причём выводу номер 14 соответствует младший бит (самый правый, нулевой бит), выводу номер 24 соответствует старший бит (самый левый, седьмой бит). В качестве параметра принимается строка из восьми цифр (ноль или единица), означающие состояние битов (крайний слева бит 7, крайний справа бит 0).

Функция command(command) передаёт микроконтроллеру заданную команду (смотри даташит). В качестве параметра принимает строку из восьми цифр (ноль или единица).

Функция erase_chip() очищает содержимое флэш-памяти микроконтроллера. Необходимая операция при очистке лок-битов.

Функция load_data_low_byte(bits) загружает нижний байт данных. В качестве параметра принимает строку из восьми цифр (ноль или единица).

Функция load_data_high_byte(bits) загружает верхний байт данных. В качестве параметра принимает строку из восьми цифр (ноль или единица).

Функция load_adress_low_byte(bits) загружает нижний байт адреса. В качестве параметра принимает строку из восьми цифр (ноль или единица).

Функция load_adress_high_byte(bits) загружает верхний байт адреса. В качестве параметра принимает строку из восьми цифр (ноль или единица).

Функция programming_fuse_high_bits(bits) устанавливает состояние верхнего байта конфигурационных ячеек. В качестве параметра принимает строку из восьми цифр (ноль или единица). Крайняя левая цифра это бит номер 7, крайняя правая цифра это бит номер ноль. То есть для ATMega8 крайняя левая цифра задаёт состояние бита RSTDISBL, крайняя правая цифра задаёт состояние бита BOOTRST. Для облегчения задания этого параметра необходимо взять состояние битов в виде шестнадцатеричного числа (из калькулятора фьюзов или из программы-прошивальщика) и перевести его в бинарный вид с помощью, хотя бы, калькулятора windows в режиме "Программист".

Функция programming_fuse_low_bits(bits) устанавливает состояние нижнего байта конфигурационных ячеек. В качестве параметра принимает строку из восьми цифр (ноль или единица). Требования к параметру аналогичны предыдущей функции. Для ATMega8 крайняя левая цифра параметра задаёт состояние бита BODLEVEL, крайняя правая цифра задаёт состояние бита CKSEL0.

Функция programming_lock_bits(bits) задаёт состояние лок-битов. В качестве параметра принимает строку из восьми цифр (ноль или единица). Для ATMega8 крайняя правая цифра задаёт состояние бита LOCKBIT1.

Функция reading_fuse_and_lock_bits() прочитывает состояние конфигурационных ячеек и лок-битов.

Функция reading_signature_bytes() прочитывает содержимое адресов 0х00-0х02 сигнатуры микроконтроллера.

Функция reading_calibration_bytes() прочитывает содержимое калибровочных ячеек встроенного тактового генератора по адресам 0х00-0х03.

Прочитанные значения можно снимать с помощью вольтметра на ножках микроконтроллера. Либо для чтения можно переводить выводы второго регистра в высокоомное состояние с помощью переключателя SW2. При этом будут загораться светодиоды на выводах DATA BIT 0 - DATA BIT 7. После чего двоичное восьмиразрядное число с помощью того же калькулятора windows в режиме "Программист" переводится в шестнадцатеричное.

Перед началом программирования необходимо задать номер COM-порта с которым будем работать. Вариантов два. Либо это порт COM1, либо это порт COM2. Необходимо найти в скрипте переменную com_port и установить её в com_port = 0 для порта COM1 и com_port = 1 для порта COM2. Узнать с каким именно номером порта работаем проще всего методом проб и ошибок, по реакции прибора на работу скрипта или отсутствие какой-либо реакции.

Список out = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] определяет начальное состояние регистров. Переменные short_pause и long_pause определяют паузы в секундах необходимые для передачи данных в микроконтроллер. Иначе скрипт будет работать быстрее, чем физически передаются данные в устройство. Данные величины установлены произвольно, "на глаз". Особенно сильно ускорять работу скрипта нет смысла. Он и так работает не долго. Строка s = serial.Serial(com_port) подключает заданный COM-порт, подготавливает его к работе. После окончания работы необходимо "закрыть" порт строкой s.close().

Строка programming_fuse_high_bits('11011001') и следующая за ней programming_fuse_low_bits('11100001') заменяет значения конфигурационных ячеек на значения по умолчанию для микроконтроллера ATMega8.

Строку erase_chip() при необходимости можно закомментировать символом #. Чип нет смысла очищать, если микроконтроллер не имеет запрограммированых лок-битов. При выполнении команды erase_chip() стирается прошивка микроконтроллера.

После внесения необходимых изменений в скрипт подключаем устройство к COM-порту компьютера. Убеждаемся что все светодиоды на выходах обоих регистров потушены. Если горит хотя бы один из выходов PAGEL, XA1, XA0, BS1, то микроконтроллер может не войти в режим программирования. Для того чтобы выводы потухли включаем и снова выключаем кнопку питания на устройстве. После подаём питание ещё раз. В случае входа микроконтроллера в режим программирования должен загореться светодиод на выводе номер 3 (RDY/BSY). Если не загорелся - производим повторное выключение и включение питания устройства.

После успешного входа в режим программирования запускаем скрипт на компьютере. Для запуска скрипта набираем в командной строке python ResetFuses.py. Указанный алгоритм ввода микроконтроллера в режим параллельного программирования согласно даташиту предназначен для перезаписи фьюзов и стирания флэш памяти вместе с лок-битами. Используйте функции чтения состояния фьюзов, сигнатур и калибровочных ячеек на свой страх и риск. У меня при невыясненных обстоятельствах в микроконтроллере испортились сигнатура и калибровочные ячейки.

Прибор некоторое время будет мигать светодиодами на выводах регистров. Это говорит о принятии команд через COM-порт. При переходе вывода WR микроконтроллера из высокого логического состояния в низкое и обратно производится запись (выполнение) команды в микроконтроллере. При этом светодиод на выводе номер 3 микроконтроллера должен едва заметно притухнуть. Если это происходит, то является признаком того что все команды были переданы правильно.

Я думаю этот же скрипт на питоне подойдёт ещё для многих микроконтроллеров семейства ATMega. В крайнем случае понадобятся минимальные изменения.

Всё описанное не больше чем эксперимент.

<На заглавную страницу сайта>

Создать бесплатный сайт с uCozCopyright MyCorp © 2025