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
-
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
-
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
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.
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
4ªDuvida: Segundo esta imagem, tenho de “comentar” a linha 13 e “descomentar” a inha 14?
imagem?
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)
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
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...
-
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?
-
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?
-
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.
-
escrevi o -F e o que me deu foi: imagem
Como é que altero a freq do ISP?
-
Enganei-me, era -D como a mensagem de erro te diz, não sei até que ponto é que não deste cabo desse .hex..
-
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?
-
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
-
desde que tenha a informação no ficheiro boards.txt grava
-
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?
-
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 é:
##############################################################
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.
-
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
-
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