AVR-PC-Control und 1-Wire-Sensoren
(RoBue's gesammelte Erfahrungen)

Grundsätzliche Informationen zu den 1-Wire-Bauteilen beim Hersteller unter
-> http://www.maxim-ic.com/products/1-wire/

Diskussion und weitere Infos im Bascom-Forum
-> http://bascom-forum.de/showthread.php?4821-RoBue-s-gesammelte-Erfahrungen-mit-1-Wire-Bausteinen

Vorbemerkungen:

- Im Gegensatz zu I2C/TWI (s.o.) ist die Zuordnung der Bauteile eindeutig, da jeder einzelne Sensor seinen eigene 8-Byte- bzw. 64-Bit-Kennung (ID)  besitzt. Dabei gibt das erste Byte gib die Gerätefamilie an (z.B. &H10 für DS1820), dann folgen 6 Bytes  sozusagen als Kennnummer und das letzte Byte enthält den CRC8-Code der vorausgehenden 7 Bytes.
Die Family-Codes sind hier zu finden:
-> http://pdfserv.maxim-ic.com/en/an/AN155.pdf

- Für 1-Wire braucht man mindestens 2 (!!!) Leitungen: GND und Data. Die Datenleitung muss beim Betreib mit einem AVR zusätzlich über einem Widerstand mit VCC/VDD verbunden werden. In der Literatur findet man in der Regel dafür den Wert 4,7k. Aus Erfahrung würde ich eher 3,3k vorschlagen. Am besten wäre jedoch eine Kombination eines Widerstandes von 470 Ohm und eines Trimmpotis von 5k in Reihe. Damit kann man bei Bedarf den Widerstand so anpassen, bis die Daten sauber ankommen. 


(Typisches Schaltbild für den Anschluss eines 1-Wire-Slaves an einen AVR o.ä.)

- Es sind verscheidene "Bus-Topologien" möglich, das meint die Art und Weise wie die einzelnen Sensoren an den Bus angebunden sind: In Reihe hintereinander,  als Baumstruktur oder sternförmig. Die Topologie hat Einfluss auf die mögliche Leitunglänge und die Anzahl der Sensoren. Am stabilsten ist die Reihenschaltung.
Weitere Infos dazu:
-> http://shop.wiregate.de/1-wire-bus
-> http://eservice-online.de/out/media/1-Wire%20Bussystem_Grundlagen_Tipps.pdf (Kopie)

- Offiziell verträgt der 1-Wire-Bus Leitungslängen von mehreren hundert Metern (je nach Bus-Topologie, s.o.) , aber in der Praxis gibt es schon bei 20-30 Metern Probleme, vor allem wenn es mehrere Bauteile sind und von diesen "parasitäre" Spannungsversorgung genutzt wird (z.B. DS1820). Deswegen ist eine Regelung des Widerstandes durchaus sinnvoll (s.o.). Für den Betrieb mehrerer Bausteine am 1-Wire-Bus sollte man sich ohnehin überlegen, ob man entweder auf einer 3. Leitung noch VDD mitführt oder den Bauteilen sogar eine eigene Spannungsversorgung spendiert (bei einigen reicht 3V-Knopfzelle, z.B. DS1820, DS2423). Außerdem gibt es Repeater, die die Busqualität verbessern.


(Ein Beispiel für einen einfachen Repeater mit P82B715, der bei mir die Qualität der Signale doch schon ganz gut verbessert hat.
Dieser Aufbau ermöglich den Einsatz von nur EINEM P82B715 zwischen Master und Slave.
Normalerweise braucht man je einen am Master und einen am Slave, die dann über Lx und Ly verbunden sind.
Evtl. kann man die Widerstände an Lx und Ly noch verkleinern, z.B. 3,3 kOhm.
Achtung: Das Schaltbild entspricht NICHT den Herstellerangaben!)


- Die meisten Bauteile bzw. Sensoren sind für den "parasitären" Betrieb ausgelegt, d.h. dass über die Datenleitung auch die Spannungsversorgung erfolgen kann. Bei einigen ist das intern schon so angelegt (Temperatursensoren, DS2405, DS2406, DS2413), bei anderen (z.B. DS2438, DS2450) muss man dies mit 2 Dioden und einem Kondensator dies extern ermöglichen.

- Für den Betrieb mit "parasite power" ist eigentlich der Einsatz einer weiteren Portleitung des AVRs mit einem FET vorgeschlage
n, die immer dann, wenn Rechenvorgänge (z.B. nach dem Befehl: &H44) stattfinden, zusätzlich "Power" auf die Datenleitung schalten ("strong pullup"). Leider unterstützt BASCOM diese Funktion (noch?) nicht. Man muss dies selbst dazu programmieren.

- Eine andere Möglichkeit der Zusammenarbeit von 1-Wire-Bausteinen mit einen Mikrocontroller bieten die Bausteine DS2482-100 und DS2482-800 (-> AN 3684 von Maxim). Es sind "I²C-1-Wire-Master", d.h. sie kommunizieren mit dem AVR über I2C und senden dessen Befehle an den 1-Wire-Bus. Sie übernehmen die Kontrolle über den 1-Wire-Bus als Master, wozu z.B. auch das Timing gehört. Damit funktionieren nun aber die BASCOM-Standard-Routinen für 1-Wire gar nicht mehr. Man muss neue erstellen.
Codebeispiele für DS2482 im BASCOM-Forum:
-> http://bascom-forum.de/showthread.php?1716-1-Wire-MASTER-%FCber-i2C-zu-1-WIRE-Bridge-DS2482-100-und-DS2482-800&highlight=DS2482


(Anschlussschema eines DS2482 an einen AVR o.ä.)



- 1-Wire- und Servo-Betrieb vertragen sich unter BASCOM nicht. Man muss sich also für eines entscheiden oder  die Routinen für eine der beiden Erweiterungen neu programmieren.
("Der Servo-Timer unterbricht alle 10µs die 1-Wire Routinen, die brauchen für's Auslesen max. 7,5ms und reagieren darauf empfindlich." -> Bascom-Forum
)


Zusammenarbeit mit dem AVR-PC-Control:

Die Datenleitung kommt an PORTD4 und GND an GND des AVR-PC-Controls.
Beim Start des AVR-PC-Control werden die IDs der ersten 8 1-Wire-Bauteile ausgelesen und gespeichert.
Sie stehen damit für weitere Funktionen zur Verfügung.

Die Temperturwerte werden mit dem 10-fachen Wert ausgegeben (25.5°C -> Ausgabe: OW-1_T=255). Die Temperaturwerte der 1-Wire-Sensoren (DS1820, DS18B20, DS2438) werden intern zusätzlich in der Tabelle "Temperatur(x)" abgelegt, um z.B. im Mode 3 weiter verarbeitet werden zu können.


Beim Erkennen des 1-Wire Sensors DS2450 werden seine 4 Ports automatisch als 16Bit AD-Eingänge initialisiert


Bisher arbeitet das AVR-PC-Control mit folgenden 1-Wire-Sensoren zusammen:

Typ Funktion Ausgabeformat
DS1820/DS18S21 Temperatursensor (Auflösung 0,5°C, Ausgabe: Temperatur x10) OW-1_T=245
DS18B20 Temperatursensor (12-Bit Auflösung, Ausgabe: Temperatur x10) OW-1_T=224
DS2405 Schalter (nicht mehr hergestellt, abgelöst durch DS2413)
Es muss 2x ausgelesen werden, um den Wert bestimmen zu können!
OW-1_PIOA
OW-1_PIOB
DS2408 8xPIO (8 Schaltports, Ausgabe: binär, binär invertiert und Activity-Register) OW-1_8XPIO-ORG=11110000
OW-1_8XPIO-INV=00001111
OW-1_8XPIO-ACT=11110000
DS2413 2xPIO (2 Schaltports, Ausgabe: binär beide PIOS, binär PIO-A und binär PIO-B) OW-1_2XPIO=01
OW-1_PIO-A=1
OW-1_PIO-B=0
DS2423 2x32-Bit-Countern (abgekündigt, nicht resetbar!) OW-1_COUNTER-A=0
OW-1_COUNTER-B=12345
DS2438 Smart Battery Monitor (AD-Wandler u. Temperatursensor, Ausgabe: Temperatur x10, Stromstärke, Versorgungsspannung, Messspannung) OW-1_T=224
OW-1_VSENS=160
OW-1_VCC=4980
OW-1_VAD=7560
DS2450 4x16Bit-AD-Wandler oder Schalter (gemischter Einsatz möglich) OW-1_AD-A=65535 (bis D)
bzw.
OW-1_SW-A=1 (oder 0)

Man kann den 1-Wire-Bus des AVR-PC-Control auch manuell bedienen und so einzelne Bausteien ansprechen, programmieren und auslesen:

Befehle für 1-Wire-Bus: Bedeutung:
(Steuerbefehle für den 1-Wire-Bus,  nur im MODE 0 sinnvoll!!!)
OW_RESET führt einen Reset für den 1-Wire-Bus durch
OW_MATCH/num ruft einen 1-Wire-Baustein mit der Nummer "num" auf (Ausgabe: "Ok!" oder "Error!")
OW_WRITE/hex schickt das Byte "hex" (Byte in hexadezimaler Schreibweise) zu dem 1-Wire-Baustein, der über "OW_MATCH/num" aufgerufen wurde
OW_READ/num liest die Anzahl von "num" Bytes vom aufgerufenen 1-Wire-Baustein aus (Ausgabe: hex - bin - dez)
OW_SEARCH sucht nach einem 1-Wire-Baustein am Bus und gibt seine 64-Bit-ID aus (Achtung: Es darf während des Vorgangs nur 1 Baustein angeschlossen sein!) 
OW_ADD schreibt die gefundene ID (OW-Search) an die nächste freie Adresse im ID-Array oder im EEPROM 
OW_STATUS/num gibt Werte aller 1-Wire-Bausteine ("num" nicht gesetzt) oder den Wert des Bausteins mit der Nummer "num" aus
(Steuerung einzelner 1-Wire-Bausteine/Sensoren)
DS2408/num/bin setzt die 8 Pios (Ports) eines DS2408 mit der Nummer "num" auf den Wert "bin"  ("bin" bedeutet 1 Byte in binärer Schreibweise, Beispiel: "DS2408/3/00001010")
DS2408_INV/num/bin wie DS2408 (s.o.), aber übergibt den Binärwert "bin" invertiert (sinnvoll, wenn am Ausgang des DS2408 ein Inverterbaustein (z.B. 74HC540) sitzt)
DS2413_A/num/bin
DS2413_B/num/bin
setzt Port A oder B eines DS2413 mit der Nummer "num" auf den Wert "bin" ("bin" bedeutet  "0" oder "1",  Beispiel: "DS2413_A/2/1" )
DS2450_INIT/num initialisiert einen DS2450-Sensor mit der Nummer "num" (1-8) für 16-Bit Auflösung (AD-Wandlung)
DS2450_A/num/bin
DS2450_B/num/bin
DS2450_C/num/bin
DS2450_D/num/bin
schreibt den Wert "bin" (Byte in Binärformat) in das entsprechende Steuerregister (08,1A,1C,1E) von Port A,B,C,D des DS2450 mit der Nummer "num" 


Beispiele für den Einsatz von 1-Wire-Bausteinen (eigene Experimente und Projekte):

Die bekannteste und einfachste Anwendung von 1-Wire-Sensoren ist die Temperaturmessiung durch die Typen DS1820, DS18S21 (Datenblatt: Maxim - Kopie), DS18B20 (Datenblatt: Maxim - Kopie). Sie sehen aus wie Transistoren und können vielseitig verwendet werden. Sie eignen sich am ehesten für den "parasitären" Betrieb (s.o.). In diesem Fall sollte GND und VDD miteinander verbunden werden. Für den Einsatz in Flüssigkeiten gibt es Hersteller, die die Sensoren in Metallhülsen einbauen (z.B. unter www.eservice-online.de zubeziehen). Heißkleber und Schrumpfschlauch reicht dafür im Notfall auch.



BASCOM-Code-Schnipsel zum Auslesen eines DS1820:

' Auslesen DS1820 (Temperatursensoren)
' Ausgabe:
' - der (10-fache) Temperaturwert(Integer) steht im Array Temperatur(k)
Ds1820_auslesen:
   Gosub Verify_rom
   If Ow_error = 0 Then
      1wwrite &HBE
      Temp(1) = 1wread()
      Temp(2) = 1wread()
      ' Temp_1820(1) Bit 1-7 -> Temperatur, Bit 0 = 1 -> .5, Bit 0 = 0 -> .0
      ' Temp_1820(2) = %B11111111 / bzw. 255 -> Minuswerte
      ' Temp_1820(2) = %B00000000 / bzw. 0  -> Pluswerte
      Temperatur(ow_nummer) = Temp(1)
      Shift Temperatur(ow_nummer) , Right
      Temperatur(ow_nummer) = Temperatur(ow_nummer) * 10
      Temp(1) = Temp(1) And 1
      If Temp(1) = 1 Then
         Temperatur(ow_nummer) = Temperatur(ow_nummer) + 5
      End If
      ' Minuswerte ?
      If Temp(2).7 = 1 Then
         Temperatur(ow_nummer) = 1280 - Temperatur(ow_nummer)
         Temperatur(ow_nummer) = -temperatur(ow_nummer)
      End If
   Else
      Temperatur(ow_nummer) = 9999
   End If
Return

BASCOM-Code-Schnipsel zum Auslesen eines DS18B20:

' Auslesen DS18B20 mit CRC (Temperatursensoren, Aufloesung bis 12Bit)
' 12Bit Aufloesung bei (Neu-)Start. Dies wird nicht veraendert!
' Ausgabe:
' - der (10-fache) Temperaturwert(Integer) steht im Array Temperatur(ow_nummer)
Ds18b20_read:
   Gosub Match_rom
   If Ow_error <> 0 Then Goto Readtemperror
   Gosub Ds18x20_read_srcatchpad
   If Ow_error <> 0 Then Goto Readtemperror
     ' Temperatur berechnen
     '
     Temp(1) = Ds1820_scratchpad(1)
     Temp(2) = Ds1820_scratchpad(2)
     ' Erzeuge daraus Integer
     Temperatur(ow_nummer) = Makeint(temp(1) , Temp(2))
     ' Umwandlung in Single zum besseren Rechnen
     Temp_18b20 = Temperatur(ow_nummer)
     Temp_18b20 = Temp_18b20 * 10
     Temp_18b20 = Temp_18b20 / 16
     ' Rückwandlung in Integer
     Temperatur(ow_nummer) = Round(temp_18b20)
   End If
Return

Readtemperror:
   Temperatur(ow_nummer) = 9999
Return

Ds18x20_read_srcatchpad:
   ' Scratchpad anforden
   1wwrite &HBE
   ' Scratchpad auslesen
   Ds1820_scratchpad(1) = 1wread(8)
   ' crc-Byte lesen
   Ds1820_crc = 1wread()
   If Crc8(ds1820_scratchpad(1) , 8) = Ds1820_crc Then
      Ow_error = 0
   Else
      Ow_error = 1
   End If
   1wreset
Return

Neben dem DS1820 ist wohl der DS2438 (Datenblatt: Maxim - Kopie) der am häufigsten eingesetzte Baustein. Eigentlich ist er für die Überwachung von Akkus gedacht. Er hat dafür eine ganze Menge an Messmöglichkeiten:
- Temperatursensor
- Messeingang für 0 - 10V (VAD, Pin 4)
- Messung der eigenen Versorgungsspannung (GND und VCC/VDD)
- Messung des Lade- und Entladestromes (Vsens+ und Vsens-, Pin 2 und 3)
Dazu kann er sogar  den Ladezustand des Akkus errechnen und ausgeben.
Man kann den DS2438 nicht nur für Akkus, sondern auch für Netzteile gebrauchen, indem man ihn z.B. auf dem Kühlblech befestigt. Dann lässt sich die Temperatur des Spannungsreglers überwachen, dazu Stromstärke (Vsens+,Vsens-), Ausgabespannung des Reglers (GND,VCC/VDD) und Versorgungsspannung (VAD).
Falls man "Fremdspannungen" oder "Fremdstromstärken" messen will, also Messwerte von Schaltungen, die nicht zugleich die 1-Wire Bauteile mit Spannung/strom versorgen, muss man GND des 1-Wire-Systems mit GND des zu messenden Systems verbinden. Falls man nur die Vsens- Eingänge nutzt, muss man zumindes Vsens- mit GND des DS2438 verbinden.
Die Berechnung der Stromstärke ist dabei etwas "tricky":
An einem sog. "Shunt" (=Widerstand mit  geringem Ohm-Wert und hoher Leistung) wird der Spannungsabfall gemessen. Die Werte müssen zwischen -300 und +300mV liegen. Damit kann man Lade- und Entladeströme (je nach Vorzeichen) messen. Die Berechnung erfolgt über die Formel: I = U/R. Wenn man für für den Shunt dem Wert 1Ohm nimmt, entspricht der Augabewert der Stromstärke in mA (geht dann aber nur bis 300mA!!!). Der Shunt wird in die GND-Leitung eingebaut.


Beispiel für einen Schaltungsaufbau mit einem DS2438.
R1 ist der sog. "Shunt", C1 dient zu Stabilisierung, R2 und 3 zur Entkoppelung.


Ein hilfreicher Artikel zum DS2438 mit BASCOM-Code findet sich unter:
-> http://www.societyofrobots.com/member_tutorials/node/101


Leider haben viele Akkus (z.B. KFZ) eine höhere Spannung (12V und mehr). Darum muss man den Eingang anpassen. Es gibt dafür bereits  von Maxim eine App-Note (Maxim - Kopie)
. Eine sehr vereinfachte Form habe ich im Einsatz:

Ueberwachung von Spannungsversorgungen < 20V mit DS2438
*******************************************************
 - Temperatur (Kuehlblech des Stabilisators, Solarmodul, Akku, ...)
 - Spannung externe Quelle (z.B. Akku, Solarmodul, ...)
 - Spannung nach Stabilisator

Schaltbild fuer Messeingang des DS2438 (Halbierung der Spannung):
   
        VDD   (Batterie/Akku) GND
o                                     o
|                                     |
o-----100k-----o-----10k-----100k-----o
               |                      |
               |         ZD 10V       |
               o -------/<|-----------o
               |                      |
               -----------------o     o
                               VAD    GND
                                (DS2438)


Neben dem Einsatz als Batterie- bzw. Akkumonitor wird der DS2438 mit einem HIH4000 o.ä. als Temperatur- und Feuchtesensor genutzt.


Schaltplan für Verwendung des DS2438 mit einem HIH3610 als Luftfeuchte- und Temperatursensor.

Die zwei Dioden (BAT54S) und der Kondensator C1 ermöglichen den "parasitären" Betrieb.



BASCOM-Code-Schnipsel zum Auslesen eines DS2438:

' DS2438 auslesen
' Ausgabe:
' - Spannungswert steht in den beiden Byte-Variablen "Ad1" und "Ad2"
' - Spannung (in mV) berechnen: (Ds2438_Ad2 * 256 + Ds2438_Ad1) * 10 -> Ds2438_vin
' - Spannungswert an Vsens steht in "Ds2438_Adsens1" und "Ds2438_Adsens2"
' - Spannung (in mV) berechnen: makeint(Adsens1 * Adsens2) * 0,2441 -> Ds2438_vsens
' - Temperatur steht in den Byte-Variablen "Ds2438_Temp1" und "Ds2438_Temp2"
Ds2438_read:
   Gosub Match_rom
   ' Recall Memory - EEPROM/SRAM -> scratchpad
   1wwrite &HB8
   ' page 0 -> scratchpad page 0
   1wwrite &H00
   1wreset
   '
   Gosub Match_rom
   'Read Scratchpad page 0 - Seite 0 auslesen (insges. 8 Bytes)
   1wwrite &HBE
   1wwrite &H00
   ' 1. Byte -> Statusregister
   Ds2438_statusreg = 1wread()
   ' 2.+3. Byte -> Temperatur
   ' LSB -> Nachkommastellen
   Ds2438_temp2 = 1wread()
   ' MSB -> Temperaturwert
   Ds2438_temp1 = 1wread()
   ' 4. und 5. Byte -> AD-Wert
   Ds2438_ad1 = 1wread()
   Ds2438_ad2 = 1wread()
   ' 6. und 7. Byte -> AD-Wert von Vsens
   Ds2438_adsens1 = 1wread()
   Ds2438_adsens2 = 1wread()
   1wreset
Return

' Nur Spannung an Pin 4 auslesen
Ds2438_read_ad:
   Gosub Match_rom
   ' Recall Memory - EEPROM/SRAM -> scratchpad
   1wwrite &HB8
   ' page 0 -> scratchpad page 0
   1wwrite &H00
   1wreset
   '
   Gosub Match_rom
   'Read Scratchpad page 0 - Seite 0 auslesen (insges. 8 Bytes)
   1wwrite &HBE
   1wwrite &H00
   ' 1. Byte -> Statusregister
   Dummybyte = 1wread()
   ' 2.+3. Byte -> Temperatur
   ' LSB -> Nachkommastellen
   Dummybyte = 1wread()
   ' MSB -> Temperaturwert
   Dummybyte = 1wread()
   ' 4. und 5. Byte -> AD-Wert
   Ds2438_ad1 = 1wread()
   Ds2438_ad2 = 1wread()
   1wreset
Return

' Temperatur berechnen
Ds2438_temp:
   Minus = 0
   If Ds2438_temp1 > 127 Then
      Ds2438_temp1 = 256 - Ds2438_temp1
      Ds2438_temp2 = 32 - Ds2438_temp2
      Minus = 1
   End If
   Temperatur(ow_nummer) = Ds2438_temp1 * 10
   ' Nachkommastellen
   Tempfix = Ds2438_temp2 * 3125
   ' nur eine Nachkommastelle
   Tempfix = Tempfix / 10000
   Temperatur(ow_nummer) = Temperatur(ow_nummer) + Tempfix
   If Minus = 1 Then
      Temperatur(ow_nummer) = -temperatur(ow_nummer)
   End If
Return

' DS2438 Spannung am Messeingang berechnen
Ds2438_vin:
   Ds2438_uvin = Ds2438_ad2 * 256
   Ds2438_uvin = Ds2438_uvin + Ds2438_ad1
   Ds2438_uvin = Ds2438_uvin * 10
Return

' DS2438 Versorgungsspannung berechnen
Ds2438_vcc:
   Ds2438_uvcc = Ds2438_ad2 * 256
   Ds2438_uvcc = Ds2438_uvcc + Ds2438_ad1
   Ds2438_uvcc = Ds2438_uvcc * 10
Return

' DS2438 Spannung an Vsens berechnen
Ds2438_vsens:
   Ds2438_uvsens = Makeint(ds2438_adsens1 , Ds2438_adsens2)
   ' Ds2438_uvsens = Ds2438_uvsens * 0.2441
   ' Geht aber nicht!
   ' Darum:
   Ds2438_uvsens = Ds2438_uvsens * 24
   Ds2438_uvsens = Ds2438_uvsens / 100
   ' Diesen Wert muss man dann durch den Shunt-Winderstandswert teilen,
   ' um die Stromstärke in mA zu bekommen.
Return

Will man analoge Signale (z.B. Drucksensoren, Feuchtesensoren) in höherer Auflösung messen, bietet sich der Baustein DS2450 (Datenblatt: Maxim - Kopie) mit 4x16-Bit-AD-Eingängen an. Man kann nicht nur für jeden Kanal die Auflösung für die AD-Messung individuell einstellen, man kann die Kanäle auch als Schaltaus- bzw. -eingänge ("open drain") programmieren. Der Baustein braucht keine externe Referenzspannung, sondern berechnet den AD-Wert intern.

Leider hat dieser Baustein einen Fehler:
Bei einer Messungen an einem Kanal nah der Maximalspannung (5V) werden die anderen Kanäle mit "hochgezogen", d.h. sie messen Werte von mehreren 100mV, auch wenn daran gar nichts angeschlossen ist.


Zum Zählen von Impulsen kann man den
DS2423 (Datenblatt: Maxim - Kopie) mit 2x32-Bit-Countern verwenden (leider ist er abgekündigt!).

Dieser Baustein eignet sich vor allem für Verbrauchsüberwachungen wie Gas, Wasser, Sch...  S(ch)trom. Es gibt spezielle Zähler, die neben der optischen Anzeige des Verbrauchs einen einfachen (potentialfreien) Impulsausgang haben, d.h. es werden Impulse im Verhältnis zum Verbauch gesendet, z.B. 1 Impuls pro Liter oder Wh. Diese werden über LEDs, Optokoppler, Reedrelais und Magnet, Hallsensoren bzw. -transistoren u.ä. erzeugt. Oft wird dieser Impulsausgang auch als "S0-Schnittstelle"bezeichnet.
Infos zur S0-Schnittstelle z.B..:
->  http://wiki.volkszaehler.org/hardware/channels/meters/s0
->  http://www.mikrocontroller.net/articles/S0-Schnittstelle
S0-Zähler kaufen z.B. bei:
-> http://www.energie-zaehler.com/ 

 
Die von Maxim/Dallas vorgeschlagene Ansteuerung erfolgt über ein Reed-Relais o.ä., das zwischen Zähleingang und VCC/VDD geschaltet ist.


Den umgekehrten Weg geht das Zählmodul von eservice-online (und meines), das für das Auslesen von S0-Impulsen ausgelegt ist. Es misst über GND und Zähleingang (10 kOhm Widerstand zwischen Zähleingang und VCC/VDD und evtl. ein 10 nF Kondensator parallel zum Entprellen). Es zeigt außerdem die eingegangenen Impulse über LEDs an. Dieser Aufbau erzeugt jedoch beim Einschalten bzw. Anschließen des Moduls einen Impuls auf den Zähleingängen.


Leider kann man den DS2423 nur zurücksetzen, indem man für einige Zeit die Stromversorgung unterbricht.
Dabei muss man bedenken, dass allein schon der obligatorische 100 nF-Block-Kondensator die Stromversorgung einige Zeit aufrecht erhalten kann. Beim Modul von eservice wird das zum Geduldsspiel, weil hier der Baustein mit einem Goldcap-Kondensator gepuffert ist.  Der hält einige Tage oder Wochen. Ich habe deshalb einen zusätzlichen Taster (sorry lieber Andreas, aber das musste einfach sein!)  eingebaut, der über einen 100 Ohm Widerstand GND und VCC/VDD direkt am DS2423 verbindet (GND --- Taster --- 100Ohm --- VCC/VDD). Wenn man das Modul von der Stromversorgung abkoppelt und dann den Taster ca. 30 s drückt, wird der Kondensator entladen und der Baustein resettet (= in allen Zählregistern steht eine "0"). Wenn man im normalen Betrieb aus Versehen den Taster mal kurz drückt, passiert in der Regel nichts.  

Wenn die Stromversorgung des DS2423 am Zusammenbrechen war (z.B. Batterie oder Puffer-Kondensator sind leer)  und sich dann wieder stabilisiert (z.B. Baustein wird wieder an Stromversorgung angeschlossen), kann es sein, dass keine Nullen in den Zählregistern stehen,  sondern wirre Daten (d.h. eine riesige Menge an Impulsen). Auch deswegen wäre eine Resetmöglichkeit sinnvoll.

BASCOM-Code-Schnipsel zum Auslesen der Counterregister eines DS2423:

' DS2423 auslesen (2x32-Bit Counter)
' Ausgabe:
' - in "Zaehler1" und "Zaehler2" (Long-Variable) stehen die gezaelten Impulse
Ds2423_auslesen:
   Gosub Match_rom
   ' Read Memory + Counter
   1wwrite &HA5
   ' Die Counterwerte befinden sich sozusagen im Ueberhang
   ' der letzten beiden Memory-Pages (C0, E0).
   '
   ' Variante 1: Start mit: &H01C0
   '1wwrite &HC0
   '1wwrite &H01
   ' Zuerst alle 32 Bytes der Memeory-Page lesen und verwerfen ...
   'For I = 1 To 32
   '  Dummybyte = 1wread()
   'Next I
   ' ... und jetzt kommen die 4 Counterwerte
   '
   ' Variante 2: Start mit: &H01DF => Nur 1 Byte muss verworfen werden
   1wwrite &HDF
   1wwrite &H01
   Dummybyte = 1wread()
   ' Jetzt kommen die gewuenschten Daten:
   For I = 1 To 4
      Count1(i) = 1wread()
   Next I
   ' Gesamtwert berechnen ...
   Zaehler1 = Count1(4) * 16777216
   Zaehler_temp = Count1(3) * 65536
   Zaehler1 = Zaehler1 + Zaehler_temp
   Zaehler_temp = Count1(2) * 256
   Zaehler1 = Zaehler1 + Zaehler_temp
   Zaehler1 = Zaehler1 + Count1(1)
   '
   ' Match ROM - bestimmtes ROM ansprechen
   Gosub Match_rom
   ' Read Memory + Counter
   1wwrite &HA5
   ' Variante 2: Start mit: &H01FF
   1wwrite &HFF
   1wwrite &H01
   Dummybyte = 1wread()
   ' Jetzt kommen die gewuenschten Daten:
   For I = 1 To 4
   Count2(i) = 1wread()
   Next I
   ' Gesamtwert berechnen ...
   Zaehler2 = Count2(4) * 16777216
   Zaehler_temp = Count2(3) * 65536
   Zaehler2 = Zaehler2 + Zaehler_temp
   Zaehler_temp = Count2(2) * 256
   Zaehler2 = Zaehler2 + Zaehler_temp
   Zaehler2 = Zaehler2 + Count2(1)
   1wreset
Return

In Zusammenarbeit mit einem ATtiny13 (Source- und Hex-File) kann man leicht eine Heizölverbauchsmessung erstellen. Der ATtiny wandelt das Dauersignal der Brenner-LED in Impulse/min um, die dann vom DS2423 (Beispiel das Zählmodul von www.eservice-online.de) gezählt werden. Daraus lässt sich bei vielen Heizungen dann der Verbrauch errechnen (z.B. 1Std. Brenndauer  = 3 l Verbrauch).



Zum Schalten von Geräten und Auslesen von logischen Zuständen gibt es folgende Bausteine:
1 Port:  DS2405, DS2406 TO-92 (Maxim - Kopie), 2 Ports:  DS2406 TSOC, DS2413 (Maxim - Kopie) und 8 Ports:
DS2408 (Maxim - Kopie)


Die Bausteine haben sog. "Open-Drain"-Ausgänge. Die Bedienung ist deswegen etwas gewöhnungsbedürftig.
- Sie brauchen am Ausgang (immer) einen Widerstand (10 kOhm) gegen VCC/VDD für eindeutige Pegelzustände.
- Im ausgeschalteten Zustand (eigentlich logisch "0" = Starteinstellung) führt der Port deswegen am Ausgang den logischen Pegel "1" (high).
- Wenn der Port über das Setzen des entsprechenden Registers eingeschaltet wird ("1"), wird der interne Transistor leitend und schaltet GND an den Ausgang durch, d.h. er führt  am Ausgang den Pegel logisch "0" (low). Mit diesem Pegel wird normalerweise geschaltet, da er am meisten Leistung bringen kann.
Man muss also immer umgekehrt denken :-o oder - wie beim AVR-PC-Control - die Befehle softwaremäßig invertieren ;-).
Wenn man nur Tasteneingaben abfragen will, muss man den Taster zwischen Port und GND schalten (Widerstand gegen VCC/VDD nicht vergessen!)

Noch eine Zwischenbemerkung zur Arbeit mit dem DS2405:
Die obigen Ausführungen betreffen eigentlich nur die Bausteine DS2406, 2408, 2413. Der DS2405 schaltet einfach dadurch, dass er abgefragt wird, d.h. wenn man seinen Status abfragen will, verändert er damit automatisch den Pegel am Ausgang - was man aber nicht unbedingt will! Was sich der Hersteller dabei gedacht hat, ist mir schleierhaft. Zum Glück wird er nicht mehr hergestellt und ist im Handel kaum noch erhältlich. Mein Rat: Gar nicht erst kaufen.


Die Bausteine DS2405, DS2406 und DS2413 brauchen keine zusätzliche Spannungsversorgung und haben auch keinen Anschluss dafür. Nur der DS2408 macht dabei eine Ausnahme. Er sollte meiner Erfahrung nach auch nicht unbedingt im parasitären Modus betrieben werden.

In der Regel sind die Ausgänge zu schwach, um ein z.B. ein Relais direkt anzusteuern (Ausnahme evtl. DS2413). Man braucht entsprechende Treiberbausteine z.B. Transistoren. Zur Ansteuerung einer LED in einem Solid-State-Relais könnte es aber u.U. auch ohne zusätzliche Hardware reichen.

2 typische Möglichkeiten, um Relais mit Transistoren anzusteuern:


- NPN-Transistor (links) -> es wird mit logisch "1" am PIO-Ausgang (und logisch "0" im internen Register) geschaltet
- PNP-Transistor (rechts) -> es wird mit logisch "0" am PIO-Ausgang (und logisch "1" im internen Register) geschaltet

Einige praktische Beispiele, wie ein DS2413 handelsübliche Bausteine bzw. Baugruppen ansteuert:





oben:
Der DS2413 steuert ein handelsübliches Relais-Modul (Arduino-Shild) an.

Die Relais auf dem Modul werden über Opto-Koppler angesprochen. Das schafft eine PIO des DS2413 locker.
mitte:
Der DS2413 steuert 2 Relais in einem Hutschienengehäuse (Firma DeHTec HSSS24M) an,
die auf 24V ausgelegt sind (=Industriestandard) und jeweils ca.12mA zum Schalten brauchen.

GND von AVR, 1-Wire und HSSS24M müssen dabei miteinander verbunden werden.

(Die Arbeit mit 24V ist etwas heikel, da bei einem Anschlussfehler der AVR und die 1-Wire-Bausteine leicht zerstört werden.)
unten:
Der DS2413 schaltet ein Solid-State Relais (Pollin, XSSR-DA2420).
Auch dafür braucht es keine zusätzlichen Bauteile. Anschluss: PIO-A oder PIO-B und VCC/+5V an Eingang des Solid-State Relais.

Und noch eine interessante Anwendungsmöglichkeit für einen DS2413 (und einen DS1820):
Man kann mit dem DS2413 einen ATX-PC ein- und ausschalten und mit einem DS1820 die Prozessortemperatur überwachen.
Die Pins auf dem Mainboard für den Power-Button werden durch ein Zwischenstück abgegriffen,
auf das man dann das Kabel zum Button draufstecken kann.

Wenn der DS2413 (kurz) durchschaltet, d.h. die PIO ca. 1s  0/low-Pegel führt, wird damit der Optokoppler CNY17am Ausgang leitend,
simuliert damit den Druck des Power-Buttons am PC-Gehäuse und schaltet den PC ein.
Ein weiterer (kurzer) Impuls würden den PC wieder herunterfahren lassen, ein langer ihn gnadenlos abwürgen, d.h. abschalten.
Letztere Möglichkeit wäre z.B. dann sinnvoll, wenn der DS1820-Temperatursensor zu hohe Kühlkörpertemperaturen messen würde.
(Achtung: Da der Ausgang des Optokopplers nur in eine Richtung leitet, muss man evtl. die Anschlüsse zum Mainboard tauschen!)





BASCOM-Code-Schnipsel zum Auslesen und Setzen der Pios eines DS2413:

' DS2413 auslesen
' Ausgabe:
' - in "Pio2_pins" (Byte-Varaible) steht der Pio-Status
Ds2413_read_piopins:
   Gosub Match_rom
   ' Lese ein PIO-Register
   1wwrite &HF5
   Pio2_pins = 1wread()
   1wreset
Return

' DS2413 Pios setzen
' Eingabe:
' - die Byte-Variable "Pio2_set" enthaelt den Wert fuer das Pio-Register
Ds2413_set_piopins:
   Gosub Match_rom
   ' Schreibe ins "PIO Output Latch State Register"
   1wwrite &H5A
   ' Pios setzen
   1wwrite Pio2_set
   ' Invertierter Wert als Test
   Dummybyte = 255 - Pio2_set
   1wwrite Dummybyte
   Pio2_set_ok = 1wread()
   Pio2_pins = 1wread()
   ' Pruefung ob alles richtig ausgefuehrt wurde
   ' - z.B. pio2set = pio2pins
   ' - pio2_set_ok = &HAA
   1wreset
Return

Für den DS2408 gibt es einige Varianten, um ein LCD zu betreiben.


(Als Beispiel die Variante von Dallas/Maxim -> pdf-Datei)

1-Wire Slaves:

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.php

Aus 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 einerseits evtl. abgekündigte Bausteine im begrenztem 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.

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 ...)

- Messung der Versorgungsspannung an PORTC1 (Pin 24) über Widerstand und Diode . Formel: (VCC(AVR) = (V(Diode) x 1023) / Messwert(ADC) | V(Diode) = 0,56V)

                PORTC1
                   o
                   |
                   |      ____
  GND o-----|<-----o-----|____|-----o VCC
           1N4148         10k

Anmerkungen/Erfahrungen:
Leider ist diese Selbstbauvariante längst nicht so robust wie die Originale von Maxim (bzw. Dallas), so dass man eher von "Erweiterungen mit 1-Wire-Datenprotokoll" sprechen sollte, d.h. in begrenztem Maße können sie am 1-Wire-Bus betrieben werden. Auffällig ist die Empfindlichkeit gegenüber der Betriebsspannung. So ist die Fehlerrate ab 5V VCC sehr hoch (10-20%), während sie z.B. bei 4,85V unter 1% liegt.


Linkliste zu 1-Wire:

Grundsätzliches:
-> http://www.maxim-ic.com/products/1-wire/ (1-Wire Herstellerseite)
-> http://pdfserv.maximintegrated.com/en/ej/DallasEJ4.pdf (Überblick)
-> http://pdfserv.maxim-ic.com/en/an/AN155.pdf (Family-Codes)
-> http://owfs.sourceforge.net/family.html (Family-Code- und Befehlsübersicht)
-> http://shop.wiregate.de/1-wire-bus (Infos zum 1-Wire -Bus, Bus-Topologie)
-> http://eservice-online.de/out/media/1-Wire%20Bussystem_Grundlagen_Tipps.pdf (Infos 1-Wire-Bus, Bus-Topologie)
-> http://www.rn-wissen.de/index.php/Bascom_und_1-Wire (1-Wire mit AVR und BASCOM)
-> http://pic-projekte.de/Download/1-Wire-Projekt-V1_3.pdf  (Ausführliche Infos zu DS1820, DS2408 und DS2450 in Deutsch!)
-> http://www.mikrocontroller.net/topic/170112   (1-Wire-Bus-Projekt: DS1820 / DS18S20 / DS2450 / DS2408 / unter C und 8051)

