USBAsp v 2.0 firmware for flashing AT89S51, AT89S52 8051

main.hex firmware with an inversion of RESET pin:

https://drive.google.com/file/d/1QiRvCN29H0l-Kq0eJhdKs3WfHdrvEXrB/view?usp=sharing

source code:

https://drive.google.com/file/d/1-idzOalAeA77U9Ony_UZ1YfTT4d_M8j3/view?usp=sharing

avrdude.conf

https://drive.google.com/file/d/1bEraBArDpIUMMW7dt0KzH7qNNhkQd99W/view?usp=sharing

TARGET=atmega8

HFUSE=0xd9

LFUSE=0x9f
You can just flash the MCU without fuses

env for PlatformIO

[env:AT89S51]

platform = intel_mcs51

board = AT89S51

upload_protocol = custom

upload_command = sudo avrdude -c usbasp -p at89s51 -U flash:w:$SOURCE:i -C +./avrdude.conf

Or Avrdudess for Windows has a bug 2026y (it tries to detect as atmega8 but read write works)

Manually detect works fine

Config for avrdude.cong taken from AVRDUDESS


#------------------------------------------------------------
# AT89S51
#------------------------------------------------------------

# MCS-51 family part
#   - Tested with -c avrisp
#   - USBASP programmers may require different firmware

part # 89S51
    desc                   = "AT89S51";
    id                     = "89S51";
    variants               =
        "AT89S51:      N/A,    Fmax=33 MHz, T=[N/A,    N/A], Vcc=[4 V, 5.5 V]",
        "AT89S51-24AU: TQFP44, Fmax=24 MHz, T=[-40 C, 85 C], Vcc=[4 V, 5.5 V]",
        "AT89S51-24JU: PLCC44, Fmax=24 MHz, T=[-40 C, 85 C], Vcc=[4 V, 5.5 V]",
        "AT89S51-24PU: PDIP40, Fmax=24 MHz, T=[-40 C, 85 C], Vcc=[4 V, 5.5 V]";
    prog_modes             = PM_ISP | PM_HVPP;
    mcuid                  = 372;
    archnum                = -1; # Not 8-bit AVR
    stk500_devcode         = 0xe0;
    chip_erase_delay       = 250000;
    signature              = 0x1e 0x51 0x06;
    timeout                = 200;
    stabdelay              = 100;
    cmdexedelay            = 25;
    synchloops             = 32;
    pollindex              = 4;
    pollvalue              = 0x69;
    predelay               = 1;
    postdelay              = 1;
    chiperasepulsewidth    = 15;
    programfusepulsewidth  = 2;
    programlockpolltimeout = 1;
    chip_erase             = "1010.1100--100x.xxxx--xxxx.xxxx--xxxx.xxxx";
    pgm_enable             = "1010.1100--0101.0011--xxxx.xxxx--xxxx.xxxx";

    memory "flash"
        size               = 4096;
        min_write_delay    = 4500;
        max_write_delay    = 4500;
        readback           = 0xff 0xff;
        mode               = 0x02;
        delay              = 10;
        blocksize          = 256;
        read               = "0010.0000--xxxa.aaaa--aaaa.aaaa--oooo.oooo";
        write              = "0100.0000--xxxa.aaaa--aaaa.aaaa--iiii.iiii";
        # Nonstandard page mode is available but not implemented
    ;

    memory "lock"
        size               = 1;
        read               = "0010.0100--xxxx.xxxx--xxxx.xxxx--xxxo.ooxx";
        # Nonstandard write: expect verification errors
        # See datasheet Page 20, Note 1 https://ww1.microchip.com/downloads/en/DeviceDoc/doc2487.pdf
        # Activate lock mode 0 through chip erase: avrdude -e
        # Activate lock mode 1: avrdude -e -V -U lock:w:1:m
        # Activate lock mode 2: avrdude -e -V -U lock:w:1:m -U lock:w:2:m
        # Activate lock mode 3: avrdude -e -V -U lock:w:1:m -U lock:w:2:m -U lock:w:3:m
        write              = "1010.1100--1110.00ii--xxxx.xxxx--xxxx.xxxx";
    ;

    memory "signature"
        size               = 3;
        read               = "0 0 1 0 1 0 0 0  x x x x x x a1 a0  x x x x x x x 0  o o o o o o o o";
    ;
