LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: Niolp em 15 de Novembro de 2012, 14:25

Título: Gravar um bootloader num Atmega644p usando Arduino UNO como ISP
Enviado por: Niolp em 15 de Novembro de 2012, 14:25
Boas!
Após ter lido este tópico http://lusorobotica.com/index.php?topic=4571.0 (http://lusorobotica.com/index.php?topic=4571.0) fiquei ainda com algumas duvidas em relação ao modo como se procede para carregar o bootloader.

Material que disponho:
Arduino UNO
Chip PDIP Atmega644p 40 pinos
Breadboard
Ressonador 16MHz
Condensador de 0.1uF
R 560ohm e 10kohm

Objectivo: gravar o bootloader no Atmega, para utilizar numa placa sanguinololu

Procedimento:

1)Com o Arduino IDE 0023 carrego o sketch ISP para o arduino UNO;

2)Faço o esquema de ligações descrito em : http://themakersworkbench.com/node/431 (http://themakersworkbench.com/node/431)

1ªDuvida: Como é que sei se o chip Atmega está a usar o oscilador interno? Ou se tenho de usar um externo?

2ªDuvida: O que é o circuito minimo de um chip? Ou seja, de acordo com http://avrprogrammers.com/atmega644bd.php (http://avrprogrammers.com/atmega644bd.php) eu preciso de ter um condensador entre GND(11) e AREF(32), isto será so para dar a referência dos +5V lógicos? Ou tem outra função?

3ªDuvida: Já li noutro post que é necessário utilizar uma resistência de pull-up de (+/-)560ohm, mas não percebi se era no Arduino UNO ou se é na breadbord com o Atmega644p.

Já tentei gravar através do Arduino IDE, mas dá me erro de sincronização no protocolo stk500, gostava de utilizar o WinAVR, mas como nunca utilizei ainda tenho algumas duvidas nos comandos. Apenas li o tópico já referido.

Agora a parte do Sanguino:

Em: http://code.google.com/p/sanguino/downloads/list (http://code.google.com/p/sanguino/downloads/list)  faço o download da versão 0023r4.
O ficheiro boards.txt tem a seguinte informação:
Anexo1

A pasta bootloaders tem os seguintes ficheiros:
Anexo2

4ªDuvida: Segundo esta imagem, tenho de “comentar” a linha 13 e “descomentar” a inha 14?

Na pagina do Sanguino dizem-nos para alterar o uploadspeed para 38400, porque é a velocidade recomendada para fazer upload de firmwares.

5ªDuvida: Ao usar o comando avrdude qual o baudrate a usar? Será 19200 ou é o valor que tenho definido no ficheiro boards?

6ªDuvida: Ao fazer upload do ficheiro *.hex preciso de dar apenas o caminho onde está o ficheiro AtmegaBOOT_644p.hex ou tenho de dar o directorio onde estão tambem AtmegaBOOT_644p.c;  AtmegaBOOT_644p.elf; etc.?

7ªDuvida: Em que sítio do chip se deve gravar o bootloader? Pelo que li no datasheet, o processador tem vários espaços de memoria, mas qual é a zona onde devemos gravar? É na flash?(parametro –U a seguir).

Ou seja supondo este comando:
avrdude -c avrisp -p m644p -b 19200 -P COM3 -U flash:w:ATmegaBOOT_644P.hex

Tenho no disco C:\ uma pasta chamada avr (c:\avr) onde pus o ficheiro *.hex
O directorio onde estão os ficheiros *.hex devem ser abertos na linha de comandos antes de escrever o comando avrdude? Como está na imagem a seguir?
Anexo3
Título: Re: Gravar um bootloader num Atmega644p usando Arduino UNO como ISP
Enviado por: CBX em 15 de Novembro de 2012, 15:44
Citar
1ªDuvida: Como é que sei se o chip Atmega está a usar o oscilador interno? Ou se tenho de usar um externo?

os Atmega vêm sempre configurados de fábrica para usar o oscilador interno (8Mhz) a dividir por 8, logo 1Mhz

Citar
2ªDuvida: O que é o circuito minimo de um chip? Ou seja, de acordo com http://avrprogrammers.com/atmega644bd.php (http://avrprogrammers.com/atmega644bd.php) eu preciso de ter um condensador entre GND(11) e AREF(32), isto será so para dar a referência dos +5V lógicos? Ou tem outra função?

