In der aktuellen CT Hardware Hacks (2/2012) hab ich in der Rubrik "Lieblingswerkzeuge" den Bus Pirate gefunden, bestellt und ausprobiert. Das ist ein wirklich hilfreiches Werkzeug, das sich mit meinem Logic ganz wunderbar ergänzt, weil er nicht nur beim analysieren hilft, sondern auch aktiv mit etwas sprechen kann. Bisher hab ich nur den 1-wire Modus benutzt und ein bisschen mit einem DS1820 (ein digitaler Temperatursensor) geplaudert. Und das klappte richtig gut. Ich hab allerdings - abgesehen von einer tabellarischen Auflistung von Meta-Befehlen des 1-wire Modus, und einem DS1820 bezogenen Howto auf italienisch - keine schöne Anleitung dazu im Netz gefunden. Deshalb schreib ich es hier hin, und vielleicht findet es ja irgendwann mal jemand nützlich.
Ich hab den DS1820 im nicht-parasitären Modus an den Bus Pirate angeschlossen, damit ich die internen Pullups verwenden kann, weil ich gerade keine passenden Widerstände da hatte. Im parasitäten Modus benötigt der Sensor einen kleineren Pullup Widerstand (5kΩ laut Datenblatt). Im nicht-parasitäten Modus reichen die 10kΩ der internen Pullups des Bus Pirates. Ich habe es also folgendermaßen angeschlossen (siehe Bild):
GND an GND, 5V an Vdd, MOSI an DQ, und VPU an DQ für die Pullups.
Los gehts:
- Den Bus Pirate in den 1-Wire Modus schalten
HiZ>m2 1WIRE routines (C) 2000 Michael Pearce GNU GPL Ready 1-WIRE>
- Spannungsversorgung einschalten
1-WIRE>W Power supplies ON
- Pullups an
1-WIRE>P Pull-up resistors ON
Ein {
führt im 1-Wire Modus einen Bus-Reset durch, d.h. zieht die Leitung 45us auf Low, worauf der DS1820 einen Precedence-Impuls sendet. Wenn das klappt, sagt der Bus Pirate BUS RESET OK
, ansonsten gibts eine BUS RESET Warning
. So sieht man schon mal, ob man bis hier hin prinzipiell richtig liegt.
Die ROM-Adressen der am Bus angeschlossenen Devices bekommt man entweder mit dem SEARCH ROM [F0h]
Command (mehrere Devices am Bus), oder READ ROM [33h]
Command (nur 1 Device am Bus) heraus. Alle Befehle hab ich dem Datenblatt des D1820 entnommen.
- In meinem Fall reicht ein READ ROM. Die Sequenz ist: BUS RESET, READ ROM, 8 Bytes lesen
1-WIRE>{ 0x33 r:8 BUS RESET OK WRITE: 0x33 READ: 0x10 0x28 0xBD 0xDD 0x01 0x08 0x00 0x0E
Der Sensor besitzt ein Scratchpad, in das er auf Befehl die Temperatur schreibt. Von dort aus kann sie anschließend gelesen werden. Der CONVERT-Befehl überträgt die Temperatur eines bestimmten Devices auf sein Scratchpad. Um das jeweilige Device anzugeben, verwendet man den Befehl MATCH ROM [55h]
. Wenn es nur ein einziges Device auf dem Bus gibt, kann man die Adressierung mit SKIP ROM [CCh]
überspringen.
- Die Sequenz ist in meinem Fall also entweder: BUS RESET, SKIP ROM, CONVERT oder BUS RESET, MATCH ROM, 0x10 0x28 0xBD 0xDD 0x01 0x08 0x00 0x0E, CONVERT
1-WIRE>{ 0xcc 0x44 BUS RESET OK WRITE: 0xCC WRITE: 0x44
- Jetzt noch das Scratchpad lesen: BUS RESET, SKIP ROM, READ SCRATCHPAD, 9 Bytes lesen (oder eben MATCH ROM + Adresse, statt dem SKIP ROM)
1-WIRE>{ 0xcc 0xbe r:9 BUS RESET OK WRITE: 0xCC WRITE: 0xBE READ: 0x2D 0x00 0x4B 0x46 0xFF 0xFF 0x04 0x10 0xB3
Die ersten beiden Bytes der Ausgabe sind die Temperatur. 0x0000 entspricht 0°C, die Auflösung ist 0.5°C. 0x2D 0x00
entspricht also 22.5 °C - das ist die Temperatur in meinem Keller.
Byte 2 und 3 der 9 Bytes sind Alarm-Trigger, die man setzen kann. Byte 5 und 6 werden nur intern verwendet, Byte 6 und 7 sind interne Zähler zur Temperaturmessung und erlauben bei trickreichem Zugriff eine höhere Auflösung als 0.5°C Schritte, und Byte 8 ist eine CRC über Byte 0 - 7. Steht auch alles im Datenblatt.
Thats it. :-)