Copparo
Offline
Newbie
Karma: 0
Posts: 44
|
 |
« on: May 26, 2012, 05:28:58 am » |
Salve a tutti,
Ho creato un programmatore di memorie per dei computer che leggono dati da chip 24lc64. E' risultato un bel progetto semplice e funzionale e collaudato. Già in produzione da me sviluppato per poche unità, mi ritrovo ora a dover gestire quantitativi maggiori: fuori dalla semplice portata di una singola persona che utilizza shield prototipi collegati con dei fili rigidi unifilari. E' stato contattato un esterno per gestire questa produzione, e dopo aver visto il prodotto, ha suggerito diverse migliorie: una mi piace molto e ha posto un dubbio. Le memorie sopracitate in I2C, sono acquistate da un fornitore già preconfigurate ad indirizzo fisso. L'idea sarebbe di gestire una coppia diretta tra 2 memorie senza usare il pc come tramite (un po' come una dock station con due hd). Pensavo di alimentare le memorie tramite due pin diversi dell'arduino, ed eseguire la copia dalla sorgente alla destinazione passando per l'eeprom alimentando di proposito l'opportuna memoria. Questa operazione viene eseguita in più passaggi (a pagine), per la limitatezza dell'eeprom dell'arduino. E' fattibile oppure posso avere problemi di conflitti indirizzi anche se una memoria non è alimentata?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 0
Posts: 355
|
 |
« Reply #1 on: May 26, 2012, 05:54:23 am » |
Tasto 1: quando premuto legge il contenuto di una eeprom e la salva in file dentro una SD. Tasto 2: quando premuto legge il contenuto del file nella SD e lo riversa nella eeprom.
|
|
|
|
|
Logged
|
|
|
|
|
Cagliari
Online
Faraday Member
Karma: 51
Posts: 3179
|
 |
« Reply #2 on: May 26, 2012, 05:55:07 am » |
Forse potresti emulare una seconda I2C via software e trasferire i dati da una memoria all'altra senza doverle accendere e spegnere ogni volta poiché hanno lo stesso indirizzo. Dai uno sguardo qui --> http://forums.adafruit.com/viewtopic.php?f=25&t=13722
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 18
Posts: 4047
Arduino rocks
|
 |
« Reply #3 on: May 26, 2012, 06:46:13 am » |
sul discorso eeprom ricorda che il limite di scrittura e' molto inferiore al limite della flash, indi se vuoi seguire questa strada consiglierei di passare attraverso la flash, con progman, invece della eeprom
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 172
Posts: 16131
+39 349 2158303
|
 |
« Reply #4 on: May 26, 2012, 07:12:01 am » |
Non capisco i problemi che vi fate. 1) sul I2C si possono metter piú dispositivi. 2) se hai 2 dispositivi con l' indirizzo uguale perché giá fissato e non selezionabile con i piedini A0 A1 e A2 allora ci sono integrati che generano un subramo sul Bus I2C dove possono esserci dispositivo con lo stesso indirizzo come su quello principale. Per esempio il PCA9543 http://www.datasheetcatalog.org/datasheet/philips/PCA9543_1.pdfUn alternativa é usare un FRAM I2C oppure SPI per memorizzare in modo temporaneo i dati. Il vantaggio é che la velocitá di scrittura é alta e il numero di scritture non é limitato. Ha anche un indirizzo I2C diverso dal EEprom da programmare. Visto che non é volatile puoi riuttilizzare i dati per fare piú copie del EEprom sorgente anche dopo spegnimento del Arduino. 3) visto che la scrittura del EEPROM é molto piú lenta della letura puoi usare il Page Write di 32 Byte alla volta. Leggi 32 byte del EEprom sorgente e li scrivi sul I2C del destinatario. Nel fratempo che il EEprom destinatario fa la scrittura leggi i prossimi 32 Byte. Non serve tenere niente in memoria EEprom o FLash di Arduino e velocizzi anche la scrittura perché elimini l'attesa della scrittura interna. Ciao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 18
Posts: 4047
Arduino rocks
|
 |
« Reply #5 on: May 26, 2012, 07:17:36 am » |
bella la storia del page write . uwe eccezionale come al solito 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 226
Posts: 16991
Don't know what I do
|
 |
« Reply #6 on: May 26, 2012, 11:48:03 am » |
sul discorso eeprom ricorda che il limite di scrittura e' molto inferiore al limite della flash, indi se vuoi seguire questa strada consiglierei di passare attraverso la flash, con progman, invece della eeprom
Veramente è alla rovescia. Se parliamo di EEPROM interna, il limite è di 100.000 scritture mentre la Flash ne "regge" 10.000. Se parliamo di EEPROM esterne il limite è mediamente di 1.000.000 di scritture.
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 172
Posts: 16131
+39 349 2158303
|
 |
« Reply #7 on: May 26, 2012, 01:40:37 pm » |
Il problema non é il numero di scritture, ma lo spazio disponible e il tempo. Se memorizzi i dati nella EEPROM interna ci metti il doppio del tempo per la copia che lo fai direttamente. Un EEPROM da 8kByte programmato con pagine da 32 Byte e un tempo di scrittura di 5ms ci mette ca 1,3 secondi. Non é tanto ma se non si deve aspettare il doppio é sempre meglio. Ciao Uwe
|
|
|
|
« Last Edit: May 27, 2012, 05:36:37 am by uwefed »
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 18
Posts: 4047
Arduino rocks
|
 |
