DS2423 - Speicher und Counter

Beschreibung des Original-Chips

Der DS2423 ist ein CHIP mi 4096 Bit SRAM (kein EEPROM!!) und vier 32 Bit Zählern, wobei zwei davon nach außen geführt sind und bei der H->L Flanke zählen. Die zwei anderen Counter zählen die Schreibzyklen im SRAM. Der Speicher ist in 16 Pages (0-15) zu je 32 Bytes organisiert. Die Counter sind an die Pages 12-15 "angehängt", d.h. nach dem Lesen der Page, wird beim weiteren Lesen mit dem Befehl Read Memory + Counter [A5H] die Zähler-Werte mit ausgegeben. Oft wird in der Software (z.B. FHEM) nur die Zähler der Page 14 und 15 ausgelesen, da diese mit den physikalischen Eingängen verknüpft sind.

Leider wird der Original-Chip DS2423 nicht mehr hergestellt und auch ein äquivalenter Ersatz ist nicht in sicht. Gerade der aktuelle Boom an elektronischen Stromzählern, erfordert aber solch einen Chip, den die Zähler haben in der Regel einen S0-Ausgang, der 1000 Impulse pro kWh ausgibt. Aber auch viele Gaszähler haben besitzen die Möglichkeit, Reedkontakte anzubringen.

Unterstützung in Systemen

Hier nur mal eine unvollständige Information zu verschiedenen Systemen. Ich kann leider nicht alles selber testen. Bitte schreibt mir eine kurze Info, falls ihr es anders erlebt, oder sich inzwischen etwas geändert hat.

SystemUnterstützungAnmerkung
Fhemnur ZähleingängePage 14 -> A Page 15 -> B
OWFSAlle Zählerüber pages/count.12 usw. theoretisch 16 Zähler machbar
Wiregatenur Zählereingängevielleicht ohne Web-Interface über OWFS mehr
IP-Symconzwei Zählereingängevielleicht auch mehr?
LoxoneNicht unterstützt

In allen genanten Systemen funktioniert auch die Simulation des DS2423.

Simulation

Die 1-Wire Befehle für den DS2423 sind in der Datei "\common\OWDS2423.S" zu finden. Sie beziehen sich auf eine in pack gespeicherte Struktur:

typedef union {
	uint8_t bytes[45];
	struct {
		uint16_t addr; //Speicheradresse
		uint8_t status; //Endadresse und Flags
		uint8_t scratch[32]; //Scratchpad bzw. "Speicherinhalt"
		uint32_t counter;  //Zaehler (aktueller Zaehlerstand wird beim Auslesen an diese Stelle kopiert)
		uint32_t zero;  //4 Byte 0x00 nach Protokoll
		uint16_t crc;  //Platz fuer CRC
	};
} counterpack_t;
volatile counterpack_t pack;

Der aktuell ausgelesene Zähler (mit Hilfe der Page-Adresse) wird vor dem Auslesen an die Stelle counter kopiert. Die Counter selber sind in einem Union mit verschiedenen Zugriffsmöglichkeiten gespiechert:

typedef union {
	uint32_t c32[4];
	uint8_t c8[16];
} counters_t;

volatile counters_t counters;

Der Zählvorgang selbst erfolgt über den Pin Change Interrupt. Beim Attiny84A sind damit die Ports PA0 - PA7 als Zähleingänge möglich. Entgegen des Originals ist die Aktivierung des interen Pullup-Widerstandes sinnvoll. In der Git-Repository gibt es ein einfaches Beispiel.

Variationen

Natürlich lässt sich der Counter auch komplett zweckentfremden und zur Ausgabe beliebiger Messwerte verwenden.

Zum Seitenanfang