uploadare sketch su Atmega328P usando Arduino UNO o serial2USB: not in sync

Ciao a tutti, è il mio primo post e mi presento:

ho 38 anni e sono appassionato di elettronica analogica e informatica da quando avevo 11 anni. Ho sempre smontato tutto quello che funzionava elettricamente per vedere e capire come era fatto dentro, ho bruciato, rotto e distrutto molte cose. Ho imparato sempre qualcosa e mi sono divertito tanto, ma purtroppo ho fatto anche tanti “morti” sul campo XD. Da poco mi sono affacciato da poco nel mondo di Arduino.

Vorrei sottoporvi un problema che sto incontrando e per il quale ho cercato soluzioni su Google e su http://playground.arduino.cc/Italiano/Pobleminoti senza successo:

mi piacerebbe uploadare gli sketch direttamente al chip Atmega328P (già con bootloader) usando:

  • arduino come programmatore, come descritto nel tutorial link errato - rimosso nella parte “Uploading Using an Arduino Board”
    OPPURE
  • utilizando l’interfaccia usb2serial (http://arduino.cc/en/Main/USBSerial), sfruttando le elementari connessioni TX, RX, RESET, GND, +5 direttamente sul chip.

La cosa mi è subito apparsa banalmente semplice: una volta montato l’atmega328P su breadboard, quarzo, condensatori, connessioni di alimentazione, pullup sul reset e pure un led su D13, provvedo a vedere se tutto funziona testando un “blink”. Tutto ok. Passo alla connessione con l’interfaccia di programmazione.

Lo schema per entrambi non lascia spazio ad errori: nel caso di Arduino UNO usato come programmatore ovviamente tolgo il microcontrollore dallo zoccolo e scelgo “Arduino duemilanove oppure Nano w/ ATmega328” prima dell’upload, mentre per usb2serial bastano solo le connessioni con il chip.

SEPPURE BANALE E SEMPLICE NON FUNZIONA =(

Dopo la compilazione, al momento dell’upload dall’IDE (1.0.5), sia arduino uno che la usb2serial seguono sì correttamente il reset del chip (lo vedo perchè la sequenza di blink del led si interrompe) ma il processo non va a bujon fine, e termina senza nemmeno inziare l’upload.

Il log in entrambi i casi avrdude esce con:

avrdude: Version 5.11, compiled on Sep  2 2011 at 19:38:36
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "blablabla\Arduino IDE 105\hardware/tools/avr/etc/avrdude.conf"

         Using Port                    : \\.\COM10
         Using Programmer              : arduino
         Overriding Baud Rate          : 19200
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Recv: 
avrdude: stk500_getsync(): not in sync: resp=0x00

avrdude done.  Thank you.

Ho provato a:

  • ricontrollare meticolosamente le connessioni, e dato che si tratta di poche banali connesioni, posso affermare che sono giuste, a meno che non sia vittima di una precoce arterosclerosi :smiley:
  • impostare diversi tipi di arduino sull’IDE, prima dell’upload
  • utilizzare altri chip atmega328P (sempre già con il bootloader)

tutto senza successo: avrdude non trova il sync con il chip. Come se i TX e RX fossero scollegati.

Se metto il chip sullo zoccolo dell’arduino, la programmazione viene eseguita senza problemi, quindi ho già escluso cavi USB difettosi, driver incompatibili, problemi al PC, chip difettoso.
Rimane quindi la parte “esterna” tra il programmatore e la breadboard.

Controllo e so che:

  • il quarzo è del valore giusto (16MHz), quindi non ci dovrebbero essere problemi di sincronizzazione per un eventuale clock differente (ma posso anche star dicendo una tavanata colossale :blush:)
  • i jumper usati per le connessioni sono di ottima qualità
  • la breadboard è di ottima qualità
  • EDIT: ho controllato che TX e RX siano “accoppiati” (ovvero il TX di chi programma collegato con RX di chi è programmato e viceversa per i restanti RX-TX)

Quindi ho infine escluso le connessioni e la componentistica.

Cosa rimane?! Avete anche voi incontrato questi problemi? Cosa suggerite per risolvere?

Esiste una guida scritta dall'utente Michele Menniti: http://www.michelemenniti.it/arduino_burn_bootloader.php

Essa ti aiuterà senz'altro a capire cosa sbagli: affronta sia la programmazione ISP (da Arduino verso un chip) sia la programmazione usando un convertitore USB/seriale.

mcinque: [u]Se metto il chip sullo zoccolo dell'arduino, la programmazione viene eseguita senza problemi, quindi ho già escluso cavi USB difettosi, driver incompatibili, problemi al PC, chip difettoso.[/u]

Sicuro che stai programmando il chip esterno e non quello sullo zoccolo, quando presente? Segui la guida di Michele e ricontrolla tutti i passaggi. ;)

Grazie Leo e Paolo! Mi fiondo sulla guida. Vi terrò aggiornati! thx again

Dunque, dopo essermi letto accuratamente e dettagliatamente la guida (complimenti all'autore), ho scoperto che non avevo commesso errori di connessione o di procedura, [u]tranne per i pin TX e RX: ero convinto che i TX e RX andassero collegati specularmente, ovvero TX con RX e RX con TX.[/u]

Tuttavia, dato che incontravo insuccessi, durante le prove precedenti alla lettura della guida, avevo già provato a invertire i pin (ovvero TX con TX e RX con RX) con gli stessi risultati: not in sync. Quindi avevo escluso che il problema fosse quello.

La cosa strana? Ora, solo dopo aver LETTO la guida, ho messo i pin TX e RX correttamente (cosa che avevo già comunque tentato) ma stavolta ho provato a fare un upload e tutto ha funzionato!

Solito hardware (visto che avevo provato sia con i piedini TX e RX collegati in modo sbagliato che correttamente) e solito software.

Potenza del Professore Michele Menniti! Anche a distanza, riesce a sistemare le cose :)

Grazie!

Spieghiamo il punto della connessione dei pin RX/TX. Se devi programmare un chip standalone tramite il suo bootloader ed usi l'Arduino come convertitore USB/seriale allora devi usare le connessioni dirette, ossia i pin RX/TX dell'Arduino li devi collegare in maniera diretta con i corrispondenti pin RX/TX del chip in standalone per un semplice motivo: se guardi lo schema elettrico dell'Arduino, noterai che essi escono come RX/TX dal chip Atmega8/16U2 ma vanno poi a confluire nei pin TX/RX rispettivamente. Sono cioè incrociati sulla scheda per un semplice motivo: che devono ovviamente programmare l'Atmega328 sulla UNO per cui essi devono entrare nei pin RX e TX di questo. Sull'header esterno te li ritrovi però mappati come sono mappati in riferimento all'Atmega328.

Se usi un convertitore addizionale, invece, devi incrociarli perché RX e TX sono collegati in maniera diretta ai pin corrispondenti del chip usato come convertitore.

mcinque: Dunque, dopo essermi letto accuratamente e dettagliatamente la guida (complimenti all'autore), ho scoperto che non avevo commesso errori di connessione o di procedura, [u]tranne per i pin TX e RX: ero convinto che i TX e RX andassero collegati specularmente, ovvero TX con RX e RX con TX.[/u]

Tuttavia, dato che incontravo insuccessi, durante le prove precedenti alla lettura della guida, avevo già provato a invertire i pin (ovvero TX con TX e RX con RX) con gli stessi risultati: not in sync. Quindi avevo escluso che il problema fosse quello.

La cosa strana? Ora, solo dopo aver LETTO la guida, ho messo i pin TX e RX correttamente (cosa che avevo già comunque tentato) ma stavolta ho provato a fare un upload e tutto ha funzionato!

Solito hardware (visto che avevo provato sia con i piedini TX e RX collegati in modo sbagliato che correttamente) e solito software.

Potenza del Professore Michele Menniti! Anche a distanza, riesce a sistemare le cose :)

Grazie!

Grazie a te, ti risparmio ulteriori approfondimenti in quanto è stato già eccellente Leo, come sempre. Sono contento di questo tuo feedback prché è la prova di quanto dicevo l'altro giorno, se la Guida si legge con la giusta attenzione, salvo guasti hardware il problema si risolve. Quanto alla "potenza", avercela davvero :grin:, grazie comunque degli apprezzamenti. Caio :)