« Reply #8 on: May 27, 2012, 04:49:04 am » |
leo ha ragione, thanks  Write/Erase Cycles: 10,000 Flash/100,000 EEPROM
|
|
|
|
|
Logged
|
|
|
|
|
Copparo
Offline
Newbie
Karma: 0
Posts: 44
|
 |
« Reply #9 on: May 28, 2012, 01:57:10 am » |
Ringrazio tutti per le risposte. Mi ha incuriosito: visto che la scrittura del EEPROM é molto piú lenta della letura puoi usare il Page Write di 32 Byte alla volta. Leggi 32 byte del EEprom sorgente e li scrivi sul I2C del destinatario. Nel fratempo che il EEprom destinatario fa la scrittura leggi i prossimi 32 Byte. Non serve tenere niente in memoria EEprom o FLash di Arduino e velocizzi anche la scrittura perché elimini l'attesa della scrittura interna.
Non ho ben capito: avendo prefissati gli indirizzi a livello di hardware: quando leggo dal chip sorgente come posso essere sicuro di farlo dal chip interessato se hanno stessi indirizzi?, o forse intendevi, con l'opzione due, a indirizzi separati? Probabilmente non ho capito. Pensavo anche ad una soluzione del tipo: mi salvo una pagina per volta in RAM (32 byte in array), in lettura uso il chip1, in scrittura uso il chip2.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Tesla Member
Karma: 87
Posts: 8493
:(){:|:&};:
|
 |
« Reply #10 on: May 28, 2012, 02:02:28 am » |
se hanno gli stessi indirizzi vanno in conflitto e l'i2c non funziona, e devi inventarti un sistema usando transistor/mosfet per alimentare solo un chip alla volta.
|
|
|
|
|
Logged
|
|
|
|
|
Copparo
Offline
Newbie
Karma: 0
Posts: 44
|
 |
« Reply #11 on: May 28, 2012, 02:05:50 am » |
se hanno gli stessi indirizzi vanno in conflitto e l'i2c non funziona, e devi inventarti un sistema usando transistor/mosfet per alimentare solo un chip alla volta.
Come immaginavo. Se anziche' di un Mosfet, usassi due pin I/O differenti? Per fortuna, i chip non usano una corrente altissima di lavoro, quindi un'out dell'arduino dovrebbe essere sufficiente, giusto?
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 18
Posts: 4047
Arduino rocks
|
 |
« Reply #12 on: May 28, 2012, 03:22:50 am » |
il discorso di alimentare prima una memoria e poi l'altra obbliga di avere un buffer che puo' essere appunto la eeprom del 328, mentre l'idea di uwe e' diversa, leggere e scrivere contemporaneamente, sfruttando la differenza di tempi delle due operazioni. Se vuoi seguire questa strada devi usare il gia' citato PCA9543 io credo sia piu' interessante come progetto, anche piu' pulito, senza forzature come possono essere lo spegnere e riaccendere fisicamente le memorie
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Tesla Member
Karma: 87
Posts: 8493
:(){:|:&};:
|
 |
« Reply #13 on: May 28, 2012, 03:24:02 am » |
sì, non dovrebbero esseri controindicazioni, assicurati che il pin arduino riesca a fornire abbastanza mA, ma in effetti dovrebbe farcela
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 172
Posts: 16131
+39 349 2158303
|
 |
« Reply #14 on: May 28, 2012, 05:33:26 pm » |
Non ho ben capito: avendo prefissati gli indirizzi a livello di hardware: quando leggo dal chip sorgente come posso essere sicuro di farlo dal chip interessato se hanno stessi indirizzi?, o forse intendevi, con l'opzione due, a indirizzi separati? Probabilmente non ho capito.
Per quello Ti ho consigliato il PCA9543 http://www.datasheetcatalog.org/datasheet/philips/PCA9543_1.pdf . Il PCA9543 ha 2 canali I2C che puó collegare a piacimento al I2C del Master. Cosí puoi leggere prima 32 Byte dal EEprom sorgente e poi scrivere i 32 Byte al EEprom di destinazione. Guardati lo schemino a pagina 8 del datasheet e i comandi a pagina 4. A pagina 7 é descritto come scrivere il registro di controllo. I bit 0 e 1 determinano se i due canali sono attivi o disattivati. Non ritengo una buona idea togliere l'alimentazione agli EEProm per selezionare l'uno o l'altro. Pensavo anche ad una soluzione del tipo: mi salvo una pagina per volta in RAM (32 byte in array), in lettura uso il chip1, in scrittura uso il chip2.
Il Bus I2C non ha previsto questo. non puoi avere 2 dispositivi con lo stesso indirizzo sullo stesso bus. Come spiegato prima con un integrato puoi avere dei rami del Bus I2C che si possono attivare e disattivare a piacimento. Ciao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
|