1Wire

Logger

Mitglied
25. Feb. 2009
106
2
18
Dinslaken
Sprachen
  1. BascomAVR
Hallo zusammen

Habe mal eine frage in bezug auf den 1wire bus, wie lang darf das kabel vom Controller(Atmega32 bis zum letzten Sensor im Bus sein.
Habe gestern meine DS1820 Sensoren bekommen und experimentiere damit einwenig rum, habe mir dann einige Code schnipsel aus dem Internet geladen und sogar zum laufen bekommen (mit LCD 16*2).
Meine erfahrung mit dem Programmieren (seit ca.8 Wochen) beschränkt sich auf einen LED Würfel mit 3*3*3 LED's auf einen Atiny2313.

mfG Ralf Neubert :D
 

Anhänge

  • Thermometer2.jpg
    Thermometer2.jpg
    187,5 KB · Aufrufe: 98
Hi Ralf,

Habe mal eine frage in bezug auf den 1wire bus, wie lang darf das kabel vom Controller(Atmega32 bis zum letzten Sensor im Bus sein.

Sieh dir das mal an ...
Design Guide 1
Design Guide 2
Die sind recht interessant. Da steht auch irgendwas mit 100m Kabel
mit Kapazität von 5000pF. Ich habe es selber noch nie mit so einer
irren Länge ausprobiert. Aber mit einer Last von 2m RG174 (Coax)
lief es noch problemlos. Einfach mal austesten. :D

In was programmierst Du denn ? Bascom, C, Assembler, ... ??

Im Assembler-Source von meinem Projekt (ATmega32-Daddelboard)
hier im Forum ist die Ansprache von 1-Wire-Devices erklärt. Die
Doku in dem Quellcode sollte auch für andere Programmiersprachen
interessant sein. Kannst ja mal reinschauen.

Gruß
Dino
 
Hi Dino

Danke für deine schnelle Antwort.
Ich Lerne in Bascom zu Programmieren, habe das zu Zeiten des C64 mal gut gekonnt, mußte aber feststellen das nach mehr als 20 Jahren davon nicht viel übrig ist. Hatte damals auch in Assembler meine ersten versuche gehabt aber davon weiß ich gar nichts mehr.
Zu meinem Bastellobjekt, es soll eine kleine Wetterstation werden, noch ohne Funk ( das Traue ich mir noch nicht zu) und die Leitung zum Aussenfühler wird ca. 7m lang.
Werde mir jezt deine links mal durchlesen.

Gruß
Ralf
 
Hi Ralf,

es soll eine kleine Wetterstation werden
das wird ja hier zur Außenstation vom Deutschen Wetterdienst :D :D

Meine ersten Assembler-Erlebnisse waren auch so 15-20Jahre her (Z80)
ich bin aber überaschend schnell wieder rein gekommen ;)
Kennt man eine Sprache, kann man das alles relativ schnell auf eine andere
umsetzen.

Na denn. Wenn noch fragen wegen 1-Wire sind. Einfach mal reinstellen.

Achja, da fällt mir ein: DS2482S-100 und DS2482S-800 gibt es da bei
Reichelt. Bin per Zufall auf die Bausteine aufmerksam geworden. Das
sind 1-Wire-Master, die man über I2C steuern kann und dann einen
oder 8 Stränge mit 1-Wire-Devices da anschließen kann. Einen
DS2482S-100 werde ich mir mal als Versuchsobjekt bei der nächsten
Bestellung gönnen. Und wenn der verd*** I2C-Bus bei mir endlich
läuft werde ich die Teile mal testen. Die sehen echt interessant aus :D

Gruß
Dino
 
Hi Dino,

Das mit der Basic Programmierung war eigentlich auch ganz einfach, man muß halt nur die besonderheiten von Bascom berücksichtigen.
Habe ja recht schnell erfolg gehabt mit meinem Ledcube , bei der LCD sah das dann schon anders aus.
Aber ich beleibe am Ball und lerne!

Gruß
Ralf
 
Hallo Ralf,

hatte mich bzgl. 1Wire auch schon mit HW-Kollegen in meiner Firma unterhalten. Ausgangsbasis waren meine Probleme mit dem I2C (TWI) Interface. Ich hatte versuche einen Ultraschallsensor via TWI über ca. 7-8 Meter an einen Mega16 anzukoppel was mit definitiv NICHT gelungen ist.

Das ganze ist hier im Forum auch nachzulesen unter meinem Projekt der Zisternen-Füllstandsanzeige. Lange Rede kurzer Sinn: Ich bin der Meinung, dass der I2C Bus noch "gutmütiger" ist als der TWI. Ich glaube dass der TWI recht empfindlich ist. Erste Versuche bestätigen das auch wobei ich nicht ausschließen kann, dass irgendwo noch ein Messfehler / Designfehler vorliegt. Die Aussage der Kollegen die selbst schon mit TWI experimientiert haben war, dass bereits ab einer Leitungslänge von 1,5 Metern mit Problemen und verschlissenen Signalen zu rechnen ist.

Die Tatsache, das der 1Wire bereits sehr "niederohmig" mit nur 4k7 Ohm abgeschlossen werden muss bestätigt mich zunächst in meiner Annahme. Da hast Du auch nicht mehr viel Spielraum die Signalflanken zu "versteilen". Aber wie gesagt, ich bin kein 1Wire-Experte und sicherlich haben einige andere Kollegen hier im Forum schon mehr Erfahrung gesammelt.

Gelesen habe ich von 100 Metern und mehr auch schon und ich glaube laut Dallas Spec ist das auch möglich aber ich wäre da vorsichtig!

Schau mal hier: http://www.ip-symcon.de/wiki/index.php/1Wire-Bus-System

Da ist sogar von 750 Meter die Rede aber es wird gleichzeitig die Formulierung "ausgeklügeltes Master-Slave-System" verwendet. Was immer das bedeutet.

Aber ich würde sagen, es läuft auf ein Experiment hinaus. Probiers doch einfach mal aus. Ich glaube da können wir alle davon lernen :D

Grüße,
Markus
 
Hi Ralf,

mit BASCOM werde ich wohl auch nochmal anfangen (oder C - mal sehen)
um rechenintensive Klamotten umzusetzen. Ich habe wenn ich ehrlich bin
keinen Bock irgendwelche Fließkommasachen in Assembler zu erledigen :D

Bei Bascom mußt du nur mit Verschachtelten Aufgaben aufpassen - so
wie ich das hier mitbekommen habe. Da ist der Compiler wohl ziemlich
nahe am Assembler angelehnt :D und etwas einfacher gehalten :rolleyes: :rolleyes:

Gruß
dino
 
Hey Dino - willkommen im BASCOM-Club :D

Irgendwann bekommen wir Dirk vielleicht auch noch dazu die BASCOM-Spielwiese aufzumachen und dann ......

Dann können wir ja schon bald unser gemeinsames Projekt in BASCOM durchführen :eek:

Grüße,
Ma
 
Hallo liebe Bascom Fangemeinde

Nach einigen abenden des lesens hier im Forum , bin ich zu der meinung gekommen, das hier mehr mit Bascom Programmiert wird als mit Assembler oder C oder... :D !
Da für mich Bascom erst mal einfacher ist und auch schon gute erfolge erzielt wurden, bleibe ich dabei. Vorläufig....
Assembler lasse ich aber nicht aus den Augen. ;)
Ich Denke jede Programmiersprache hat ihre vorzüge und auch ihre Nachteile.

