Programmare atmega328 standalone

Ho già visto che questo argomento è ampiamente trattato sul sito di Arduino, ma volevo capire bene una cosa.

Praticamente, ho portato il circuito di Arduino UNO su una scheda millefori per un mio progetto ed il tutto funziona molto bene. Ho seguito questo schema per effettuare i collegamenti: http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Dev/Arduino/Boards/redboard.pdf e questa è la guida: http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Dev/Arduino/Boards/BBAC-01-guide-SPAR-PRINT-85.pdf

Ora ho l'esigenza di poter programmare l'atmega328 direttamente dalla millefori senza dover ogni volta staccarlo e collegarlo allo zoccolo posto sulla scheda di Arduino e soprattutto vorrei poter riuscire a caricare gli sketch anche senza utilizzare atmel con bootloader già caricato (oppure riuscire a caricarlo nel caso di micontrollori vergini)

Mi interesserebbe sapere se utilizzando i 6 pin dedicati alla programmazione (che potete vedere nei PDF del circuito ai link che ho postato) insieme al chip FT232RL serial to USB di sparkfun riuscirei sia a programmare l'atmega che a fare il burning del bootloader o a caricare direttamente gli sketch.

In rete ho visto che i collegamenti per il bootloader sono diversi e che vengono utilizzati altri pin al posto di RX e TX, in particolare, i pin 10, 11, 12 e 13.

Mi sapreste dare dei consigli? Oltre ai 6 pin mi conviene inserire dei connettori anche per i pin digitali in modo da poter installare il bootloader o vanno già bene i 6 pin?

Se vuoi programmarlo senza usare il bootloader usando l’ic FT232 puoi usare il bitbangmode oppure usi un altro arduino/USB tiny ISP o similari per programmarlo tramite ISP

Ciao, scaricati la mia Guida e non hai bisogno di nient’altro. :wink:

