Usando o firmware original do gravador AVR USBasp no MX-USBASP (clone chinês)

Eletrônica Arduino 17 de Novembro de 2019 às 13:09

O projeto open-source do gravador USBasp foi desenvolvido originalmente por Thomas Fischl, onde seu principal objetivo é a gravação ICSP de microcontroladores da família AVR utilizando a USB do computador, e sendo 100% compatível com programadores em linha de comando e GUIs como o AVRDude, BASCOM-AVR, Khazama AVR Programmer e eXtreme Burner - AVR.

O pequeno hardware é composto por um microcontrolador Atmega8 ou Atmega88 e componentes simples. O código fonte e o arquivo compilado (hex) possuem diversas versões e estão disponíveis para download no site oficial do Fischl.

Gravador USBasp desenvolvido por Thomas Fischl.

Clones chineses e problemas

Conforme o crescimento de sua popularidade open-source, outras versões foram desenvolvidas e comercializadas mundialmente, e é neste ponto onde clones com modificações em níveis de hardware e firmware deste gravador apareceram para "dar dor de cabeça". Um exemplo disso é o gravador MX-USBASP/USB-ISP com Atmega88v que imita um USBasp, e seu firmware é modificado para responder somente ao programa PROG-ISP desenvolvido por Zhifeng Software.

Por experiência própria, eu estava com problemas em gravar um Atmega328p para um projeto embarcado chamado Transistor Tester, um medidor universal de componentes eletrônicos, útil para medir ESR de capacitores. O USBasp modificado gravava os arquivos .hex e .eep conforme os fuses do microcontrolador no PROG-ISP, porém as medições do equipamento estavam erradas e exibiam caracteres aleatórios no display, como um glitch. Com vários testes realizados, os únicos detalhes estranhos eram essa exclusividade do PROG-ISP e o AVRDude não reconhecer o gravador chinês como USBasp e nenhum outro de sua lista. Na loja online que foi comprado o gravador chinês, vende-se como um gravador AVR USBasp compatível com AVRDude e outros programadores, o que não é uma verdade, talvez isso ocorreu por desconhecimento da loja ou lotes errados. Para não perder o dispositivo e dinheiro, pesquisei como modificar o firmware do gravador, e encontrei artigos interessantes como "Making USBasp Chinese Clones Usable", "Hacking an AVR programmer Atmega8" "Hacking an AVR programmer II Atmega88" e "Atmega (any chip) Device Signature issues and stk500_getsync()(resolutions)" o que fez transformar o meu gravador chinês em um gravador USBasp reconhecido pelo AVRDude, e resolver os problemas do equipamento Transistor Tester.

Atualize seu USBasp agora!

Agora você sabe o porquê de muitas tentativas e sugestões da internet terem falhado com seu gravador USBasp, mas não se preocupe, siga os seguintes passos para realizar estes procedimentos.

Obs: Gravações de firmware são por sua conta e risco!

Passo 1: Modo programação do gravador Atmega88v

No projeto original contamos com alguns jumpers úteis, como o de self programming para receber atualizações de firmware, slow SCK para targets (microcontrolador que recebe o código via ICSP) com clocks baixos e supply target para isolar a alimentação da USB e do target. Infelizmente essas versões clonadas não possuem esses jumpers, eles foram retirados com o intuito de diminuir o hardware para ser encaixado em uma lata de proteção. Retirando esta lata, podemos ver que esta versão do MX-USBASP/USB-ISP possui dois furos e escrito ao centro ->UP<- no silkscreen da placa, este é o jumper do self programming do Atmega88v, que conecta os pinos 14 (PB2) e 29 (PC6/!RESET). Para isso solde um fio nesses furos realizando a conexão. Após este procedimento, precisamos de um Arduino no modo ISP para gravar o novo firmware no gravador.

Pinagem Atmega88v MLF

Passo 2: Arduino Uno modo ISP

Nesta etapa separamos um Arduino Uno (Atmega328p) para enviar firmwares via ICSP. A IDE oficial do Arduino oferece este código em seus exemplos, chamado ArduinoISP, o mesmo código utilizado para gravar bootloaders em placas Arduino.

Antes de realizar automaticamente as conexões dos fios de MISO, MOSI, SCK e Reset de costume, é necessário descomentar a linha 81 do código para utilizar o modo antigo de pinagem, onde o pino de Reset do Atmega88v é conectado ao pino 10 do Arduino Uno.

