Gleich gehts los...

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.

DS2450 - 4-Fach 16 Bit A/D-Wandler

Der DS2450 ist Ideal für die Verwendung zur Abfrage verschiedener Sensoren. Leider wird er nicht von allen "Smarthome" Systemen unterstützt. So ist dieser Sensosr nicht im Web-Interface von Wiregate enthalten. Auch die Loxone 1-Wire Extension unterstützt diese Sonsoren bis jetzt noch nicht.

In der Vergangenheit wird mit unter von Problemen des Chips berichtet wie z.B. CRC-Fehler bei der Abfrage. Auch ich hatte solche Probleme mit den originalen Chips, allerdings kann ich nicht auschließen, dass es am 1-Wire Bus selbst lag. Die Simulation funktionert sehr gut und ist auch schon in vielen Systemen z.B. als Multisensor im Einsatz (Vorzugsweise FHEM und IP-Symcon).

Vielfach unbekannt ist die Tatsache, dass die Eingänge des DS2450 auch als digitale Ausgäng verwendet werden können. Allerdings ist im Datenblatt kein Hinweis über maximale Ströme zu finden. Nur die Spannung bei 4mA und gegen Masse geschalteten Transistor ist angegeben.

Simulation des DS2450

Eine komplette Referenzsimulation ist in der Git-Repository im Verzeichnis owSlave2/DS2450 zu finden.

Die 1-Wire Commandos werden in der Assempler-Datei common/OWDS2450.S behandelt. Die Kommunikation erfolgt über die Struktur:

typedef union {
	volatile uint8_t bytes[0x20];
	struct {
		//Page0
		uint16_t A;  //0
		uint16_t B;  //2
		uint16_t C;  //4
		uint16_t D;  //6
		//Page1
		uint8_t CSA1;
		uint8_t CSA2;
		uint8_t CSB1;
		uint8_t CSB2;
		uint8_t CSC1;
		uint8_t CSC2;
		uint8_t CSD1;
		uint8_t CSD2;
		//Page2
		uint8_t LA;
		uint8_t HA;
		uint8_t LB;
		uint8_t HB;
		uint8_t LC;
		uint8_t HC;
		uint8_t LD;
		uint8_t HD;
		//Page3
		uint8_t FC1;
		uint8_t FC2;
		uint8_t FC3;
		uint8_t FC4;
		uint8_t VCCP;
		uint8_t FC5;
		uint8_t FC6;
		uint8_t FC7;
		uint8_t convc1;
		uint8_t convc2;
	};
} pack_t;
volatile pack_t pack;

Diese Refernzvariante verwendet nur 10 Bit für den A/D-Wandler. Mit vielen Messungen nacheinander könnte die "Auflösung" noch etwas erhöht werden. Bei der Messeinstellung 0 .. 2,55V wird die interne Spanungsrefernz von 1.1V für den A/D-Wandler verwendet.

DS2423 Dual Counter

Ein ATtiny bietet die Möglichkeit, zwei 1-Wire Chips in einem Mikrocontroller zu Simulieren. Das einzig trickreiche dabei ist es, die Search-Rom und die Match-Rom Routine entsprechend zu programmieren. Bei Gelegenheit werde ich nochmal einen separaten Artikel dazu schreiben.

Mit zwei DS2423 in einem Chip wird es bei einem ATtinyX4 schon recht eng, besonders bei dem weit verbreiten ATtiny44. Deshalb wird der SRAM beider Chips zu einem Speicherbereich zusammengelegt. Die einzelnen Counter-Werte werden wie schon bei einem einzelnen DS2423 wärend der Abfrage in die Struktur pack kopiert.

Einen passenden Quellcode mit EEPROM-Speicherung für 2x2 Zähler gibt es wie immer in der Git-Repository.

Für die Verwendung der Dual-Variante wird die Datei common/OWDS2423_DS2423.S benötigt. Dort sind alle 1-Wire Kommandos für zwei 1-Wire-Chips definiert.

DS2423 mit EEPROM-Speicherung

Schon am Anfang der DS2423-Simulation stand die Idee der EEPROM Speicherung im Raum. Das bedeutet, bei Spannungsausfall den Mikrocontroller mit einem ELKO solange zu versorgen, bis der die Werte in das EEPROM übernehmen kann. Es war dann am Ende doch etwas schwieriger und es wurde viel in Foren darüber diskutiert. Deshalb habe ich mich 2017 mich noch einmal grundlegend mit dem Problem beschäftigt. Ich will da gar nicht weiter darauf die Diskussionen eingehen, sondern nur eine Lösung präsentieren die immer funktioniert. (aktuelle Firmware vorausgesetzt).

Nebenbei bemerkt: das EEPROM des ATtiny (und auch Mega) ist nur auf 100 000 Schreibzyklen ausgelegt. Bei einem Schreiben nach jedem Zählvorgang könnte also nur bis 100 000 gezählt werden (Mit ein paar Tricks noch mehr aber auf jeden Fall begrenzt).

Schaltung

Die Schaltung ist relativ einfach. Der Mikrocontroller wird über einen ELKO versorgt, der über eine Schottky-Diode von der Versorgungsspannung getrennt ist. So lange die Versorgungspannung größer als die Spannung am Kondensator ist, wird der Kondensator geladen.

