Pages: [1] 2   Go Down
Author Topic: EEPROM -PROGMEM - domande  (Read 1234 times)
0 Members and 1 Guest are viewing this topic.
Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2754
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve a tutti, sono arrivato nel progetto alla parte eeprom e avrei bisogno di qualche delucidazione.

Ho scritto una piccola paginetta login su flash, dove alla prima connessione arduino invia una pagina di login e uno status del sistema compresi i parametri ip, gatway e tutto il resto salvato su eeprom
sono 12 righe da esattamente 100 caratteri ciascuna
 
Code:
char buffer[100];
prog_char linea0[] PROGMEM =   "<html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=windows-1250\"><title>Log";
prog_char linea1[] PROGMEM =   "in</title><font face=\"verdana,arial\" size=-1><center><table cellpadding=\"2\" cellspacing=\"0\" bo";
prog_char linea2[] PROGMEM =   "rder=\"0\" id=\"ap_table\"><tr><td bgcolor=\"blue\"><table cellpadding=\"0\" cellspacing=\"0\" borde";
prog_char linea3[] PROGMEM =   "r=\"0\" width=\"100%\"><tr><td bgcolor=\"blue\" align=center style=\"padding:2;padding-bottom:4\"><b";
prog_char linea4[] PROGMEM =   "><font size=-1 color=\"white\" face=\"verdana,arial\"><b>Inserisci  login  e  password</b></font></t";
...
...
PROGMEM const char *string_table0[] = {linea0, linea1, linea2, linea3, linea4, linea5, linea6, linea7, linea8, linea9, linea10, linea11};

//lettura stringhe

void setup()
{
   Serial.begin(9600);
            for (int i = 0; i < 12; i++)
            {
            strcpy_P(buffer, (char*)pgm_read_word(&(string_table0[i])));
            Serial.println( buffer );
            }
}

Avendo 4k a disposizione come misuro quanto spazio ho usato? devo considerare un byte per ogni carattere?
100*12=1,2k?

Questo esempio qui sopra come viene allocato in memoria? da dove parto a leggere il primo byte con la funzione EEprom.read dal momento che non gli ho specificato le posizioni?

Quello che vorrei fare è usare uno sketch che scriva tutto quello che mi serve su eprom e poi cambiare lo sketch che vada a leggere la memoria, non vorrei che a ogni reset riscrivesse di nuovo tutto, non è necessario farlo sempre, è possibile no?

grazie
« Last Edit: May 02, 2012, 09:17:55 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao

forse c'è un equivoco di fondo: PROGMEM alloca le stringhe nella memoria programma, non nella EEPROM interna del micro:

http://arduino.cc/en/Reference/PROGMEM
http://arduino.cc/it/Reference/EEPROM
Logged

lucadentella.it

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2754
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si ho notato. nella flah metti variabili costanti che comunque le perdi al reset.... bene non è quello che mi serve, deve essere butatto tutto su eeprom, avrò sbattermi un po'

si ma 4k dannazione!!! neanche nome e cognome ci sta!! smiley
« Last Edit: May 02, 2012, 09:21:08 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

puoi utilizzare una EEPROM i2c esterna... ne trovi per pochi euro anche da 512-1024k
Logged

lucadentella.it

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2754
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie Luca, quando 20 anni fa mi sono diplomato in elettronica nelle sezioni elt c'erano ancora le valvole smiley studiare le memorie varie era pura fantascienza, l'anno dopo hanno rimosso le valvole e inserito i microprocessori + ram ecc. Cosa che andava fatta 10 anni prima. Povera Italia.

Qindi ritornando alle 12 righe da 100 char, dovrei convertire i caratteri in byte, allocarli partendo dal primo (mi pare 0x50 devo verificare il DS) e occupo così 1,2k?

ciao
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao!

sì, la corrispondenza è un carattere = un byte (includendo ovviamente anche spazi, "a capo" etc...)
utilizzando una eeprom esterna hai anche una modalità di lettura "continua" che ti consente di leggere un'intera sequenza di caratteri in un buffer, es:
http://arduino.cc/playground/Code/I2CEEPROM