Descomentar a linha 81 do código "ArduinoISP".

Salve e envie este código ao seu Arduino Uno e prepare a conexão ICSP para o gravador, observe a pinagem conforme o conector de 10 pinos. Você pode utilizar o protoboard e um conector/adaptador com os indicadores de pinagem para facilitar as conexões e evitar erros.

Montagem na prática para gravar o novo firmware no USBasp com Arduino ISP.

Depois de tudo conectado conforme a pinagem fornecida, vamos utilizar o programador AVRDude.

Passo 3: Gravação do firmware correto com AVRDude

Antes de abrir o prompt de comando (CMD) e digitar alguns comandos, é importante destacar alguns pontos sobre erros ao gravar associados com alimentação. O pino 2 do ICSP recebe uma alimentação externa de 5V (VCC/GND EXT), pois a alimentação da USB não fornece corrente suficiente para os dois dispositivos ao mesmo tempo, então separamos estas tensões para evitar alguns erros na gravação com AVRDude. Normalmente os erros relacionados ao utilizar a tensão USB para alimentar o gravador em modo self programming são:

  • O AVRDude não reconhece o dispositivo, e sugere rever a pinagem ou utilizar o comando -F (Comando não indicado, pois desativa o teste de fuses e modelo do microcontrolador).
avrdude: Device signature = 0x000000
avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override
         this check.
  • O AVRDude não pode realizar a conexão, o gravador não está funcionando corretamente.
avrdude: stk500_getsync(): not in sync: resp=0x00

Depois de checar todas as conexões dos fios e alimentação, baixe o programador em linha de comando AVRDude, se preferir faça o download no site oficial. Seu executável é iniciado via CMD, para isso abra o CMD dentro da pasta do programador, com o botão direito do mouse e clique em "Abrir janela de comando aqui". Conecte o Arduino Uno no computador e veja qual porta COM ele está, procure esta informação no Gerenciador de dispositivos do Windows ou na IDE oficial do Arduino. Permaneça o gravador USBasp desconectado do computador.

Digite esta linha de comando do AVRDude para verificar a conexão com o gravador.

avrdude -c stk500v1 -p m88 -b 19200 -P COM6

Se a conexão for bem sucedida..

D:\avrdude>avrdude -c stk500v1 -p m88 -b 19200 -P COM6

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.11s

avrdude: Device signature = 0x1e930a

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Se os fuses não corresponderem ao microcontrolador Atmega88, configure utilizando a seguinte linha de comando. Se o AVRDude responder "Fuses OK" ignore este comando.

avrdude -p m88 -c stk500v1 -P COM6 -U lfuse:w:0xff:m -U hfuse:w:0xdd:m

O código a ser gravado nesta versão clonada do USBasp é a oficial com algumas modificações em valores de seus registradores, pois deve acompanhar também as alterações realizadas no hardware. Os detalhes estão nos artigos em forma de link citados no início deste tutorial. O firmware nomeado como mega88_usbasp.hex já está compilado para ser gravado na memória flash do microcontrolador Atmega88v, então copie o arquivo para a pasta do AVRDude e digite este comando.

avrdude -vv -c stk500v1 -b 19200 -P COM6 -p m88 -U flash:w:mega88_usbasp.hex:i

Se a gravação ocorrer de forma bem sucedida..

D:\avrdude>avrdude -vv -c stk500v1 -b 19200 -P COM6 -p m88 -U flash:w:mega88_usbasp.hex:i

avrdude: Version 5.11-Patch#7610, compiled on Aug 31 2011 at 08:02:19
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "D:\avrdude\avrdude.conf"

         Using Port                    : COM6
         Using Programmer              : stk500v1
         Overriding Baud Rate          : 19200
         AVR Part                      : ATMEGA88
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no        512    4      0  3600  3600 0xff 0xff
           flash         65     6    64    0 yes      8192   64    128  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : STK500
         Description     : Atmel STK500 Version 1.x firmware
         Hardware Version: 2
         Firmware Version: 1.18
         Topcard         : Unknown
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.09s

avrdude: Device signature = 0x1e930a
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as DD
avrdude: safemode: efuse reads as 1
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "mega88_usbasp.hex"
avrdude: writing flash (3720 bytes):

