DS2450 mit dem Pokeys auslesen (Teil 1)

Wenn man sich erst einmal mit 1-Wire beschäftigt, entdeckt man, dass es eine Menge toller Sensoren gibt, die man darüber anbinden kann. Natürlich wollen wir diese Sensoren über unseren Pokeys ansprechen. Bei tm3d.de haben wir einen 4-Fach Sensor gefunden, der auf dem DS2450 basiert. Dieser kann neben der Temperatur auch die Luftfeuchte, den Luftdruck und die Helligkeit messen. Das klingt nach dem idealen Sensor um zu überwachen, wie gut es den Pflanzen geht.

Leider lässt sich der Sensor nicht einfach über Easy-Sensor einbinden. Der Pokeys erkennt den Sensor leider nicht. Also ist die einzige Möglichkeit, ihn über PoBlocks anzusprechen. Wie dies funktioniert, zeigen wir in den folgenden Absätzen.

 

1. Schritt: Adresse des Sensors auslesen

Dazu wird der Sensor als einziger Sensor an die Pin 51 anschließen. So kann man schon mal ganz einfach die Adresse des Chips auslesen. Dazu verwendet man den Clock Source Baustein (Unter Trigger/Timing) und den 1-Wire Baustein (Unter Communication).

PoBlocks 1-Wire Baustein für den ReadRom Befehl verwenden

Den 1-Wire Baustein konfiguriert man so, dass er einen Eingang und 8 Ausgänge hat. In den Eingang schickt man das Signal 51 (0x33), was dem Befehl ReadRom entspricht.

Am besten notiert man sich die Adresse, da sie im folgenden Script benötigt wird.

2. Schritt: DS2450 konfigurieren

Bevor der Chip DS2450 verwendet werden kann, um Daten auszulesen muss er initialisiert werden. Die Initialisierung besteht daraus, dass in verschiedenen Seiten per WritePage (0x55) Befehl Daten eingetragen werden.

Da die 1-Wire Befehle für diesen Chip etwas komplexer ist, reicht es nicht, den 1-Wire Baustein zu verwenden, den wir zum Auslesen der Adresse verwenden konnten. Deswegen müssen die Befehle jetzt per CustomPoil (Unter Extended) selbst programmiert werden.

Konfiguration des CustomPoil

Den ersten CustomPoil verwenden wir, um die Adresse des Chips konstant auszugeben. So können wir sie in den verschiedenen Blöcken verwenden und sie leichter ändern.

Es wird ein CustomPoil hinzugefügt. Per Doppelklick öffnet sich ein Fenster, wie im Bild zu sehen. Es werden 8 Output Variablen angelegt und diese werden im Code mit festen Werten belegt und dann ausgegeben.

PoBlocks CustomPoil für die Ausgabe einer 8 Byte Adresse

Der Block gibt jetzt also eine feste Adresse aus. Den Block verwenden wir jetzt immer, wenn wir irgendwo eine Adresse brauchen.

Als erstes werden wir die Adresse verwenden, um den DS2450 zu initialisieren. Hierzu verwenden wir einen weiteren CustomPoil. Dieser wird jetzt neben einem CLK Eingang die Adresse als Eingabe bekommen. Als Ausgabe hat er nur ein Busy Flag, das später genutzt wird, um weitere Bausteine hinter diesen Baustein packen zu können.

PoBlocks Aufbau für Initialisierung des DS2450

Allgemeines zum Init Block

Das Programm des Init Block CustomPoil ist etwas länger als das Programm für die Sensor Adresse. Im Bild sieht man, dass einige Variablen benötigt werden. Diese werden im Speicher hintereinander geschrieben, so dass wir sie später als Daten für das Schreiben auf den 1-Wire Bus verwenden können und zum Auslesen der Daten, die wir bekommen.

