RISOLTO - Arduino as ISP: impossibile l'upload se ATMEGA trasmette dati sul TX

Ciao a tutti,

sto usando uno shield sparkfun avr isp che sicuramente tutti conoscete.

Ho a disposizione 7 ATMEGA328P, tutti forniti già con il bootloader UNO.

Ho (ovviamente) caricato lo sketch "Arduino ISP" sulla board UNO che sta sotto allo shield e ho impostato "Strumenti>Programmatore>Arduino as ISP"; fino a poche ore fa ero in grado SIA di caricare uno sketch su tutti i microcontrollori in mio possesso, usando "File>Carica con un programmatore", SIA di scrivere il bootloader "Strumenti>Scrivi il bootloader". Tutto come mi aspettavo.

Scrivevo un "Blink" di prova e testavo l'avvenuta scrittura su una breadboard base a 16MHz (2 condensatori + 1 quarzo) con uno zoccolo ZIF e un led al D13. Tutto funzionava regolarmente.

Poi ho voluto provare a caricare uno sketch che mi permettesse di leggere dei dati sulla seriale, a caso, per prova, ho scelto "File>Esempi>Basics>DigitalReadSerial" (tutti sapete che fa un digitalread del pin 2 e riporta il valore sulla seriale ogni ms).

A questo punto, dopo il caricamento, il led rosso "ERROR" sullo shield si è acceso. E perchè?. Resetto. Ritorna "Error". Senza stare troppo a pensarci provo il microcontrollore sulla breadboard e vedo che lo sketch è stato caricato: la seriale funzionava correttamente e ricevevo le letture del pin 2.

Quindi il programmatore ha funzionato.

Riprovo a rimettere il microcontrollore sullo ZIF della shield ma appena chiudo lo zoccolo, "ERROR". Dopo aver caricato quello sketch sul quell'ATMEGA, qualsiasi tentativo di caricarncene uno nuovo, fallisce con un out of sync 0x00.

Provo con altri ATMEGA e finchè carico sketch che NON utilizzino la seriale, tutto va bene, posso riprogrammarli quanto voglio.

Quando invece carico su un ATMEGA uno sketch che utilizza la seriale, con quel chip lo shield va in ERROR e non c'è più il verso di smuoverlo: non è più possibile caricarvi alcuno sketch.

