Strano problema con signature scrivendo il bootloader

Buongiorno a tutti,
Ieri sera finalmente sono riuscito a trovare uno spicciolo di tempo per finire la mia shield per programmare atmega vergini (@menniti alla fine il quarzo l'ho messo, per siciurezza ! XD) ed andando a fare le prime programmazioni è successa una cosa alla quale non ho trovato una spiegazione plausibile.

Ho degli atmega328pu (vergini), provando a scriverci su il bootloader (bootloader di arduino uno) dall'ide di arduino ricevevo un messaggio che diceva che per il 328p si aspettava una signature diversa.
Nessun problema, armato di pazienza mi sono modificato avrdude.conf aggiungendo una nuova entry specifica per il chip 328pu, copiando lo schema dal 328 normale e cambiando la signature.
Dopodichè ho aggiunto anche una nuova entry (che ho chiamato atmega 328pu su shield)in board.txt di arduino in maniera tale che ho sempre a disposizione le impostazioni delle altre schede e in aggiunta ho questo nuovo set di configurazione che utilizza però la mcu aggiunta poco sopra su avrdude.

Riprovo a scrivere il bootloader, questa volta settando su board la mia 'atmega 328pu su shield' , burn bootloader with arduino as ISP e via, perfetto al primo colpo.
A questo punto prendo il chip appena programmato , e lo metto al posto del chip che ho nella arduino uno, ci scrivo sopra Blink, e il led lampeggia, perfetto direi.
Per sfizio ora ci programmo sopra ISP e provo a riscrivere il bootloader sul chip che originariamente avevo nella arduino uno.
Anche qui perfetto al primo colpo, se non che mi accorgo che nel frattempo non ho cambiato l'impostazione su board, pertanto ho scritto anche questo chip con l'impostazione 'atmega 328pu su shield' che dovrebbe puntare ad un chip con la signature diversa, inquanto 328PU.
Stranito dal fatto, ho controllato con la lente il chip, ed in effetti anche quest'ultimo perlomeno dalla scritta risulta essere un 328PU.

La cosa strana viene ora, sempre con lo stesso chip , che ricordo essere da sigla un atmega328-pu, però estratto dalla mia arduino uno, provo a cambiare board e selezionare arduino uno, vado a riscrivere il bootloader e ... baaaammm , funziona lo stesso al primo colpo!
MA COME!!! ora non la fà la verifica della signature????

Non sazio rimonto il chip originale sulla arduino uno, riscrivo blik, e constato che è tutto ok, riscrivo ISP e riprovo a caricare il bootloader sul mio (ex) chip vergine 328-pu usando come impostazioni la board arduino uno, eeeeee .... bbbbaaaaaaaaammmm, messaggio che dice aspettava una signature diversa!!!(come sopra)

Sunto della situazione, dati 2 chip con codice identico atmega 328-pu, perchè uno lo riesco a scrivere con entrambi i profili e uno invece solo con il suo?

La signature è diversa tra il 328 e il 328p il 328p-PU ha la stessa signature del 328p perché la PU identifica il case, 28P3, e non ha nulla a che vedere col core del micro.
L'elenco di tutte le signature del 168/328 le trovi a partire a pagina 301-302 del datasheet, capitolo 28 paragrafo 3, e come puoi vedere da solo non esiste una signature specifica per la versione 328p-PU, c'è solo quella per il 328 e il 328p.

Mi hai anticipato :slight_smile: (la "P" sta per "PicoPower", ossia identifica i modelli a basso consumo energetico).

Potresti pubblicare il file boards.txt che usi ed i messaggi esatti di avrdude perché tra "baaam", "perfetto", hai però dimenticato i dati essenziali :wink:

astrobeed:
La signature è diversa tra il 328 e il 328p il 328p-PU ha la stessa signature del 328p perché la PU identifica il case, 28P3, e non ha nulla a che vedere col core del micro.
L'elenco di tutte le signature del 168/328 le trovi a partire a pagina 301-302 del datasheet, capitolo 28 paragrafo 3, e come puoi vedere da solo non esiste una signature specifica per la versione 328p-PU, c'è solo quella per il 328 e il 328p.

Intanto grazie, però c'è qualcosa che non mi torna.
Io ho identificato il chip leggendo il codice apposto sopra, e la scritta mi sembra identica tra i due , non ci metto le mani sul fuoco però mi pareva così (erano le 2.30 di stanotte, tutto è possibile! :()
A parita di sigla scritta sopra, paradossalmente i chip non dovrebbero essere identici?
E poi la cosa strana come dicevo è un altra, perchè un chip può essere bootloaderato con entrambi i profili (ergo 2 signature diverse) e uno no?
Intanto vedo di prendere in mano i chip e verificare meglio.

niki77:
Intanto grazie, però c'è qualcosa che non mi torna.

Per dirla tutta a me non torna questa tua affermazione:

Nessun problema, armato di pazienza mi sono modificato avrdude.conf aggiungendo una nuova entry specifica per il chip 328pu, copiando lo schema dal 328 normale e cambiando la signature.

Come puoi aver cambiato la signature visto che è identica per tutti e due i chip ? Il datasheet non mente e in questi casi è lui che fa testo :slight_smile:

Ma ne sei estremamente sicuro?
Da quello che so io (letto in altri post di questo fourm in inglese) la signature impostata per il 328 di arduino uno (atmega328p) è 1E 94 0F
Quella che ho dovuto impostare io per far quagliare il tutto è 1E 94 14.

se trovo il link lo riallego.

Eccolo :

http://arduino.cc/forum/index.php/topic,58670.0.html

Scusami ma io flasho da almeno 6 mesi gli Atmega328p-20pu in standalone e non ho mai modificato la signature nel file boards.txt.
Che poi, a ripensarci, la signature manco c'è nel file originale. C'è solo il modello di micro che, per gli Atmega dell'Arduino, sono "atmega328p".
Inoltre avrdude non supporta neanche gli atmega328 senza "p", ho appena provato.

PS: confermo che la signature per i 328p è proprio 1E 95 0F. E' quella che mi da avrdude del mio 328 standalone.
Scusa, ma puoi postare questo boards.txt o no?

niki77:
Ma ne sei estremamente sicuro?

Il datasheet dice che è esattamente come dico io quindi si, sono sicuro al 1000% :grin:

Da quello che so io (letto in altri post di questo fourm in inglese) la signature impostata per il 328 di arduino uno (atmega328p) è 1E 94 0F
Quella che ho dovuto impostare io per far quagliare il tutto è 1E 94 14.

La signature del 328 è 0x1E 0x95 0x14, la signature del 328p è 0x1E 0x95 0x0F, quelle con lo 0x94 sono del 168 e comunque il terzo valore è diverso.
0x1E 0x94 0x14 non è una signature valida ne per il 168 ne per il 328, se non ci credi leggi il datasheet.

leo72:
Che poi, a ripensarci, la signature manco c'è nel file originale. C'è solo il modello di micro che, per gli Atmega dell'Arduino, sono "atmega328p".
Inoltre avrdude non supporta neanche gli atmega328 senza "p", ho appena provato.

Esatto, la signature non c'è nel file boards.txt, quella si trova nel file di configurazione di avrdude, il famigerato avrdude.conf, che contiene tutte le informazioni per i vari modelli di micro inclusa la signature.

Piccola precisazione , a memoria avevo confuso il secondo byte della signature, è in effetti 95, non 94

Su file boards.txt ci sono solo i parametri da passare ad avrdude
Su boards.txt troverai solo atmega328p, perlomeno in quello di serie.
Nel mio invece ho replicato il blocco di arduino uno

##############################################################

uno.name=Arduino Uno
uno.upload.protocol=stk500
uno.upload.maximum_size=32256
uno.upload.speed=115200
uno.bootloader.low_fuses=0xff
uno.bootloader.high_fuses=0xde
uno.bootloader.extended_fuses=0x05
uno.bootloader.path=optiboot
uno.bootloader.file=optiboot_atmega328.hex
uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F
uno.build.mcu=atmega328p
uno.build.f_cpu=16000000L
uno.build.core=arduino

e modificando la copia facendola diventare

##############################################################

atmega328pu.name=Atmega328PU su shield
atmega328pu.upload.protocol=stk500
atmega328pu.upload.maximum_size=32256
atmega328pu.upload.speed=115200
atmega328pu.bootloader.low_fuses=0xff
atmega328pu.bootloader.high_fuses=0xde
atmega328pu.bootloader.extended_fuses=0x05
atmega328pu.bootloader.path=optiboot
atmega328pu.bootloader.file=optiboot_atmega328.hex
atmega328pu.bootloader.unlock_bits=0x3F
atmega328pu.bootloader.lock_bits=0x0F
atmega328pu.build.mcu=atmega328pu
atmega328pu.build.f_cpu=16000000L
atmega328pu.build.core=arduino

in modo tale da avere sulla lista delle boards anche la voce 'Atmega328PU su shield'

Poi su avrdude.conf ho creato la entry per gestire il famoso 'atmega328pu' che ho referenziato nel file board, altrimenti va in errore e dice che non se lo trova (giustamente)

[allego solo le prime righe giusto per capire]

anche qui duplicando l'intera definizione per Atmega328

#------------------------------------------------------------

ATmega328

#------------------------------------------------------------

part
id = "m328p";
desc = "ATMEGA328P";
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 0x0F;
pagel = 0xd7;
bs2 = 0xc2;
chip_erase_delay = 9000;

etc etc etc ...

e modificando la copia facendola diventare

#------------------------------------------------------------

ATmega328PU

#------------------------------------------------------------

part
id = "m328pu";
desc = "ATMEGA328PU";
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;

etc etc etc ...

e così facendo mi trovo nelle condizioni che ho detto.

Signatura esistente o meno, io riesco a programmare i miei nuovi micro SOLO utilizzando queste impostazioni,
se vado a reimpostare la signature a 1e 95 0f non li scrive!

niki77:
Piccola precisazione , a memoria avevo confuso il secondo byte della signature, è in effetti 95, non 94

Si ma tu non stai usando un ATmega328p stai usando un ATmega328, la PU indica solo il case, la "p" dopo il 328 fa la differenza tra i due core e la signature, uno è siglato 328p-PU quello che hai tu è siglato 328-PU, Arduino usa l'ATmega328p-PU.

Ma dove li hai comprati, i tuoi Amtega?

Li ho acquistati nel post della discordia aperto poco tempo fà proprio su questo forum.

Comunque se leggete bene il mio primo intervento :

La cosa strana viene ora, sempre con lo stesso chip , che ricordo essere da sigla un atmega328-pu...

parlavo di atmega 328-pu

A questo punto riducendo tutto ai minimi termini, i miei micro nuovi sono dei 328, quello che avevo nella UNO è un 328p ?

E in tutti i casi, perchè il 328p lo riesco a programmare con entrambi i signature mentre il 328 no?

niki77:
quello che avevo nella UNO è un 328p ?

Sulla UNO c'è il 328p

E in tutti i casi, perchè il 328p lo riesco a programmare con entrambi i signature mentre il 328 no?

Non è possibile, il 328p lo puoi programmare solo se viene riconosciuta la sua signature, idem per il 328 senza p.

Avevi scritto "328pu", si dava per scontato che fossero 328p. Come ti ha detto astrobeed, "pu" è il suffisso che indica il package. Allora, per completezza, i micro sono marchiati "Atmel ATMEGA328P-PU".

Ora dico la mia ca##ata.
Che tu possa programmare un 328p sia come 328p che come 328 potrebbe essere logico, dato che il 328p è un'evoluzione del 328 con nuovi sistemi di gestione del risparmio energetico, quindi pienamente compatibile con il micro precedente: viceversa, invece, non si può dire. Quindi non sapendo a priori se nel tuo codice usi o meno le nuove caratteristiche, avrdude ti impedisce di flasharlo.

Io la vedo così.

E' plausibile, a me era venuto il dubbio che avesse scritto correttamente la sua sigla, altrimenti non si spiegava la cosa.
Comunque non so da dove vengano questi micro, io non ne ho mai visti in giro, non so nemmeno se ATMEL li produce ancora; in ogni caso, la modifica dovrebbe essere un'aggiunta del nuovo modello, non una sostituzione, come consiglio sempre di fare, è più ordinato e più comodo.

Chiedo umilmente scusa a tutti ma ho commesso una gaffa micidiale.

Io possiedo un 328p e quattro 328 , il 328p si può programmare il bootloader SOLO con la sua signature, idem per il 328 .

La programmazione spicciola invece,ovvero l'upload di schetch , la riescoa fare su entrambi i chip SOLO specificando la board ARDUINO UNO.

Mi ritiro a fare ammenda delle minchiate scritte in precedenza! :zipper_mouth_face:

@Mike:
il datasheet parla di 328 e 328p ed il sito di Atmel li riporta ancora entrambi.
Però avrdude non supporta i 328 normali (senza "p"), neanche le ultimissime versioni, non solo la vecchia release che è inserita nell'IDE.

niki77:
Chiedo umilmente scusa a tutti ma ho commesso una gaffa micidiale.

Io possiedo un 328p e quattro 328 , il 328p si può programmare il bootloader SOLO con la sua signature, idem per il 328 .

La programmazione spicciola invece,ovvero l'upload di schetch , la riescoa fare su entrambi i chip SOLO specificando la board ARDUINO UNO.

Mi ritiro a fare ammenda delle minchiate scritte in precedenza! :zipper_mouth_face:

Quest'ultima parte si riferisce all'operazione di montare il micro (qualsiasi) sullo zoccolo di Arduino ed usare l'IDE per inviare uno sketch?
Non ti preoccupare di ciò che dici, come vedi ormai abbiamo le spalle grosse su quest'argomento e non crediamo a nessuno che dica cose che non tornano XD almeno fino a prova contraria CERTA :slight_smile:

@Leo: beh, ovviamente mica fanno sparire il datasheet, bisognerebbe vedere sul sito ATMEL se li producono/vendono ancora; comunque questa storia della signature se ricordi l'abbiamo affrontata con l'atmega8 (senza la A), solo che lì fu durissima a metterci sul il BL, e Daniele riuscì solo per il prezioso aiuto di BB che gli scrisse tutte le modifiche da fare e gli spiegò come ricompilare il file, ma non chiedermi altro se vuoi approfondire, c'è il Topic.