mi si è presentato da qualche giorno un problemino da cui non riesco a venirne fuori...
Ho già cercato in internet ma non sono riuscito a trovare nulla per risolverlo.
Il problema è il seguente:
devo riuscire a caricare un bootloader su di un atmga328p au che lo faccia funzionare a 3.3v con 8Mhz o 1MHz di clock.
La cosa buffa è che ad aprile ci sono riuscito con 5 chip ed ora non me ne va uno..
Sto utilizzando un sia l'IDE 1.6.5 che l'1.8.9 (li ho provati entrambi perchè pensavo fosse colpa della versione. i vecchi chip li ho programmati con l'1.8.9)
Sto utilizzando minicore ed la configurazione arduino as isp per caricare il bootloader.
Riesco a farlo funzionare senza oscillatore esterno (quindi presuppongo che cambi frequenza 1mhz o 8mhz (li ho provati entrambi ma in entrambi i casi se non sono collegati a i +5v non riesco a caricare il programma.
Quelli che ho già montato lavorano bene e riesco a modificare lo sketch caricandolo con GND Reset,Tx,Rx (il +3.3v lo prende da batteria)
Cosa sto sbagliando? Con minicore mi sentivo abbastanza tranquillo..
PS: ho provato anche a modificare i fuse di una procedura trovata su internet a 8mhz (credo di aver rovinato 3 chip eheh)
Spero di essere stato più chiaro possibile.
Claudio
Non c'è problema a programmarli ad 8MHz alimentandoli a 5V.
Poi ovviamente li alimenti a 3.3V dopo averli programmati.
I chip vergini sono configurati per lavorare con l'oscillatore ed un fuse CLKDIV abilitato che divide x 8, per cui lavorano a 1MHz.
Per farli andare a 8MHz basta disabilitare il fuse CLKDIV.
Tuttavia i chip venduti compatibili con le board arduino hanno il bootloader e i fuse sono configurati per lavorare con il quarzo.
Ok, quindi installi il bootloader.
Che non è procedura per principianti e il minicore non c'entra nulla.
In vita mia solo all'inizio ho bloccato due atmega ma poi dopo avere studiato ho capito tutto, ma studiato per davvero.
Bene ora sai che con fuse e lockbit non si gioca o sai quello che fai o prima o poi ti fregano.
Dunque non sapendo come hai configurato i fuse l'unica soluzione è la programmazione parallela per riportarli alla configurazione del produttore. Se cerchi @Datman ha lavorato ad un programmatore parallelo.
Perché Minicore con i ATmega328P? Sono i chip standard che monta Arduino UNO, quindi usa il core standard Arduino e programma il bootloader con quello e lascia stare altre cose che non conosci a fondo.
Come IDE usa l'ultima versione del IDE classico ... la 1.8.19 ... è la più affidabile.
Ovviamente, per programmare il bootloader e i fuse ti occorre un programmatore esterno collegato in ICSP ... il chip VA alimentato e NON alimentato solo attraverso il programmatore
Cercherò sicuramente Datman che non mi piace sprecare i componenti
Ancora non ho capito due cose...
-Non posso cambiare il bootloader con la procedura ISP di arduino? Devo necessariamente usare un programmatore esterno?
-Cosa intendi per alimentazione? quella che riceve dalla board di arduino (quindi quella del PC) uno non è sufficiente (o stabile)
avete inoltre qualche consiglio sui programmatori ICSP?
scusate l'ignoranza e grazie mille ancora per le risposte!
NO, la programmazione dei FUSE ed il caricamento del bootloader può avvenire SOLO attraverso la programmazione ICSP (connettore a 6 pin sul fondo della scheda Arduino UNO) e NON da USB.
Come programmatore ISP economico ed affidabile, ti consiglio QUESTO da un rivenditore in Italia.
ok!
ho acquistato il programmatore ISP (spero arrivi presto!)
A questo punto toglimi una curiosità.
Io cosa ho fatto/combinato fino ad ora?
Cioè cosa realmente stavo facendo?
Comunque ti ringrazio ancora!
Quello che devo fare quindi ricapitolando è:
Collegare il chip al programmatore, creare una board (copia di arduino uno) ma con i fuse così impostati
Low fuse 0x62
High fuse 0xD9
Extended fuse 0xFE
per ottenere 1MHz con oscillatore interno
la frequenza di upload abbassarla a 9600Mhz o 4800Mhz
Low fuse 0x52
High fuse 0xDA
Extended fuse 0x05
per ottenere 8MHz con oscillatore interno
la frequenza di upload abbassarla a 57600Mhz
Quindi selezionare la nuova board e come programmatore?
O il programmatore ha un programma diverso per il bootloader?
(scusa la confusione ma ne ho molta in testa ora )
Ok, allora, dallo schema che disegni tu stai effettivamente usando la programmazione ISP ... solo che come programmatore stai usando un Arduino UNO che "fa finta" di essere un programmatore (cosa che personalmente non amo molto e che ha svariate limitazioni) ...
Premesso questo, purtroppo, se si vuole poi programmare il chip attraverso il bootloader (cosa che si può anche evitare, specie se si possiede un programmatore ICSP) NON basta impostare correttamente i FUSE per cambiare la frequenza di lavoro della MCU, ma occorre avere il bootloader per quella frequenza (il bootloader è legato alla frequenza a cui fai lavorare la MCU e non puoi usare quello classico di Arduino, fatto per i 16 MHz, su una MCU che vuoi mandare ad 1 MHz).
Però, dato che tu stai facendo una TUA configurazione (ed, immagino, una tua scheda personalizzata) e dato che ti sei dotato di un vero programmatore ISP ... il bootloader che lo carichi a fare? Solo per poi poter caricare dalla porta USB tramite un convertitore USB <-> seriale?
Puoi benissimo risparmiarti la memoria occupata da bootloader e caricare sempre i programmi via programmatore e collegamento ISP ... tanto, essendo una tua scheda personalizzata, non credo che la userai come sistema di sviluppo, ma per un'applicazione specifica ...
Appunto mi hai fatto una bella domanda!
Per ora (e dico per ora) uso il bootloader per caricare gli sketch e leggere i valori restituiti (per apportare le modifiche fino al raggiungimento del programma corretto).
Giustamente potrei farne a meno ma per ora mi limitavo a fare quel poco che so nell'ambito della programmazione e già provare a modificare il bootloader per risparmiare energia è una cosa che ho sperimentato quest'anno (per esempio anche l'impostazione dei timer interni per le varie applicazioni di check). Diciamo che "seriamente" (le "" indicano che è sempre al livello di divertimento/hobby ) ho iniziato quest'anno a fare cose specifiche con l'atmega 328p. Già che 3 schede mi funzionano da aprile la vedo come un bel risultato!
Quindi a questo punto visto che mi hai messo la pulce nell'orecchio, c'è una pagina web o un topic in cui si parla di programmazione diretta con il programmatore ISCP senza bootloader?
Non avendo il bootloader come dico all'atmega di lavorare con 8Mhz o 1Mhz e a 3.3v?
Senza bootloader le varie comunicazione (I2c, ISP e seriale) funzionano lo stesso? come leggo i valori restituiti? (necessario ripeto solo al fine di miglioramento del codice)
Lo so, sono un rompiscatole! ma mi piace imparare e soprattutto fare le cose in modo preciso e se scopro un modo migliore applicarlo
... il bootloader è un programma che ha il solo scopo di guaradare, al momento del reset, se c'è qualcuno sulla seriale che vuole caricare un programma nuovo ... se SI ti permette da seriale (USB) di caricare il nuovo programma, se NO, fa partire il programma che c'è ... NULL'ALTRO.
Tutto quello che dici tu è impostato attraverso i FUSE ... dovresti studiarti bene il datasheet del ATmega328P.
... t'ho spiegato sopra cosa fa il bootloader ... per quanto ti ho scritto pensi quindi possa cambiare qualche cosa?
Non c'è nulla di differente da sapere, solo che, alimentata la scheda e collegato il programmatore ICSP, invece di schiacciare solo il bottone dell'IDE con la freccia per caricare il programma devi tenere premuto lo "shift" e schiacciare lo stesso bottone (vedrai che appare la scritta "carica con il programmatore"). Ovviamnete, prima, dovrai aver selezionato il giusto programmatore che usi ed i suoi eventuali parametri ... ti allego il manuale del "pololu" da studiare per capire come si usa: Pololu usb avr programmer v2.pdf (1.0 MB)
Vedi perché non avevo preso in considerazione questa strada? ahahah
Grazie mille ancora!!! vedrò di leggermelo prima che arrivi il pololu!
Per quanto riguarda i fuse mi leggerò il manuale e controllerò che tutto sia corretto. Penso però che quelli che avevo scritto all'inizio siano corretti.
Con il programmatore ho risolto!
Alla fine era un problema (come mi avevi giustamente fatto notare) un problema di alimentazione. Quindi aggiungendo i +3.3v da un'altra scheda alimentata a batteria mi carica regolarmente. Il pololu me lo ha specificato subito. Comunque anche per altri problemi è molto chiaro. quindi continuerò ad usare quello. Devo solo capire se posso leggere la seriale con quello o goni volta devo staccarlo e usare un arduino uno per leggerla (ancora non ci sono riuscito ma ho provato una volta sola)
Ovviamnete la seriale è su pin diversi da quelli del ICSP, ma ... il pololu, se ben ricordo, offre DUE interfaccie, una per la ICSP ed una per la conversione seriale <-> USB ... nel manuale è ben descritto.
Si quello lo avevo visto, il problema penso sia un altro.
fuori dalla scheda ho lasciato i piedini Vcc-GND-Tx-Rx-Rst (come ho fatto spesso) ma anche a collegarli alla board di arduino uno mi riconoscono la porta ma non scrive..
Devo ricontrollare bene cosa ho combinato nella scheda!!
Dopo un attento controllo, sono riuscito a fare i collegamenti giusti anche per la seriale ( mi mancava il condensatore da 100nF fra B e Rst). Ora riesco a caricare i programmi anche con la seriale del programmatore ma cosa per me più importante leggere i dati ricevuti!
Però (c'è un però ) tutto funziona su un atmega328p au standalone... se gli stessi collegamenti li faccio sulla scheda che mi sono fatto stampare (già con i vari componenti saldati) non carica il programma (seriale) ne si leggono i dati.
A questo punto ho saldato un altro atmega su una seconda scheda stampata vuota (e per ora funziona!) e aggiungendo componente per componente risalgo fino al punto in cui ho sbagliato.
Che intendi per "seriale"? Vuoi caricare via ISP o via "seriale"?
Per caricare via "seriale" è obbligatorio aver caricato sulla MCU il bootloader ed aver programmato i FUSE in modo da usarlo.
Se c'è qualche cosa collegato ai pin che si usano per caricare il programma ... ovviamente questo qualche cosa può disturbare i segnali di programmazione ed impedire che il tutto vada a buon fine.
Per ora (su queste schede che ho già fatto) mi risulta più comodo via seriale.
Le prossime le penseró in modo da poter caricare direttamente in ISP in modo da poter risparmiare memoria. Comunque la comunicazione seriale dopo che ho testato il programma non mi servirà più.
Per quanto riguarda i componenti ci sta.. Per quello sto procedendo uno alla volta per capire dove si trova il problema. Già ho montato una parte del circuito e funziona. Domani continuo con la restante. (purtroppo con i turni di lavoro vado un po' a rilento).