mfG
Ralf :)
 
Hallo Markus,

Hey Dino - willkommen im BASCOM-Club :D

Irgendwann bekommen wir Dirk vielleicht auch noch dazu die BASCOM-Spielwiese aufzumachen und dann ......

Dann können wir ja schon bald unser gemeinsames Projekt in BASCOM durchführen :eek:
Wird wohl der einfachste Weg für größere Dinge sein :D
Ich werd mir dann wohl auch irgendwann mal ne Vollversion holen
(irgendwann ...)
Benutzen tue ich aber immer noch am liebsten Assembler. Ich mag
keine CPUs die nicht das machen was ich will :rolleyes: :rolleyes:
Oder Compiler die irgendwas geheimes stricken und man wundert
sich dann über das Ergebnis.

Gruß
Dino
 
1 Wire Temperaturmessung erweitern

Hallo zusammen

Habe mal meinen Bascom Code eingefügt und auch direkt zwei Fragen, 1. Ist der Code verbesserungs bedürftig und 2. wie muß ich ihn ändern um eine zweite Temperatur (DS1820) zu Messen (und auf dem Lcd sichtbar zumachen.) Das mit dem LCD bekomme ich schon hin.


Code:
$regfile = "m32def.dat"
$crystal = 3686400

' LCD konfigurieren Port auf Ausgabe setzten und Pin's entsprechend zuordnen
Ddrb = &HFF
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
Config Lcd = 16 * 2

' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert
Config 1wire = Portd.4

Dim Dsid(8) As Byte
' Die Adresse meines DS1820 die ich vorher ermittelt habe
Dsid(1) = &H10 : Dsid(2) = &H68 : Dsid(3) = &H17 : Dsid(4) = &H25 : Dsid(5) = &H01 : Dsid(6) = &H08 : Dsid(7) = &H00 : Dsid(8) = &H98
Dim Sc(9) As Byte
Dim T As Integer
Dim T1 As Integer
Dim I As Byte
Dim T6 As Single
Dim Temp As String * 5

   'Grad zeichen chr(0)
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32

Cls
Cursor Off
Locate 1 , 1 : Lcd "Innen Temperatur"

Do
 ' Alle angeschlossenen DS1820 zum Messen veranlassen
 1wreset
 1wwrite &HCC
 1wwrite &H44
 Waitus 200
 ' Den gewünschten Sensor auswählen
 1wverify Dsid(1)
 ' Kommando READ SCRATCHPAD
 1wwrite &HBE
 Sc(1) = 1wread(9)
 If Sc(9) = Crc8(sc(1) , 8) Then
  ' Genauere Temperaturberechnung auf 0,1 °C
  I = Sc(1) And 1
  If I = 1 Then Decr Sc(1)
  T = Makeint(sc(1) , Sc(2))
  T = T * 50
  T = T - 25
  T1 = Sc(8) - Sc(7)
  T1 = T1 * 100
  T1 = T1 / Sc(8)
  T = T + T1
  T = T / 10
    'Habe damit eine kommastelle
  T6 = T / 10
  Temp = Fusing(t6 , "###.#" )

  ' Temperatur in 0,1 Grad Schritten ausgeben
  Locate 2 , 1 : Lcd Temp ; Chr(0) ; "C"

 Else
  ' Wenn Fehler Scratchpad zur Kontrolle Hexadezimal ausgeben
  Locate 2 , 1
  ' Es passen nur 8 Byte auf das Display
  For I = 1 To 8
   Lcd Hex(sc(i))
  Next
 End If
 ' Ausgabe alle 0,5 Sekunden
 Waitms 500
Loop

End


Teile des Programms sind von Jakob Pirna's Homepage.

Danke schon mal im vorraus.

Ralf
 
Hallo Ralf,

sieht doch schon mal ganz gut aus :D

Wenn mich mein Wissen nicht täuscht, dann hat doch jedes 1-Wire-Gerät eine eigene ID ? Nun ja, Du mußt einfach den 2. DS1820 adressieren, sonst ist alles gleich. Oder täusche ich mich da ? Markus, sag mal was.

Die waitms 500 unten würde ich nicht machen, da der Atmel während dieser Zeit blockiert ist. Ich würde einen kleinen Timer aufziehen, der alle 500ms überläuft und somit die Messung triggert (Bit setzen und in einer Endlosschleife abfragen). By the way, 500ms sind schon heftig oft ;) Tuts doch sicher auch 1s oder gar 10s ?

Thomas
 
Hallo Ralf!

Thomas hat schon recht....

Du musst einfach nur die ID des zweiten DS1820 senden und das Ergebnis in einer anderen Variable speichern.

Am besten ist es, du fragst den 1-Wire-Bus vorher ab, welche IDs auf dem BUS sind und speicherst diese in verschiedene Variablen.

Danach musst du zur Abfrage eines Sensors nur die passende "ID-Variable" auswählen und kannst ihn abfragen.