Writing | ################################################## | 100% 8.70s

avrdude: 3720 bytes of flash written
avrdude: verifying flash memory against mega88_usbasp.hex:
avrdude: load data flash data from input file mega88_usbasp.hex:
avrdude: input file mega88_usbasp.hex contains 3720 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 4.87s

avrdude: verifying ...
avrdude: 3720 bytes of flash verified

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as DD
avrdude: safemode: efuse reads as 1
avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Após este procedimento de gravação do firmware, retire do modo "Self programming" o fio ou jumper, e retire as ligações do Arduino ISP. Conectando o gravador USBasp com o novo firmware, o Windows detectará que é um dispositivo USB imitindo um som. Isso é um sinal positivo de que está funcionando. Para o AVRDude reconhecer como um gravador USBasp é necessário a instalação do driver libusb-win32.

Passo 4: Instalação do driver libusb-win32 no Windows 10

Esse driver não costuma funcionar corretamente no Windows 10, porém no site do Fischl, ele recomenda que utilize o software Zadig para uma instalação bem sucedida. Com o gravador conectado no computador, automaticamente o Zadig detecta o dispositivo, selecione nas setas até encontrar este driver, e clique no botão Install Driver, espere alguns segundos até mostrar uma mensagem de que o driver foi instalado corretamente.

Zadig e USBasp para instalação do driver libusb-win32.

Após este procedimento, você terá o seu gravador USBasp funcionando perfeitamente! Agora podemos testar com um Arduino Uno utilizando o conector de 6 pinos ICSP da placa e piscar seu LED interno.

Teste final: Gravando um código no Arduino Uno via AVRDude e USBasp

Para fazer o último teste deste tutorial, conecte o USBasp no computador, realize a conexão ICSP ao Arduino Uno, utilize um adaptador para ser prático. Não é necessário conectar o Arduino ao computador.

Pinagem ICSP de 6 pinos - Arduino Uno.
Adaptador para USBasp e Arduino Uno ICSP.

Na IDE oficial do Arduino, abra o exemplo pronto Blink.ino, que piscará o LED interno "L" da placa. Em preferências, ative os "avisos do compilador" marcando como "Todos", isso é necessário para encontrar o caminho temporário do arquivo compilado do código Blink com bootloader.

Caminho da pasta temporária dos arquivos compilados do código Blink.
Caminho do arquivo Blink.ino.with_bootloader.hex no Windows Explorer.

Com o AVRDude pronto, digite este código modificando o "SEU_USUARIO" para o nome de usuário do seu computador, e o número da build em "arduino_build_XXXXX" que o Arduino criou temporariamente na compilação do código.

avrdude -c usbasp -p ATmega328P -U flash:w:C:\Users\SEU_USUARIO\AppData\Local\Temp\arduino_build_XXXXX\Blink.ino.with_bootloader.hex:i

Se a gravação for bem sucedida..

D:\avrdude>avrdude -c usbasp -p ATmega328P -U flash:w:C:\Users\anapa\AppData\Local\Temp\arduino_build_58486\Blink.ino.with_bootloader.hex:i

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.08s

avrdude: Device signature = 0x1e950f
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "C:\Users\anapa\AppData\Local\Temp\arduino_build_58486\Blink.ino.with_bootloader.hex"
avrdude: writing flash (32768 bytes):

Writing | ################################################## | 100% 17.76s



avrdude: 32768 bytes of flash written
avrdude: verifying flash memory against C:\Users\anapa\AppData\Local\Temp\arduino_build_58486\Blink.ino.with_bootloader.hex:
avrdude: load data flash data from input file C:\Users\anapa\AppData\Local\Temp\arduino_build_58486\Blink.ino.with_bootloader.hex:
avrdude: input file C:\Users\anapa\AppData\Local\Temp\arduino_build_58486\Blink.ino.with_bootloader.hex contains 32768 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 12.10s



avrdude: verifying ...
avrdude: 32768 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Você verá o LED interno "L" piscar e seu gravador USBasp funcionando em perfeitas condições! Como ele deveria funcionar desde o dia de sua compra..mas tudo bem!

Gostou? Então comente o que achou deste tutorial, ou tire suas dúvidas!

Se inscreva no canal do YouTube para mais conteúdo de eletrônica digital e embarcados!

Ana Paula Messina

Analista de sistemas e membro do tecdicas.