AT89S52. Есть ли жизнь в 2026 году?

Автор: | 04.01.2026

Доброго времени суток. Есть у меня устройство на очень легаси железе, который в свое время пришлось немного модернизировать. Это поворотное устройство для антенн, которое состоит из мотора с энкодером (на самом деле не совсем энкодер, так как не умеет указывать направление), червячного редуктора и коробочки для управления этим двигателем. В коробочке спрятаны микроконтроллер 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 местах и прошивка успешно собирается и работает.

Что ответить на вопрос из заголовка… Жизнь возможна. Вопрос только зачем? В моем случае было лень переделывать коробочку, хотя там деталей кот наплакал.

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

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