[Vorerst erledigt] Fragen zur fram.h von tommy56

Hallo zusammen,

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.

#include "fram.h"

char framCharValue[16];
byte framINTValue;

void setup()
{
  Serial.begin(115200);
  readFramChar(0);
  Serial.println(framCharValue);
  readFramInt(20);
  Serial.println(framINTValue);
  readFramChar(32);
  Serial.println(framCharValue);
  readFramInt(52);
  Serial.println(framINTValue);
}

void loop()
{
  
}

void readFramChar(uint16_t fAddr) {
  byte readValue = 1;
  
  for (byte i = 0; readValue > 0; i++)
  {
    fRamRead(fAddr, readValue);
    //Serial.println((char) readValue);
    framCharValue[i] = (char) readValue;
    fAddr++;
  }
}

void readFramInt(uint16_t fAddr) {
  byte readValue;

  fRamRead(fAddr, readValue);
  //Serial.println(readValue);
  framINTValue = readValue;
}

Serielle Ausgabe:

Joerg
42
Ingo
46

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.

Anbei die fram.h und Sketch+fram.h gezippt.

Viele Grüße
Jörg

ProMini.zip (2.37 KB)

fram.h (5.9 KB)

Du bist doch nicht erst seit gestern dabei. Warum setzt Du Deine Quellcodes nicht in Codetags?

Also die fram.h von mir kann beliebig große Zahlen und auch char-Arrays speichern und lesen.

Gruß Tommy

Edit: Das wird in der Beispieldatei im Thread auch gezeigt.

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.

Edit: Es geht übrigens um diesen Thread.

Und was ist in der "ProMini.zip" ?
Das ist für portable User auch sehr umständlich.

HotSystems:
Und was ist in der "ProMini.zip" ?
Das ist für portable User auch sehr umständlich.

Das ist nur der Projektordner aus der IDE, mit dem Sketch aus #0 als .ino und der fram.h, falls das jemand in der IDE öffnen will, mehr nicht :wink:

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.

Gruß Tommy

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.

Sorry, der besagte Beispielcode hat mir echt gefehlt, da war ich wohl blind... :astonished: 8)

So werde ich wohl weiterkommen.

Ok, der Thread geht durch die Korrekturen ja auch etwas durcheinander. Das Beispiel ist viel weiter vorn, als die Endfassung der fRam.h.

Falls Du noch Fragen hast, melde Dich.

Gruß Tommy

Ok, der Thread geht durch die Korrekturen ja auch etwas durcheinander. Das Beispiel ist viel weiter vorn, als die Endfassung der fRam.h.

Jo, ein wenig :wink: Ich hatte allerdings damit auch etwas länger pausiert.

Hab den Beispielcode eben geflasht und getestet, läuft hervorragend. Ich melde mich falls ich Fragen habe. :slight_smile:

Hi

Du hattest eine weitere Version in Aussicht gestellt - hätte kein Problem damit, wenn Du Diese im Nachbar-Universum an den Thread noch anhängst.

... müsste mit meinen FRam's auch Mal wieder spielen ... vorerst sind aber erst Mal SD-Karten dran ...

MfG

Hier ist sie.

Gruß Tommy

@Tommy56
So wie ich das für meinen Teil bereits sagen kann, läuft das auch mit bis zu 256k (32KB), nicht nur mit 64k.

Danke für die Rückmeldung. Ich hatte damals nur bis 64k getestet.

Gruß Tommy

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 :wink:

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.

Gruß Tommy

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… :smiley: Aber gut zu wissen :slight_smile:

Das war auch eher "falls man es mal braucht" und "weil ich gerade dabei bin".

Gruß Tommy