Logged

lucadentella.it

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2754
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho guardato un po' sul mercato Ita RS li ha a 2-3 euro, gli atmel che propone arduino-cc in Italia dove li prendete?
   
Questo da RS della stm potrebbe andare bene?, è smd purtroppo
STMicroelectronics
M24256-BWMN6P
EEPROM I2C 256KBit 3 Chip Enable SOIC8

oppuere questa
Microchip
24LC256-I/P
EEprom seriale 256K 32K X 8 2.5V PDIP-8

per eeprom seriale si intende sempre i2c no?
grazie
« Last Edit: May 02, 2012, 10:37:38 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

BZ (I)
Online Online
Brattain Member
*****
Karma: 235
Posts: 20223
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

per eeprom seriale si intende sempre i2c no?
No, puó essere anche SPI.
Ciao Uwe
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Si ho notato. nella flah metti variabili costanti che comunque le perdi al reset....
No.
Nella Flash memorizzi delle variabili che non possono essere modificate.
Diventano tipo costanti. Ma la grossa differenza arriva ora.

Quando nello sketch la CPU incontra un'istruzione per gestire una variabile, essa cosa fa?
1) legge il valore dalla Flash
2) crea nella SRAM una variabile contenente quel valore
3) a quel punto continua con l'esecuzione del programma gestendo la variabile dalla SRAM.

Qualunque valore tu debba creare, la CPU lo farà sempre nella SRAM. Anche una stringa non sfugge a questa regola: la CPU prima la copierà nella SRAM e dopo la leggerà. Ecco perché la memoria si consuma velocemente.

Con PROGMEM si usa invece la possibilità di leggere il valore di una variabile (che non è necessariamente una stringa ma può essere anche un byte, ad esempio) direttamente dalla Flash, senza prima copiarla nella SRAM. Ovviamente si possono gestire solo costanti, cioè dati che non cambiano di valore.

Logged


Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2754
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Capito sei stato chiaro, poi con gli indirizzi e company ci sarà da ridere, però me lo studio, quello che intendevo prima è:
Posso scrivere 500 caratteri consecutivi da uno sketch apposito di scrittura
EEPROM.write(0, carattere to byte[0])  fino a EEPROM.write(499, carattere to byte[499])

poi butto via questo schetch e carico un web server normalissimo che nel client.print mi scrive i caratteri
da EEPROM.read(0, byte[0])  fino a EEPROM.read(499, byte[499])
la mia pagina web iniziale sarà per sepre nella eeprom giusto? fino a quando ovviamente non vado a riscrivere
Qualsiasi sketch che vado a mettere resetto, spengo, accendo, la pagina è sempre lì?  
Altrimenti che memoria sarebbe smiley
Chiedo prima di mettermi a tirare giù programmi e chissà magari qualche santo smiley smiley smiley
Se funziona bene con una i2c da 2048 potrei mettere tutto li sono molti file... magari più veloce che leggere da SD (questo non lo so ancora) ..ma sarebbe fantastico!

siccome scriverò molte volte per provare, mi chiedevo quando scrivo 500 volte con il write tolgo 500 cicli di vita dai 100.000 o ne tolgo 1 per ogni cella?
Oggi sono in vena di domande scusate, ma dai non ne faccio quasi mai smiley
grazie ciao
 
« Last Edit: May 02, 2012, 11:49:08 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sì, generalmente si fa così. Si programma la EEPROM con uno sketch "programmatore" dopo di che si carica lo sketch che userà i dati in EEPROM.
L'uso di una EEPROM esterna non cambia la procedura. Ricordati però che qualunque valore tu leggerai dalla EEPROM verrà riversato in una variabile, quindi non leggere tutti i 500 byte insieme altrimenti la CPU crea un array di 500 byte nella SRAM.

Scritture: ogni scrittura togli 1 "vita" alla cella di memoria che hai usato, non a tutta la EEPROM.
Logged


BZ (I)
Online Online
Brattain Member
*****
Karma: 235
Posts: 20223
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

