F-RAM (ferroelectric random access memory)

FRAMFRAM module
De superkleine Adafruit SPI FRAM Breakout module heeft 8 kbyte geheugen. De inhoud van het geheugen blijft ook als er geen spanning is levenslang bewaard. Deze module is vooral geschikt om kleine hoeveelheden gegevens, die je niet kwijt wilt als de Arduino wordt uitgezet, te bewaren. Je kunt denken aan een lijst met de hoogste scores bij een spel, of meetgegevens. Voor het opslaan van grote hoeveelheden data en foto's kun je beter een SD kaartje gebruiken.
Het kost weinig moeite de module aan het werk te krijgen met het programmeervoorbeeld van Adafruit. Het programma bestaat uit een tellertje dat begint bij 0 en wordt elke keer dat je opnieuw opstart met één verhoogd. De bedoeling is dat je de tekst maar één keer in het geheugen zet en andere keren niet. Zo kun je nagaan dat na uitzetten van de spanning en weer aanzetten de tekst hetzelfde gebleven is. Het voorbeeld mag dan goed werken, maar de werking wordt slecht uitgelegd en ook aan de sketch zelf valt nogal veel te verbeteren. Een ander probleem is dat het tellertje een byte is en dat deze dus na de 256e keer over de kop gaat. Er is echter geen functie aanwezig in de bibliotheek die integers kan wegschrijven. Dat nu geeft een probleem, want hoewel je zelf gemakkelijk een functie kunt maken die dit wel doet, moet je een keuze maken: hoge byte eerst, of de lage? Als Adafruit later alsnog een read16 functie aan zijn bibliotheek toevoegt dan kunnen zij een andere keus gemaakt hebben. Je zou dan altijd je eigen functie moeten blijven gebruikenb of je FRAM opbnieuw beschrijven. Ik zie net dat Adafruit inmiddels ondersteuning heeft voor 24 en 32 bits adressen. Moet ik nog testen! Ik heb hieronder mijn versie gezet met een functie leesInt en schrijfInt, met de lage byte eerst. Ik heb deze opzettelijk niet toegevoegd bij de fram functies. Je hoeft de pinnen HOLD en WP niet per se aan te sluiten, maar als je een deel van je geheugen wilt blokkeren dan moet de pin WP (writeprotect) op VCC worden aangesloten (of op een digitale pin die je via een programma hoog of laag kunt zetten).
#include "Adafruit_FRAM_SPI.h"
/* Voorbeeld voor de Adafruit SPI FRAM module */
byte FRAM_CS = 10;
Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_CS);  // gebruik hardware SPI
/*
  Je kunt het geheugen op andere pinnen aansluiten, maar dan werkt dit veel trager
  byte FRAM_SCK = 13;  // Zet hier de door jou gekozen pin
  byte FRAM_MISO = 12; // Zet hier de door jou gekozen pin
  byte FRAM_MOSI = 11; // Zet hier de door jou gekozen pin
  Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_SCK, FRAM_MISO, FRAM_MOSI, FRAM_CS);
*/
int leesInt(int adres) {
  byte a = fram.read8(adres);
  byte b = fram.read8(adres + 1);
  return (a & 0xFF) + ((b << 8) & 0xFF00);
}

void schrijfInt(int adres, int getal) {
  fram.write8(adres, getal & 0xFF);
  fram.write8(adres, getal >> 8);
}

void setup(void) {
  Serial.begin(9600);
  if (fram.begin()) {
    Serial.println("SPI F - RAM aanwezig");
  } else {
    Serial.println("Geen SPI F - RAM gevonden ... controleer de aansluitingen");
    while (true); // blijf wachten, Arduino moet opnieuw opgestart worden
  }
  // Lees de integer op het eerste adres (dat is adres 0)
  int test = leesInt(0);
  Serial.print(test); Serial.println(" keer opgestart...");

  fram.writeEnable(true);
  schrijfInt(0, test + 1);
  fram.writeEnable(false);

  /*  // BELANGRIJK: Haal de eerste keer de /* weg en zet deze later weer terug
    fram.writeEnable(true);
    fram.write(2, (uint8_t *) "Theo was hier.. !", 17); // Zet hier uw eigen tekst en lengte daarvan
    fram.writeEnable(false);
  */ // BELANGRIJK: Haal de eerste keer */ weg en zet deze later weer terug

  // Laat eerste deel van het geheugen zien.
  byte value;
  for (int a = 2; a < 18; a++) { // maximum: a < 8192
    value = fram.read8(a);
    if ((a % 32) == 0) {
      Serial.println(); Serial.print(a); Serial.print(": ");
    }
    else if (value < 1) Serial.print(0);
    else Serial.print(char(value)); // "char" Werkt alleen goed met tekst
  }
}

void loop(void) {
}