LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: Capeleiro em 09 de Outubro de 2010, 11:42

Título: Repor Fuses do ATMega328
Enviado por: Capeleiro em 09 de Outubro de 2010, 11:42
Construí um programador com base num Arduino e com ele resolvi tentar gravar bootloaders, enviar programas sem bootloader, e explorar um pouco mais. Foi então que experimentei alterar os fuses do chip para trabalhar com o clock interno de 8MHz, o que até correu bem. Mas então decidi colocar a fonte de clock de origem do Arduino (cristal de 16MHz) e enganei-me e coloquei como External Clock, ou seja, coloquei todos os fuses a zeros.

O problema é que agora não consigo enviar nada para o ATMega pois recebo a seguinte mensagem:
Citar
avrdude: Device signature = 0x000000
avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override this check.

Quando tento repor os fuses para qualquer valor os bytes continuam a zeros:
Citar
C:\Users\Rodrigo>avrdude -p m328p -P com3 -c avrisp -b 19200 -F -U lfuse:w:0x62:
m -U hfuse:w:0xD9:m -U efuse:w:0xFF:m -U lock:w:0xFF:m

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.12s

avrdude: Device signature = 0x000000
avrdude: Yikes!  Invalid device signature.
avrdude: Expected signature for ATMEGA328P is 1E 95 0F
avrdude: reading input file "0x62"
avrdude: writing lfuse (1 bytes):

Writing |                                                    | 0% 0.00s ***faile
d;
Writing | ################################################## | 100% 0.31s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0x62:
avrdude: load data lfuse data from input file 0x62:
avrdude: input file 0x62 contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.02s

avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0000
         0x62 != 0x00
avrdude: verification error; content mismatch

avrdude: safemode: lfuse changed! Was 62, and is now 0
Would you like this fuse to be changed back? [y/n] n
avrdude: safemode: Fuses OK

avrdude done.  Thank you.

O que estou a fazer mal? Existe alguma forma de contornar o problema?
Título: Re: Repor Fuses do ATMega328
Enviado por: amando96 em 09 de Outubro de 2010, 12:57
Ligaste lá o cristal externo?
Título: Re: Repor Fuses do ATMega328
Enviado por: Capeleiro em 09 de Outubro de 2010, 13:13
Ligaste lá o cristal externo?
Liguei tal como no Arduino, o problema deve estar aí então.
O datasheet manda ligar de forma diferente, mas como é que posso gerar a frequência?
(figura 8-4. da página 35)
Título: Re: Repor Fuses do ATMega328
Enviado por: Njay em 09 de Outubro de 2010, 14:10
Se escolheste "External clock" agora ele só funciona com um clock gerado no exterior a entrar pelo pino XTAL1, com o pino XTAL2 sem estar ligado a nada. Tens que arranjar/fazer um gerador de clock (oscilador de onda quadrada), podes fazer por exemplo com um 555 (alimentado a 5V) ou usar um AMPOP ou umas portas lógicas (há milhentos circuitos na net). Se tiveres outro arduino(breaduino tb o podes pôr a gerar uma onda quadrada para servir de clock.
Título: Re: Repor Fuses do ATMega328
Enviado por: Capeleiro em 09 de Outubro de 2010, 15:11
Obrigado. No datasheet dizem que a frequência deve ser entre 0 e 20MHz. Qual a frequência mínima que vai fazer funcionar, só para ter uma ideia?
Título: Re: Repor Fuses do ATMega328
Enviado por: Njay em 09 de Outubro de 2010, 15:50
O clock tem que ser umas 4 vezes superior à velocidade máxima (bitrate) com que o avrdude vai programar. Usa pelo menos umas centenas de KHz, se não funcionar acho que podes configurar o avrdude para ficar mais lento (vê o manual).
Título: Re: Repor Fuses do ATMega328
Enviado por: Capeleiro em 09 de Outubro de 2010, 17:33
Ok, obrigado Njay

EDIT: Já agora, também posso definir o pin CLKO de outro ATmega como output do clock de sistema e ligá-lo ao XTAL1, não é?