Construindo uma interface USBASP

Após comprar duas interfaces USBASP e as duas queimarem sem nenhum motivo lógico, decidi fazer minha própria interface, apesar do preço extremamente baixo de uma pronta. O projeto que foi usado é bem conhecido e até acredito que a maiorias das interfaces prontas vendidas por aí saíram deste projeto. Você pode usar um ATMEGA8, 48 ou 88, no meu caso usei um ATMEGA8. O grande problema é que para programar o ATMEGA você precisa de uma interface SPI que é, por exempo, exatamente uma USBASP. Eu usei um recurso do Arduino conhecido como Arduino como ISP. Mais abaixo darei detalhes de como fazer.




Todo o projeto, incluindo o circuito, o HEX para o ATMEGA e driver estão pronto na pagina do autor, precisando somente confeccionar a placa, no meu caso usei uma placa padrão de ilhas. Você pode montar a placa como sugere o circuito do autor, fazendo as ligações corretas, colocando o jumper JP2 e assim programando o ATMEGA. Ou fazer como eu que montei no protoboard, gravei o ATMEGA e depois montei a placa. Fiz assim, porque na realidade depois de programar o ATMEGA, fiz todas as ligações e testei o circuito no protoboard mesmo. Para poder gravar o ATMEGA usando um Arduino, bastas seguir as ligações abaixo, os componentes para o lado do ATMEGA são os que estão no circuito do autor. No Arduino será preciso carregar o Sketch “ArduinoISP” disponível nos exemplos.

 

Para usar qualquer outra interface SPI basta fazer as ligações MISO, MOSI, SCK, RESET e alimentação 5V. Para ter uma referencia, no Arduino os pinos são:
pin13 - SCK
pin12 - MISO
pin11 - MOSI
pin10 - RESET
Para a interface onde o conector seja de 6 ou 10 pinos, basta seguir a figura:

 

Na programação usei o AVRDUDE via linha de comandos. Primeiro gravei os fuse bits de acordo com o README:

# TARGET=atmega8 HFUSE=0xc9 LFUSE=0xef
# TARGET=atmega48 HFUSE=0xdd LFUSE=0xff
# TARGET=atmega88 HFUSE=0xdd LFUSE=0xff

No meu caso, ATMEGA8, usando o Arduino como interface e em Linux, usei os comandos:
avrdude -c arduino -b 19200 -p m8 -P /dev/ttyACM0 -u -U lfuse:w:0xEF:m
avrdude -c arduino -b 19200 -p m8 -P /dev/ttyACM0 -u -U hfuse:w:0xC9:m
Após a gravação dos fuse bits, gravei o arquivo HEX (disponível na pasta bin/firmware):
avrdude -c arduino -b 19200 -p m8 -P /dev/ttyACM0 -U flash:w:usbasp.atmega8.2011-05-28.hex:i
Lembrando que o arquivo "usbasp.atmega8.2011-05-28.hex" precisa estar na pasta onde se está executando o comando.
*Para o caso de Windows, mudar o parametro -P de /dev/ttyACM0 para COMx

Aqui minha interface pronta para uso:

 

Um grande problema que tive, foi que a interface não estava sendo reconhecida pelo PC, após vários testes e montagens/desmontagens, achei uma informação crucial na internet. O problema era os diodos zener que eu estava usando. Eles era falsos e variavam de valor quando testados com uma fonte variável de tensão, na medida que alterava a tensão em cima dele, ele alterava sua tensão de 3,6V, algo entre 2,5V até 3,8V. Após comprar outros em lojas diferentes e continuar com o problema, decidi arriscar comprar um pacote de diodos da DX. Mas lembrei de uma loja conceituada no Brasil onde comprei alguns também. Por fim tanto os dessa loja, como os da DX funcionaram perfeitamente e a interface foi detectada de imediato.

Segundo o próprio autor, para Windows é necessário instalar o driver libusb_0.1.12.1 disponível em bin/win-driver, mas no teste que eu fiz em um WinXP, ela foi detectada sem a instalação do mesmo.

Em Linux a interface funciona somente como super usuário. Ou então, basta definir as regras para o dispositivo, disponível em bin/linux-nonroot .



Comentários