Quando il micro si fa stretto...

Ragazzi ho un problemino: che si fa quando lo sketch è troppo grande? Lo sketch che devo caricare ha raggiunto i 32000 byte e sto vedendo il modo di alleggerirlo un pò ma credo sia al quanto difficile. Ho letto che in queste situazioni si può caricare lo sketch su un atmega privo di bootloader ma non l'ho mai fatto fin' ora, cercando su internet esce di tutto e mi è venuta una gran confusione. Programmatori esterni avr non ne ho, ho un pickit2 ma una volta ci ho provato ad usarlo con un atmega8 e non ci sono riuscito, avete qualche buon link che spiega un metodo funzionante per caricare lo sketch senza mettere il bootloader? Se c'è da costruire un programmatore non importa, ho diversi pc e se occorre la porta parallela non è affatto un problema, il guaio è solo trovare una procedura affidabile...

Edit: l'atmega328 ha 32K di memoria, significa che senza bootloader potrei caricare sketch grandi fino a 32768 byte?

Ringrazio in anticipo per l'aiuto che mi darete, se me lo darete :)

Usa un ATmega1280 (Arduino Mega o Seeeduino Mega) o ATmega2560 (Arduino Mega 2560) Dovrai adattare eventuamenta il codice perché alcune funzionalitá sono su pin diverse. Ciao Uwe

L'Optiboot, che è il bootloader dell'Arduino Uno, occupa solo 512 byte, per cui con quello ti restano 32256 byte liberi. Togliendo anche il bootloader guadagni mezzo K ma perdi la possibilità di caricare lo sketch dall'IDE. Doop devi compilare il file a mano, creare il file .hex e caricarlo con un programmatore e avr-dude.

Se hai bisogno di spazio, oltre ai Mega già segnalati, esistono anche gli Atmega644P: 64 KB di flash, 4 KB di SRAM e 2 di EEPROM, DIP40 (se non ricordo male) e sono in vendita da Watterott a 6,45: http://www.watterott.com/en/ATMEGA644P-20PU

(PS: anche per essi ti serve il programmatore)

Allora, la strada di cambiare microcontrollore non posso prenderla perchè come sempre ho già fatto la scheda e non pensavo che lo sketch fosse così avido di byte....

Ma con l'arduino proprio non si può fare niente? Quando uso un arduino per mettere il bootloader su un micro nuovo, carico lo sketch ArduinoISP e ci pensa lui a mettere il file hex sul chip vergine; ho trovato nei file temporanei il file hex del mio sketch che l'IDE ha creato durante la compilazione , se prendo questo file e lo rinomino con lo stesso nome del file hex del bootloader sostituendolo solo per un attimo nella cartella bootloader, se poi vado a caricare il "finto" bootloader dite possa funzionare come sotterfugio? In fondo è sempre un file hex, ma da profano non me ne intendo. Che dite?

Immagino tu usi l'Arduino 2009, giusto? Altrimenti non parleresti di sketch "ArduinoISP". Non so se cambiando il nome del file .hex può funzionare, prova. Però se hai una 2009 potresti usare la scheda come programmatore e caricare lo sketch su un Atmega senza bootloader. Oppure prenderti una Uno ed usare un micro con bootloader Optiboot, così da salvare 1 altro kB di dati. Ma proprio non riesci a compattare lo sketch? Magari riusando le funzioni? Oppure sostituendo cicli e controlli? Ad esempio, for e while possono essere usati per ottenere le stesse funzioni ma spesso occupano diversi quantitativi di byte.

Si, ho soltanto i 2009, l'uno ancora non l'ho provato. Lo sketch lo sto raffinando ma sono ancora sui 31K, speriamo di farcela.

Però se hai una 2009 potresti usare la scheda come programmatore e caricare lo sketch su un Atmega senza bootloader.

Esatto, è proprio quello che vorrei fare ma non riesco a trovare la procedura C'è da caricare qualche sketch apposta? Se hai un link ti ringrazio a vita!

Io conosco questo: http://arduino.cc/en/Tutorial/ArduinoISP

Di solito questo metodo lo uso per mettere il bootloader, mi sono fatto pure uno shield apposito Non ho trovato comunque il metodo per caricare uno sketch al posto del bootloader, mo tra un pò provo a rinominare i file, speriamo bene....

