Far funzionare ATmega328 (non "P")

Mi ha scritto D.R. chiedendomi aiuto visto che seguendo la Guida non è riuscito a caricare il bl sul suo ATmega328, che ho scoperto essere leggermente diverso dal 328P; sul datasheet infatti c’è scritto che il 328P è identificato da

0x1E, 0x95 e 0x0F

mentre il 328 da

0x1E, 0x95 e 0x14

Infatti quando tenta di fare il burn l’IDE gli dice

Expected signature for ATMEGA328P is 1E 95 0F
Double check chip, or use -F to override this check

questo perché lui sta usando il riferimento mcu atmega328p.
Ho scoperto che nel file “ATmegaBOOT_168”, che poi è quello che lui usa per il BL, questi valori ci sono e sono modificabili; quindi teoricamente dovrebbe bastare mettere 0x14 invece di 0x0F e ricompilare il file. Ha fatto delle prove ottenendo questo:

avr-gcc -g -Wall -O2 -mmcu=atmega328p -DF_CPU=1000000L ‘-DMAX_TIME_COUNT=F_CPU>>4’ ‘-DNUM_LED_FLASHES=1’ -DBAUD_RATE=57600 -c -o ATmegaBOOT_168.o ATmegaBOOT_168.c
process_begin: CreateProcess<NULL, avr-gcc -g -Wall -O2 -mmcu=atmega328p -DF_CPU=1000000L ‘-DMAX_TIME_COUNT=F_CPU>>4’ ‘-DNUM_LED_FLASHES=1’ -DBAUD_RATE=57600 -c -o ATmegaBOOT_168.o ATmegaBOOT_168.c, …> failed.
make <e=2>: Impossibile trovare il file specificato
MAKE: *** [ATmegaBOOT_168.o] Error 2

Io non sono in grado di aiutarlo, qualcuno può dirmi cosa suggerire? La sua necessità in realtà è quella di portarlo a 1MHz, visto che questo chip ha giò il bl del 2009 e quindi è sicuramente settato per 16MHz. Potrebbe risolvere da riga di comando?

menniti: Io non sono in grado di aiutarlo, qualcuno può dirmi cosa suggerire? La sua necessità in realtà è quella di portarlo a 1MHz, visto che questo chip ha giò il bl del 2009 e quindi è sicuramente settato per 16MHz. Potrebbe risolvere da riga di comando?

La signature contenuta nel sorgente del bootloader è quella che fornisce per farsi identificare da Avrdude come programmatore STK500 collegato ad un ATmega 328p, modificandola si adatta per il 328 a livello riconoscimento micro dall'IDE, tocca comunque creare il relativo device in boards.txt che sarà da utilizzare anche per caricare il bootloader, modificato e ricompilato, tramite lo sketch isp.

astrobeed:

menniti: Io non sono in grado di aiutarlo, qualcuno può dirmi cosa suggerire? La sua necessità in realtà è quella di portarlo a 1MHz, visto che questo chip ha giò il bl del 2009 e quindi è sicuramente settato per 16MHz. Potrebbe risolvere da riga di comando?

La signature contenuta nel sorgente del bootloader è quella che fornisce per farsi identificare da Avrdude come programmatore STK500 collegato ad un ATmega 328p, modificandola si adatta per il 328 a livello riconoscimento micro dall'IDE, tocca comunque creare il relativo device in boards.txt che sarà da utilizzare anche per caricare il bootloader, modificato e ricompilato, tramite lo sketch isp.

Si, naturalmente tutti questi passaggi sono stati fatti, in realtà sta usando un 2009 come target quindi gli basterebbe modificare il file (temporaneamente) e usare la board 2009; in pratica bisognerebbe dare la nuova signature al 328p.

avrai noie anche con avrdude che non riconosce nativamente il 328, ma solo il 328p. dovrai modificare a mano avrdude.conf creando un'altro paragrafo (copiato dal 328p) ma con nome e signature diversa. per gcc , m328 e m328p sono due cose diverse.

Ciao a tutti mi presento sono Daniele, ringrazio ancora una volta Michele che molto gentilmente vi ha posto il mio problema. Venendo ai fatti... ho modificato il file avrdude.conf modificando la signature (ho provato anche a cambiare l'id in "m328") ho modificato il file boards inserendo i dati della nuova. ho provato a caricare il bootloader ma genera l'errore

Expected signature for ATMEGA328P is 1E 95 14 * Double check chip, or use -F to override this check*

da notare che non è più 1E 95 0F ma 1E 95 14, la signature giusta per il mio Atmega328-pu (almeno credo, a questo punto non ho più certezze)

da qui la necessità di provare a modificare il bootloader: ho modificato dapprima AtmegaBOOT_168 e relativo Makefile ma lanciando il comando "make atmega328" da vari errori. Questi errori in realtà li da comunque anche con i file non modificati, originali, pertanto pensano fosse problema di windows vista ho provato su win XP ma niente di nuovo ho modificato oggi anche il Makefile (inserendo la frequenza di 1mhz e i fuses necessari) di optiboot e ho compilato i file .hex regolarmente, però quando provo a caricare il bootloader compare l'errore Expected signature for ATMEGA328P is 1E 95 14 * Double check chip, or use -F to override this check* a questo punto mi viene il dubbio che la signature scrivere il messaggio di errore venga letta da avrdude.conf (e infatti correttamente scrive 1E 95 14) ma che a generare l'errore sia la comparazione della signature letta sul chip con un altro file... o che la signature giusta non sia nemmeno questa!

grazie mille anticipatamente a tutti!

Daniele

A mio avviso devi cercare assolutamente di ottenere il file "ATmegaBOOT_168_atmega328.hex" (che è quello che usi con la riga "atmega3281.bootloader.file=ATmegaBOOT_168_atmega328.hex") con la modifica. In pratica devi modificare:

elif defined AVR_ATmega328

define SIG2 0x95

define SIG3 0x14

define PAGE_SIZE 0x40U //64 words

naturalmente prima ti fai una copia per poi ripristinare tutto, una volta risolto. Piché parti da un file sorgente "ATmegaBOOT_168.c" ovvio che alla compilazione lo devi rinominare (anche dopo) in "ATmegaBOOT_168_atmega328.hex" altrimenti viene ignorato dalle righe della tua board virtuale. Credo che debbano combaciare i dati tra questo file ed avrdude.conf.

Ok la modifica l’ho fatto ma non rieco assolutamente a a ricompilare il file!
nemmeno senza modifiche riesco a compilarlo…
ho appena provato anche con la versione 0021…
quando compilo esce questo errore

avr-gcc -g -Wall -O2 -mmcu=atmega328p -DF_CPU=1000000L ‘-DMAX_TIME_COUNT=F_CPU>>4’ ‘-DNUM_LED_FLASHES=1’ -DBAUD_RATE=57600 -c -o ATmegaBOOT_168.o ATmegaBOOT_168.c
ATmegaBOOT_168.c: in function ‘main’:
ATmegaBOOT_168.c: error: ‘EEWE’ undeclared (first use in this function)
ATmegaBOOT_168.c: error: (each undeclared identifier is reported once
ATmegaBOOT_168.c: error: for each function it appears in.)
MAKE: *** [ATmegaBOOT_168.o] Error 1

mmmm nel file ATmegaBOOT_168 non avendo trovato altri richiami a EEWE ma solo riferimenti a EEPE ho sostituito il nome e sono riuscito a compilare il file ho riprovato con il file compilato ma l'errore persiste medesimo

Expected signature for ATMEGA328P is 1E 95 14 * Double check chip, or use -F to override this check*

fra le varie prove ho anche provato a eliminare la cartella bootloaders e durante il burn bootloader non da errori a riguardo. penso che il problema sia rigardo avrdude che cerca di "mettersi in contatto" con l'atmega328.

nel file ATmegaBOOT_168 non avendo trovato altri richiami a EEWE ma solo riferimenti a EEPE ho sostituito il nome e sono riuscito a compilare il file

In effetti EEWE nel datasheet del micro 328/328P non esce, probabilmente c’è un errore prova ad invertire le while
perchè forse EEWE è presente nel 1280/1281.

Non puoi pretendere che avrdude non si lamenti se non è aggiornato, usa -F per forzare la scrittura.

Ciao.

I dati dei vari chip sono contenuti nel file avrdude.conf. Arduino contiene questo file insieme ad avrdude (/arduino-ooxx/hardware/tools sul mio sistema). Bisognerebbe editare tale file per inserire le specifiche del 328.

Fatto ciò, se Davide deve solo impostare il micro a 1 MHz, può fregarsene del bootloader e dell'IDE e flashare i fuse del micro in standalone usando l'Arduino come ISP tramite avrdude lanciato da terminale.

Detto questo, ed assumendo che le UNICHE differenze tra il 328 ed il 328p siano a livello di signature (intendo per avrdude, tralasciando le differenze reali dell'HW), si potrebbe provare a copiare le definizioni del 328p, che sono alla riga 7261-7448 e modificare la signature contenuta alla riga 7275.

Ho modificato il sorgente del bootloader, il makefile, il file boards.txt e avrdude.conf ma non sò come passarteli.. :~

Ultimo aggiornamento di questa mattina.
Modificando soltanto avrdude.conf, in particolare
id = “m328”;
signature = 0x1E 0x95 0x14;
funziona, nel senso che modificando anche l’id sono riuscito a caricare di nuovo (era già presente) il bootloader 2009 (sono partito dalle cose semplici :slight_smile: )

andando a questo punto a caricare le nuove impostazioni con i nuovi fuses ottengo

***failed;
avrdude: verification error, first mismatch at byte 0x0000

  • 0xff != 0x07*
    avrdude: verification error; content mismatch

adesso proverò a caricare direttamente i fuses con avrdude… spero di riuscire

Prova da terminale, secondo me con avrdude usato al di fuori dell'IDE potresti farcela. Contemporaneamente programma anche i fuse per avere il clock a 1 MHz e sei a posto. Questi parametri sono per il 328P ma credo non faccia differenza con il 328 "normale". -U lfuse:w:0x62:m -U hfuse:w:0xde:m -U efuse:w:0xff:m

quel verification error però non fà sperare bene... :roll_eyes:

Daniele85: Ultimo aggiornamento di questa mattina. Modificando soltanto avrdude.conf, in particolare id = "m328"; signature = 0x1E 0x95 0x14; funziona, nel senso che modificando anche l'id sono riuscito a caricare di nuovo (era già presente) il bootloader 2009 (sono partito dalle cose semplici :) )

andando a questo punto a caricare le nuove impostazioni con i nuovi fuses ottengo

***failed; avrdude: verification error, first mismatch at byte 0x0000 * 0xff != 0x07* avrdude: verification error; content mismatch

adesso proverò a caricare direttamente i fuses con avrdude... spero di riuscire

No Davide, quello è un errore noto, basta che nella board virtuale imposti l'efuses a 0x07 e vedrai che ti funziona tutto.

Quoto Mike, mi ero dimenticato dell'efuse :P

Bene intanto grazie mille a tutti, mi state dando un aiuto enorme ho provato i file che mi ha inviato BrainBooster e... funziona! sono riuscito a caricare il bootloader senza errori. per quanto riguarda il settaggio dei fuses nel file che mi ha inviato ha riportato

atmega328.bootloader.low_fuses=0x62 atmega328.bootloader.high_fuses=0xD9 atmega328.bootloader.extended_fuses=0x05

che mi ha caricato regolarmente. Ho poi provato a caricare i seguenti (quelli consigliati da Michele sulla sua guida)

atmega328.bootloader.low_fuses=0x62 atmega328.bootloader.high_fuses=0xDE atmega328.bootloader.extended_fuses=0xFF

e ha caricato anche questi. A questo punto mi chiedo, ma quali sono le differenze fra i vari fuses?

il low dovrebbe essere riferito alla frequenza l'high alle varie opzione connesse e l' extended ????

Ci sono diversi parametri programmabili con i fuse, tra cui la possibilità o meno di flashare il micro via seriale, l'abilitazione o meno dello spazio riservato per il bootloader, il watchdog ecc... Fai riferimento a questo sito: http://www.engbedded.com/fusecalc/

ah ok però... ... di nuovo errori (non si finisce più!)

adesso ho provato a caricare uno sketch, ho preso il classico BlinkWithoutDelay, ho selezionato la board dell'atmega328 a 1mhz e ho lanciato upload... l'errore che dà è

unknown MCU 'atmega328' specified known MCU names: ---segue lista --- BlinkWithoutDelay:-1: error: MCU 'atmega328' sipported for assembler only

Daniele85: ah ok però... ... di nuovo errori (non si finisce più!)

adesso ho provato a caricare uno sketch, ho preso il classico BlinkWithoutDelay, ho selezionato la board dell'atmega328 a 1mhz e ho lanciato upload... l'errore che dà è

unknown MCU 'atmega328' specified known MCU names: ---segue lista --- BlinkWithoutDelay:-1: error: MCU 'atmega328' sipported for assembler only

forse ora devi aggiungere la "p" finale