Ragazzi ho acquistato un Arduino UNO R3. Ho cercato come prima semplice operazione la riprogrammazione del chip ATMEGA328P montato sull'Arduino usando un codice già pronto.
Ho collegato il programmatore USBTinyISP all'Arduino tramite il cavo ISP. Il LED ON dell'Arduino si accende e il LED L lampeggia.
Ho installato il software AVRDUDESS e ho caricato il codice da scrivere nella flash. Eseguendo il comando write il LED del programmatore lampeggia, segno che esso viene riconosciuto dal software, ma ottengo il seguente errore:
avrdude: Initialization failed, rc=1
Documentandomi ho appurato che si tratti di un errore di comunicazione tra programmatore e chip da programmare. Dal momento però che il connettore ISP è inserito correttamente e che il chip sull'Arduino è quindi alimentato, come dovrei comportarmi?
Scusami ma probabilmente sono io che non capisco, perché programmi tramite isp e non con la sua porta usb? Sarebbe utile avere riportati i collegamenti punto per punto e magari una foto del tutto per vedere la situazione.
essereumano:
Scusami ma probabilmente sono io che non capisco, perché programmi tramite isp e non con la sua porta usb? Sarebbe utile avere riportati i collegamenti punto per punto e magari una foto del tutto per vedere la situazione.
semplicemente ho un file .hex che vorrei caricare nel microcontrollore, insieme ai dati EEPROM e ai fuse. L'USBtiny viene pubblicizzato come programmatore ISP per atmega328P, ecco la foto della inserzione:
Mi hanno detto però che non è possibile eseguire questa operazione collegandosi via ISP all'arduino, il che mi lascia perplesso. A cosa serve allora il connettore ISP montato sull'arduino?
Fatto sta che mi sono documentato in rete e ho realizzato un PCB per collegare il cavo ISP dell'USBtiny direttamente ai PIN corrispondenti dell'atmega328P. In questo modo dovrei poter programmare il chip in mode stand-alone come accade per es. con il PICkit e i microchip. Per quanto riguarda il software uso AVRDUDESS, completo di GUI.
Sono in attesa che asciughi la lacca isolante sul lato rame. Vi faccio sapere appena posso.
ok prova fatta, stesso errore di comunicazione tra programmatore e chip. Devo aggiungere quarzo, resistenza e condesatore, giusto?
Che noia però questi micro atmel, per i microchip è tutto più semplice e immediato.
EDIT: ho omesso di collegare il PIN 20 (AVCC) ai 5V, rimedio e faccio un altro test.
Niente da fare, bisogna aggiungere il cristallo da 16MHz al chip. Mi procuro i componenti e domani faccio un altro test. Poi allego alla discussione lo schema dei collegamenti che potrebbe risultare utile in futuro a chi volesse programmare il chip con un USBtinyISP o programmatore simile.
Non capisco però perché in rete si trovino tutorial che spiegano di collegare il cavo ISP al chip senza nessun componente di contorno.
demonoid:
Non capisco però perché in rete si trovino tutorial che spiegano di collegare il cavo ISP al chip senza nessun componente di contorno.
In quel caso probabilmente viene usato il generatore di clock interno che però col ATmega328 può andare solo a 8Mhz o 1Mhz. Dipende da come setti i fuse.
PaoloP:
Ma se gli dai un DETECT ti vede il micro?
Che impostazioni hai dato ad AVRdudess riguardo al programmatore?
Ma è un ATmega stand-alone o è montato sulla UNO? Perché parli di aggiungere il quarzo?
Con avrdudess dopo aver specificato il programmatore in uso dall'elenco se clicco su DETECT restituisce il seguente errore:
avrdude: Initialization failed, rc=1
Questo accade sia con il chip montato su arduino UNO, sia disinserendo il chip e collegandolo direttamente al cavo ISP di USBtiny.
Dovrei quindi impostare qualcosa in particolare con avrdudess per comunicare con il chip da programmare?
Parlo di quarzo perché nella guida del prof. Menniti è spiegato che bisogna collegare al chip da programmare un quarzo da 16mhz, condensatori da 22pf, ecc.
PaoloP:
In quel caso probabilmente viene usato il generatore di clock interno che però col ATmega328 può andare solo a 8Mhz o 1Mhz. Dipende da come setti i fuse.
non capisco, questo significa che dovrei usare delle impostazioni particolari per poter scrivere il file .hex nella flash?
Mi sa che stiamo andando fuori rotta, il discorso dell'oscillatore dipende dal micro, se vergine di fabbrica è settato per lavorare con l'oscillatore interno e non servono oscillatori esterni ne condensatori, il discorso cambia se, come su arduino, il micro è impostato per utilizzare un cristallo esterno e se lo rimuovi dalla scheda devi rimetterci l'oscillatore altrimenti non va.
Quale clock usare, quello interno o esterno, lo imposti tramite fuse.
Cmq io fossi in te ricontrollerei 50 volte i collegamenti, spesso e volentieri il problema è che o alcuni fili sono invertiti o interrotti, assicurati con un multimetro che ci sia continuità e che le tensioni siano quelle giuste. Ovviamente con il micro inserito nella scheda arduino.
essereumano:
Mi sa che stiamo andando fuori rotta, il discorso dell'oscillatore dipende dal micro, se vergine di fabbrica è settato per lavorare con l'oscillatore interno e non servono oscillatori esterni ne condensatori, il discorso cambia se, come su arduino, il micro è impostato per utilizzare un cristallo esterno e se lo rimuovi dalla scheda devi rimetterci l'oscillatore altrimenti non va.
Quale clock usare, quello interno o esterno, lo imposti tramite fuse.
Cmq io fossi in te ricontrollerei 50 volte i collegamenti, spesso e volentieri il problema è che o alcuni fili sono invertiti o interrotti, assicurati con un multimetro che ci sia continuità e che le tensioni siano quelle giuste. Ovviamente con il micro inserito nella scheda arduino.
perfetto, discorso chiaro, ti ringrazio molto.
Come ho precisato dall'inizio uso il cavo ISP dell'USBtiny che inserisco nell'apposito connettore ISP dell'arduino. Collegando il cavo USB al PC si accendono il LED ON e quello lampeggiante L dell'arduino stesso (segno che il cavo ISP è inserito correttamente). Ho aperto il programmatore USBtinyISP e ho controllato anche che vi fosse continuità tra i 6 PIN del programmatore e i PIN dell'arduino. La continuità c'è, quindi è da escludersi che si tratti di un problema di collegamenti errati o mancanti.
Ho esaurito quindi le possibilità... Per quanto riguarda invece i comandi corretti da usare con avrdude o avrdudess? Il mio scopo è sovrascrivere il contenuto del chip dell'arduino con un file .hex in mio possesso, ma mi accontenterei anche di riuscire a programmare un chip vergine di fabbrica.
demonoid:
.........
Mi hanno detto però che non è possibile eseguire questa operazione collegandosi via ISP all'arduino, il che mi lascia perplesso. A cosa serve allora il connettore ISP montato sull'arduino?
Essendo io la fonte di questa informazione ti invito a rileggere la mia risposta, ti ho infatti spiegato che "non puoi fare questa operazione" a motivo del fatto che con la programmazione ISP sovrascriveresti il bootloader, rendendo poi impossibile la programmazione via USB, e te lo ribadisco, ciò che stai tentando di fare, appena ti riuscirà (perché c'è gente in gamba che ti sta aiutando) non ti permetterà più di programmare il micro mediante USB, quindi decisamente ti conviene comprare un altro micro e lavorarci esternamente all'Arduino.
La foto che hai postato mostra il collegamento diretto via ICPS tra il programmatore e il micro dell'Arduino ma l'unica utilità è quella di settare i fuse e caricare il bootloader su un micro vergine che andresti a montare al posto dell'originale. Spero di essere stato più chiaro. Ciao
Non vorrei dire una stupidaggine (e in effetti sembrerebbe non avere molto senso quello che sto per dire) ma mi sembra di ricordare che a me non funziona fino a quando non collego anche l'alimentazione all'arduino o l'alimentazione dello standalone (che deve avere il quarzo, i 2 condensatori, e il pull-up sul reset), ora non ho modo di provare ma stasera verifico e se non hai risolto ti posto come ho fatto io.
Il connettore ICSP dovrebbe fornire l'alimentazione a 5V poiché dispone dei pin VCC e GND.
Potrebbe non essere però sufficiente.
Comunque ribadisco il problema di identificare il programmatore con quelli compatibili con avrdude.
Quel errore di inizializzazione mi fa pensare che non trova il programmatore piuttosto che il micro.
Aggiungo un'altra cosa.
Se hai creato uno convertittore per l'attacco ricorda che i segnali sono a coppie e non invertiti.
Quindi MISO con MISO, MOSI con MOSI e SCK con SCK. Devi aggiungere il RESET, VCC e GND.
In effetti avevo lottato un po' con i drivers quando ho collegato il programmatore per la prima volta. Soprattutto (e forse più importante) per programmare il micro passo per Atmel Studio: c'è un dialog attraverso il quale verificare la connessione con il micro, modificare i FUSE, e flashare (o ripulire) un .hex
Magari vale la pena di fare un tentativo usando questo IDE.
demonoid:
semplicemente ho un file .hex che vorrei caricare nel microcontrollore, insieme ai dati EEPROM e ai fuse. L'USBtiny viene pubblicizzato come programmatore ISP per atmega328P, ecco la foto della inserzione ...
Quello un USBtinyISP ? ? ? :o :o :o
Quello in quella foto è un (quasi sicuramente clone del) AVRISP mkII, come puoi ben vedere sul sito di Atmel QUI e posso assicurati che funziona correttamente anche come mostrato nella foto che hai allegato !
... inoltre mi risulta che, sotto windows, quel programmatore (USBtinyISP) richieda un apposito driver, come descritto nelle note d'uso che si trovano QUI (paragrafo "What's so great about it?", sotto paragrafo "Easy to use") e scaricabili da QUESTO link.
Alcune precisazioni che non avevo ancora fatto. Il programmatore in mio possesso è effettivamente un USBtinyISP e monta all'interno un ATTINY2313A e quarzo da 12MHz. Ho installato correttamente il driver (stesso link fornito da gpb01, che mi aveva già fornito il venditore eBay). Il driver risulta essere libusb-win32 con firma Adafruit Industries.
La conferma che si tratti di un USBtiny e che sia correttamente riconosciuto da avrdude deriva dal fatto che quando seleziono dal menu a tendina di AVRDUDESS il programmatore "USBtiny Simple USB Programmer" e clicco sul tasto DETECT immediatamente lampeggia per un istante il LED rosso del programmatore, segno che l'impulso viene inviato correttamente al programmatore. Stessa cosa se provo a eseguire altre operazioni come lettura e scrittura flash o fuse.
Ogni volta compare però il messaggio di errore avrdude: Initialization failed, rc=1
Se invece seleziono dal menu il programmatore AVRISP MKII non avviene nessun lampeggio del LED e ricevo il messaggio di errore seguente:
avrdude.exe: usbdev_open(): did not find any USB device "usb" (0x03eb:0x2104)
Il mio intento è proprio quello di sostituire tutto il codice del chip con quello in mio possesso, non ho interesse a conservare la possibilità di programmazione via USB. Non mi resta che provare a programmare il chip tramite lo schema illustrato dal prof. Menniti, con quarzo da 16MHz, condesatori ecc. Se dovesse fallire proverò con un chip vergine di fabbrica. Faccio la prova in giornata e vi faccio sapere, grazie ancora a tutti.
demonoid:
Il mio intento è proprio quello di sostituire tutto il codice del chip con quello in mio possesso, non ho interesse a conservare la possibilità di programmazione via USB.
Se il chip che vuoi programmare era montato su qualche cosa che usava il quarzo ESTERNO ... allora avrà sicuramente i fuse programmati per lavorare con esso e la programmazione ISP avviene solo se monti quarzo e condensatori.
Se invece prendi un chip vergine, arriva dalla fabbrica con i fuse settati per il clock INTERNO e quindi puoi programmarlo via ISP senza problemi.
Io, per tagliare la testa al toro, sulla basetta con cui faccio le programmazioni dei vari chip, ho montato fisso quarzo e condensatori così ... va comunque