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.
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.
- Passo 1: Modo programação do gravador Atmega88v
- Passo 2: Arduino Uno modo ISP
- Passo 3: Gravação do firmware correto com AVRDude
- Passo 4: Instalação do driver libusb-win32 no Windows 10
- Teste final: Gravando um código no Arduino Uno via AVRDude e USBasp
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.
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.
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.
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.
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.
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.
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!