Программатор EPROM

Автор: | 25.07.2019

Понадобилось при изучении и ремонте компьютеров, которые старше меня, прошивать ПЗУшки. Тесты оперативной памяти и периферии проводить. Нормального программатора у меня на тот момент не было. Собрать на логике для 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:

  1. 27C16 на 21 ногу микросхемы (23 ногу DIP28 сокета)
  2. 27C32 и 27C512 на сигнал #OE (Output Enable)
  3. 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. При сборке можно спокойно менять номиналы резисторов в схеме подачи напряжения программирования и делителя для контроля значения. Правда со вторым дополнительно потребуется немножко исправить код скетча.

Надеюсь, данное устройство кому нибудь пригодится. На данный момент у меня в наличии 7 плат, так что желающие могут их купить (по себестоимости, 100 рублей + пересылка).

Ну и небольшой список полезных лотов на Ali:

  • Цанговые «расчески»: http://ali.pub/3l463k
  • Программатор MiniPro: http://ali.pub/3l4681
  • EPROM Eracer: http://ali.pub/3l46hd
  • DC-DC Step Up: http://ali.pub/3l47fs

Программатор EPROM: 55 комментариев

  1. Сергей

    Добрый день и с Новым годом!
    Если ещё остались платки, хотел бы одну прикупить. Как это сделать?
     

  2. Владимир

    Здравствуйте
    Я так понимаю программа под винду платная?
    нигде не нашел где ее скачать. ткните пожалуйста пальцем

    1. walhi Автор записи

      Разумеется бесплатная. Все исходные коды же предоставлены. На странице репозитория Github есть кнопка «Релизы». В сам репозиторий обычно кладутся исходники, а релиз содержит снимок исходников и собранные пакеты. Это должно быть гарантировано рабочим кодом. https://github.com/walhi/arduino_eprom27_programmer/releases

  3. Vitaliy

    Хочу повторить данный программатор но никогда раньше не имел дело с Arduino 🙁
    Подскажите, пожалуйста, как записать firmware.

    1. walhi Автор записи

      Ну уж уроки по андуине я еще не выпускал… их итак куча.

  4. Vitaliy

    Да, как бы уже записал.
    Смущает, что Arduino IDE выдал ошибку в строке «if (buf[j] != virify){»
    Заменил на verify и все пошло. Это так и задумывалось?
     

    1. walhi Автор записи

      Качайте релиз, а не просто репозиторий

  5. Vitaliy

    Скачал. Компелируется нормально. Пишу через STK500, так как через USB выдает ошибку записи хотя порт работает и «Board info» тоже.
    Вопрос по печатке. Они существенно отличаются в релизе и репозитории.
    В частности, убран DC-DC. В чем причина? Я собираю по старой. Будут ли проблемы с ней?

    1. walhi Автор записи

      Странно… не помню, чтобы отличались печатные платы. Надо разобраться будет. Я начал переделывать софт для компа по человечески, но забил пока. А плату не трогал вроде. В релизе есть архив с гербер файлами. Там все правильно, за исключением диаметра отверстий у микрухи самой. Для цанговых панелек подходит, а вот zif уже не лезут. Не учел этот момент. Пришлось напильником ножки подтачивать.

  6. Vitaliy

    Похоже, это у меня глюки. Так как металлизацию отверстий делать не могу, ZIF мне не светит. Поставил обычную цанговую панельку.

      1. walhi Автор записи

        Значит проблема в загрузчике или же uart преобразователе. Попробуйте из arduino ide прошить загрузчик правильный. Там есть в меню такой пункт.

  7. Vitaliy

    ТОлько через программатор. Может, потому, что китайский?

    1. walhi Автор записи

      Да. Китайцы используют старый загрузчик. Там в опциях есть выбор загрузчика для arduino nano

  8. Vitaliy

    Пробовал по всякому. При попытке писАть через USB ругается на STK500.
    Зато через тот-же STK500 (Petka), но внешний, никаких проблем не возникает.
    Я не видел опции «выбор загрузчика», только возможность записать. Результат тот-же. Через внешний программатор никаких проблем. Как будто не хочет корректно дружить с CH340.

    1. walhi Автор записи

      Посмотрел как там подписано. Есть выбор процессора. И как раз в этом пункте меню можно выбрать atmega328 old bootloader

  9. Vitaliy

    Зашил через программатор «old bootloader» и заработала запись через USB 🙂

  10. Vitaliy

    Наконец-то пришли регистра. Надеюсь сегодня закончить.
    Обнаружились странности с изменением напряжения программирования.
    Резисторы 10к и 1.5к 1%. Показания отличаются почти на 2 вольта и плавают в пределах примерно вольта. Поменял в скетче 1500 на 1700. Поставил 1uF параллельно 1.5к. Стало точнее но плавать не перестало.

    1. walhi Автор записи

      Это известные странности, ибо опорный источник нифига не стабильный. Это изначально задумывалось, как показометр, чтобы перед прошивкой проверить того ли порядка напряжения. А до как закачаешь случайно 25 вольт вместо 15.

    1. walhi Автор записи

      Можно. Тогда немного код инициализации переписать и функцию считывания напряжение. И, разумеется, пересчитать делитель резисторный.

  11. Vitaliy

    Подсказку в студию!
    У меня есть куча ИОН на разное напряжение.

  12. Vitaliy

    Поможете?
    Как я понял, нужно прописать
    analogReference (EXTERNAL) ; analogRead (0) ;
    Вместо чего?

    1. walhi Автор записи

      В функции setup() прописать analogReference (EXTERNAL). И только номиналы резисторов в делителе заменить, чтобы диапазон охватить.

  13. Vitaliy

    То есть просто добавить в область «setup» analogReference (EXTERNAL) ?
    Нужно ли менять что-либо тут?
    Заменить 5. на напряжение ИОН?
    float get_voltage (void) {float vADC = (analogRead(voltageControl) / 1024.) * 5.;float current = vADC / rBottom;return (current * (rTop + rBottom));}
    Понятно, что напряжение на rBottom не должно превышать Aref.

    1. walhi Автор записи

      Да… Я и забыл, что на aref не 5 вольтовый ИОН. 2.048 или 4.096 например.

  14. Vitaliy

    Ну да, в Atmege же можно выбрать в качестве опорного или напряжение питания или внутренний 2.048/4.096 или внешний. Но там это через регистры.
    При Aref=4.096v резисторы менять не нужно. 

  15. Vitaliy

    Упс, ошибочка. У 328-й только 1.1в или напряжение питания. Так что, только внешний.

  16. Vitaliy

    Правильно?
    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));}

  17. Vitaliy

    Поставил LM4040, скорректировал sketch. Напряжение стоит как вкопаное и измерение идеально правильное во всем диапазоне.
    Не подскажете процедуру настройки и тестирования так как последний раз я делал подобное устройство лет 30 назад на логике и LPT.

    1. walhi Автор записи

      Ну так вставить микруху и считать. Без микрухи должны быть все FF

  18. Vitaliy

    Это я знаю. Кажется я каким-то образом спалил транзисторы на 24. Ну и конвертор заодно 🙁
    Есть тестовые прошивки?

    1. walhi Автор записи

      Что вы называете тестовой прошивкой?

    2. Vitaliy

      Правда, я заменил BC557 на BC327 но не демаю, что это проблема.
      Я бы тут вообще поставил mosfet SSR для надежности.

  19. Vitaliy

    Скажем так, любая прошивка соответствующего размера, которую можно отсрыть в HEX viewer и визуально сравнить с прочитанным на этом программаторе чтобы убедиться что адресные линии и линии данных работают корректно.

  20. Vitaliy

    Собрал до кучи. Проверил. Интересная проблема обнаружилась. При чтении любой ПЗУшки вначале идут FF последняя в группе меняется при следующем чтении. Стираю, проверяю(чистая), записываю «00». При чтении сначала идут «FF». Может быть, что сигналы СЕ или ОЕ запаздывают?
     

    1. walhi Автор записи

      Там есть функция verify. Если сгачала считать, а потом кликать на проверку, то посчитает ошибки. Warning — недописанная ячейка, когда на выходе 1, а должен быть 0. Эту ячейку можно прописать еще раз без стирания. А вот из 0 сделать 1 только стиранием можно. Обычно не прописываются из-за низкого напряжения программирования. На транзисторах же чутка падает.

  21. Vitaliy

    Пробовал неоднократно. При записи говорит, что все в порядке. При последующей проверке или чтении начальный байты FF. Возникает уверенность, что проблема не в записи, а в чтении. Если сигнал CE or OE запаздывает по какой-то причине, то на время задержки и будут «FF». Можно ввести задержку начала чтения? Если дадите E-mail, могу отправить пару файлов, прочитанных с EPROM.

    1. walhi Автор записи

      Софт надо переделывать. Это давно известно. Прошивка идет без контроля сейчас.

  22. Vitaliy

    С РФ5 такой проблемы нет. Записываю все 00 и читаются все 00.
    Производится ли проверка записи во время программирования?

  23. Vitaliy

    Что давно известно? Так это известный глюк или только у меня?

    1. walhi Автор записи

      Что софт кривоват. Как гуй, так и прошивка.

    1. walhi Автор записи

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

  24. Vitaliy

    А сложно ли ввести задержку чтения, чтобы СЕ и ОЕ успели устаканится?
    Можно ли их для проверки установить LOW на постоянно?

    1. walhi Автор записи

      При чтении у меня ни разу проблем не было. Проверял с использованием другого программатора.

  25. Vitaliy

    А где Вы находитесь географически? Или у нас часовые пояса почти совпадают, или Вы по ночам работаете.

  26. Vitaliy

    Далеко. У меня -5.
    Так, все-таки, где временно внести изменения, что-бы на выходах А3 и А4 постоянно был 0?

    1. walhi Автор записи

      Там код достаточно простой. Все сигналы через define используются.

  27. Vitaliy

    Поменял все «HIGH» for «LOW» и стало читать нормально начальные адреса.
    Значит, точно где-то задержка в сигналах управления. Как ввести задержку начала чтения?

    1. walhi Автор записи

      Там на все чтение ножки CE и OE не дергаются. Если хотите добавить задержку, то после строк:
      digitalWrite(chipEnable, LOW);
      digitalWrite(outputEnable, LOW);

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *