Hi Leute,
wie versprochen stelle ich hier mal einige meiner Entwicklungen zum Nachbasteln und Herumexperimentieren ein.
Etwas heikel ist die Entwicklung von eigenen 1-Wire-Slaves. Maxim scheint nicht besonders erpicht darauf zu sein, aber es fehlen leider zu viele Komponenten für ein umfassendes System. Außerdem werden gute und sinnvolle Bauteile (z.B. DS2423, DS2450) abgekündigt. Deswegen finden sich im Internet einige Ansätze, vorhandene Bausteine durch den Einsatz von Mikrocontrollern nachzubauen oder neue zu entwickeln.
Hier einige gute Beispiele:
->
http://www.mikrocontroller.net/topic/241934#new->
http://www.mikrocontroller.net/topic/44100 (vor allem DS2423)
->
http://www.mikrocontroller.net/topic/271772 (DCF77)
->
http://www.tm3d.de/index.php/1-wire-device-mit-avr (DS18B20, DS2423, Barometer)
->
http://www.mcselec.com/index.php?option=com_content&task=view&id=256&Itemid=57 (DS2450 mit BASCOM)
->
http://www.brain4home.eu/index.phpAus diesen Vorlagen entschloss ich mich einen einfachen 1-Wire-Slave-Baukasten zu entwickeln, mit dem man unter BASCOM leicht eigene Slaves erstellen kann. Auf diese Weise kann man evtl. abgekündigte Bausteine im begrenzten Umfang nachbilden, aber vor allem andere Sensoren (z.B. analoge oder I²C) in das 1-Wire-System einbinden. Dies ist z.B. bei dem weit verbreiteten SHT11 durchaus sinnvoll.
Schwierig ist das jedoch, WIE diese neuen Slaves vom Master angesprochen werden sollen, wenn der Master bzw. dessen Steuersoftware diesen Slavetyp überhaupt nicht kennt!
Es gibt zwei Lösungswege:
- Wenn man die Steuersoftware selbst schreiben kann, ist ein eigener Family-Code am einfachsten. Dann kann man darüber den Slave eindeutig identifizieren und ihn seiner Funktion entsprechend auslesen.
- Wenn man auf eine fertige Steuersoftware zurückgreifen will/muss, bleibt einem nichts anderes übrig, als den Slave so zu programmieren, dass er sich analog zu einem vorhandenen Baustein verhält. Die Gefahr, dass es dabei zu Doppelungen in der 64-Bit-ID kommt, ist dabei sicher gering, aber trotzdem möglich.
Meine Lösung:
- In der Slave-Software ist ein DS18B20 als Standard eingestellt (Data &H28 , &H53 , &H48 , &H54 , &H00 , &H00 , &H00 , &H68).
- Um eine andere ID mit evtl. einem anderen Familiy-Code einzustellen, muss man diese in die ersten 8 Bytes des EEPROMs des ATmega schreiben. Dann wird diese automatisch beim Starten als (neue) ID genutzt.
- Der Slave verhält sich ähnlich wie ein DS18B20, d.h. der Befehl "&H44" (Convert Temperature) berechnet alle Werte, schreibt sie in die ersten 8 Bytes eines Arrays und erstellt daraus eine CRC-Prüsumme, die in das 9.Byte des Arrays geschrieben wird. Der Befehl "&HBE" (Read Scatchpad) gibt 8 Werte und die CRC-Prüfsumme (=9. Wert) aus.
- Diese 8 Werte selbst sind aber nicht mit denen eines DS18B20 kompatibel, sondern daraus muss man nun, je nach Funktionen des Slaves, seine Werte gewinnen. Das funktioniert also nur mit Steuerssoftware, die auch das Scatchpad ausgibt und nicht nur fertige Werte anzeigt. Möglich ist das z.B. mit DigiTemp oder den 1-Wire-Kernel-Modulen des RaspberryPi, leider geht es wohl nicht mit owfs oder IPSymcon.
- Wenn man auf eigene Software zurückgreifen kann, dann kann man für den Slave entweder einen eigenen Family-Code wählen (z.B. &HFE) oder über den Befehl "&H10" und "1wread()" einen Wert auslesen. Ist er <> 255/&HFF, dann ist es kein echter DS18B20. Eine eigene 64-Bit-ID(s.o.) kann man sich z.B. bei ->
http://www.tm3d.de/index.php/tools berechnen lassen. Das AVR-PC-Control erkennt Eigenbau-Slaves mit Familiy-Code &HFE und "falsche" DS18B20 über den Befehl "&H10" und gibt die Messwerte im richtigen Format aus.
(siehe Anhang / see attachement)
Beispiel für einen 1-Wire-Slave mit ATmega8/168 für SHT11 und LCD-Ausgabe (Source- und Hex-Files):
Aufbau der ID: Familycode: &H28 oder &HFE; Byte 2-4: &H53 &H48 &H54 = "SHT"; Byte 5-7: Nummer; Byte 8: CRC8
Scatchpad: Byte 1+2 = Temperatur x 10, Byte 3+4 = Luftfeuchte x 10, Byte 5+6 ADC oder Counter, Byte 7 = z.Z. unbenutzt, Byte 8 = Fehlerstatus (Byte 9 = CRC)
Folgende Ergänzungen und Erweiterungen sind möglich:
- LED an PORTB0 mit Widerstand gegen GND. Sie zeigt an, wenn der Slave gerade angesprochen wird
- Jumper an PORTD4 (Pin 6)gegen GND. Wenn der Jumper gesteckt ist, dann läuft das Modul im Standalone-Betrieb (Ausgabe alle 15s, kein 1-Wire-Zugriff möglich!!!)
- 16Bit-Counter an PORTD5 (Pin 11)
- ADC-Eingang an PORTC0 (Pin 23) füer analoge Sensoren (Luftgüte, Druck, Licht ...)
(siehe Anhang / see attachement)
Viel Spaß,
RoBue