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.
System | Unterstützung | Anmerkung |
---|---|---|
Fhem | nur Zähleingänge | Page 14 -> A Page 15 -> B |
OWFS | Alle Zähler | über pages/count.12 usw. theoretisch 16 Zähler machbar |
Wiregate | nur Zählereingänge | vielleicht ohne Web-Interface über OWFS mehr |
IP-Symcon | zwei Zählereingänge | vielleicht auch mehr? |
Loxone | Nicht 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
- Speicherung der Zählwerte im EEPROM bei Zusammenbruch der Versorgungspannung
- Zwei DS2423 in einem Attiny84A
- Simulation von einem DS2423 mit einem DS2413 zum Zurücksetzen der Counter-Werte über 1-Wire
- Anpassung an die an die Platine im FHEM Wiki
Natürlich lässt sich der Counter auch komplett zweckentfremden und zur Ausgabe beliebiger Messwerte verwenden.