Доброго времени суток. Есть у меня устройство на очень легаси железе, который в свое время пришлось немного модернизировать. Это поворотное устройство для антенн, которое состоит из мотора с энкодером (на самом деле не совсем энкодер, так как не умеет указывать направление), червячного редуктора и коробочки для управления этим двигателем. В коробочке спрятаны микроконтроллер AT89C51, I2C EEPROM для сохранения текущего положения антенны, экран, энкодер и пара реле. Оно вполне работало и завода, но были приколы, которые не добавляли удобства пользования. В результате в далеком 2021 году написал альтернативную прошивку под это железо, но в родной МК не уложился и пришлось его заменить на AT89S52. Прошивка все ещё сырая местами, так что статейки про неё пока нет.
Что такое этот AT89S52? Это древность на ядре MCS51, которому уже 45 стукнуло в прошлом году, если верить Википедии. Intel представил микроконтроллер 8051 в 1980 году, но производство чипов на этом ядре и его улучшенных версиях до сих пор ведется. Например, многим известный копеечный логический анализатор на 8 каналов построен на МК с ядром MCS51. Чип AT89C51 от Atmel (ныне принадлежит Microchip Technology) это по сути клон Intel 8051, который содержит 4 кб памяти под программу, 128 байт оперативной памяти, UART и один таймер. Никаких встроенных АЦП, I2C, PWM в те времена ещё не было. Буква C означает, что этот чип можно прошивать только в параллельном режиме, что не очень то и удобно в разработке. AT89S52 отличается увеличенной в 2 раза памятью и дополнительным таймером. Но самое главное — возможностью прошивки через последовательный порт. Да, тут есть SPI, но он используется только для прошивки. А внутри программы придется реализовывать его «ногодрыгом».
Чем шить? Теоретически любым программатором, с которым умеет работать утилита avrdude. Но есть подвох. У микроконтроллера прямой RESET, а не как у современных чипов. Активный уровень — единица, а на плате подтянут к нулю. Так что напрямую любой программатор использовать не выйдет и потребуется либо внешняя схема инверсии сигнала RESET, либо программатор на чипе FTDI, который работает в режиме «нодогрыга». Плюс внести небольшие правки в конфигурации avrdude. Относительно версии с параллельной загрузкой, то тут поможет народный TL866 и его развитие. Но каждый раз извлекать чип для прошивки это крайне неудобно. Если только не использовать ZIF панельку. К слову, о народной мудрости «программаторов должно быть много и разных типов». Не знаю, насколько это действительно народная мудрость, но сам придерживаюсь данной концепции. Программаторы работают по разным алгоритмам, так что забракованный TL866 чип вполне может считаться СТЕРХ-ом. Именно такой прикол я поймал в попытках сдампить родную прошивку поворотки.
Для начала создадим резервную копию файла avrdude.conf. Он содержит описание поддерживаемых чипов и программаторов. Про добавление кастомного программатора в этот файл у меня уже есть статья. По ней можно добавить кастомную версию программатора на чипе FTDI с инвертированным сигналом RESET (символ ~ перед номером пина). К сожалению, в конфигурации отсутствует описание AT89S52, так что и его придется добавить. И именно этот фрагмент является причиной написания статьи, так как я три дня убил на попытки прошить чип. Я пробовал разные версии avrdude, разные версии операционных систем (разработку начинал ещё во времена Debian 10, сейчас на компьютерах Debian 13), разные чипы, но в результате ничего не работало. Сам программатор исправен и ATMega8 читает, корректно видит ID чипа AT89S52, но читает мусор, а при записи вываливает ***failed на весь терминал. Оказалось, что все найденные в сети описания чипов имеют некорректные тайминги. Не просто так говорят «делай бекап». В результате я поднял резервную копию диска старого ноутбука, на которой нашел гарантировано рабочее описание чипа с правильными таймингами.
#------------------------------------------------------------
# AT89S52
#------------------------------------------------------------
part
id = "8052";
desc = "AT89S52";
signature = 0x1E 0x52 0x06;
chip_erase_delay = 500000;
pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1",
"x x x x x x x x x x x x x x x x";
chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x",
"x x x x x x x x x x x x x x x x";
timeout = 200;
stabdelay = 100;
cmdexedelay = 25;
synchloops = 32;
bytedelay = 0;
pollindex = 3;
pollvalue = 0x53;
predelay = 1;
postdelay = 1;
pollmethod = 0;
memory "flash"
size = 8192;
paged = no;
min_write_delay = 4000;
max_write_delay = 9000;
readback_p1 = 0xff;
readback_p2 = 0xff;
read = " 0 0 1 0 0 0 0 0",
" x x x a12 a11 a10 a9 a8",
" a7 a6 a5 a4 a3 a2 a1 a0",
" o o o o o o o o";
write = " 0 1 0 0 0 0 0 0",
" x x x a12 a11 a10 a9 a8",
" a7 a6 a5 a4 a3 a2 a1 a0",
" i i i i i i i i";
mode = 0x21;
delay = 12;
;
memory "signature"
size = 3;
read = "0 0 1 0 1 0 0 0 x x x 0 0 0 a1 a0",
"0 0 0 0 0 0 0 0 o o o o o o o o";
;
;
От того, что лежит в сети, эта конфигурация отличается только параметром chip_erase_delay. Все, что гуглятся сейчас имеют значение 20000, в то время как у меня корректно работает значение 500000. Одна цифра и сколько времени убито…
Про время записи. Оно в сравнении с AVR очень большое. На 8 КБ было потрачено почти 100 секунд.
Linking main.ihx
Pack main.hex
packihx: read 287 lines, wrote 530: OK.
avrdude -c pinboard_invert -p at89s52 -C ~/avrdude.conf -V -e -U flash:w:main.hex
avrdude: AVR device initialized and ready to accept instructions
avrdude: device signature = 0x1e5206 (probably 8052)
avrdude: erasing chip
avrdude: reading input file main.hex for flash
with 8115 bytes in 7 sections within [0, 0x1fcf]
avrdude: writing 8115 bytes flash ...
Writing | ################################################## | 100% 96.65 s
avrdude: 8115 bytes of flash written
avrdude done. Thank you.
Теперь про сборку прошивки. Существует компилятор SDCC, который поддерживает MCS51. Не знаю, как в Windows с этим обстоят дела, но в Debian он есть в репозитории. Конкретно мои исходники от 2021 года актуальной версией компилятора уже не собрались, так как теперь вектор прерывания должен быть обязательно в скобочках. Зачем? Ну, наверное, так нужно было. Правим в 5 местах и прошивка успешно собирается и работает.
Что ответить на вопрос из заголовка… Жизнь возможна. Вопрос только зачем? В моем случае было лень переделывать коробочку, хотя там деталей кот наплакал.