leo72:
Pablos, che necessità hai per dover scrivere sulla Flash? Non potresti fare in altro modo?
Magari se spieghi, possiamo vedere di trovare un'alternativa.
E' un po' lungo da spiegare nei dettagli, cerco di essere breve .... mmm mi sa che ti annoierai:
Il mio progetto è quello di creare una piattaforma antiscemo :) , tutto ciò che riguarda la logica di azione e reazione tra i pin. La mega è totalmente configurata da un file su sd dove ci sono tutti i byte che servono per dire al chip imposta i registri in questo modo ed esegui determinate cose se ci sono determinati eventi, questo mi permette di usare arduino per molteplici applicazioni senza nemmeno guardare lo sketch, le impostazioni sono modificabili da remoto.
Parametri su SD da passare alla eeprom
4 byte IP
6 byte MAC
4 Byte Gateway
4 byte subnet
4 byte per server NTC_1
4 byte per server NTC_2
4 byte per server NTC_3
5 byte di aggiustamento hh,mm,gg,mese,anno (+/-)
54 byte setup Input/output e pullup + 0/1 allo start - setup di tutti i pin (54 byte di configurazioni) qui scgli se il pin deve essere Input con o senza pullup opp Output, inoltre stabilisci se allo start di arduino il pin deve partire da 1 o 0.
16 byte setup Input/output/analog - setup di tutti i pin analogici. qui si può scegliere come sopra come vuoi che sia il pin
99 gruppi di appartenenza - 9 byte per ogni gruppo, questi 9 byte raccolgono tutti i registri PIN-ABCDEFGHJ... ed è la parte più complicata ma anche la più snella potendo gestire tutti i pin senza "cicli for" con la manipolazione dei registri in un colpo solo.Potrebbe essere impiegato per creare in domotica gli scenari, sollevare gruppi di serrande e chiuderne altre accendere luci nello stesso istante, se li mettiamo tutti e 8 a 0 spegnamo tutto e buonanotte, insomma comandare comunque un insieme di pin a scelta inseriti nel gruppo.
25 codici IR con sistema di autoapprendimento, ipotizzando uno voglia usare un 32bit, sono 25x4byte al massimo che metto a disposizione, ogni codice può essere assegnato a 1 o anche a tutti i pin in base al gruppo di appartenenza che viene scelto nelle condizioni. Il sistema comprende in modo opzionale uno o più ricevitori IR, basta che nel setup su SD venga scritto su quali pin sono stati messi.
54 condizioni/ON -
54 condizioni/OFF - la condizione stabisce con 2 byte ciascuno cosa deve fare il pin quando un evento lo commuta a 1 o 0, quindi che il pin sia settato in Input o Output non ha importanza il programma agisce in base a questi 2 byte.
300 timer + enable/disable + ON/OFF - 300 orologi (che sembrano tanti, ma distribuiti opzionalmente su tutti i pin non lo sono), ho dovuto comunque fare dei tagli per questioni di mem ....
Si può decidere perciò di dare 300 timer a un pin solo oppure 7-8 timer a tutti i pin ovviamente se sono impostati output... a scelta dell'utente, utile per utenze che hanno molte accensioni e spegnimento durante il giorno o la notte (prendi un acquario per esempio)
54 impulsi - 1 byte, questo parametro decide se il pin una volta chiamato deve dare un impulso 0 o 1 di n secondi o deve restare sempre 0 o 1, avendo un byte posso solo moltiplicando per 1000 decidere minimo un secondo massimo 4 minuti può essere utile per fare dei timer luci scala con ogni piano separato, comandare dei relè passo-passo, una luce lampeggiante, azionare delle serrande elettriche a tempo...ecc
30 AND 0/1 di massimo 12 pin
30 OR 0/1 di massimo 12 pin
25 byte password MD5 - default > scritta su popup web diretta su eeprom
25 byte password MD5 - utente > scritta su popup web diretta su eeprom
poi c'è tutta la parte dei pin analogici (Manca memoria per i parametri) che possono essere usati con tutti i sensori che uno vuole purchè si rispettino i 0-5v, il setup su sd avrà come dati da confrontare degli INT quindi 2 byte, in questo modo a me non interessa se ci colleghi una fotoresistenza un lm35 o un sensore hall, il dato reale e la formula è fatta dalla pagina web che visualizza in real time i valori convertiti in lux, gradi, ampere ecc ecc (del resto arduino che se ne fa dei dati convertiti in celsius o ampere?)
Ci sarebbe la parte della ripetizione IR in base ai codici memorizzati su eeprom, per accendere con i timer programmati o da remoto condizionatori e apparati vari con infrar. (non l'ho fatta)
Inserimento opzionale di uno o 2 tipi standard di display lcd, aggiungo le librerie che saranno usate
Come detto prima c'è poi la ethernet le paginette web che visualizza in sinnottico 70 pin con l'invio di soli 40 byte senza refresh della pagina ma in modalità persistente.
Le svariate combinazioni dei parametri qui sopra possono dare molte applicazioni senza sbattimenti di programmazione sketch e anche un inesperto di programmazione può usare la scheda, certo non ci fa un pallone sonda o un rover da mandare su Venere.
Fino ad ora ho risolto una montagna di problemi.
Riassumendo il tutto ti ho risposto in modo lungo :) alla tua domanda, non vorrei passare per pazzo facendo richieste assurde, ecco perchè mi serve più memoria per i parametri da poter leggere rapidamente, potrei spaziare molto di più nelle opzioni.
Ringrazio tutti voi per l'aiuto datomi nelle parti più difficili.
Cosa ne faccio di quei parametri:
Tutti i parametri presenti nel file setup.ini su sd al reset vengono nel setup() confrontati con quelli scritti nella eeprom , se il byte è diverso viene sovrascritto col nuovo dato nella singola cella, altrimenti non scrive nulla, evitando di logorare inutilmente la memoria. Posso resettare 1000 volte senza scrivere nulla, quindi se voglio cambiare un dato, vado sulla pagina web cambio il dato nel file ini e resetto, con questo ti spiego perchè il PROGMEM non fa al caso mio e ti spiego anche perchè volevo un reset remoto senza impegnare un altro pin.
Desideravo che arduino fosse il più autonomo possibile senza l'ausilio di computer di appoggio, server con database ecc, una cosa piccola dove con i connettori vai alle interfacce e stop.
ciao