Arduinos & Breaduinos
Programando AVR's
Utilização da interface SPI para programação de AVR's
- o ID da placa: breaduino1
- O nome, que é o que aparecerá no menu de placas
- os fuses: low=0x62, high=0xd9 e extended=0x07
- e o f_cpu: 1000000L que corresponde à velocidade de 1MHz
Basta consultar as respectivas documentações, do micro-controlador e do programador para saber os pinos de comunicação SPI, que são:
MISO - Master Input <- Slave Output
MOSI - Master Output -> Slave Input
SCK - Serial clock, o sinal de pulsos de sincronização de transferência de dados
SS - Slave select, não usamos. Infelizmente a especificação não inclui a utilização deste pino o que permitiria selecionar o alvo a programar.
Basta ligar os respectivos pinos do programador e do microcontrolador para estabelecer a a via de comunicação.
Além da comunicação, o programador SPI inclui um pino de reset que deve ser ligado respectivamennte. Caso este pino não exista no programador, pode-se ligar a resistencia de reset ao negativo (gnd) durante o processo de programação SPI.
Estes programadores podem ainda alimentar o micro-controlador caso a montagem não inclua alimentação própria, em caso de a montagem possuir alimentação própria, ligue apenas o ground.
Para teste abra o esboço (sketch) de exemplo blink.
Escolhemos no menu ferramentas:
Placa: Arduino Uno
Porta: Selecione uma qualquer (o IDE requer uma porta selecionada, embora o avrduide a ignore no caso do programador USBASP)
Programador: USBasp
O primeiro carregamento pode ser efectuado utilizando a opção:
Ficheiro->Carregar utilizando um programador
O sketch será compilado e carregado, no entanto o programa executará 16 vezes mais lento pois os circuitos virgens vêm com as definições de fabrica para trabalhar a 1MHz.
Podemos corrigir isso, mantendo o uC a funcionar a 1MHz mas no entanto informando o arduino IDE das especificidades, pois as definições da placa "Arduino Uno" que utilizamos oiriginalmente são para uma placa a 16MHz.
Isso é feito num ficheiro boards.txt que caso não exista pode ser criado na seguinte localização
(pasta de sketches)/hardware/arduino/boards.txt
basta adicionar as seguintes definições:
############################################
breaduino1.name=Breaduino 1Mhz (RA 2014)
breaduino1.upload.maximum_size=32256
breaduino1.upload.speed=115200
breaduino1.bootloader.low_fuses=0x62
breaduino1.bootloader.high_fuses=0xd9
breaduino1.bootloader.extended_fuses=0x07
breaduino1.bootloader.path=optiboot
breaduino1.bootloader.file=optiboot_atmega328.hex
breaduino1.bootloader.unlock_bits=0x3F
breaduino1.bootloader.lock_bits=0x0F
breaduino1.build.mcu=atmega328p
breaduino1.build.f_cpu=1000000L
breaduino1.build.core=arduino
breaduino1.build.variant=standard
Estas definições foram copiadas das definições da board do arduino uno, de onde apenas modificamos alguns parametros:
desta forma o arduino IDE saberá como tratar esta montagem e irá gerar o codigo correcto para os tempos de espera correspondentes à velocidade configurada (1MHz).
Os fuses listadoscorrespondem tambem à configuração do uC a 1MHz
São de extrema importancia e a sua alteração de forma incorrecta pode danificar ou inviabilizar PERMANENTEMENTE o uC, por isso recomenda-se muito cuidado.
Usamos o mesmo utilitário que é usado pelo arduino IDEpara carregar os programas e que permite tambem interacionar com o uC e neste caso confirmar os valores dos fuses. Usamos tambem um calculador de fuse online para uma segunda confirmação destes valores.
O avrdude é um utilitário de linha de comando.
Com o avrdude temos:
avrdudde lista parametros da linha de comando
avrdude -p? lista uC suportados e respectrivos códigos a usar.
avrdude -pm328p -cusbasp verifica a ligação do programador usbasp com o microcontrolador ATMega328p
avrdude -pm328p -cusbasp -t abre o avrdude em modo terminal para que possamos executar outros comando
dentro do modo terminal podemos obter uma lista de comandos válidos digitando apenas ? e enter e podemos tambem obter os valores actuais dos fuses com os seguintes comandos:
read lfuse obtém o valor do low_fuse
read hfuse obtém o valor do high_fuse
este uC possui tabém um extended fuse efuse
read efuse obtém o valor do extended_fuse
o valor do efuse listado 0x07 difere do mostrado no site porque se usam apenas os 3 primeiros bits, sendo que colocar 0xFF como está no site resultaria num aviso e na utilização de 0x07 na realidade
Os fuse tem uma lógica invertida sendo que 1 equivale a não programado e 0 a activo.