Scrivere sketch eliminando il bootloader ed usando due Arduino

Ciao ragazzi!

Sto provando a scrivere su un Arduino Duemilanove uno sketch trovato online. L'autore ha specificato che è utile eliminare il bootloader dall'Arduino per avere l'avvio immediato del codice.

Ho capito, leggendo diverse guide, che uno dei metodi utilizzabili per scrivere del codice sull'Atmel di un Arduino "cancellando" (o sovrascrivendo col codice stesso) il bootloader è caricarlo usando un altro Arduino programmato come ISP.

L'altro Arduino a mia disposizione, programmato come ISP, è un Elegoo Mega2560 R3.

Ho seguito questa guida: http://www.xorse.it/wp-content/uploads/downloads/2013/03/GUIDA-tecniche-programmazione-microcontrollori-atmel_v4.pdf per programmare l'Elegoo come ISP e per collegare i due Arduino, utilizzando però come pin di reset dell'Elegoo il 10 e non il 53, visto che con quest'ultimo Arduino IDE 1.8.15 mi dava subito un errore e l'Elegoo non "reagiva" in alcun modo.

Configurando nel modo appena descritto il tutto, usando Arduino IDE 1.8.15 opportunamente collegato, dopo aver premuto su "Carica tramite un programmatore", l'Elegoo si attiva e comincia un'alternanza tra i led RX e TX, mentre sul Duemilanove c'è un lampeggio rapido del led L.

Dopo circa 7-8 secondi, Arduino IDE mi dà il seguente errore:

avrdude: verification error, first mismatch at byte 0x012f
         0x00 != 0x92
avrdude: verification error; content mismatch
avrdude: verification error; content mismatch

Ho fatto diverse prove, utilizzando ad esempio un condensatore elettrolitico 10uF sia come consigliato nella guida sopra, come sistema anti-autoreset, quindi tra 3.3v e RESET, sia come riportato nella guida di arduino.cc, ovvero tra RESET e GND, ma non c'è differenza.

Potreste darmi una mano nell'analisi più avanzata di questo problema?

Grazie a tutti in anticipo per la risposta!

Anch'io anni fa provai a usare una scheda Arduino come programmatore ICSP, ma non è assolutamente pratico (né economico) e troppo spesso mi capitava di sbagliare e riprogrammare il programmatore anziché la scheda che avrei voluto programmare!

È molto più semplice, invece, usando un economico programmatore USBASP con il suo adattatore da 10 a 6 pin), collegandolo ai pin "ICSP" presenti sulla scheda.

Se cerchi USBASP su ebay (o Aliexpress, ad es. € 2,86 diymore 10 Pin to Standard 6 Pin Adapter Converter 5V USBASP ISP AVR USB Programmer with JATG Wire Case for Arduino|avr programmer|isp programmerpin 1 - AliExpress) [come si modifca il sorgente della pagina?...] trovi sia i programmatori che gli adattatori. Ti consiglio di acquistare un programmatore dotato di custodia (che puoi anche acquistare a parte, cercando USBASP case) per evitare cortocircuiti.

1 Like

Ti ringrazio innanzitutto per la risposta.

Avevo pensato anch'io ad una soluzione del genere. Magari lo acquisto da Amazon, così da ridurre un po' i tempi di consegna.

Devo dire che sono abbastanza sicuro che poi, alla fine, il tutto venga scritto correttamente sull'Arduino destinazione, in quanto ho fatto un paio di controprove ed il codice di test (ovvero un semplice sketch per far lampeggiare un led) fa il suo dovere.

Credo comunque che acquisterò anche l'USBASP per avere maggiore sicurezza su ciò che sto facendo.

Grazie!

Purtroppo da Amazon ti viene a costare 14€ anziché 3€... :frowning:
Forse altrove riesci a trovare un compromesso fra prezzo e tempo di consegna.

Ho visto che quello su AliExpress avrebbe anche qualche € di spedizione.

Su Amazon ne ho trovato uno identico a 7.99€ senza involucro, ma considerando che mi arriverebbe in un giorno e che non avere l'involucro in plastica non mi rappresenta un particolareggiato problema, penso che opterò per quest'ultimo.

L'adattatore da 10 a 6 pin è compreso?

Sì, anche se non mi è chiaro a cosa serva!

Serve per collegarlo al connettore a 6 pin presente sulla scheda.

Quello che ho visto io ha il connettore a 6 pin direttamente sull'USBASP ed il cavo piattina di collegamento anch'esso a 6 pin: DollaTek USBASP USBISP AVR USBasp_H6 Programmatore + Supporto Cavo 6 Pin Ideale Win7 Win10 Linux : Amazon.it: Elettronica