1 vita a ogni cella o 1 vita ad ogni cella del blocco che contiene la cella?
Ciao Uwe
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2754
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

tutti in cella!!  Leo è per te la domanda di uwefed smiley
« Last Edit: May 02, 2012, 03:13:58 pm by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

1 vita a ogni cella o 1 vita ad ogni cella del blocco che contiene la cella?
Ciao Uwe
Bisogna vedere il costruttore sotto che condizioni ha fatto i test, secondo me, e quindi cosa intenda per "endurance". Generalmente le EEPROM sono strutturate per essere accessibili a singoly byte per cui se anche un solo elemento di un byte si rovina quel byte è perso.

http://electronics.stackexchange.com/questions/21232/100k-eeprom-writes-per-bit-or-as-a-whole
Logged


Offline Offline
God Member
*****
Karma: 5
Posts: 873
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perche' muoiono le celle delle eeprom e delle flash ? E' tutta colpa della meccanica quantistica

Si e' cosi', scrivendo e cancellando, le flash e le eeprom muoiono, e per la flash parliamo di togliere la vita a interi blocchi di byte nel caso la flash sia organizzata a blocchi: se muore anche solo una cella tutto il blocco e' compromesso.

Fondamentalmente le celle bit sia delle eeprom che delle flash funzionano grazie a 2 transistor, uno e' tradizionale, il secondo ha invece il gate flottante e sepolto nell'ossido per renderlo isolato elettricamente perche' in questo modo si riesce ad intrappolarci carica sfruttando l'effetto tunnel.

Anche la cancellazione sfrutta l'effetto tunnel con un processo inverso all'hot-electron injection usato in fase di programmazione perche' in questo caso non si vogliono intrappolare altri elettroni ma strappare via quelli che prima erano stato intrappolati.

Nella meccanica classica una particella non puo' superare un ostacolo se non ha l'energia necessaria per farlo: chi fa come me balistica sa che se un proiettile non ha la forza di bucare una parete nessuno potra' mai trovato al di la' della parete.

Nel mondo quantistico una particella possiede una funzione d’onda che prevede una probabilita', piccola ma concreta, di attraversare spontaneamente una barriera piu' alta dell’energia posseduta dalla particella stessa, in sostanza quindi un elettrone collocato in una scatola chiusa, puo' trovarsi ad un certo punto fuori dalla scatola stessa, e in modo del tutto spontaneo.

Magia ? No, e' una conseguenza diretta del principio di indeterminazione di Heisenberg che dice che se una particella e' confinata in uno spazio molto stretto  l’incertezza della sua quantità di moto  e' molto grande ed e' possibile che riesca a superare la barriera, detta cosi' dice poco ma allo stesso risultato si arriva anche se si prende in considerazione l’indeterminazione energia/tempo, e allora si nota che in un intervallo di tempo molto breve la fluttuazione energetica della particella puo' raggiungere livelli tali da permetterle di fuoriuscire.

Ecco quindi perche' la cancellazione e la scrittura puo' sopportare solo un numero limitato di operazioni di cancellazione/scrittura: perche' la fluttuazione energetica richiesta affinche' ci sia accumulano di elettroni nel gate sepolto genera una probabilita' crescente che si verifichno errori nel'hot-electron injection dovuti ai campi elettrici con cui si accelerano gli elettroni. In pratica l'effetto tunnel si basa sulla capacita' che possiedono le particelle quantistiche di attraversare una barriera di potenziale piu' alta dell'energia che avrebbero a disposizione, pero' ad ogni iterazione di scrittura e cancellazione ci sono delle perdite energetiche i cui effetti si accumulano nel tempo e fanno degenerare il sottilissimo ossido del floating gate alzandone anche la barriera di potenziale

La conclusione e' un triste epitaffio: quella cella vedra' sempre elettroni sul gate con la conseguenza che la cella non potra' piu' cambiare stato logico.

« Last Edit: May 02, 2012, 04:13:10 pm by legacy » Logged

Pages: [1] 2   Go Up
Jump to: