1. Grundsätzliches
Nachdem meine Homepage abgeschaltet worden ist,
habe ich meine Erkenntnisse dem "bascom-forum" (mit Bindestrich) anbefohlen,
wo sie nun anscheinend auch wieder im Nichts verschwunden sind.
Deswegen versuche ich es hier nochmal - hoffentlich mit mehr Erfolg.
Worum geht es dabei?
1-Wire ist eine pfiffige Technik bzw. ein Bussystem von Dallas/Maxim,
die Daten über größere Entfernungen über 2 (Data und GND) bzw. 3 Leitungen (Data, GND, VCC) transportieren kann.
-> 1wire
Da gibt es so wunderbare Bausteine wie
- den DS18B20 Temperatursensor
- den DS2438 Batteriemonitor
- den DS2423 2x32-Bit-Counter
- den DS2450 4x16-Bit-AD-Wandler
- den DS2408 und DS2413 8xPIO bzw. 2xPIO
(Es gab (oder gibt?) sogar eine ganze Wetterstation, die nur mit 1-Wire-Bausteinen betrieben wird/wurde)
Leider, ja leider, gibt es nicht für alle Bereiche fertige Sensoren
und manche Bausteine wurden abgekündigt (DS2423, DS2450).
Deswegen finden sich im Internet einige Ansätze,
vorhandene Bausteine durch den Einsatz von Mikrocontrollern nachzubauen oder neue zu entwickeln.
Hier einige gute Beispiele:
-> mikrocontroller.net/topic/241934#new
-> mikrocontroller.net/topic/44100
(vor allem DS2423)
-> mikrocontroller.net/topic/271772
(DCF77)
-> tm3d.de/index.php/1-wire-device-mit-avr
(DS18B20, DS2423, Barometer)
-> mcselec.com/index.php?option=c…ask=view&id=256&Itemid=57
(DS2450 mit BASCOM)
-> brain4home.eu/index.php
Nachdem ich diese Vorlagen einige Zeit studiert und langsam auch etwas begriffen habe,
kam mir der Gedanke, daraus 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 begrenzt 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 (z.B. eben in BASCOM),
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.
Jetzt muss man noch ein paar Infos dazwischenschieben:
Jeder Baustein ist vom Hersteller mit einer eindeutigen ID versehen worden
und kann darüber vom Master angesprochen werden.
Diese umfasst 8 Bytes bzw. 64 Bits.
Das 1. Byte steht dabei für den "Familiy-Code" und gibt Auskunft über die Funktion des Bausteins (z.B. &H28 -> DS18B20).
Das letzte Byte ist eine CRC8-Prüfsumme der vorangehenden 7 Bytes
Meine 1-Wire-Slave-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/ATtinys 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 CRC8-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
-> tm3d.de/index.php/tools
berechnen lassen.)
Nochmal zur Sicherheit:
Im Gensatz zur ID (s.o.) besteht das Scatchpad aus 9 Bytes:
8 Datenbytes und ein 9. CRC8-Byte (aus den 8 Datenbytes).
Über dieses Scatchpad tauschen mehrere Bausteine Daten mit dem Master aus.
(Bitte nicht verwechseln)
Soweit mal die Grundinfos.
Der Rest (Code) kommt bald.
Liebe Grüße,
RoBue
Nachdem meine Homepage abgeschaltet worden ist,
habe ich meine Erkenntnisse dem "bascom-forum" (mit Bindestrich) anbefohlen,
wo sie nun anscheinend auch wieder im Nichts verschwunden sind.
Deswegen versuche ich es hier nochmal - hoffentlich mit mehr Erfolg.
Worum geht es dabei?
1-Wire ist eine pfiffige Technik bzw. ein Bussystem von Dallas/Maxim,
die Daten über größere Entfernungen über 2 (Data und GND) bzw. 3 Leitungen (Data, GND, VCC) transportieren kann.
-> 1wire
Da gibt es so wunderbare Bausteine wie
- den DS18B20 Temperatursensor
- den DS2438 Batteriemonitor
- den DS2423 2x32-Bit-Counter
- den DS2450 4x16-Bit-AD-Wandler
- den DS2408 und DS2413 8xPIO bzw. 2xPIO
(Es gab (oder gibt?) sogar eine ganze Wetterstation, die nur mit 1-Wire-Bausteinen betrieben wird/wurde)
Leider, ja leider, gibt es nicht für alle Bereiche fertige Sensoren
und manche Bausteine wurden abgekündigt (DS2423, DS2450).
Deswegen finden sich im Internet einige Ansätze,
vorhandene Bausteine durch den Einsatz von Mikrocontrollern nachzubauen oder neue zu entwickeln.
Hier einige gute Beispiele:
-> mikrocontroller.net/topic/241934#new
-> mikrocontroller.net/topic/44100
(vor allem DS2423)
-> mikrocontroller.net/topic/271772
(DCF77)
-> tm3d.de/index.php/1-wire-device-mit-avr
(DS18B20, DS2423, Barometer)
-> mcselec.com/index.php?option=c…ask=view&id=256&Itemid=57
(DS2450 mit BASCOM)
-> brain4home.eu/index.php
Nachdem ich diese Vorlagen einige Zeit studiert und langsam auch etwas begriffen habe,
kam mir der Gedanke, daraus 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 begrenzt 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 (z.B. eben in BASCOM),
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.
Jetzt muss man noch ein paar Infos dazwischenschieben:
Jeder Baustein ist vom Hersteller mit einer eindeutigen ID versehen worden
und kann darüber vom Master angesprochen werden.
Diese umfasst 8 Bytes bzw. 64 Bits.
Das 1. Byte steht dabei für den "Familiy-Code" und gibt Auskunft über die Funktion des Bausteins (z.B. &H28 -> DS18B20).
Das letzte Byte ist eine CRC8-Prüfsumme der vorangehenden 7 Bytes
Meine 1-Wire-Slave-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/ATtinys 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 CRC8-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
-> tm3d.de/index.php/tools
berechnen lassen.)
Nochmal zur Sicherheit:
Im Gensatz zur ID (s.o.) besteht das Scatchpad aus 9 Bytes:
8 Datenbytes und ein 9. CRC8-Byte (aus den 8 Datenbytes).
Über dieses Scatchpad tauschen mehrere Bausteine Daten mit dem Master aus.
(Bitte nicht verwechseln)
Soweit mal die Grundinfos.
Der Rest (Code) kommt bald.
Liebe Grüße,
RoBue
The post was edited 7 times, last by RoBue ().