Понадобилось при изучении и ремонте компьютеров, которые старше меня, прошивать ПЗУшки. Тесты оперативной памяти и периферии проводить. Нормального программатора у меня на тот момент не было. Собрать на логике для LPT порта, конечно, можно, но данный вариант был отброшен, так как для использования пришлось бы включать какого-нибудь старичка. В современных компах все ещё встречается данный интерфейс (правда не полноценный разъем, а на гребенке) да и купить плату в PCI слот тоже не проблема, но возникают уже сложности с софтом. Он был написан очень давно, когда работа с портами ввода/вывода в операционных системах велась иначе. Соответственно, в современных версиях Windows ПО не будет работать.
Сразу стоит оговориться, что про существование TL866 знаю. И даже в процессе разработки все же его купил себе, но он не в состоянии прошить микросхемы, которые требуют высокое напряжение программирования. Максимум 18 вольт (TL866+ или 21 для предыдущей версии).
Беглое гугление привело меня к данному репозиторию: https://github.com/bouletmarc/BMBurner. Собрав программатор, я смог сдампить пару интересующих чипов. А вот с прошивкой все оказалось куда сложнее… Софт этого просто не умеет… Его, конечно, можно обмануть, выставив неправильный чип, но работает это не во всех случаях и явно не наш метод
Очень сильно огорчил пользовательский интерфейс, который, вместо классического варианта с предоставлением права выбора порта пользователю, проходился по всем доступным последовательным интерфейсам. Соответственно, все устройства перезагружаются. Особенно обидно, наверное, когда у тебя 3D принтер уже часов 10 печатает детальку с флешки, а тут такая подстава…
Мир OpenSource прекрасен тем, что ты можешь взять проект и дописать его под свою задачу. В данном случае исходных кодов к графическому интерфейсу нет. По крайней мере я их не нашел, хотя можно было написать разработчику. Стало интересно и появился небольшой повод для изучения Qt. Так что софт будет кросплатформенный.
Берем за основу схему, дорабатываем устройство до требуемого функционала. Решил пожертвовать поддержкой EEPROM в софте. Возможно, это не совсем удачное решение. Если вдруг понадобится такая функциональность, то всегда можно попробовать дописать. Хотя, учитывая стоимость MiniPro, будут ли оправданы трудозатраты… В любом случае, имеется репозиторий на github, который можно Fork-нуть или там теоретически могут появиться обновления.
При доработке опирался на самую объемную микросхему (27C512) и убрал всю путаницу относительно адресных ножек. Весь адрес будет задаваться исключительно при помощи сдвиговых регистров (74HC595 или отечественный аналог КР1564ИР52). Это освободит дополнительные ноги самого микроконтроллера. Получить дополнительные сигналы, которые требуются для программирования, можно просто модифицировав адрес перед отправкой.
Принцип подачи напряжения программирования остался прежним. Изменения только в области защиты выводов микроконтроллера и сдвиговых регистров. Заменил резисторы (1 КОм) на диоды. Правда с ними потребовалась ещё подтяжка выхода к логическому нулю. Это более безопасный метод, хотя, справедливости ради, и резисторы работают.
Изучив документацию на все интересующие чипы, определил, что требуется три точки подачи Vpp:
- 27C16 на 21 ногу микросхемы (23 ногу DIP28 сокета)
- 27C32 и 27C512 на сигнал #OE (Output Enable)
- 27C64, 27C128, 27C256 на 1 ногу микросхем
Микросхемы 27C16 и 27C32 от остальных отличаются корпусом, так что им требуется подавать напряжение питания на 26 ножку сокета. Это адресная нога A13 (для более емких собратьев), подключенная к сдвиговому регистру. Тока с его выхода должно хватить для работы, но на время передачи данных от микроконтроллера выходы микросхемы 74xx595 переходят в Z состояние. Подобный режим допустим, но включение на чтение или запись одной ячейки вряд ли является нормой. Поэтому под управление питания установлен дополнительный транзистор.
27C16 на время чтения требует на вход Vpp напряжение 5 вольт. При формировании сдвиговым регистром возникали проблемы, так что ещё один ключ. Можно, конечно, на время чтения выставить напряжение программирования на значения 5 вольт, но метод не очень удобный для эксплуатации. Быстро переключаться между 25 и 5 вольтами не выйдет.
Если есть свободные ноги АЦП, то почему бы не измерять напряжение программирования? Плата разведена под Arduino Nano. На нем имеются два дополнительных входа, которые кроме как для АЦП использовать нельзя. На самом деле это особенность многих микроконтроллеров AVR в корпусе для поверхностного монтажа. На китайских Arduino UNO частенько есть входы A6 и A7. С учетом того, что напряжение может быть до 30 вольт (вроде больше всего хотят отечественные РФ5, 25 вольт), рассчитываем делитель из того, что есть в наличии. Точность в 0.5 вольта для данной задачи вполне достаточна. Главное убедиться, что напряжение программирования поступает от внешнего источника и примерно совпадает с номинальным для микросхемы. Плюс небольшая защита от дурака.
Можно, конечно, было заморочиться с DC-DC повышающим преобразователем и выступать в качестве ШИМ контроллера, но 27С16 съела все оставшиеся ноги… Поэтому на печатной плате есть посадочное место для преобразователя DC-DC Step Up на чипе MT3608, которые доступны на али: http://ali.pub/3l47fs.
По схеме на этом все.
Алгоритм работы с данными микросхемами очень прост. С ним можно ознакомится в небольшом ролике.
Схемы и софт доступны в репозитории на GitHub: https://github.com/walhi/arduino_eprom27_programmer. При сборке можно спокойно менять номиналы резисторов в схеме подачи напряжения программирования и делителя для контроля значения. Правда со вторым дополнительно потребуется немножко исправить код скетча.
Имеется альтернативная схема и разводка печатной платы от пользователя RadioNews. Подробнее можно ознакомиться в видео.
Надеюсь, данное устройство кому нибудь пригодится.
Ну и небольшой список полезных лотов на Ali:
- Цанговые «расчески»: http://ali.pub/3l463k
- Программатор MiniPro: http://ali.pub/3l4681
- EPROM Eracer: http://ali.pub/3l46hd
- DC-DC Step Up: http://ali.pub/3l47fs
Добрый день и с Новым годом!
Если ещё остались платки, хотел бы одну прикупить. Как это сделать?
Платки вроде были. Написать на почту walhi_at_walhi.ru или ВК https://vk.com/walhi
Здравствуйте
Я так понимаю программа под винду платная?
нигде не нашел где ее скачать. ткните пожалуйста пальцем
Разумеется бесплатная. Все исходные коды же предоставлены. На странице репозитория Github есть кнопка «Релизы». В сам репозиторий обычно кладутся исходники, а релиз содержит снимок исходников и собранные пакеты. Это должно быть гарантировано рабочим кодом. https://github.com/walhi/arduino_eprom27_programmer/releases
Хочу повторить данный программатор но никогда раньше не имел дело с Arduino 🙁
Подскажите, пожалуйста, как записать firmware.
Ну уж уроки по андуине я еще не выпускал… их итак куча.
Да, как бы уже записал.
Смущает, что Arduino IDE выдал ошибку в строке «if (buf[j] != virify){»
Заменил на verify и все пошло. Это так и задумывалось?
Качайте релиз, а не просто репозиторий
Скачал. Компелируется нормально. Пишу через STK500, так как через USB выдает ошибку записи хотя порт работает и «Board info» тоже.
Вопрос по печатке. Они существенно отличаются в релизе и репозитории.
В частности, убран DC-DC. В чем причина? Я собираю по старой. Будут ли проблемы с ней?
Странно… не помню, чтобы отличались печатные платы. Надо разобраться будет. Я начал переделывать софт для компа по человечески, но забил пока. А плату не трогал вроде. В релизе есть архив с гербер файлами. Там все правильно, за исключением диаметра отверстий у микрухи самой. Для цанговых панелек подходит, а вот zif уже не лезут. Не учел этот момент. Пришлось напильником ножки подтачивать.
Похоже, это у меня глюки. Так как металлизацию отверстий делать не могу, ZIF мне не светит. Поставил обычную цанговую панельку.
Нет, не глюки.
Захожу сюда https://github.com/walhi/arduino_eprom27_programmer/releases/tag/v0.1
Source code(zip)
В папке Eagle совершенно другая борда.
Не подскажете, по какой причине Arduino пишется через ISP но не хочет через USB?
Значит проблема в загрузчике или же uart преобразователе. Попробуйте из arduino ide прошить загрузчик правильный. Там есть в меню такой пункт.
ТОлько через программатор. Может, потому, что китайский?
Да. Китайцы используют старый загрузчик. Там в опциях есть выбор загрузчика для arduino nano
Пробовал по всякому. При попытке писАть через USB ругается на STK500.
Зато через тот-же STK500 (Petka), но внешний, никаких проблем не возникает.
Я не видел опции «выбор загрузчика», только возможность записать. Результат тот-же. Через внешний программатор никаких проблем. Как будто не хочет корректно дружить с CH340.
Посмотрел как там подписано. Есть выбор процессора. И как раз в этом пункте меню можно выбрать atmega328 old bootloader
Зашил через программатор «old bootloader» и заработала запись через USB 🙂
Наконец-то пришли регистра. Надеюсь сегодня закончить.
Обнаружились странности с изменением напряжения программирования.
Резисторы 10к и 1.5к 1%. Показания отличаются почти на 2 вольта и плавают в пределах примерно вольта. Поменял в скетче 1500 на 1700. Поставил 1uF параллельно 1.5к. Стало точнее но плавать не перестало.
Это известные странности, ибо опорный источник нифига не стабильный. Это изначально задумывалось, как показометр, чтобы перед прошивкой проверить того ли порядка напряжения. А до как закачаешь случайно 25 вольт вместо 15.
А нельзя Vref использовать?
Можно. Тогда немного код инициализации переписать и функцию считывания напряжение. И, разумеется, пересчитать делитель резисторный.
Подсказку в студию!
У меня есть куча ИОН на разное напряжение.
Не вижу проблем. Можно приделать.
Поможете?
Как я понял, нужно прописать
analogReference (EXTERNAL) ; analogRead (0) ;
Вместо чего?
В функции setup() прописать analogReference (EXTERNAL). И только номиналы резисторов в делителе заменить, чтобы диапазон охватить.
То есть просто добавить в область «setup» analogReference (EXTERNAL) ?
Нужно ли менять что-либо тут?
Заменить 5. на напряжение ИОН?
float get_voltage (void) {float vADC = (analogRead(voltageControl) / 1024.) * 5.;float current = vADC / rBottom;return (current * (rTop + rBottom));}
Понятно, что напряжение на rBottom не должно превышать Aref.
Да… Я и забыл, что на aref не 5 вольтовый ИОН. 2.048 или 4.096 например.
Ну да, в Atmege же можно выбрать в качестве опорного или напряжение питания или внутренний 2.048/4.096 или внешний. Но там это через регистры.
При Aref=4.096v резисторы менять не нужно.
Упс, ошибочка. У 328-й только 1.1в или напряжение питания. Так что, только внешний.
Правильно?
void setup() {
analogReference (EXTERNAL)
}
}
float get_voltage (void) {float vADC = (analogRead(voltageControl) / 1024.) * 4.096.; /*4.096V ИОН*/float current = vADC / rBottom;return (current * (rTop + rBottom));}
Поставил LM4040, скорректировал sketch. Напряжение стоит как вкопаное и измерение идеально правильное во всем диапазоне.
Не подскажете процедуру настройки и тестирования так как последний раз я делал подобное устройство лет 30 назад на логике и LPT.
Ну так вставить микруху и считать. Без микрухи должны быть все FF
Это я знаю. Кажется я каким-то образом спалил транзисторы на 24. Ну и конвертор заодно 🙁
Есть тестовые прошивки?
Что вы называете тестовой прошивкой?
Правда, я заменил BC557 на BC327 но не демаю, что это проблема.
Я бы тут вообще поставил mosfet SSR для надежности.
Скажем так, любая прошивка соответствующего размера, которую можно отсрыть в HEX viewer и визуально сравнить с прочитанным на этом программаторе чтобы убедиться что адресные линии и линии данных работают корректно.
Собрал до кучи. Проверил. Интересная проблема обнаружилась. При чтении любой ПЗУшки вначале идут FF последняя в группе меняется при следующем чтении. Стираю, проверяю(чистая), записываю «00». При чтении сначала идут «FF». Может быть, что сигналы СЕ или ОЕ запаздывают?
Там есть функция verify. Если сгачала считать, а потом кликать на проверку, то посчитает ошибки. Warning — недописанная ячейка, когда на выходе 1, а должен быть 0. Эту ячейку можно прописать еще раз без стирания. А вот из 0 сделать 1 только стиранием можно. Обычно не прописываются из-за низкого напряжения программирования. На транзисторах же чутка падает.
Пробовал неоднократно. При записи говорит, что все в порядке. При последующей проверке или чтении начальный байты FF. Возникает уверенность, что проблема не в записи, а в чтении. Если сигнал CE or OE запаздывает по какой-то причине, то на время задержки и будут «FF». Можно ввести задержку начала чтения? Если дадите E-mail, могу отправить пару файлов, прочитанных с EPROM.
Софт надо переделывать. Это давно известно. Прошивка идет без контроля сейчас.
С РФ5 такой проблемы нет. Записываю все 00 и читаются все 00.
Производится ли проверка записи во время программирования?
Что давно известно? Так это известный глюк или только у меня?
Что софт кривоват. Как гуй, так и прошивка.
А новая версия ожидается?
Возможна. Но вопрос открытый. Стимула ковырять программатор нет, так как нет под него задач сейчас.
А сложно ли ввести задержку чтения, чтобы СЕ и ОЕ успели устаканится?
Можно ли их для проверки установить LOW на постоянно?
При чтении у меня ни разу проблем не было. Проверял с использованием другого программатора.
А где Вы находитесь географически? Или у нас часовые пояса почти совпадают, или Вы по ночам работаете.
Часовой пояс +3.
Далеко. У меня -5.
Так, все-таки, где временно внести изменения, что-бы на выходах А3 и А4 постоянно был 0?
Там код достаточно простой. Все сигналы через define используются.
Поменял все «HIGH» for «LOW» и стало читать нормально начальные адреса.
Значит, точно где-то задержка в сигналах управления. Как ввести задержку начала чтения?
Там на все чтение ножки CE и OE не дергаются. Если хотите добавить задержку, то после строк:
digitalWrite(chipEnable, LOW);
digitalWrite(outputEnable, LOW);
Нашел, в чем была проблема. Не было земли на R15.
Заказал платы на JLCPCB
Вопрос немного не в тему, насчет QtCreator — как вы скомпилировали статический экзешник без dll?
Почему не в тему? Вполне в тему. Но я уже не помню… Первая ссылка в гугле по статической сборке в qt. Я вообще не смог в винду и собирал в Debian под неё.
Буду повторять схему, и возникла идея — вместо транзисторов и рассыпухи поставить одну L293D или ULN2003. Дешевле, компактнее, уже есть.
Uln2003 же не подойдет. Она на землю коммутирует, а надо подавать высокое. Если только npn на нее заменить, чтобы pnp открывать. Кстати, есть модификация от блогера radionews на мосфетах.
Автор поудалял схемы и исходники с гитхаба (не полностью, в истории коммитов всё доступно) — судя по всему, теперь это коммерческий проект. Но даже в первых версиях не было указано лицензии в явном виде — а это означает что код проприетарный, даже несмотря на то что выложен на всеобщее обозрение.
В общем, грубо нарушаете авторское право.
А ничего, что от того проекта, про который вы говорите, остался только принцип подачи высокого напряжения на чипы, а именно кусок схемы в два транзистора, 5 резисторов и диод. Весь софт написан с нуля, схема переработана. Считаю наезд необоснованным.
Так ведь нет же. Открываешь гитхаб — а там написано что это деривативный проект от проприетарщины. И да, у вас тоже лицензии не указано. =)
С практической точки зрения оно мне параллельно, но с юридической — стоит иметь в виду, что гитхаб теперь под M$ и к заявлениям о нарушении авторского права они относятся куда более трепетно.
Ну и вообще, выкладывать исходники без явного указания степени авторских притязаний (т.е. лицензии) — моветон.
Уведомление: Программатор EPROM от Walhi > Rahost Studio
Сергей, здравствуйте! Собрал программатор по вашей схеме. Для сборки использовал печатную плату заводского изготовления (купил на озоне) Для подачи напряжения программирования на данной плате предусмотрено место для dc- dc преобразователя. Получившийся программатор читает все имеющиеся у меня ПЗУшки без проблем но, вот записывать микросхемы никак не хочет! При этом процесс прошивки начинается нормально, но всегда завершается ошибкой записи. Если после после такой «записи» считать содержимое микросхемы и сравнить текстом исходной прошивки то видно, что первые несколько строчек совпадают а потом запись или обрывается или идут сплошные ошибки.
Добрый день! Пока идей нет. Вы не можете записать несколько микросхем одного объема или разных? Возможно, проблемы с подачей высокого напряжения и стоит проверить ножку с Vpp во время записи (без чипа можно).
Добрый день! Спасибо что откликнулись. Я пробовал писать разные микросхемы…. И 2764 и 27128 и 27512 результат всегда одинаковый. Запись завершается с ошибкой либо почти сразу, либо на на половине процесса. Причем, другим программатором эти микросхемы пишутся без проблем. Может нужно как-то подправить скорость передачи данных в настройках виртуального порта??? Я находил на драйв2 пост человека, который собрал этот програматор и имел аналогичную проблему. Все читается, но ничего не пишется.,. Возможно проблема в самой ардуино, а именно, на каком чипе в ней собран ком порт????
Вот такой получился программатор…. https://disk.yandex.ru/i/Bp4gnnAZvEFbEg
Как можно поправить ситуацию?