Sitemap

Gravando microcontrolador 8051 com USBasp e AVRdude no Linux

6 min readOct 30, 2022

--

Press enter or click to view image in full size

Embora possa ser encontrado na internet vários exemplos do gravador USBasp gravando o microcontrolador 8051 como AT89S52, você pode ter uma surpresa caso compre um e tente fazer a gravação, porque normalmente esses gravadores veem com um firmware que não grava a série AT89Sxx. Porem é possível modifica-lo para esse propósito, de maneira relativamente simples.

Necessário:

  • Gravador com suporte a ATmega8.
  • Firmware modificado para gravação do 8051. (download)

Antes de gravar é necessário colocar um jumper no JP1 para poder fazer a gravação do firmware.

Press enter or click to view image in full size

Para fazer a gravação do USBasp irei utilizar um clone dele conhecido como USBisp v2.0.

Press enter or click to view image in full size

Depois de conectados o gravador ao computador, irei executar a gravação com o firmware modificado, através do AVRdude, com os seguintes comandos:

avrdude -v -c usbasp -p atmega8 -b 19200 -u -U hfuse:w:0xc9:m -U lfuse:w:0xef:m
avrdude -v -c usbasp -p atmega8 -b 19200 -U flash:w:USB_MCS51s_avr_main.hex

Com o firmware gravado o USBasp agora pode gravar os microcontroladores AT89Sxx com outros gravadores, porem o AVRdude não possui as configurações desses microcontroladores, sendo necessários coloca-las no arquivos de configuração.

Get f9kill’s stories in your inbox

Join Medium for free to get updates from this writer.

Abra o arquivos de configuração /etc/avrdude.conf com algum editor de texto e coloque a configuração abaixo perto dos outros defines.

#define AT89START   0xE0
#define AT89S51 0xE0
#define AT89S52 0xE1

E adicione essa parte da configuração no final do arquivo:

#------------------------------------------------------------
# AT89S51
#------------------------------------------------------------
part
id = "8052";
desc = "AT89S51";
signature = 0x1E 0x51 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 = 4096;
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";
;
;
#------------------------------------------------------------
# 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";
;
;
#------------------------------------------------------------
# AT89S8253
#------------------------------------------------------------
part
id = "8253";
desc = "AT89S8253";
chip_erase_delay = 20000;
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 = 12288;
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 a13 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 a13 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 = 2;
readback_p1 = 0x1E;
readback_p2 = 0x73;
read = "0 0 1 0 1 0 0 0 x x x x x x x x",
"x x 1 1 0 0 0 a0 o o o o o o o o";
;
;

Pronto, feito isso você já poderá fazer a gravação do 8051 com AVRdude.

Para gravar o 8051, mais precisamente o AT89S52, eu utilizo a seguinte configuração:

Press enter or click to view image in full size

O jumper JP1 da imagem é necessário ser retirado quando for fazer a gravação e colocado depois para execução.

A ligação do USBasp com o 8051 é a seguinte:

Depois é só executar a gravação do programa:

avrdude -v -c usbasp -p at89s52 -b 19200 -U flash:w:prog.hex:i

Referências:

Arif Johar Taufiq. USB downloader untuk Microcontroller AT89Sxx S-series (AT89s51, AT89S52,…& AVR microcontroller). 2011. Disponível em: <https://guru.technosains.com/USB-for-at89S-series-and-AVR-microcontroller.htm>. Acessado em: 30 de outubro de 2022.

avrfreaks.net. Writing to a AT89S52 through a USBasp. 2010. Disponível em: <https://www.avrfreaks.net/forum/writing-at89s52-through-usbasp>. Acessado em: 30 de outubro de 2022.

--

--