in einem meiner vergangenen Threads hat mir Tommy56 seine, bzw. die mit seiner Hilfe, erstellte fram.h empfohlen und ich beschäftige mich jetzt seit einiger Zeit damit und bin jetzt an einem Punkt wobei ich Hilfe und Denkanstöße brauche.
Auf meinem 32 KByte FRAM habe ich an den Adressen (in Byte) 0 und 32 Namen gespeichert und dazu jeweils an den Adressen 20 und 52 das dazugehörige Alter.
Mit diesem Sketch kann ich die Daten auch auslesen und im seriellen Monitor ausgeben.
Was ich nicht verstehe ist, wie ich die Funktion readFramChar() mit einem Rückgabewert versehen kann, char Arrays sind als Rückgabe scheinbar nicht zugelassen. Derzeit nutze ich dafür ein globales char Array, das ich dann weiter verarbeiten kann. Gibt es da eine bessere Lösung?
Zum anderen habe ich ein Verständnisproblem mit dem Speicher und Abrufen von größeren Zahlen, im Sketch rufe ich die im Zahlen im Byte-Bereich auf, aber Int größer 255 werden oder sollten auf mehrere Adressen verteilt werden, Speichern der Zahlen hatte ich auch schon mal versucht, aber ich kriege die Zahl zum Überprüfen nicht korrekt ausgelesen (oder weißt nicht wie ich mit der Ausgabe umzugehen habe). Wie kriege ich die Funktion readFramInt() so umgebaut, dass ich den korrekten Wert ausgelesen oder angezeigt kriege.
Oder mache ich schon beim Speichern der Zahlen einen Fehler und muss die vorher irgendwie umwandeln oder splitten?
Ich will zum Beispiel ein Datum im Format Jahr Monat Tag (20191110) erfassen, später auslesen und weiterverarbeiten.
Tommy56:
Du bist doch nicht erst seit gestern dabei. Warum setzt Du Deine Quellcodes nicht in Codetags?
Den Sketch habe ich doch in Code-Tags gesetzt, oder meinst du die fram.h? Die hatte ich nicht als relevant angesehen
Also die fram.h von mir kann beliebig große Zahlen und auch char-Arrays speichern und lesen.
Mit char-Arrays hab ich ja auch keine größeren Probleme, nur mit die großen Zahlen, aber ich hab in letzter Zeit vielleicht zu viel getestet und seh den Wald vor lauter Bäumen nicht mehr...
Gruß Tommy
Edit: Das wird in der Beispieldatei im Thread auch gezeigt.
Ok, ich lese mir den Thread nochmal durch, vielleicht oder sehr wahrscheinlich habe ich was übersehen.
Was ich nicht verstehe ist, wie ich die Funktion readFramChar() mit einem Rückgabewert versehen kann, char Arrays sind als Rückgabe scheinbar nicht zugelassen.
Arrays solltest du erst mal verstehen. In C/C++ sind Arrays keine Objekte. Array Variablen sind nicht viel mehr als Zeiger auf das erste Element. Und du darfst keine Zeiger auf lokale Variablen zurückgeben.
Normal übergibt man daher ein Array als Parameter und gibt dann das Array wieder zurück. Dann kann man die Funktion direkt in andere Funktionen einsetzen
@wapjoe: Du hast die Vorgehensweise nicht verstanden.
Wenn Du einen int lesen willst, musst Du natürlich auch einen int und nicht ein Byte übergeben.
Dein Code:
void readFramInt(uint16_t fAddr) {
byte readValue;
fRamRead(fAddr, readValue); // <----- Wenn Du hier ein byte übergibst, wird er auch nur ein Byte lesen
//Serial.println(readValue);
framINTValue = readValue;
}
Besser (Wenn man es unbedingt nochmal in Funktionen kapseln will):
int readFramInt(uint16_t fAddr) {
int readValue;
fRamRead(fAddr, readValue);
//Serial.println(readValue);
return readValue;
}
Ich verstehe nicht ganz, warum Du alles erst nochmal in eigene Funktionen packst. Du kannst fRamRead doch direkt mit beliebigen Typen aufrufen. Das ist doch der Vorteil von Templates.
Das mit dem byte ist mir schon klar, das hab ich auch nur für das Beispiel so gesetzt. Ja das in eigene Funktionen zu setzen ist sehr wahrscheinlich übertrieben und eine Spielerei. Ich versuche das jetzt mal mit deinem Beispielcode aus #10 im Thread und baue darauf auf, die Beispiele sind mir komplett untergegangen. Danke für die Hinweise.
Serenifly:
Arrays solltest du erst mal verstehen. In C/C++ sind Arrays keine Objekte. Array Variablen sind nicht viel mehr als Zeiger auf das erste Element. Und du darfst keine Zeiger auf lokale Variablen zurückgeben.
Normal übergibt man daher ein Array als Parameter und gibt dann das Array wieder zurück. Dann kann man die Funktion direkt in andere Funktionen einsetzen
Ja, das und vieles weitere Wissen fehlt mir noch, leider finde ich zu wenig Zeit und kann mich nur nebenbei damit befassen.
Tommy56:
Danke für die Rückmeldung. Ich hatte damals nur bis 64k getestet.
Gruß Tommy
Ach so, die neue Version hab ich noch nicht getestet, aber der Vorgänger läuft mit 256k. Theoretisch sollte der auch auf bis zu 512k (64KB) laufen, wegen der 2-byte Speicheradresse (bis 0xFFFF), das ist jetzt allerdings reine Spekulation/Theorie
Wenn die erste Version läuft, läuft auch die zweite, weil da der einzige Unterschied ist, dass die I2C-Adresse des FRAM nicht fest ist, sondern bei jedem Aufruf mit durchgereicht wird, so dass man wahlweise mehrere FRAM betreiben kann.
Ich weiß schon jetzt nicht was ich mit 32 KB alles speichern soll, ich brauche nur einen Bruchteil des Speichers, ein 2. FRAM wäre in meinem Fall arg übertrieben… Aber gut zu wissen