Das Programm funktioniert als State-Maschine, die nach und nach die einzelnen Zustände durchgeht. Das sind die folgende Schritte:

  • Warten auf eine Flanke zum Starten der Abarbeitung
  • Testen, ob der DS2450 schon initialisiert ist (wenn ja, direkt zum Ende springen), dieser Schritt besteht aus 3 Schritten, den Senden des Befehls, dem Warten auf die Antwort und dem Lesen und Auswerten der Antwort
  • Auf Seite 1 und 3 müssen jeweils Daten geschrieben werden, das besteht wieder aus den 3 Schritten Senden des Befehls, Warten auf die Antwort und Auswerten der Antwort.
  • Warten bis der Takt abgeschlossen ist, bevor wieder in den ersten Zustand gewechselt wird.

Testen ob der DS2450 schon initialisiert ist

Wir wollen testen, ob der DS2450 seit dem letzten Neustart initialisiert wurde. Dazu überprüfen wir auf Seite 3, ob hier im Register 5 der Eintrag 0x40 steht. Diesen schreiben wir bei der Initialisierung in das Register und der Eintrag wird bei einem Neustart des Chips immer überschrieben. Der Block, mit dem der Lese-Befehl gesendet wird, ist hier zu sehen:

LOAD BL[h55] # ReadRom
STORE t0
LOAD addr1 # Adresse in den Speicher schreiben
STORE t1
LOAD addr2
STORE t2
LOAD addr3
STORE t3
LOAD addr4
STORE t4
LOAD addr5
STORE t5
LOAD addr6
STORE t6
LOAD addr7
STORE t7
LOAD addr8
STORE t8
LOAD BL[hAA] # Read Page
STORE t9
LOAD BL[h18] # Seite 3
STORE t10
LOAD BL[h00]
STORE t11
PUSH BL[h10] # Befehl fuer 1-Wire zusammenstellen
PUSH &t0
PUSH BL[12]
PUSH BL[10]
CALL WL[hFF0A]
LOAD S

Wie man erkennen kann, werden die Scripte selbst für einfache Befehle schnell sehr lang. Hier wurde gerade einmal 1-Wire Befehl mit 30 Zeilen Code erzeugt. Auf den 1-WireBus schreiben wir mit dem Code  folgenden Befehl: 0x55 addr1 addr2 addr3 addr4 addr5 addr6 addr7 addr8 0xAA 0x18 0x00.

Jetzt lauschen wir auf dem 1-Wire Bus so lange, bis als Status Fertig kommt. Dies erledigt der folgende Befehl:

PUSH BL[h11] # Aktuellen Befehl erneut an den Bus senden
PUSH &t0
PUSH BL[12]
PUSH BL[10]
CALL WL[hFF0A]
LOAD S # Status des Bus lesen
CMPEQ BL[h10] # h10 - noch am arbeiten
JMPT caseWaitInitTestDoNothing
LOAD DL[12] # Wechsel zu naechstem Status
STORE state
caseWaitInitTestDoNothing:
JMP endSwitchInit

Hierbei nutzen wir aus, dass im Speicher des Bausteins immer noch die gleichen Befehle stehen. Meldet der Befehlt den Status Fertig, so befinden sich die Daten im Speicher und können ausgewertet werden. Uns interessiert hier der Wert, der in t4 steht, um zu entscheiden, ob der DS2450 initialisiert werden muss.

LOAD t4
CMPEQ DL[h40]
JMPF caseStartInitWrite1  # Wenn nicht 0x40 drin steht, geht es zum naechsten Status
LOAD DL[60] # Wechsel zu Ende-Status
STORE state

Weitere Befehle im Init Block

Um jetzt die DS2450 zu mit den richtigen Werten initialisieren, müssen wir die folgenden beiden Befehle auf den 1-Wire Bus senden:

  • 0x55 addr1 addr2 addr3 addr4 addr5 addr6 addr7 addr8 0x55 0x1C 0x00 0x40 (Eintrag auf Seite 3)
  • 0x55 addr1 addr2 addr3 addr4 addr5 addr6 addr7 addr8 0x55 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 (Eintrag auf Seite 0)

Für beide Befehle führen wir den gleichen Ablauf aus, wie oben beschrieben. Das komplette Script für den Baustein findet sich hier: InitDS2450.

Weiterführende Links

2 Antworten auf „DS2450 mit dem Pokeys auslesen (Teil 1)“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.