o circuito mínimo, como o nome sugere é o mínimo necessário para o microcontrolador funcionar, neste caso será uma resistência de pullup no pino reset (entre 4.7k e 10K) e condensadores de decoupling nos pinos VCC (0.1uf), caso não queiras usar o oscilador interno precisas de um cristal e dois condensadores(entre 18pf e 27pf, depende do cristal) ou um ressonador cerâmico que já tem os condensadores integrados. O pino AREF serve de referencia para o ADC, se quiseres usar a referencia interna precisas desse condensador de 0.1uf. É boa prática usar mais um condensador de 10uf para filtrar o ruído no VCC.

Citar
3ªDuvida: Já li noutro post que é necessário utilizar uma resistência de pull-up de (+/-)560ohm, mas não percebi se era no Arduino UNO ou se é na breadbord com o Atmega644p.

esquece essa resistência

Citar
4ªDuvida: Segundo esta imagem, tenho de “comentar” a linha 13 e “descomentar” a inha 14?

imagem?

Citar
5ªDuvida: Ao usar o comando avrdude qual o baudrate a usar? Será 19200 ou é o valor que tenho definido no ficheiro boards?

neste caso será a que velocidade queres programar, ao usar o arduino como programador não tenho a certeza, deixa em branco que ele usa o default (remove isto: -b 19200)

Citar
6ªDuvida: Ao fazer upload do ficheiro *.hex preciso de dar apenas o caminho onde está o ficheiro AtmegaBOOT_644p.hex ou tenho de dar o directorio onde estão tambem AtmegaBOOT_644p.c;  AtmegaBOOT_644p.elf; etc.?

apenas do .hex

Citar
7ªDuvida: Em que sítio do chip se deve gravar o bootloader? Pelo que li no datasheet, o processador tem vários espaços de memoria, mas qual é a zona onde devemos gravar? É na flash?(parametro –U a seguir).

Ou seja supondo este comando:
avrdude -c avrisp -p m644p -b 19200 -P COM3 -U flash:w:ATmegaBOOT_644P.hex

Tenho no disco C:\ uma pasta chamada avr (c:\avr) onde pus o ficheiro *.hex
O directorio onde estão os ficheiros *.hex devem ser abertos na linha de comandos antes de escrever o comando avrdude? Como está na imagem a seguir?
Anexo3
´

sempre na flash...

se estás a gravar o bootloader a partir do avrdude falta gravar os fuses para isso funcionar...
Título: Re: Gravar um bootloader num Atmega644p usando Arduino UNO como ISP
Enviado por: Niolp em 15 de Novembro de 2012, 15:52
Citar
os Atmega vêm sempre configurados de fábrica para usar o oscilador interno (8Mhz) a dividir por 8, logo 1Mhz
Quer dizer que se não utilizar o ressonador ele funciona a 1Mhz? e não há problema a programar com esta frequência?

A imagem que me refiro na 4ªduvida é a da boards.txt

Então e para gravar os fuses que comando é que tenho de enviar no avrdude?
Título: Re: Gravar um bootloader num Atmega644p usando Arduino UNO como ISP
Enviado por: Niolp em 15 de Novembro de 2012, 17:15
Escrevi isto para gravar os fuses:

avrdude -c arduino -p m644p -P COM7 -U efuse:w:0xFF:m -U lfuse:w:0xFF:m -U hfuse:w:0x9A:m


e isto para gravar o bootloader:

avrdude -c arduino -p m644p -P COM7 -U flash:w:ATmegaBOOT_644P.hex

e aparece me o seguinte: ver imagem

o que é que estou a fazer de errado? pode ser a escrita dos fuse bits que não seja a correcta?
Título: Re: Gravar um bootloader num Atmega644p usando Arduino UNO como ISP
Enviado por: senso em 15 de Novembro de 2012, 17:22
Deves ter um PA ou então um 644 que não é P..
Mete-lhe o -F, e já agora baixa a frequência do ISP ai para 125Khz ou menos.
Título: Re: Gravar um bootloader num Atmega644p usando Arduino UNO como ISP
Enviado por: Niolp em 15 de Novembro de 2012, 17:30
escrevi o -F e o que me deu foi: imagem

Como é que altero a freq do ISP?
Título: Re: Gravar um bootloader num Atmega644p usando Arduino UNO como ISP
Enviado por: senso em 15 de Novembro de 2012, 17:33
Enganei-me, era -D como a mensagem de erro te diz, não sei até que ponto é que não deste cabo desse .hex..
Título: Re: Gravar um bootloader num Atmega644p usando Arduino UNO como ISP
Enviado por: Niolp em 15 de Novembro de 2012, 17:36
Vou experimentar com o -D