Sono un pò confuso, ragazzi, scusatemi :(

@Michele: l'ho scaricata, ma non trovo da nessuna parte dove parla di FT232 e bootloader, la rileggo meglio casomai mi è sfuggito

@ratto: ma se scelgo il bitbangmode, come riportato in questa guida: http://www.geocities.jp/arduino_diecimila/bootloader/index_en.html, il cavo poi lo posso collegare direttamente ai sei pin dell'FT232? perchè lì parla solo di cavo ICSP..

Dato che devo realizzare il circuito in tecnologia smd mi serve capire se devo predisporre dei pins oltre ai sei che ho destinato al FT232 in modo da poter caricare il bootloader e gli sketch.

Se fosse possibile, preferirei utilizzare solo i pin per l'FT232, ma se è necessario, ovviamente, non ho problemi a predisporre gli altri.

[quote author=marcus barnet link=topic=109538.msg822558#msg822558 date=1339424094] Sono un pò confuso, ragazzi, scusatemi :(

@Michele: l'ho scaricata, ma non trovo da nessuna parte dove parla di FT232 e bootloader, la rileggo meglio casomai mi è sfuggito

[/quote] scusa, hai ragione, mi era sfuggita avendo letto di fretta; la mia Guida ti fa fare ciò che vuoi usando un Arduino e il chip da programmare su una breadboard o anche su un altro Arduino. Il convertitore USB-Seriale ti permette di caricare sketch sul micro, a patto che abbia già il bootloader; il bootloader lo puoi caricare tramite tecnica ISP (quella della mia Guida); onestamente non mi è mai passato nemmeno per la mente di provare la modalità suggerita da ratto, sinceramente non mi piace "a pelle". Io porterei fuori i 6 pin ISP; poiché tra questi ci sono anche RESET, Vcc e GND, in realtà del convertitore ti mandano solo tx, rx e DTR; ricordati di mettere un C da 100nF tra il DTR del convertitore ed il reset del micro.

Ti ringrazio Michele! Quindi portando fuori i sei pin dell'ISP avrei la possibilità di utilizzare un qualunque programmatore esterno per caricare il bootloader senza dover fare particolari casini? :)

Pensavo: ma il connettore ISP si può usare anche per caricare direttamente il file .hex senza bootloader? Ho visto che Arduino crea ogni volta un file esadecimale temporaneo: potrei caricare quello tramite ISP?

Se ho capito bene dalla tua guida, io potrei anche collegare il connettore ISP di una scheda Arduino direttamente al connettore ISP del mio circuito, mettere la scheda Arduino in modalità ISP Programmer e caricare gli sketch?

Posso quindi eliminare proprio i 6 pin dell’FT232, giusto?

[quote author=marcus barnet link=topic=109538.msg822595#msg822595 date=1339425604] Se ho capito bene dalla tua guida, io potrei anche collegare il connettore ISP di una scheda Arduino direttamente al connettore ISP del mio circuito, mettere la scheda Arduino in modalità ISP Programmer e caricare gli sketch?

Posso quindi eliminare proprio i 6 pin dell'FT232, giusto? [/quote] Sì, abolisci completamente il bootloader e a quel punto la comunicazione seriale non ti serve, SEMPRE che il tuo progetto non preveda un collegamento al PC! Altra cosa importante è che i pin coinvolti nell'ISP: MISO, MOSI, SCK, siano liberi da collegamenti a componenti, o almeno a riferimenti verso massa (p.es. pulldown, altrimenti la programmazione ISP sarà fortemente disturbata e potrebbe non andare a buon fine. In questo caso ti conviene prevedere dei jumper (o anche un dip switch a tre poli, per scollegare tali compoenti dai pin lasciandoli invece collegati alla presa ISP esterna; spero di essere stato chiaro altrimenti chiedi ciò che vuoi.

Si, in realtà quei pin li uso già perchè collegati a dei sensori; dovrò studiare un modo per poterli isolare dal resto del circuito durante la programmazione.

La tua guida è abbastanza chiara e dal paragrafo sul cavo ISP ho capito molto facilmente come realizzarlo e che sulla board che funziona in modalità ISP bisogna collegare un cavetto a parte mentre sulla scheda prototipale basta collegare esattamente tutti i pin dell'ISP.

Volevo sapere se l'upload del codice senza bootloader può essere fatta con Arduino o se mi serve prendere un programmatore esterno. Anche se, alla fine, non mi costa nulla caricare bootloader e sketch visto che mi basta collegare, per entrambe le funzioni, sempre e solo il cavetto ISP, giusto?

P.S. no, non mi serve leggere dalla seriale.

Cioè, per caricare il bootloader mi basta collegare il cavo ISP, mettere Arduino in modalità ISP programmer e fare "Burn Bootloader"? Mentre, sempre con gli stessi collegamenti, selezionando uno sketch e facendo upload lo carico sull'atmega?

Sembra molto facile come procedura :relaxed:

[quote author=marcus barnet link=topic=109538.msg822619#msg822619 date=1339426639] Cioè, per caricare il bootloader mi basta collegare il cavo ISP, mettere Arduino in modalità ISP programmer e fare "Burn Bootloader"? Mentre, sempre con gli stessi collegamenti, selezionando uno sketch e facendo upload lo carico sull'atmega?

Sembra molto facile come procedura :relaxed: [/quote] e secondo te stavano a studiare mesi per fare una cosa difficile :grin:? Allora tu carichi il bootloader SOLO per settare i fuse: il micro vergine esce per lavorare a 1MHz, se lo vuoi impostare su 16MHz puoi farlo usando la board dell'UNO o 2009 e caricando il bootloader. Da questo punto in poi tu puoi inviare direttamente lo sketch, ma il bootloader sarà cancellato, e comunque non ti servirà più. Tutto questo puoi farlo collegando via ISP Arduino e il tuo circuito, ma ATTENZIONE! il cavo non è completamente pin-to-pin, sulla Guida comunque è spiegato come realizzarlo.

Si, si ho visto sulla tua guida che il cavo non è esattamente pin2pin a parte quello che riguarda il connettore ISP presente sul circuito target; sulla scheda Arduino usata come programmatore, invece, occorre collegare il pin10 al pin reset che viene dal circuito target. Giusto?

A me serve utilizzarlo a 16Mhz, quindi, mi sa che dovrò caricare il bootloader.. ma non è un problema :)

[quote author=marcus barnet link=topic=109538.msg822632#msg822632 date=1339427150] Si, si ho visto sulla tua guida che il cavo non è esattamente pin2pin a parte quello che riguarda il connettore ISP presente sul circuito target; sulla scheda Arduino usata come programmatore, invece, occorre collegare il pin10 al pin reset che viene dal circuito target. Giusto? [/quote] Perfetto XD in pratica colleghi pin-to-pin i tre segnali e l'alimentazione, mentre il pin che va al reset del tuo atmega lo colleghi al pin 10 di Arduino, vedo che hai studiato XD

A me serve utilizzarlo a 16Mhz, quindi, mi sa che dovrò caricare il bootloader.. ma non è un problema :)

puoi evitarlo cambiando i fuse tramite riga di comando, con Avrdude, ma l'operazione del bootloader è così semplice che te la cacci con niente, inoltre la fai sempre tramite lo stesso cavo. Se hai il dubbio che qualche componente collegato sui segnali possa disturbare la programmazione mandami tranquillamente una MP con lo stralcio dello schema.

Ti ringrazio per l'aiuto e le disponibilità :)

Ho controllato e dei pin 11, 12 e 13 solo il pin11 è utilizzato come segnale pwm in uscita per un op-amp quindi per semplificare le cose ho scelto di lasciar il pin11 libero e di portare il pwm su un altro pin (tipo il 10) in modo da avere disponibili tutti e tre i pin che mi servono per l'ISP ed evitare di usare jumper per selezionare la modalità programmazione o normale funzionamento. :)

Non capisco solo questo passaggio:

Io porterei fuori i 6 pin ISP; poiché tra questi ci sono anche RESET, Vcc e GND, in realtà del convertitore ti mandano solo tx, rx e DTR; ricordati di mettere un C da 100nF tra il DTR del convertitore ed il reset del micro

Dove dovrei metterlo il condensatore? non mi basta collegare direttamente i pin del micro al connettore ISP? I pin rx e tx sono per la comunicazione seriale, non sto riuscendo a capire a cosa ti riferivi e sto impazzendo :)

Anche il pin 10 è coinvolto nell'ISP, l'hai già dimenticato? ;) Tutto quel passaggio riguardava l'idea iniziale di usare sia l'ISP che la seriale, ignorala.

No, però il pin10 serve solo sull'Arduino usato come programmatore e non sul mio circuito quindi non lo sto considerando minimamente :)

Io devo collegare il pin RESET dell'atmega238 presente sul mio circuito al pin10 dell'arduino che uso in modalità ISP, giusto?

Quindi comunque i pin che mi servono sul circuito sono il pin11, pin12 e pin13 oltre al pin di reset, a GND e Vcc, è corretto?

[quote author=marcus barnet link=topic=109538.msg822689#msg822689 date=1339431537] No, però il pin10 serve solo sull'Arduino usato come programmatore e non sul mio circuito quindi non lo sto considerando minimamente :)

Io devo collegare il pin RESET dell'atmega238 presente sul mio circuito al pin10 dell'arduino che uso in modalità ISP, giusto?

Quindi comunque i pin che mi servono sul circuito sono il pin11, pin12 e pin13 oltre al pin di reset, a GND e Vcc, è corretto?

[/quote] sì, sì, hai ragione, è che mentre lavoro ogni tanto perdo il filo :D procedi così e stai tranquillissimo, la cosa è più che collaudata ;)

Ho effettuato i collegamenti, ma non funziona.

Ho eseguito questi passi:

  • modifica del file boards.txt con:

uno1.name=ATMEGA STANDALONE uno1.upload.protocol=arduino uno1.upload.maximum_size=32256 uno1.upload.speed=115200 uno1.upload.using=arduino:arduinoisp uno1.bootloader.low_fuses=0xff uno1.bootloader.high_fuses=0xde uno1.bootloader.extended_fuses=0x05 uno1.bootloader.path=optiboot uno1.bootloader.file=optiboot_atmega328.hex uno1.bootloader.unlock_bits=0x3F uno1.bootloader.lock_bits=0x0F uno1.build.mcu=atmega328p uno1.build.f_cpu=16000000L uno1.build.core=arduino uno1.build.variant=standard

  • caricato sketch ArduinoISP sull'arduino da usare come programmatore
  • poi ho collegato il cavetto ISP tra arduino e il circuito facendo attenzione per il pin10 collegato a reset
  • ho selezionato il programmatore Arduino as ISP e poi come board quella inserita nel file boards.txt ed ho provato a caricare uno sketch stupido che dovrebbe accendere un LED.

La procedura non da errori, ma nell'atmel del circuito non si carica nulla..

Da quanto vedo mi sa che stai usando l'IDE 1.0.x, il funzionamento è diverso rispetto alla Guida, con quella devi far riferimento alla 0022. Se stai usando 1.0 sappi che ArduinoISP è difettoso, se stai usando 1.0.1 allora mi pare che devi eliminare

uno1.upload.using=arduino:arduinoisp

perché per flashare devi usare il comando specifico nel menu File. Ma che ne sai che nel circuito non si carica nulla? se non ti dà il "done uploading" deve per forza dare un messaggio; non è che è tutto a posto e hai sbagliato il riferimento al pin digitale a cui è collegato il led?

EDIT: ecco dai un'occhio alla Guida di Testato, che ha fatto un lavoro specifico sull'1.0; naturalmente puoi ifnorare il passaggio del TinyISP perché l'ArduinoISP in dotazione alla nuova 1.0.1 dovrebbe funzionare.