Go Down

Topic: Salvataggio e stampa caratteri su EEPROM (Read 3809 times) previous topic - next topic

tntsix

Salve a tutti.....

Volevo sapere se fosse possibile scrivere delle stringhe di caratteri all'interno della EEPROM e di stamparle su monitor seriale......

Facendo una cosa del genere magari
Code: [Select]


#include <EEPROM.h>

void setup()
{
Serial.begin(9600);
EEPROM.write(0, 'c' );
EEPROM.write(1, 'i' );
EEPROM.write(2, 'a' );
EEPROM.write(3, 'o');
Serial.print(EEPROM.read(0));
Serial.print(EEPROM.read(1));
Serial.print(EEPROM.read(2));
Serial.print(EEPROM.read(3));
}

void loop()
{
}


Praticamente il problema che ho è che sto salvando delle stringhe di caratteri su micro SD (ho la shield Ethernet),  ma nel caso di mal funzionamento della micro SD vorrei potermi cautelare salvando le mie stringhe parallelamente sulla EEPROM e di visualizzarle con la EEPROM stessa al posto della SD in caso appunto di mal funzionamento.......
Tuttavia la memoria della EEPROM è troppo esigua (ho un Arduino uno), per cui magari se fosse possibile salvare il tutto altrove, o magari attraverso qualche memoria esterna direttamente collegabile ad arduino non sarebbe male.....sono aperto ad eventuali consigli :D

Grazie a chi risponde :)

hard_uino

#1
Sep 03, 2014, 04:39 pm Last Edit: Sep 03, 2014, 04:49 pm by hard_uino Reason: 1
Quote
Tuttavia la memoria della EEPROM è troppo esigua (ho un Arduino uno), per cui magari se fosse possibile salvare il tutto altrove, o magari attraverso qualche memoria esterna direttamente collegabile ad arduino non sarebbe male.....sono aperto ad eventuali consigli

Da quello che ho capito vuoi che i dati vengano anche visualizzati sulla seriale (quindi sei collegato a un computer).
Allora puoi salvare tutti i dati visualizzati dalla seriale sul tuo computer in un file .txt senza andare a riempire la EEPROM

Se vuoi che la seriale visualizzi i dati sul pc e poi questi vengano salvati scaricati CoolTerm (è una finestra seriale simile a quella di arduino con in più la possibilità di salvare tutti i dati) da qui:http:freeware.the-meiers.org. Questo programma lo uso e funziona.

Se non è necessario che la seriale sia aperta guarda questo forum:http://forum.arduino.cc/index.php/topic,107350.0.html

Se proprio vuoi salvare dati sulla EEPROM in questo forum discutono di questo:http://forum.arduino.cc/index.php?topic=264580.0

tntsix

Ho letto i link che mi hai passato ma non mi sono stati molto utili......il mio problema sostanzialmente si riduce alla stampa a video dei caratteri memorizzati nella EEPROM......Se si prova a fare l'istruzione Serial.print(EEPROM.read(index)), la stampa a video darà un numero e non il carattere memorizzato precedentemente nella locazione

simonenascivera

Si perche puo salvare solo int quindi te lo converte

tntsix

Per cui non cè la possibilita di stampare caratteri con la EEPROM? eventuali alternative per la memorzziazione di caratteri?

hard_uino

Puoi salvare sulla EEPROM un carattere che viene convertito in numero.
Prima di visualizzare il carattere lo riconverti, ad esempio se ti salva A come numero 65 (credo che li converta in ASCII ma non mi sono mai informato) quando  lo leggi assegni a 65 il carattere A e così via per tutti gli altri caratteri.
Però come detto non ho mai provato quindi non ti assicuro che funzioni.

tntsix

Avevo anche io pensato di fare questa trafila ma mi sembra un po troppo "rude" come cosa......:)

pablos71

#7
Sep 04, 2014, 12:53 pm Last Edit: Sep 04, 2014, 01:05 pm by pablos Reason: 1
http://lnx.deltabeta.it/joomla/index.php?option=com_content&view=article&id=258:tabella-ascii-con-arduino&catid=61:arduino&Itemid=75  
http://arduino.cc/en/Tutorial/ASCIITable

Per salvare il byte su eeprom fai char to byte
Per stampare su seriale basta fare serial.write del numero letto sulla cella della eeprom
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

gpb01

