Lektion 6: EEPROM & Co.

In diesem Kapitel möchten wir dir die Kleinigkeiten rund um die Konnekting-Bibliothek näher bringen. Hier werden auch Fragen aus dem Forum aufgegriffen und die Lösungen näher erläutert.

Inhaltsverzeichnis

EEPROM

Externes EEPROM

Wie in der letzten Lektion bereits erwähnt, nutzt Konnekting ein EEPROM, um Gruppenadressen und Parameter zu speichern. Da der SAMD21G18 kein internes EEPROM besitzt, muss ein externes EEPROM her. Dazu eignet sich z.B. ein 24AA256 (32 K x 8). Wenn deine Applikation viele Daten nichtflüchtig speichert, dann solltest du prüfen, ob du damit auskommst. Der DemoSketch bringt die EEPROM_24AA256.h mit den Funktionen für den Zugriff mit. Du musst nur noch die Funktionspointer an Konnekting übergeben

    Wire.begin();
    Konnekting.setMemoryReadFunc(&readMemory);
    Konnekting.setMemoryWriteFunc(&writeMemory);
    Konnekting.setMemoryUpdateFunc(&updateMemory);
    Konnekting.setMemoryCommitFunc(&commitMemory);

und danach dann Konnekting initialisieren.

Flash als EEPROM

Konnekting greift hauptsächlich lesend auf das EEPROM zu. Wenn deine Applikation nur wenige Schreibzugriffe durchführt, dann kannst du auch den internen Flash-Speicher als EEPROM-Ersatz nutzen. Dazu gibt es die KonnektingFlashStorage-Bibliothek. Diese wird zunächst eingebunden und ein Speicherbereich festgelegt:

// internes Flash als EEPROM
#include <FlashAsEEPROM.h>
Flash(my_eeprom_storage, 2048);

Nun benötigt man noch die vier Funktionen für den Zugriff:

byte readMemory(int index) {
	return EEPROM.read(index);
}

void writeMemory(int index, byte val) {
	EEPROM.write(index,val);
}

void updateMemory(int index, byte val) {
	EEPROM.update(index,val);
}

void commitMemory() {
	EEPROM.commit();
}

Im Setup muss das EEPROM initialisiert werden:

	// tell the EEPROM implementation which flash to use
	EEPROM.setStorage(&my_eeprom_storage);

Danach geht es dann wie beim externen EEPROM weiter.

ACHTUNG! Der Flash-Speicher wird beim Neuprogrammieren der Firmware überschrieben. Das Gerät muss nach dem Flashen neu parametriert werden.

EEPROM in der Applikation

Damit deine Applikation weiß, wo sie ihre Daten speichern kann, stellt Konnekting eine Funktion bereit, die den Beginn des freien EEPROM-Speichers zurückgibt. Lesen der ersten Speicherstelle für die Applikation sieht so aus:

a = EEPROM.read(Konnekting.getMemoryUserSpaceStart());

Prog-Button und Prog-LED

Bislang haben wir immer mit einem Button an einem Interruptanschluss gearbeitet, um das Gerät in den Programmiermodus zu versetzen. Hat man aber bereits viele Taster auf der Frontplatte und wenig Platz für einen weiteren, den man dazu auch noch selten benötigt, dann kann man auch die vorhandenen Taster nutzen. Das Gleiche gilt für die LED, die den Programmiermodus anzeigt. Dazu schreibst du zunächst eine Funktion, die die entsprechende Anzeige ein- oder ausschaltet:

void progLed(bool state)
{
    //hier steht dein Programmtext zum Anzeigen des Prog-Status
    //z.B. digitalWrite(PROG_LED_PIN, state);
    //kann aber auch eine LCD-Anzeige o.ä. sein
}

Die Initialisierung von Konnekting sieht dann so aus:

    Konnekting.init(KNX_SERIAL,
                    &progLed,
                    MANUFACTURER_ID,
                    DEVICE_ID,
                    REVISION);

Du übergibst Konnekting also einfach die Funktion für die Statusanzeige. Um den Progstatus umzuschalten, musst du die dafür vorgesehene Tastenprozedur in deiner Tastaturroutine auswerten und dann die Funktion

	    Konnekting.toggleProgState();

aufrufen. Voila.

<– Lektion 5: Nun mit Konnekting