PROGMEM sposta il contenuto di una variabile dichiarata come costante nella flash, cio mi sarebbe utile per spostare un array da 2kB in flash, piuttosto che saturare completamente la ram.
l'array in questione lo trovate qui
è una serie di font riciclata per una matrice di led.
io ho trovato questa discussione sempre su PROGMEM
che credo serva a far diventare la locazione di memoria della ram, al suo contenuto(cioe la locazione di memoria della flash dove viene salvato il dato), che a sua volta viene convertito nel dato stesso
prima di tutto il * cosa fa? so che è un puntatore, ma il reference non dice nulla d'altro, come ad esempio a cosa serva.
perche le parentesi graffe?
le funzioni che finiscono con _P sono incluse in avrdude come ad esempio PROGMEM stesso?
Il puntatore punta, appunto, ad un indirizzo di memoria. In questo caso si usa quella funzione per far caricare in un buffer che vive in ram il puntstore al dato che ti interrssa e cge fisicamente hai messo in flash.
Strcopy_P è una funzione della LibC che lavora con progmem. Tutte le funzioni che finiscono in _P riguardano appunto operazioni in flash.
Sul link che hai postato c'è Mauro cbe spiega ulteriormente la cosa
boschi:
quindi * trasforma una variabile nel suo indirizzo di memoria, mentre & trasforma un indirizzo nel suo contenuto
Hai capito esattamente il contrario . Occhio che per gli array non è necessario prendere il loro indirizzo, nel senso che il "nome" di un array è già un puntatore (se non specifichi un indice).
Per l'altro errore posta esattamente quel che hai scritto, la linea di strcpy_P() e la dichiarazione delle variabili che le passi.
Un char contiene un carattere solo, strcpy (nelle varie varianti) copia stringhe.
Nel tuo caso non si parla di stringhe, visto che dovrebbero essere array di char terminati da '\0' (così almeno è come se li aspetta strcpy()), ma forse nemmeno singoli byte/char. Forse quel che ti serve sono array di byte di una certa dimensione? In tal caso devi predisporre fontBuff in modo che abbia la dimensione corretta, quindi riempirlo con una memcpy_P(), sempre che esista. Se non esiste dovrai ciclare con una pgm_read_byte(), se ricordo bene.
spulciando quel pdf credevo di aver trovato la risposta ai miei problemi, poi ho compilato
come diceva SukkoPera il comando da usare (se non ho capito male) è pgm_read_byte, come si evince dalla pagina 5 di quel documento
all inizio non funzionava, poi ho capito che lui stava prendendo l'indirizzo della flash, quindi ho messo un & davanti alla variabile da leggere ed ha funzionato.
grazie millea tutti, mi siete stati davvero utilissimi, io non ci sarei mai arrivato da solo
Potresti anche metterlo in eeprom invece che in flash,
Vantaggi :
Non lo riscrivi ad ogni upload inutilmente.
Gestisci il tutto con la libreria ufficiale arduino, più semplice di progmem
Il problema è che con l'IDE di Arduino non puoi programmare la EEPROM insieme alla flash, quindi dovresti usare uno sketch solo per programmarla, quindi un altro per farci quel che vuoi. Fattibile, ma un po' scomodo insomma.
Esempio nel setup programmi la eeprom, dopo il primo upload commenti la parte di eeprom così non la ricarichi piu.
Nel caso devi modificare un font decommenti e modifichi la eeprom.
Lo sketch ti rimane uno, ed in un unico upload carichi sia eeprom che flash