Ragazzi, state facendo un sacco di confusione ...

'A' oppure 65 sono LA STESSA COSA ... dato che 'A' si rappresenta in binario, seguendo il codice ASCII, con il valore decimale 65 (esadecimale 0x41) ... quindi la Serial.print() sta facendo il suo dovere.

Quando tu memorizzi 'A' in EEPROM, in realtà stai scrivendo 65 decimale e quindi ... quello è quello che ottieni.

Se vuoi vedere il CARATTERE 'A' invece del valore decimale, devi usare l'apposita funzione di conversione, che ti mette a disposizione la libreria standard AVR Libc, includendo la <stdlib.h>, ovvero la ... itoa().

Nota che la AVR Libc è SEMPRE automaticamente inclusa dal IDE di Arduino e quindi è sempre a disposizione.

In pratica, letto il valore dalla EEPROM, con la itoa() lo converti in stringa di caratteri (char array) e con la Serial.print() lo stampi.

Tutto qui  XD

Guglielmo
Search is Your friend ... or I am Your enemy !

pablos71

#9
Sep 04, 2014, 01:47 pm Last Edit: Sep 04, 2014, 02:07 pm by pablos Reason: 1
Ha chiesto di volerlo solo stampare su monitor (nel primo post)  perché usare itoa....

Code: [Select]
Serial.write(Byte);       dove byte è la cella eeprom .... va visto come fa l'input dei char sulla eeprom più che altro  :( , spero non inserisca un carattere  alla volta della frase sulla eeprom
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

gpb01

Non ti seguo Pablos ...
... quando tu scrivi in EEPROM tipo : EEPROM.write(0, 'A'); sai benissimo che nella cella zero viene messo 0x41.

Quando a ritroso fai EEPROM.read(0) ... semper un char (1 byte signed) di valore 0x41 ottieni.

A quel punto, se lo vuoi come stringa alfabetica "A" da stampare con una Serial.print() usi la itoa() e la ottieni.

Se invece non interessa averlo come stringa, ma lo si deve esclusivamente vedere, allora SI, basta usare invece della Serial.print() la Serial.write() la quale manderà gli 8 bit del carattere al monitor che visualizzerà l'equivalente ASCII :)

Guglielmo
Search is Your friend ... or I am Your enemy !

tntsix

confermo il funzionamento della funzione Serial.write in questo contesto.....si visualizza correttamente il tutto.
E' possibile salvare delle stringhe a questo punto in una sola locazione di memoria della EEPROM?
Mi spiego meglio....ad esempio abbiamo appurato la possibilita di salvare dei caratteri nelle singole locazioni di memoria della EEPROM e di stampare a video il tutto tramite Serial.write()

Se a questo punto avessi un certo numero di caratteri salvati all'interno di un array di caratteri, ho visto che non è possibile praticamente fare una cosa del genere:

Code: [Select]

#include <EEPROM.h>

void setup()
{
char array[];
...
..
EEPROM.write(0,array); // salvataggio intero array all'interno della locazione di memoria 0
}

void loop()
{
}



Facendo una cosa del genere il compilatore da errore......a questo punto devo usare la funzione itoa() se voglio fare una cosa del genere?

pablos71

Bisogna che cominci a studiare e consultare i tutorial anche con google ... fino ad ora ci saresti arrivato da solo .... stai scrivendo un array di n char su una cella singola ....
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

gpb01


Bisogna che cominci a studiare e consultare i tutorial anche con google ... fino ad ora ci saresti arrivato da solo .... stai scrivendo un array di n char su una cella singola ....


@ tntsix :
... e aggiungo che tocca che ti studi anche la AVR libc che ti ho precedentemente linkato dato che, se solo gli avessi dato un occhiata, avresti visto che, invece di usare la limitatissima EEPROM.h, puoi usare la <avr/eeprom.h> la quale ... ha TUTTE le funzioni che ti servono   ]:D ]:D ]:D

Guglielmo
Search is Your friend ... or I am Your enemy !

tntsix

Non cè bisogno di essere cosi romanzati e coloriti nella risposta comunque.....non è che mi tocca studiare perche non conosco il C dato che sono riuscito a scrivere facilmente nella EEPROM con uno stupidissimo while.
Non conosco la libreria avr.eeprom, ma se non gli ho dato un occhiata avrò avuto le mie buone ragioni.

Grazie per i consigli

Go Up