Non lo avevo mai visto, né mi era capitato cercando USBASP! :slight_smile:

Ah ok! :smiley:

Preso quello del link da 7.99€ (in verità l'ho pagato un euro in meno, visto che all'atto dell'acquisto c'era un coupon sconto attivabile): messi i drivers libusbK per poterlo usare in Windows 10.

Tutto ok, sono riuscito a scrivere su Arduino Duemilanove lo sketch senza errori di sorta.

Ora: utilizzando questo metodo si elimina in modo sicuro il bootloader dall'Arduino, oppure ci può essere qualcos altro da dover fare per esserne certi?

In realtà il bootloader non è un gran problema, anche perché serve per configurare il clock e gli altri "fuse" di un microcontrollore nuovo, cosa altrimenti da fare con Burn-O-Matic o altri programmi. L'ATmega328P nuovo di fabbrica, ad esempio, è impostato con il clock interno a 1MHz.
L'avvio è comunque pressoché istantaneo. L'unica valida ragione per eliminare il bootloader è recuperare quel 5% circa di spazio occupato, se il programma da caricare è tanto grande da richiederlo. Leggo che dovrebbe impiegare 1,6 secondi, ma sia il contatore Geiger che l'indicatore di velocità con GPS che ho qui a portata di mano partono immediatamente e, pur usando l'USBASP per programmare, per impostare i fuse carico sempre il bootloader...

... e questa dove l'hai letta ? ? ? :open_mouth:

Assolutamnete NO ... è la funzione di Carica Bootloader" dell'IDE di Arduino che va prima a impostare i fuse e poi a caricare il bootloader, ma il bootloader di persè NON fa nulla di ciò che descrivi.

Compito del bootloader è partire all'avvio, guardare se sulla seraile qualcuno vuole parlare con lui per caricare un nuovo programma e poi passare il controllo a detto programma. Se nessuno vuole parlare conlui, il bootloader passa direttamete il controllo al codice già caricato in precedenza.

Se si usa la programmazione ISP, esso è del tutto inutile ed uno spreco di memoria. Qualsiasi programma che usa la programmazione ISP, incluso lo stesso avrdude è in gradoi di impostare i FUSE come si vuole ... basta studiarsi il manuale e vedere quali opzioni dare a lina comando.

Se non si vuole stare a studiare avrdude, ci sono svariate interfaccie grafiche che semplificano la cosa rendendola a una semplice selezione di check-box. In ambiente Win, molto pratico e avrdudes (gira anche in altri ambienti con l'ausilio di "mono"), su Mac, molto fatto bene è AVRfuses.

Oh, per inciso, se non cambiano le necessità hardware, l'impostazione dei FUSE è cosa che si fa una volta e poi non si fa più ... :wink:

Guglielmo

Il motivo per cui voglio togliere il bootloader è che, per il tipo di codice che sto provando ad implementare (un emulatore di CD changer per HU Fiat, nel mio caso una vecchia Punto), necessita, stando a quanto ho letto online da programmatori che molti anni fa avevano cominciato un progetto simile, di un avvio istantaneo, pena il non riconoscimento dell'emulatore da parte dell'autoradio.

Con il bootloader, quel minimo di ritardo creerebbe problemi da questo punto di vista.

Bene, imposta i FUSE una volta per tutte come ti occorrono e poi carichi sempre il programma via ISP senza ausilio del bootloader :wink:

All'avvio sarà il tuo programma a partire immediatamente.

Guglielmo

Perdonami, Guglielmo! Avrei dovuto scrivere:
(...) CARICARE IL BOOTLOADER serve ANCHE per configurare il clock e gli altri "fuse" di un microcontrollore nuovo

... si, ma è cosa che non c'entra nulla con il bootloader di persè ... è l'IDE che va a scrivere prima i FUSE e poi carica il bootloader :wink:

Guglielmo

1 Like

Una volta per tutte... su quel singolo microcontrollore! Per usi futuri, sarà bene salvare l'impostazione.

Chiaro :slight_smile:

Scusa, Guglielmo: io non ho mai notato quel ritardo... Eppure solitamente monto il 328 sulla scheda Arduino, faccio molte prove con il cavetto USB (cioè seriale, che necessita del bootloader), poi costruisco il circuito, ci metto il 328, il quarzo e gli altri componenti e poi lo programmo tramite l'USBASP...

... su 328P non lo noto nenache io, ma prova una leonardo (o altro basato su ATmega32U4) e lo noterai di più ... :slight_smile:

Guglielmo