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).
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.
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.
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.
2 Antworten auf „DS2450 mit dem Pokeys auslesen (Teil 1)“