Mit der Methode bist du auch flexibel und musst nicht jede ID fest einkompilieren, sondern kannst einen Sensor auch mal auswechseln ohne das Prgramm neu einspielen zu müssen. ;)

Zur Realisierung benötigst du die BASCOM-Befehle:
1wirecount()
1wsearchfirst()
1wsearchnext()

Schau einfach mal in der BASCOM-Hilfe nach, dort sind auch kleine Beispiele vorhanden. ;)


Zum Ansprechen der einzelnen Sensoren benutzt du dann nicht mehr das "allgemeine" &HCC, wie in diesem Beispiel:
Code:
   1wreset
   1wwrite &HCC
   1wwrite &H44
   Waitms 100

   1wreset
   1wwrite &HCC
   1wwrite &HBE
.
.
.


...sondern das &H55 mit anschließender Übermittlung der Sensor_ID,
wie in diesem Beispiel:

Code:
1wreset
1wwrite &H55
For I = 1 To 8
1wwrite Sensor_ID1(i)
Next
1wwrite &H44
Waitms 100

1wreset
1wwrite &H55
For I = 1 To 8
1wwrite Sensor_ID1(i)
Next
1wwrite &HBE
.
.
.


Je nach Menge an Sensoren auf dem BUS und zeitlichen Intervall, kannst du damit jeden einzelnen Sensor abfragen. Es muss nicht unmittelbar nacheinander geschehen.

Viel Spaß beim experimentieren! :)

Cassio
 
Hallo Ralf,

schau mal in Thread:
http://www.avr-praxis.de/forum/showthread.php?t=266&page=4

In meiner Software ZFA_Slave.bas verwende ich einen DS18S20 und ich habe auch die von Cassio angesprochenen Routinen implementiert mit denen ich abprüfe welche Konfiguration am 1Wire-Bus gerade herrscht. Die Routine ist zwar noch auch meine Bedürfnisse zugeschnitten aber wie es funktionieren soll ist schon zu erkennen und wenn Du andere 1Wire-Devices noch auswerten möchtest so kannst Du das ohne Probleme einbauen.

Man müsste auch nochmal im Datenblatt nachsehen ob es Broad-Cast Botschaften gibt. Das habe ich jetzt nicht mehr im Kopf. Bedeutet, Du sendest einmal auf dem 1Wire "Hallo an alle bitte jetzt messen" und dann wartest Du nur einmal 1 Sekunde und holst Dir anschließend von allen Sensoren nacheinander die Messwerte ab.

Grüße,
Markus

Grüße,
Markus
 
Hi Markus,

Man müsste auch nochmal im Datenblatt nachsehen ob es Broad-Cast Botschaften gibt. Das habe ich jetzt nicht mehr im Kopf. Bedeutet, Du sendest einmal auf dem 1Wire "Hallo an alle bitte jetzt messen" und dann wartest Du nur einmal 1 Sekunde und holst Dir anschließend von allen Sensoren nacheinander die Messwerte ab.

Geht :D Nennt sich Skip ROM (0xCC). Der nachfolgende Befehl wird dann
von allen ausgeführt.

Gruß
Dino
 
Danke Dino für die schnelle Antwort!

@Rolf; damit müsstest Du die wesentlichen Informationen haben um mit Deinen DS's ins Feld zu ziehen. Wenns klemmt frag einfach nach!

Grüße,
Ma
 
Eine Sache noch ...
wenn mann mehrere DS1820 an einem Bus zur Messung antreibt dann
habe ich die Befürchtung, das die Spannung über Phantom-Speisung
doch stark zusammenbrechen könnte.
Bei einem mag das laufen. Bei 2 oder mehr hab ich das noch nicht getestet.
Die schreiben im Datenblatt ja auch, man soll während der Messung oder
dem Speichern im EEPROM vom DS1820 die Leitung über einen FET
direkt auf +5V schalten.

Gruß
Dino
 
Dann speist den DS1820 doch einfach konventionell! Ist meiner Meinung nach besser zu handeln und man muss sich keine Gedanken um den PIN und das Timing machen!

Grüße,
Ma
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)