Se quel metodo va per il bootloader, dovrebbe andare anche per gli sketch.
Forse usando avr-dude direttamente senza usare l’IDE?

Bellissima idea, sei un grande.... Proverò in tutti e due i metodi

Ho trovato anche questo (sempre per 2009): http://zuccala.blogspot.com/2009/08/mini-tutorial-per-usare-arduino-come.html

sicuro che parte del codice non può essere messa in funzioni/cicli, che parte delle istruzioni non siano in realtà scritte/codici che puoi salvare in EEPROM, addiriturra potresti creare uno pseudolinguaggio che esegue i comandi salvati in eprom..

Sto vedendo anche questo, in effetti ho molti messaggi che vanno scritti su un lcd ma non mi torna una cosa:

supponendo che nei vari menù e sottomenù devo scrivere ad esempio lo stesso messaggio con l'istruzione lcd.print("BLABLABLA") ho messo il messaggio su un array e ho fatto scrivere quello: char messaggio[17] = "BLABLABLA" e su ogni parte del menu scrivo con l'istruzione lcd.print(messaggio) In teoria dovrebbe occupare meno memoria visto che il messaggio da scrivere è memorizzato nell'array solo una volta ma non sembra cambiare minimamente.

Intanto prov con char *messaggio, usando i puntatori dovresti (forse) inizializzare una sola volta la variabile.

Ho provato a cambiare l’array da char messaggio[17] = “blablabla” con char *messaggio = “blablabla” ma quando compilo addirittura i byte aumentano

Pelletta: Ho provato a cambiare l'array da char messaggio[17] = "blablabla" con char *messaggio = "blablabla" ma quando compilo addirittura i byte aumentano

strano, probabilmente il compilato fa già questa sostituzione...

char messaggio[17] = "blablabla"; è ok char *messaggio = "blablabla"; non sono sicuro,, credo manchi una malloc()

Ma la malloc serve per allocare memoria dinamicamente. Può essere utile nel caso di un array creato in fase di runtime ma per una stringa che viene dichiarata ed usata per tutto il programma, non so quanto sia utile.

Forse il consiglio di trasferire in Eeprom TUTTE le stringhe e leggerle da lì non sarebbe sbagliato. Basterebbe usare un indice che, a seconda del msg da visualizzare, legge nell'Eeprom la giusta sequenza di caratteri.

leo72: Ma la malloc serve per allocare memoria dinamicamente. Può essere utile nel caso di un array creato in fase di runtime ma per una stringa che viene dichiarata ed usata per tutto il programma, non so quanto sia utile.

se nella definizione della stinga statica il compilatore non aggiunge in automatico una malloc allora stai puntando un'area di memoria che potrebbe essere allocata per altre variabili... inutile stare a discutere sui risultati. Non sono sicuro dell'allocazione automatica, solo quello è il prolblema.

leo72: Forse il consiglio di trasferire in Eeprom TUTTE le stringhe e leggerle da lì non sarebbe sbagliato. Basterebbe usare un indice che, a seconda del msg da visualizzare, legge nell'Eeprom la giusta sequenza di caratteri.

si, la consiglio come soluzione. tra l'altro, se le stinghe le scrivi in un file .txt che poi carichi in eeprom,diventa anche facile tradurre il programma in altre lingue (è un trucco molto usato nei giochi)

Riapro questo thread perché sono arrivato al massimo di memoria anch'io... solo che ho avuto un problema. Ho compilato uno sketch molto grande:

Bynary sketch size: 32152 byte (of a 32256 byte maximum)

Quando sono andato a fare l'upload, ho visto i 2 led RX/TX che sono rimasti accesi qualche secondo con la scritta "uploading ecc..." e poi ho ricevuto questo messaggio di errore:

avrdude: stk500_paged_write(): (a) protocol error, expect=0x14, resp=0x64 avrdure: failed to write flash memory, rc=4 avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

Ho provato a caricare lo sketch di esempio "Blinking" e va. Ma se provo col mio super-sketch ricevo quell'errore... buffo, no?

(PS: Arduino Uno)

uhm direi che si merita una segnalazione nella sezione inglese specifica, non è una bella cosa che succeda