Anbieter von Bausteinen und Modulen:

-> www.eservice-online.de

Interessante Artikel zum Einsatz von 1-Wire-Bausteinen und AVRs im KFZ-Bereich:
-> http://freibert.de/1wire.htm
und im Boot-Bereich:
-> http://www.boote-forum.de/showthread.php?t=114213
-> http://www.freibert.de/avr.htm
-> http://www.freibert.de/avrnew.htm

Wetterstationen:
-> http://archives.sensorsmag.com/articles/0698/wir0698/index.htm
-> http://www.weathertoys.net/weathertoys/main.html
David Bray hat für den DS2438 eine Barometerschaltung mit MPX5115 und LM358 entwickelt:
-> http://davidbray.org/onewire/baro2030.html

Optisch getrennter 1-Wire-Bus
->
http://home.kpn.nl/thomas_7/1wire/1wire_isolating.html

1-Wire am PC:
Adapter:
-> http://www.fhemwiki.de/wiki/Interfaces_f%C3%BCr_1-Wire
-> http://www.haeussler.name/blogs/hobby/elektronik/rs232-1-wire-interface/
Linux:
-> http://www.digitemp.com/  
(DigiTemp)
-> http://owfs.org/  (
OWFS (1-Wire Filesystem)
Windows:
-> http://www.mrsoft.fi/ohj01en.htm  (
LogTemp)
-> http://www.ip-symcon.de/service/dokumentation/modulreferenz/1-wire/ (1-Wire-Unterstützung durch Ip-Symcon)





(Stand: 27.02.2014)