Problemas ao gravar Bootloader em ATMega328P-PU


#1

E aí pessoal! Estou enfrentando um probleminha chato e ainda não conseguir achar na net uma solução, eu cometi a gafe de ao montar um projeto dar um grau numa fonte pra liga-la no standalone que até então estava sendo alimentado por um arduino uno.

Esta fonte tem 12v e 500mAh, logo imaginei que não teria problemas pro 7805, ao liga-la no standalone não ligou a placa e o 7805 ficou esquentando, logo despluguei, retomei a alimentação do Arduino Uno e nada, pus na placa do uno no lugar do ATMega dele e nada de subir o Blink, testei o RX TX no putty e tudo piscando ok, decidi carregar um bootloader, gravei o ISP no ATMega bom e fiz a pinagem de acordo com esse tutorial:

Fiz todo o procedimento correto, sempre segui esse tutorial, já gravei vários ATMega por ele, inclusive o que tá na minha Uno hoje, mas obtive o seguinte erro:

avrdude: Expected signature for ATmega328P is 1E 95 0F
Double check chip, or use -F to override this check.
Erro ao gravar o bootloader.

A principio imaginei que era fim da linha pra aquele ATMega, mas aí fui testar um chip virgem que tinha guardado, e deu o mesmo erro, estou começando a achar que deva ser os capacitores do cristal ou algo do tipo, porque não tem condições.


#2

Vou me concentrar na questão do avrdude, pois não entendi praticamente nada do restante.

O avrdude, é o que há por trás do IDE padrão do Arduino para enviar os programas para o MCU, no caso, ela vem configurada para trabalhar com o ATmega328P.

A questão é que o avrdude checa a assinatura do MCU, sendo que, cada versão tem a sua assinatura particular e o avrdude, ao checar a assinatura, “percebe” que o MCU não é, em teoria, o correto.

Para corrigir este problema, você deve abrir o arquivo avrdude.conf que deve estar na pasta da instalação do arduino em …/hardware/tools/avr/etc e procurar pela assinatura com problemas, daí em diante, você deve modificar a assinatura conflitante (0x1e 0x95 0x0F) pela assinatura correta das versão PU, que deve ser 0x1e 0x95 0x14, salve o arquivo e reinicie o IDE do Arduino.

Esse procedimento deve corrigir o problema, se não corrigir, tente procurar a assinatura correta do controlador que você está utilizando e faça o mesmo procedimento.

Lembre-se que isso vai fazer com que o avrdude apresente o mesmo problema quando tentar gravar no controlador correto do UNO, o P, sendo assim, precisará reverter o procedimento para que volte a gravar.


#3

Segue um trecho do meu arquivo original do avrdude:

#------------------------------------------------------------
# ATmega328
#------------------------------------------------------------

part
    id			= "m328";
    desc		= "ATmega328";
    has_debugwire	= yes;
    flash_instr		= 0xB6, 0x01, 0x11;
    eeprom_instr	= 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,
			  0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,
			  0x99, 0xF9, 0xBB, 0xAF;
    stk500_devcode	= 0x86;
    # avr910_devcode	= 0x;
    signature		= 0x1e 0x95 0x14;
    pagel		= 0xd7;
    bs2			= 0xc2;
    chip_erase_delay	= 9000;
    pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1",
		 "x x x x x x x x x x x x x x x x";

    chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x",
		 "x x x x x x x x x x x x x x x x";

    timeout	= 200;
    stabdelay	= 100;
    cmdexedelay	= 25;
    synchloops	= 32;
    bytedelay	= 0;
    pollindex	= 3;
    pollvalue	= 0x53;
    predelay	= 1;
    postdelay	= 1;
    pollmethod	= 1;

    pp_controlstack =
	0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
	0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
	0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B,
	0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
    hventerstabdelay	= 100;
    progmodedelay	= 0;
    latchcycles		= 5;
    togglevtg		= 1;
    poweroffdelay	= 15;
    resetdelayms	= 1;
    resetdelayus	= 0;
    hvleavestabdelay	= 15;
    resetdelay		= 15;
    chiperasepulsewidth	= 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programlockpolltimeout = 5;

    ocdrev              = 1;

    memory "eeprom"
	paged		= no;
	page_size	= 4;
	size		= 1024;
	min_write_delay = 3600;
	max_write_delay = 3600;
	readback_p1	= 0xff;
	readback_p2	= 0xff;
	read = " 1 0 1 0 0 0 0 0",
	       " 0 0 0 x x x a9 a8",
	       " a7 a6 a5 a4 a3 a2 a1 a0",
	       " o o o o o o o o";

	write = " 1 1 0 0 0 0 0 0",
	      	" 0 0 0 x x x a9 a8",
		" a7 a6 a5 a4 a3 a2 a1 a0",
		" i i i i i i i i";

	loadpage_lo = " 1 1 0 0 0 0 0 1",
		      " 0 0 0 0 0 0 0 0",
		      " 0 0 0 0 0 0 a1 a0",
		      " i i i i i i i i";

	writepage = " 1 1 0 0 0 0 1 0",
		    " 0 0 x x x x a9 a8",
		    " a7 a6 a5 a4 a3 a2 0 0",
		    " x x x x x x x x";

	mode		= 0x41;
	delay		= 20;
	blocksize	= 4;
	readsize	= 256;
    ;

    memory "flash"
	paged		= yes;
	size		= 32768;
	page_size	= 128;
	num_pages	= 256;
	min_write_delay = 4500;
	max_write_delay = 4500;
	readback_p1	= 0xff;
	readback_p2	= 0xff;
	read_lo = " 0 0 1 0 0 0 0 0",
		  " 0 0 a13 a12 a11 a10 a9 a8",
		  " a7 a6 a5 a4 a3 a2 a1 a0",
		  " o o o o o o o o";

	read_hi = " 0 0 1 0 1 0 0 0",
		  " 0 0 a13 a12 a11 a10 a9 a8",
		  " a7 a6 a5 a4 a3 a2 a1 a0",
		  " o o o o o o o o";

	loadpage_lo = " 0 1 0 0 0 0 0 0",
		      " 0 0 0 x x x x x",
		      " x x a5 a4 a3 a2 a1 a0",
		      " i i i i i i i i";

	loadpage_hi = " 0 1 0 0 1 0 0 0",
		      " 0 0 0 x x x x x",
		      " x x a5 a4 a3 a2 a1 a0",
		      " i i i i i i i i";

	writepage = " 0 1 0 0 1 1 0 0",
		    " 0 0 a13 a12 a11 a10 a9 a8",
		    " a7 a6 x x x x x x",
		    " x x x x x x x x";

	mode		= 0x41;
	delay		= 6;
	blocksize	= 128;
	readsize	= 256;

    ;

    memory "lfuse"
	size = 1;
	min_write_delay = 4500;
	max_write_delay = 4500;
	read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0",
	       "x x x x x x x x o o o o o o o o";

	write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0",
	      	"x x x x x x x x i i i i i i i i";
    ;

    memory "hfuse"
	size = 1;
	min_write_delay = 4500;
	max_write_delay = 4500;
	read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0",
	       "x x x x x x x x o o o o o o o o";

	write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0",
	      	"x x x x x x x x i i i i i i i i";
    ;

    memory "efuse"
	size = 1;
	min_write_delay = 4500;
	max_write_delay = 4500;
	read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0",
	       "x x x x x x x x o o o o o o o o";

	write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0",
	      	"x x x x x x x x x x x x x i i i";
    ;

    memory "lock"
	size = 1;
	min_write_delay = 4500;
	max_write_delay = 4500;
	read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0",
	       "x x x x x x x x x x o o o o o o";

	write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x",
	      	"x x x x x x x x 1 1 i i i i i i";
    ;

    memory "calibration"
	size = 1;
	read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x",
	       "0 0 0 0 0 0 0 0 o o o o o o o o";
    ;

    memory "signature"
	size = 3;
	read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x",
	       "x x x x x x a1 a0 o o o o o o o o";
    ;