Risulta evidente che allo sketch "Arduino ISP" non piace che l'ATMEGA sullo ZIF invii dati seriali, infatti se isolo il piedino TX con un pezzo di termorestringente lo shield non si accorge di nulla e l'errore sparisce (ma resta comunque impossibile caricare uno sketch: anche se la procedura apparentemente va a buon fine in realtà non viene caricato niente, è solo che avrdude non puo' verificare il caricamento visto che non riceve i dati e da per scontato che tutto sia ok, come descritto nella guida del Prof. Menniti).

Ci sono diverse condizioni nello sketch "Arduino ISP" per le quali si accende il led rosso "ERROR", ma la mia conoscenza di programmazione non è così avanzata da permettermi di capire da solo come posso risolvere.

Ma il bello è che ho provato anche a rimuovere il microcontrollore "originale" di Arduino UNO e metterci al suo posto quelli "improgrammabili". E la cosa assurda è che rimangono improgrammabili. Out of sync 0x00. Se ci metto, per prova, quelli che non sono stati programmati con "DigitalReadSerial", la programmazione avviene correttamente. L'hardware funziona e il software pure. Assurdo!

Avete consigli?

Ogni volta che si usa la seriale prima di inizializzarla nel setup è buona prassi mettere un delay di uno o due secondi

void setup()
{
  delay(2000);
  Serial.begin(9600);
}

Grazie Pelletta,

però se fosse un problema di sketch dovrebbe farlo ANCHE caricandolo su una board Arduino UNO.

Mentre invece se carico lo sketch su una board UNO, questo viene caricato e poi il microcontrollore puo' essere riprogrammato (come ci si aspetta!), mentre se lo faccio sul CHIP standalone tramite Arduino as ISP, il microcontrollore accetta il caricamento ma il fatto che appena alimentato cominci a mandare i dati sul pin3 (TX) lo fa diventare apparentemente improgrammabile (problemi di sync con la seriale USB).

non vorrei dire una scemeza ma se programmi via isp quando metti lo sketch blink levi il bootloader
quindi forse il bootloader ha integrato una funzione per eliminare questo problema, se non hai bootloader devi prevedere tu questa soluzione nel tuo codice...
ma serve la conferma dei guru del software :smiley:

La programmazione via ISP avviene comunque con l'invio dei dati dal PC alla scheda via seriale. I dati sono intercettati dal convertitore seriale Atmega16U2 montato sull'Arduino e poi spediti al chip Atmega programmato con lo sketch ArduinoISP, che a sua volta li invia tramite ISP al micro da programmare.

Tu stai usando uno shield che hanno realizzato collegando allo zoccolo ZIF anche le linee RX/TX, come si vede dallo schema:

In questa situazione, se il chip che vuoi programmare occupa la seriale, l'invio di dati da PC al convertitore seriale dell'Arduino sottostante è impedito proprio dal fatto che il chip da programmare sta impegnando la linea di comunicazione.

comunque per sbloccarli (se non seri riuscito) prova questo
li metti sulla board arduino e
http://playground.arduino.cc/Italiano/Pobleminoti#blocco

Ciao Leo72, ci si rilegge :slight_smile:

mmm... capisco perfettamente. Quindi l'unico modo per riprogrammarlo è

usare un cavetto ISP
oppure
reinserirlo in una board UNO e programmare via USB

confermi? Nel secondo caso il problema continua, devo provare il primo.

puoi consigliarmi una shield migliore da usare come programmatore? O un programmatore stand alone?

Ciao Lucaleo,

a mio avviso quello che dici sarebbe corretto se io caricassi uno sketch via cavetto ISP, mentre l'ho solo inserito sopra come shield, quindi usando solo i TX e RX. Correggimi se sbaglio.

Cmq grazie per il suggerimento dello sblocco, provo!

@mcinque:
io sono qui tutti i giorni, forse tu eri sparito dalla circolazione, sarà per questo che non mi ricordo di te? :sweat_smile:

Comunque, quello shield ha questo, le linee RX/TX collegate a quelle dell'Arduino. In questo modo se il chip da programmare impegna la seriale, ti disturba la programmazione. Le alternative sono 3: o ti fai uno shield tu, senza quei collegamenti (io me ne sono fatti 2, uno con uno ZIF DIP28, un altro con 4 zoccoli per DIP8/DIP14/DIP20/DIP28 per programmare anche gli Attiny) oppure cerchi uno shield già fatto che non abbia quelle linee collegare, oppure le tagli con un trincetto.

Si, leo, ero io che ero sparito, avevo chiesto lumi sulla programmazione e mi avevi consigliato l'ottima guida del Prof. Menniti :slight_smile: Grazie ancora.

Torno al problema: tutto ciò avrebbe senso e posso farmi lo shield, ma il mio cruccio è questo:

programmo un chip mettendolo sullo zoccolo di una board Arduino UNO, caricandovi sopra uno sketch che impegna la seriale = il chip funziona e si riprogramma tranquillamente (come è normale aspettarsi!) solo che il metodo è poco pratico perchè gli zoccoli DIL sono noiossimi e dai che ti ridai alla fine si spezza un pin del microcontrollore, come ben saprai

MA SE

programmo un chip tramite lo shield Sparkfun utilizzando il metodo seriale, caricandovi sopra IL MEDESIMO SKETCH che impegna la seriale = finita la programmazione il chip funziona MA non può più essere riprogrammato, NEMMENO se reinserito sullo zoccolo di una board Arduino UNO (e questo è assurdo!)

mcinque:
a mio avviso quello che dici sarebbe corretto se io caricassi uno sketch via cavetto ISP, mentre l'ho solo inserito sopra come shield, quindi usando solo i TX e RX. Correggimi se sbaglio.

Cmq grazie per il suggerimento dello sblocco, provo!

io onestamente non so risponderti :slight_smile:
però se quando compili via usb non lo fa e invece via isp si mi sembra possibile che venga sovrascritto il bootloader... provo a indagare un po' sulla documentazione che ho :wink:

EDIT
dalla guida di michele menniti

NOTA IMPORTANTE
: Questo metodo permette di programmare il nostro chip stand
alone inviandogli un bootloader
(come abbiamo già visto)
oppure con uno sketch; ma
quando si manda lo sketch l’event
uale bootloader viene cancellato. Se si vuole creare un
chip che contenga entrambi il caricamento del
lo sketch deve avvenire col metodo seriale
oppure mettendo il chip direttamente su Arduino

secondo me è quello che sta succedendo il bootloader ho letto che ha delle parti che aiutano il micro a non bloccarsi per errori del codice o cose varie

mcinque:
programmo un chip tramite lo shield Sparkfun utilizzando il metodo seriale, caricandovi sopra IL MEDESIMO SKETCH che impegna la seriale = finita la programmazione il chip funziona MA non può più essere riprogrammato, NEMMENO se reinserito sullo zoccolo di una board Arduino UNO (e questo è assurdo!)

Programmando via ISP elimini il bootloader. E' normale che non puoi più programmarlo via seriale.

PaoloP:

mcinque:
programmo un chip tramite lo shield Sparkfun utilizzando il metodo seriale, caricandovi sopra IL MEDESIMO SKETCH che impegna la seriale = finita la programmazione il chip funziona MA non può più essere riprogrammato, NEMMENO se reinserito sullo zoccolo di una board Arduino UNO (e questo è assurdo!)

Programmando via ISP elimini il bootloader. E' normale che non puoi più programmarlo via seriale.

ecco :smiley:

mcinque:
Torno al problema: tutto ciò avrebbe senso e posso farmi lo shield, ma il mio cruccio è questo:

Leo ti ha spiegato perfettamente dove sta il problema, per risolvere taglia le piste che collegano Tx e Rx dello shield, oppure isola i relativi pin sullo zoccolo zif, con i rispettivi di Arduino, non servono a nulla per la programmazione ISP però se il micro da programmare impegna la seriale questo da fastidio alla comunicazione tra Arduino con lo sketch ISP e il pc.

Potresti cercare di modificare la board tagliando le due piste e mettendo due jumper per ripristinarle se necessario.

Ciao PaoloP, grazie per la risposta.

PaoloP:
Programmando via ISP elimini il bootloader. E' normale che non puoi più programmarlo via seriale.

Ecco svelato l'arcano!

lucaleo me lo aveva fatto presente subito ma ero convinto che non caricassi via ISP.

lucaleo:
non vorrei dire una scemeza ma se programmi via isp quando metti lo sketch blink levi il bootloader

Ora, PaoloP ripetendo la cosa mi ha messo il dubbio che effettivamente io fossi convinto di una cosa sbagliata.

EDIT: per non passare da idiota, (qualcuno potrebbe pensare: dici di aver letto la guida più volte e non sapevi che programmando via ISP si cancellava il bootloader? XD), sì, lo sapevo, ma tengo a precisare che:

1. Io ero CONVINTO che usando "carica con un programmatore", lo shield usasse i TX e RX che sono effettivamente connessi, mentre invece programmava tramite ISP (a che pro allora hanno collegato quei dannati pin?)
2. non sapevo che Il bootloader servisse solo affinchè ATMEGA possa essere programmato anche SENZA un programmatore ISP (se l'avessi saputo avrei capito che il fatto che il chip, messo sullo zoccolo di una board UNO, continuava a non essere programmabile, ERA IL CHIARO SINTOMO CHE MANCAVA IL BOOTLOADER, quindi avrei dedotto che stavo caricando via ISP.)

E' bastato ISOLARE le piste TX e RX, a quel punto posso riscrivere il bootloader oppure caricare uno sketch (sovrascrivendo il bootloader).

La chiave è che per rendere il chip nuovamente utilizzabile, l'ultima operazione da fare è riscrivere il bootloader.

Quale scopo hanno allora connessioni TX e RX che sono sullo shield?

Un ringraziamento a tutti i partecipanti al topic per l'aiuto!

Se scrivi il bootloader cancelli lo sketch precedentemente programmato tramite ISP.
O l'uno o l'altro.

Si Paolo, adesso è chiaro, ti ringrazio.