;

#------------------------------------------------------------
# AT89S52
#------------------------------------------------------------

part parent "89S51" # 89S52
    desc                   = "AT89S52";
    id                     = "89S52";
    variants               =
        "AT89S52:       N/A,    Fmax=33 MHz, T=[N/A,    N/A], Vcc=[4 V, 5.5 V]",
        "AT89S52-24AU:  TQFP44, Fmax=24 MHz, T=[-40 C, 85 C], Vcc=[4 V, 5.5 V]",
        "AT89S52-24AUR: TQFP44, Fmax=24 MHz, T=[-40 C, 85 C], Vcc=[4 V, 5.5 V]",
        "AT89S52-24JU:  PLCC44, Fmax=24 MHz, T=[-40 C, 85 C], Vcc=[4 V, 5.5 V]",
        "AT89S52-24PU:  PDIP40, Fmax=24 MHz, T=[-40 C, 85 C], Vcc=[4 V, 5.5 V]";
    mcuid                  = 373;
    stk500_devcode         = 0xe1;
    signature              = 0x1e 0x52 0x06;

    memory "flash"
        size               = 8192;
    ;
;

Controlling Vivitek projector via Arduino Part 1 (decoding)

I has situation when 3 Vivitek’s RC remote controls doesn’t work. So I decided to make my own IR remote control.

Remote uses NEC protocol. Arduino uses IRremote library. I have wired TSOP receiver to the Arduino and dumped some codes.

Here are the commands:

Power on/off

Protocol=NEC Address=0x31 Command=0x81 Repeat gap=94450us

Protocol=NEC Address=0x31 Command=0x81 Repeat gap=94500us

Menu

Protocol=NEC Address=0x31 Command=0x87 Repeat gap=94450us

Protocol=NEC Address=0x31 Command=0x87 Repeat gap=94500us

Up

Protocol=NEC Address=0x31 Command=0xC1 Repeat gap=94450us

Protocol=NEC Address=0x31 Command=0xC1 Repeat gap=94400us

Down

Protocol=NEC Address=0x31 Command=0xC2 Repeat gap=94450us

Protocol=NEC Address=0x31 Command=0xC2 Repeat gap=94450us

Left

Protocol=NEC Address=0x31 Command=0xC3 Repeat gap=94450us

Protocol=NEC Address=0x31 Command=0xC3 Repeat gap=94450us

Right

Protocol=NEC Address=0x31 Command=0xC4 Repeat gap=94450us

Protocol=NEC Address=0x31 Command=0xC4 Repeat gap=94450us

Enter (Ok)

Protocol=NEC Address=0x31 Command=0xC5 Repeat gap=94500us

Protocol=NEC Address=0x31 Command=0xC5 Repeat gap=94500us

Keystone 1

Protocol=NEC Address=0x31 Command=0x85 Repeat gap=94450us

Protocol=NEC Address=0x31 Command=0x85 Repeat gap=94500us

Keystone 2

Protocol=NEC Address=0x31 Command=0x84 Repeat gap=94450us

Protocol=NEC Address=0x31 Command=0x84 Repeat gap=94400us

Source

Protocol=NEC Address=0x31 Command=0x83 Repeat gap=94450us

Protocol=NEC Address=0x31 Command=0x83 Repeat gap=94450us

Auto

Protocol=NEC Address=0x31 Command=0x86 Repeat gap=94500us

Protocol=NEC Address=0x31 Command=0x86 Repeat gap=94500us

Mute

Protocol=NEC Address=0x31 Command=0x89 Repeat gap=94500us

Protocol=NEC Address=0x31 Command=0x89 Repeat gap=94450us

Freeze

Protocol=NEC Address=0x31 Command=0x8E Repeat gap=94450us

Protocol=NEC Address=0x31 Command=0x8E Repeat gap=94500us

Plus

Protocol=NEC Address=0x31 Command=0x8C Repeat gap=94450us

Protocol=NEC Address=0x31 Command=0x8C Repeat gap=94450us

Minus

Protocol=NEC Address=0x31 Command=0x8F Repeat gap=94450us

Protocol=NEC Address=0x31 Command=0x8F Repeat gap=94450us

Watch for other parts…to be continued