Über den Spannungsteiler an PA2 (AIN1) wird intern über den analog Comparator der Spannungszusammenbruch ermittelt. Die Widerstände können gewiss noch größer gewählt werden, nur das Verhältnis sollte erhalten bleiben.

Schaltung DS2423 Autosave
Schaltung für die DS2423-Simulation mit Autosave

Verbesserungen

Im Folgenden sind die Änderungen zur Verbesserung des Speicherns ins EEPROM beschrieben.

Comparator-Interrupt

Gegenüber dem relativ großen undefinierten Spannungsbereich zwischen High- und Low-Level ist es mit dem Comparator möglich, die Eingangsspannung an einem Pin (vorzugsweise PA2/AIN1) mit einer anderen Spannung zu vergleichen. Für die Spannungserkennung wurde dazu die interne Spannungsreferenz gewählt. AIN1 ist dabei mit dem negativen Anschluss des Comparators verbunden, die Spannungsreferenz mit dem positiven Anschluss. Bei Spannungsabfall wird der negative Eingang kleiner als die Referenz und es wird eine steigende Flanke am Comparatorausgang erzeugt. Das ist mitunter etwas verwirrend :-).

Timeout bei der Reset-Erkennung.

Lange habe ich den Grund gesucht, warum manchmal das Speichern nicht richtig funktioniert. Der Controller entlädt in diesen Fall den Kondensator mit einem relativ hohen Strom. Ich hatte die Idee, dass vielleicht irgendwo noch versteckte Ströme fließen ...

Das Problem war dann doch ein ganz anderes: wenn ein 1-Wire Reset ausgelöst wird, wartete die Timer-Interrupt-Routine bis die Leitung wieder auf High geht, d.h. der Reset-Impuls zu Ende ist. Wenn der 1-Wire-Bus zuerst abgeklemmt wird, dann bleibt der Controller in einer Schleife im Timer-Interrupt hängen und es kann kein anderer Interrupt ausgelöst werden. Abhilfe schafft hier eine Timeout-Prüfung für zu lange Reset-Impulse.

Verändern der Taktfrequenz

Mit 8 MHz benötigt der ATtiny84A mind. 2,7V um gut zu funktionieren. Darum wird vor dem Speichern in das EEPROM die Taktfrequenz auf 4MHz geändert. Somit funktioniert der Controller bis 1,8V. Das reduziert auch den Strom etwas, aber gegenüber dem Strom der für das Speichern in das EEPROM benötigt wird fällt das nicht auf.

Bei allen 1-Wire Simulationen ist es wichtig, die BODLEVEL-Fuse auf 1,8V bzw. 2,7V zu setzen! Besonders bei Schaltungen, bei denen die Spannung sehr langsam abfällt, wie die oben beschriebene.

Kontrolle ob überhaupt gezählt wurde

Meist fällt die Spannung nicht abrupt ab, sondern schwingt. Dabei kommt es vor, dass der Comparator-Interrupt viele Male aufgerufen wird, und die Werte immer wieder in das EEPROM geschrieben werden. Mit einer einfachen Variable lässt sich prüfen, ob die Werte sich verändert haben und so eine Mehrfachspeicherung verhindern.

Timings

Hier noch zwei Bilder vom zeitlichen Verlauf der Spannung am ATtiny84A. Der Speichervorgang dauert ziemlich genau 50ms.

Speicherzeit im 20 ms Raster
Speicherzeit im 20 ms Raster

Spannungsabfall im Überblick
Spannungsabfall im Überblick

Quellcode

Unter Sourcecode gibt es eine passende Variante des Quelltextes im Verzeichnis DS2423_Autosave. Dort sind alle beschriebenen Algorithmen eingepflegt.

DS2423 mit DS2413 zum Zurücksetzen

Wenn zwei 1-Wire Chips in einem Controler möglich sind, gibt es eine Vielzahl an Variationsmöglichkeiten. So kam vereinzelt der Wunsch auf, die Zähler auf irgend eine Weise über den 1-Wire-Bus auch rücksetzen zu können.

Sicher, es könnte einfach ein bestimmter Wert an eine bestimmte Stelle in den SRAM-Speicher des DS2423 geschrieben werden. Mit diesem wäre es kein Problem dann den Zähler zurück zu setzen oder einen Wert einzustellen. Aber viele Softwaresysteme für 1-Wire unterstützen den Zugriff auf das SRAM gar nicht. Eine weitere Möglichkeit ist die Simulation eines DS2413, der ja ein zweifach PIO darstellt.

Wird PIOA eingeschaltet, dann wird der Counter von Page 14 (Counter A) zurückgesetzt. Genau das gleiche gilt dann für PIOB und Counter B.

Einen passenden Quellcode für diese Variante gibt es unter DS2423_DS2413 in der Git-Repository.

Für die Verwendung der Dual-Funktionen wird die Datei common/OWDS2423_DS2413.S benötigt. Dort sind alle 1-Wire Kommandos entsprechend für zwei 1-Wire-Chips aufgegliedert.

Neu Schutzlack

Für einen Aufpreis von 3 € können alle Module mit Schutzlack versiegelt werden. (abgesehen von den Sensoröffnungen 😉)

Option Schutzlack

Neue Artikel im Shop

Zum Seitenanfang