O hex saquei-o do github do sanguino, não fiz alterações nenhumas.
achas que deva experimentar com outro?
Título: Re: Gravar um bootloader num Atmega644p usando Arduino UNO como ISP
Enviado por: senso em 15 de Novembro de 2012, 17:42
Como usas-te o -F penso que ele leu o micro e escreveu no hex, volta a sacar.
E o IDE do Arduino supostamente tem um botão que é só carregar lá e ele programar o .hex, não sei é se o sabe fazer para o atmega644
Título: Re: Gravar um bootloader num Atmega644p usando Arduino UNO como ISP
Enviado por: CBX em 15 de Novembro de 2012, 17:45
desde que tenha a informação no ficheiro boards.txt grava
Título: Re: Gravar um bootloader num Atmega644p usando Arduino UNO como ISP
Enviado por: Niolp em 15 de Novembro de 2012, 17:49
O problema de não estar a usar o IDE do arduino é porque ele me dava sempre erro de sincronização do stk500, daí estar a experimentar por este método.

A frequência onde é que tenho de alterar?
Título: Re: Gravar um bootloader num Atmega644p usando Arduino UNO como ISP
Enviado por: Niolp em 16 de Novembro de 2012, 01:22
Boas Pessoal.

Experimentei utilizar este ficheiro ADABoot_644p.hex, encontrei aqui: http://avrprogrammers.com/proj_dev40.php (http://avrprogrammers.com/proj_dev40.php)
O ficheiro boards.txt que acompanha o .hex é:

Código: [Seleccione]
##############################################################
dev40a644.name=AVRBoards Dev40A-644

dev40a644.upload.protocol=stk500
dev40a644.upload.maximum_size=63488
dev40a644.upload.speed=38400

dev40a644.bootloader.low_fuses=0xFF
dev40a644.bootloader.high_fuses=0xDC
dev40a644.bootloader.extended_fuses=0xFD
dev40a644.bootloader.path=dev40a
dev40a644.bootloader.file=ADABoot_644p.hex
dev40a644.bootloader.unlock_bits=0x3F
dev40a644.bootloader.lock_bits=0x0F

dev40a644.build.mcu=atmega644p
dev40a644.build.f_cpu=16000000L
dev40a644.build.core=arduino

Por isso, gravei os fusebits com os valores que estão em cima, o comando penso que está correcto e foi este:
avrdude -c arduino -p m644p -P COM3 -U efuse:w:0xFD:m -U hfuse:w:0xDC:m -U lfuse:w:0xFF:m

A seguir tentei gravar o *.hex, com o comando:
avrdude -c arduino -p m644p -P COM3 -v -e -D -F -U flash:w:ADABoot_644p.hex -U lock:w:0x0F:m

o output da operação com o verbose meto em anexo: Imagem1;
Apareceu-me um erro: "first mismatch at byte 0x0000" "0xFF != 0x0c"

1ªDuvida: os caracteres != querem dizer "not equal" certo?
Pode ser o fusebit low?

2ªDuvida: mesmo com este erro consegui gravar o bootloader no chip?
Se ele gravou, pode comprovar a teoria do senso, de o ficheiro .hex anterior ter sido alterado.

 
Título: Re: Gravar um bootloader num Atmega644p usando Arduino UNO como ISP
Enviado por: CBX em 16 de Novembro de 2012, 02:38
lê isto: http://reprap.org/wiki/Burning_the_Sanguino_Bootloader_using_Arduino_as_ISP (http://reprap.org/wiki/Burning_the_Sanguino_Bootloader_using_Arduino_as_ISP)

penso que responde a todas as tuas perguntas
Título: Re: Gravar um bootloader num Atmega644p usando Arduino UNO como ISP
Enviado por: Niolp em 16 de Novembro de 2012, 12:32
Boas!

@CBX
Eu segui esse tutorial todo, aliás foi por onde comecei a ver informação de gravar bootloaders etc, porque nunca tinha tido contacto com esta parte da electrónica.
Não percebo muito bem porque, mas sempre que tentei usar o IDE do arduino para gravar, dava sempre erro, experimentei uma serie de coisas diferentes e nada!
Mas falta informação naquele tutorial que penso que seja preciosa.

Bem resta-me só dizer que finalmente consegui gravar o bootloader no chip, em anexo segue o output da gravação, e gostava que alguém me desse um feedback, pois como foi a primeira vez que fiz isto não posso comparar esta operação com nenhuma outra.

Obrigado a todos que me ajudaram!

Se alguém no futuro precisar de ajuda/dicas neste processo diga alguma coisa.

Cumprimentos