;

part parent "m328"
    id			= "m328p";
    desc		= "ATmega328P";
    signature		= 0x1e 0x95 0x0F;

    ocdrev              = 1;
;

#------------------------------------------------------------
# ATmega32m1
#------------------------------------------------------------

part parent "m328"
    id              = "m32m1";
    desc            = "ATmega32M1";
    # stk500_devcode	= 0x;
    # avr910_devcode	= 0x;
    signature       = 0x1e 0x95 0x84;
    bs2             = 0xe2;

    memory "efuse"
        read            = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0",
                          "x x x x x x x x o o o o o o o o";
        write           = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0",
                          "x x x x x x x x x x i i i i i i";
    ;
;

Percebe-se que ele já vem por padrão com as duas assinaturas, mas eu continuo a receber erros como esse:

Arduino: 1.6.13 (Windows 10), Placa:“Arduino/Genuino Uno”

avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.

Erro ao gravar o bootloader.

Já troquei o cristal, reinstalei a IDE, verifiquei a pinagem e inclusive alterei a assinatura, mas sempre na mesma, já troquei até o ATMega.


#4

Bom, pelo que pesquisei, aparentemente é necessário criar uma entrada no arquivo boards.txt.

With a current (1.65+) version of the IDE, it should be pretty trivial. (…). All you really need is a modified boards.txt and a new bootloader hex file - you should need separate core and firmware directories (and you really don’t want them, either!)

Fonte: Fórum Arduino


#5

Resolvi! Aquele ATMega realmente fritou, descobri que a fonte que eu dei um grau tava passando na verdade 190v ao invés de 12v, por isso sofri um choque enorme, eu tinha testado no multímetro, mas meu cansaço tava tão grande na última madrugada que eu não percebi que tava dando 190v, ao ligar perdi o ATMega e provavelmente o 7805.

Utilizei desta ferramenta para fazer alguns testes (Board detector):

Sobre o circuito na protoboard que estava atrapalhando a identificação e gravação, como eu não tinha capacitores de 22pf por aqui, utilizei uma outra standalone que tinha eles, reparei também que por questões de cansaço, ao invés de 10k estava utilizando um resistor de 1k no pino de Reset (pino 1 do ATMega), logo resolvi e fiz um arranjo sobre a standalone, logo o ATMega bichado não foi identificado, já os outros dois reservas foram identificados inclusive seus respectivos bootloaders em hexadecimal.

Mesmo assim testei gravar o bootloader em um deles, logo upei o código do ISP e tentei gravar, o que me retornou apenas a seguinte mensagem:

***failed; avrdude: WARNING: invalid value for unused bits in fuse “efuse”, should be set to 1 according to datasheet This behaviour is deprecated and will result in an error in future version You probably want to use 0xfd instead of 0x05 (double check with your datasheet first).

O que segundo algumas fontes não tem nada demais, achei o processo bem rápido em relação à antigamente o que o Arduino e Cia ainda comenta em seu post que este processo foi optimizado e que é normal tal rapidez.