DS18x20 User Byte 1 + 2

JOJO150272

Mitglied
23. März 2008
30
1
8
Sprachen
DS18s20 User Byte 1 + 2

Hallo Leute,

ich verfolge diesen Beitrag mit großem Interesse und habe dabei mal die Datenblätter der DS18x20 studiert.

Dabei ist mir aufgefallen, dass es die TL und TH Register für Alarmwerte gibt. Sie haben aber auch eine weitere Funktion als User Byte 1 und User Byte 2.
Wie und als was kann man das User Byte verwenden? Könnte ich da eine Zahl reinschreiben woran ich die Reihenfolge bei mehreren Sensoren erkennen könnte ???

Gruß Jörg
 
Hallo Leute,

ich verfolge diesen Beitrag mit großem Interesse und habe dabei mal die Datenblätter der DS18x20 studiert.

Dabei ist mir aufgefallen, dass es die TL und TH Register für Alarmwerte gibt. Sie haben aber auch eine weitere Funktion als User Byte 1 und User Byte 2.
Wie und als was kann man das User Byte verwenden? Könnte ich da eine Zahl reinschreiben woran ich die Reihenfolge bei mehreren Sensoren erkennen könnte ???

Gruß Jörg
Hallo Jörg,
da es sich bei deiner Frage um ein ganz anderes Thema handelt, würde ich dafür einen neuen Thread aufmachen. Vielleicht können die Mods das tun.

Die Werte der Register werden dir ja bei jedem Auslesen der Daten als Byte 2+3 geliefert. Darüber kannst du also einfach eine Identifizierung des Sensors vornehmen. Hierbei werden die Werte gelesen, die zuletzt per Recall_E² (&HB8) vom EEPROM gelesen wurden. Das Einschalten der Spannungsversorgung des Sensors liest ebenfalls die Daten vom EEPROM.
Schreiben kannst du die Werte mit dem Kommando Copy_ScratchPad (&H48). Danach das Recall_E² nicht vergessen.

HBA
 
Vielleicht können die Mods das tun.
Hat er getan. ;)


Hallo zusammen!

Ich sehe das genauso wie HBA und darum wurden von mir die beiden Beiträge in einen neuen Thread verschoben.
Damit aber der Zusammenhang deines ersten Satzes gewart bleibt, habe ich zusätzlich einen Link zum "alten" Thema eingefügt. ;)

So und nun muss ich mir erst mal das Datenblatt des DS18x20 raussuchen.....


Grüße,
Cassio
 
Weitere Fragen

Hallo,

erstmal danke an Cassio für das schnelle verschieben des Threads. Ich war mir nicht ganz sicher, ob ich einen neuen Thread anlegen sollte.

Dann auch ein herzliches danke an HBA für die schnelle Antwort.
Ich hätte da aber noch ein paar Fragen, weil ich das Datenblatt wohl nicht ganz verstehe.

Ich habe zwar erkannt, dass ich mit Kommando 48xh Daten zum ScratchPad schieben kann. Danach das Recall_E² B8xh ausführen um die Werte auszulesen. Aber was ich nicht verstehe, woran erkenne ich das es "eigene Werte" sind und keine Alarmwerte???

Entweder habe ich da was überlesen oder ich habe es nicht verstanden.

Gruß Jörg, der nochmals Danke sagt
 
Aber was ich nicht verstehe, woran erkenne ich das es "eigene Werte" sind und keine Alarmwerte???

Hallo!

Ich habe auch noch mal etwas im Datenblatt gestöbert und habe es so verstanden, dass du in Byte 2 und Byte 3 eigene Werte ablegen kannst.
Diese Alarmwerte kannst du dann auch ins EEPROM speichern und sie natürlich auch wieder ins Scratchpad zurück holen.

Allerdings kannst du in die beiden Bytes (2 + 3) nur Alarmwerte (für T-Low und T-High) ablegen..... und keine Sensorkennungen!

Da die Sensoren nur mit einem Alarmflag arbeiten.... und nicht mit Temperaturwerten.... sind die ausgelesenen Werte aus Byte 2+3 immer deine eigenen hinterlegten.


Grüße,
Cassio
 
Hallo Cassio,

genau das hatte ich auch aus den Datenblättern des DS18S20 und des DS18B20 herausgelesen. War mir aber nicht wirklich sicher.

Ich hatte vor in den ersten Sensor die Nummer 1 in den beiden User Bytes abzulegen, in allen weiteren die entsprechende Nummer des Sensors um festzulegen welcher Sensor an welchem Kanal angeschlossen ist. Wenn nun zB. der Sensor 5 ausgetauscht wird kann man feststellen das die Sensoren 1-4 und die Sensoren 6-8 eine Nummer haben und der Sensor der keine Nummer hat bekommt dann die Nummer 5 zugewiesen. So hatte ich die Idee das die Reihenfolge der Sensoren nicht durch die Seriennummer verändert wird.

Ich möchte das zuweisen der Sensoren so gestalten, dass beim Einschalten immer nach Sensoren gesucht wird und die Sensoren die keine Nummer in den User Bytes haben bekommen die erste freie Sensor Nummer zugewiesen. Die Sensoren werden so eingelesen, dass der erste Sensor angeschlossen wird und nach dem Einschalten der Steuerung eine Nummer zugewiesen bekommt, dann wird die Steuerung wieder ausgeschaltet und ein weiterer Sensor angeschlossen und die Steuerung wieder in Betrieb genommen. Das wird so für alle 8 Sensoren gemacht.

Gruß Jörg, der gerne eure Meinung zu dieser Idee wüßte
 
Hallo !

Ich weiß was du meinst.... und wie du dir das gedacht hast.

Letztlich ist es aber doch egal, ob der Sensor (1C2B3A4F....) nun als erster Sensor zurück gemeldet wird, oder als fünfter.

Du speicherst die Sensor-ID jedes einzelnen Sensors einfach in deinem Programm ab (z.B. jeweils ein Byte-Array) und gibst ihnen Nummern (dem Array).

Im Programm kannst du dann einzeln die Sensoren bequem mit deinen Variablen aufrufen und abfragen...... wenn es sein muss auch der Reihe nach mit Num1(1), Num2(1), Num3(1), oder nach Hund(1), Katze(1), Maus(1). ;)


Ich denke, dass du deswegen nicht die Alarm-Bytes dafür zweckentfremden müsstest.

Gruß,
Cassio
 
Reihenfolge der Sensoren

Hallo,

Letztlich ist es aber doch egal, ob der Sensor (1C2B3A4F....) nun als erster Sensor zurück gemeldet wird, oder als fünfter.

Die Reihenfolge ist meiner Meinung nach eigentlich sehr wichtig.

1. Sensor: Heizung Vorlauf
2. Sensor: Heizung Rücklauf
3. Sensor: Heizung Kesselwasser
4. Sensor: Außentemperatur
5. Sensor: Brauchwasser Speicher
6. Sensor: Solar Vorlauf
7: Sensor: Solar Rücklauf
8. Senosr: Schichtenspeicher

Wenn jetzt der Sensor 5 defekt ist, dann würde ja der neue Sensor die Reihenfolge je nach Seriennummer verändern und ich hätte falsche Messwerte.

Wie löst man dann dieses Prob ohne jedes mal den Code zu ändern ???

Gruß Jörg
 
Hallo !

Hm, die Reihenfolge ist doch eigentlich überhaupt nicht wichtig.

Wichtig ist doch lediglich nur, dass du die Seriennummern jedes einzelnen DS1820 richtig zuordnest.
Du musst im Programm doch sowieso die Sensoren einzeln ansprechen (&H55) und die Romdaten übermitteln, damit du auch den richtigen Temperaturwert für z.B. den "Brauchwasserspeicher" bekommst.
Oder wie hast du das im Programm gelöst? :hmmmm:

Tja, wie du die Seonsor-ID`s im laufenden Programm änderst, ohne ein neues Programm zu kompilieren ist eine Sache der Programmierung und der Variablenverwaltung.

Eigentlich ist es doch auch schade, wenn du die Möglichkeit für die Alarmwerte durch Zweckentfremdung "unbrauchbar" machen würdest.
Gerade durch deine vielen verschiedenen Bereiche gibt es doch bestimmt verschiedene Min- und Max-Temperaturen.
Mit dem Kontrollieren des Alarmflags in allen DS1820 weiß dein Programm innerhalb kürzester Zeit, dass in einem Bereich etwas nicht stimmt.

OK... bleibt aber deine Entscheidung. ;)


Grüße,
Cassio
 
Die Reihenfolge ist meiner Meinung nach eigentlich sehr wichtig.
Hallo Jörg,
du gehtst davon aus, dass du die Sensoren über 1wSearchFirst und 1w SearchNext ansprichst. Dann hast du vollkommen recht.
Der neue Sensor wird sich auch nicht in die Lücke einfügen, sondern entsprechend seiner ID irgendwo einsortiert.
Daher meinst Cassio, dass du die IDs im Programm irgendwo (ich machs im EEPROM des µCs) abspeicherst. Dann selektierst du die Sensoren z.B. über 1wVerify.
Meiner Meinung nach kann man die Alarmfunktion dazu ebenso gut nutzen, weil sie für den Betrieb nicht wirklich hilfreich ist. Die Sensoren melden sich nicht von selber (etwa durch eine Art Interrupt), dass bei ihnen ein Alarmzustand eingetreten ist, sondern erst auf Anfrage des Masters. Außerdem gibt es keinen Unterschied zwischen über- und unterschreiten.
Du kannst mit dem entsprechenden Befehl (Alarm_Search (&HEC) nur die Sensoren selektieren, die sich im Alarmzustand befinden. Wenn sich dann mehrere melden, musst du wieder feststellen, welcher es ist.
Normalerweise musst du eine Überprüfung der Temperatur im Programm sowieso durchführen und kannst dann auch direkt auf Über- oder Unterschreiten der Alarmwerte checken.

Wie löst man dann dieses Prob ohne jedes mal den Code zu ändern ???
Indem man im Programm eine Zuordnung der Sensor ID zu einer Nummer implementiert. Also so, wie Cassio das mit dem Array vorgeschlagen hat ode durch feste Positionen der Sensor IDs im EEPROM.

HBA
 
Hallo zusammen!

Berichtige mich bitte HBA, wenn ich mich gerade irre....

Wenn sich nun acht ID`s im EEPROM befinden und er wechselt einen der Sensoren aus, dann stimmen noch sieben ID`s mit den Sensoren überein.... aber eben die ID des neuen Sensors wird nicht berücksichtig.
Man benötigt aber die ID, um den Sensor dirket ansprechen zu können (55h + ROM-ID).

Da er sein Programm dann aber nicht neu kompilieren möchte, MUSS er also im Programm eine Routine haben die es ihm ermöglicht, EINE der alten ID`s zu löschen (und zwar die Richtige) und dafür EINE Neue zu erfassen.
Er kommt also um die "Zuordnung" der ID`s mit Variablen seiner Wahl im Programm nicht herum.
In wie weit dies automatisch gehen könnte, wenn ein Sensor gewechselt wurde, vermag ich momentan nicht zu sagen. :hmmmm:
Wenn ein Sensor ausfällt und ausgetauscht wird, ist das vielleicht noch zu machen...... was aber, wenn zwei Sensoren kurz nach einander ausfallen?

Was mich an der Idee mit der Nummer im "Alarmbyte" auch stören würde ist die Tatsache, dass ich vor dem Einsatz eines neuen Sensors diesen auch erst noch mit der "Nummer" programmieren müsste.
Also nicht einfach den Sensor aus der Kiste holen, gleich einbauen und im Programm kurz eine Serviceroutine aufrufen, die den neuen Sensor dem Programm zuordnet.
Gar nicht dran zu denken, dass ein Sensor sporadisch ausfällt (oder öfter fehlerhafte Werte übermittelt) und man mal eben durch "Tauschen" der Sensoren herausfinden möchte, ob es wirklich am Sensor liegt. :cool:



Was die Alarmflags betrifft....
Nun das sehe ich ein wenig anders. ;)
Selbst wenn ich nur zwei Sensoren am Bus habe ist eine Programmabfrage über den Alarmzustand aller Sensoren wesentlich schneller als jeden einzeln auszulesen und mit Alarm-Min- sowie Alarm-Max-Werte zu vergleichen.

Natürlich kann man dies auch alles im Programm mit einbauen, und auf die Alarmfunktion verzichten. Gerade wenn man sowieso permanent die Werte abfragt. Allerdings habe ich dann ggf. immer vier Temperaturwerte für jeden Sensor im Programm (Schaltwert Min, Schaltwert Max, Alarmwert Min, Alarmwert Max.).... und das bei acht Sensoren?

Es kommt aber wie immer auf den Verwendungszweck, die Speichergröße und die persönliche Einstellung dazu an. ;)


Grüße,
Cassio :)
 
Hallo Jörg,

so wie HBA und Cassio das vorgeschlagen haben, wird es die einzige Möglichkeit sein jeden einzelnen Sensor explizit zu selektieren.

Du kommst um das Implementieren eines Array mit den Sensor-ID's nicht herum. Das setzt für Dich natürlich voraus, dass Du im Vorfeld Dir eine kleine SW schreibst die nix anderes macht als die ID's aus dem Sensor auszulesen und Dir anzuzeigen. Ja, das istwas händische Arbeit. Du wirst in der aktuellen Implementierung Deines Programms dann bei Sensorwechel auch immer am Programm Hand anlegen müssen.

Es sei denn Du implementierst Dir ein Einstellungmenü mit dem Du Sensoren anlernen und zuordenen kannst. Damit hättest Du dann etwas SW gestützte Intelligenz und müsstest nicht jedes Mal neu an den Code ran und das Array ändern. ..... Oder Du verwendest eine Tabelle in einer Datei die Du mittels Flash-Tool direkt in das EEPROM schreibst und via SW ausliest. ....

Andere Möglichkeiten sehe ich auch nicht.

Grüße,
Markus
 
Hallo an ALLE,

bei der ersten Installation wird Sensor für Sensor angesteckt und so die Zuordnung festgelegt. Die Searchfirst, Searchnext Funktion wir nach anlegen der Spannungsversorgung aufgerufen um die Sensoren zu initialisieren.

Da die Module zum Teil in Unterputzdosen sind, habe ich auch keinerlei Tasten mit denen ich Unterprogramme aufrufen könnte.

Die Alarmwerte verwende ich gar nicht, da die Sensoren ihre Messwerte an mein Gebäude Bus System weitergeben.

Ich habe es mir so vorgestellt, dass ich nicht für jeden der 8 Sensoren ein eigenes Array spendieren wollte, ich möchte nur ein Array für alle 8 Sensoren anlegen. Ich lege die Seriennummern mit der Sensor Nummer im EEProm ab. So habe ich eindeutig jeden Sensor zugeordnet.

Wenn nun z.B. der Sensor 5 defekt ist und gegen einen neuen ausgetauscht wird soll es nach einem erneuten einschalten so funktionieren:
Beim auslesen der Sensoren werden die Seriennummern und die Sensor ID's erkannt von den Sensoren 1-4 und 6-8. Wenn beim Auslesen ein Sensor keine eigene ID hat, wird die Seriennummer im EEprom zwischengespeichert und nach erfolgter Kontrolle der ID's wird die Zwischengespeicherte Seriennummer an die Stelle den fehlenden Sensors 5 geschrieben und der Sensor bekommt die ID 5 zugewiesen.

Die ID der Sensoren würde ich zur Neuinstallation auf dem Steckboard löschen wollen.

Was haltet Ihr den von diesem Verfahren???

Gruß Jörg
 
Also für mich hört sich das zunächst nicht schlecht an ... kommt nur darauf an, wie es jetzt implementiert wird :rolleyes:
 
Hallo Markus,

da bin ich jetzt Stück für Stück dran.

Habe inzwischen das Auslesen des Laser Rom und das abspeichern der Seriennummern im EEprom vorgenommen. Sollte ich da auch die CRC und den Family Code mit abspeichern???

Bin gerade daran die ID in den DS18x20 zu schreiben.

Jetzt stellt sich gerade für mich die Frage ob man die CRC (ROM oder scratchpad) immer prüfen sollte um einen Lesefehler auszuschließen.

Gruß Jörg, der nicht weis wie oft es Lesefehler gibt :confused:
 
Hallo Jörg!

Von der Idee her klingen deine Überlegungen gar nicht so verkehrt.

Allerdings bin ich der Meinung, dass dann auch immer nur ein Sensor ausfallen darf..... oder zumindest nur ein Sensor nicht erreichbar sein darf.
Sobald es zwei oder mehr Sensoren sind (durch eine Störung oder Ähnliches), steht das Konzept aber auf wackligen Beinen.
Oder habe ich da etwas nicht verstanden?


Zwei Sachen verstehe ich auch noch nicht ganz.....
Ich denke, du möchtest Temperaturen wie Brauchwasser, Heizungs Vor- und Rücklauf und soetwas erfassen. Wieso sind die Sensoren dann in Unterputzdosen?
Oder meintest du die "Zwischenstation" die dann die Daten an dein Hausbussystem weiter gibt?

Wenn du ein Hausbussystem hast, kannst du da keine Serviceroutinen integrieren, die dann an der "Zwischenstation" ein Sub aufrufen und den neuen Sensor integrieren?

Nun ja.... .Möglichkeiten gibt es wohl viele. ;)
Ich werde aber gern deine Idee weiter verfolgen.... sofern du sie hier berichtest und einstellst.

Grüße,
Cassio
 
Hallo Cassio,

Allerdings bin ich der Meinung, dass dann auch immer nur ein Sensor ausfallen darf..... oder zumindest nur ein Sensor nicht erreichbar sein darf.
Sobald es zwei oder mehr Sensoren sind (durch eine Störung oder Ähnliches), steht das Konzept aber auf wackligen Beinen.
Oder habe ich da etwas nicht verstanden?

Wo siehst Du da die Probs???

Wenn z.B. die Sensoren 4-7 ausgefallen sind wegen Kabelbruch dann werden die Sensoren doch beim wieder anschließen an ihrer ID erkannt. Falls bei einem Ausfall ein Sensor defekt wäre fehlt nach wieder anschließen z.B. der Sensor mit der ID 5 und kann durch einen neuen Sensor ausgetauscht werden.


Zwei Sachen verstehe ich auch noch nicht ganz.....
Ich denke, du möchtest Temperaturen wie Brauchwasser, Heizungs Vor- und Rücklauf und so etwas erfassen. Wieso sind die Sensoren dann in Unterputzdosen?
Oder meintest du die "Zwischenstation" die dann die Daten an dein Hausbussystem weiter gibt?

Die AVR's sind teilweise in UP-Dosen, in AP-Gehäusen und UV vergraben :( . Die Sensoren sind über Kabel zu den einzelnen Messstellen geführt.


Wenn du ein Hausbussystem hast, kannst du da keine Serviceroutinen integrieren, die dann an der "Zwischenstation" ein Sub aufrufen und den neuen Sensor integrieren?

Da es ein fertiges Gebäude Bus System ist, sind Befehle nicht ganz einfach zu implementieren im Bus System. Mal schauen ob ich da was machen kann. Die Idee ist nämlich echt gut :adore: .


Nun ja.... .Möglichkeiten gibt es wohl viele. ;)
Ich werde aber gern deine Idee weiter verfolgen.... sofern du sie hier berichtest und einstellst.

Das werde ich auf jeden Fall machen. Ich hoffe :D ja auch, dass ich dann von euch auf meine größeren und Mega großen Fehler hingewiesen werde.


Gruß Jörg
 
Da es ein fertiges Gebäude Bus System ist, sind Befehle nicht ganz einfach zu implementieren im Bus System.

Hallo Jörg!

Ah ja.... jetzt setzt sich das Puzzle langsam in meinem Kopf zusammen. ;)

Wenn man natürlich nicht alle Hintergrundinfos hat, dann tappt man teilweise doch etwas im Dunkeln.

Jetzt habe ich auch verstanden, wie du das mit den ID`s und dem "Wiederanschließen" gemeint hast.
Ich war davon ausgegangen, dass beim defekten oder fehlendem Sensor die ID im AVR gelöscht wird und sobald eine neue ID hinzu kommt, wird diese der freien Stelle zugewiesen.
Darum hatte ich die Probleme mit zwei oder mehr Sensoren gesehen.



Das werde ich auf jeden Fall machen. Ich hoffe :D ja auch, dass ich dann von euch auf meine größeren und Mega großen Fehler hingewiesen werde.

Nun.... wir wollen doch mal hoffen, dass es nur Tiny-Fehler sind und keine Mega-Fehler. ;)

Grüße,
Cassio
 
Hallo Leute,

nun habe ich mal angefangen mich näher mit dem Thema zu beschäftigen und bin gerade dran den Code zusammen zu basteln.

Habe hier mal ein paar Zeilen mit der bitte um eure Meinung was ich da verbessern könnte

Code:
   ' Variablen 1wire
   Dim B_1w_lrc(8) As Byte                                                     ' Laser Rom Code
   Dim B_1w_lrc_tmp As Byte                                                    ' Temp. Laser Rom Code Variable
   Dim B_1w_lrc_new(8) As Byte                                                 ' Neue Laser Rom Code Variable
   Dim B_1w_count As Byte                                                      ' Anzahl 1wire Sensoren
   Dim B_1w_memory(9) As Byte                                                  ' 1wire Zwischenablage
   Dim B_1w_id(2) As Byte                                                      ' 1wire ID Byte's
   Dim B_1w_sensor As Byte                                                     ' 1wire Sensor aktiv

   Dim B_1w_err_flag As Bit                                                    ' Flag ob Fehler vorhanden
   Dim B_1w_id_flag As Bit                                                     ' Flag ob Sensor ID gesetzt
   Dim I_e2_rom_step As Integer                                                ' Variable für Addresse im EEprom


1w_search:                                                                     ' Einlesen des 1wire Bus
   B_1w_lrc(1) = 1wsearchfirst()

      If Err = 0 Then                                                          ' Überprüfung ob ein 1wire Gerät vorhanden ist
         Do
            Gosub 1w_r_rom                                                     ' Auslesen der Zwischenablage
            Gosub A_lrc                                                        ' Testanzeige der Laser Rom Code an der RS232
            Gosub A_memory                                                     ' Testanzeige der Zwischenablage an der RS232
            Gosub 1w_id_search                                                 ' Überprüfung der Sensor ID
               If B_1w_id_flag = 1 Then                                        ' Auswertung ob der Sensor eine ID hat
                  Gosub 1w_e2w_sernr                                           ' Schreiben der 1wire Seriennummer in den EEProm
               End If
            B_1w_lrc(1) = 1wsearchnext()
         Loop Until Err = 1                                                    ' solange bis sich keine weiteren Geräte mehr melden
      End If
   B_1w_count = 1wirecount()                                                   ' Anzahl der vorhandenen 1wire Geräte
Return
' --------------------------------------------------------------------------------------------------------------------------------------------------------------------

1w_r_rom:                                                                      ' Zwischenablage auslesen
   1wreset
      1wwrite &H55                                                             ' Match ROM
      1wverify B_1w_lrc(1)                                                     ' Sensor mit Seriennummer ansprechen
      1wwrite &HBE                                                             ' Auslesen der Zwischenablage
      B_1w_memory(1) = 1wread(9)                                               ' Übertragen der Zwischenablage in das Array
   1wreset
Return
' --------------------------------------------------------------------------------------------------------------------------------------------------------------------

1w_id_search:
Print "1w_id_search"
Print B_1w_memory(3)

   If B_1w_memory(4) = 255 Then                                                ' Kontrolle ob User Byte 2 auf 255 gesetzt ist
      Select Case B_1w_memory(3)                                               ' Kontrolle des User Byte 1
         Case 1
            B_1w_sensor.0 = 1                                                  ' Sensor ID 1 wird Bit weiße gesetzt
            I_e2_rom_step = &H012                                              ' Startaddresse im EEProm
               Gosub 1w_lrc_check                                              ' Vergleich LRC und EEProm
         Case 2
            B_1w_sensor.1 = 1                                                  ' Sensor ID 2 wird Bit weiße gesetzt
            I_e2_rom_step = &H022                                              ' Startaddresse im EEProm
               Gosub 1w_lrc_check                                              ' Vergleich LRC und EEProm
         Case 3
            B_1w_sensor.2 = 1                                                  ' Sensor ID 3 wird Bit weiße gesetzt
            I_e2_rom_step = &H032                                              ' Startaddresse im EEProm
               Gosub 1w_lrc_check                                              ' Vergleich LRC und EEProm
         Case 4
            B_1w_sensor.3 = 1                                                  ' Sensor ID 4 wird Bit weiße gesetzt
            I_e2_rom_step = &H042                                              ' Startaddresse im EEProm
               Gosub 1w_lrc_check                                              ' Vergleich LRC und EEProm
         Case 5
            B_1w_sensor.4 = 1                                                  ' Sensor ID 5 wird Bit weiße gesetzt
            I_e2_rom_step = &H052                                              ' Startaddresse im EEProm
               Gosub 1w_lrc_check                                              ' Vergleich LRC und EEProm
         Case 6
            B_1w_sensor.5 = 1                                                  ' Sensor ID 6 wird Bit weiße gesetzt
            I_e2_rom_step = &H062                                              ' Startaddresse im EEProm
               Gosub 1w_lrc_check                                              ' Vergleich LRC und EEProm
         Case 7
            B_1w_sensor.6 = 1                                                  ' Sensor ID 7 wird Bit weiße gesetzt
            I_e2_rom_step = &H072                                              ' Startaddresse im EEProm
               Gosub 1w_lrc_check                                              ' Vergleich LRC und EEProm
         Case 8
            B_1w_sensor.7 = 1                                                  ' Sensor ID 8 wird Bit weiße gesetzt
            I_e2_rom_step = &H082                                              ' Startaddresse im EEProm
               Gosub 1w_lrc_check                                              ' Vergleich LRC und EEProm
         Case Else
            B_1w_err_flag = 1                                                  ' 1wire Fehler Flag setzen
            Print "Falsche ID User Byte 1"                                     ' Testanzeige ob ID gültig an der RS232
      End Select
   Else
      B_1w_err_flag = 1                                                        ' 1wire Fehler Flag setzen
      Print "Falsche ID User Byte 2"                                           ' Testanzeige ob ID gültig an der RS232
   End If
Return
' --------------------------------------------------------------------------------------------------------------------------------------------------------------------

1w_lrc_check:                                                                  ' Vergleich LRC und EEProm
      For I = 1 To 8 Step 1
         Readeeprom B_1w_lrc_tmp , I_e2_rom_step                               ' Auslesen des LRC
            If B_1w_lrc(i) <> B_1w_lrc_tmp Then                                ' Vergleichen des LRC mit dem EEProm Inhalt
      B_1w_err_flag = 1                                                        ' 1wire Fehler Flag setzen
      Print "Falscher LRC"                                                     ' Testanzeige ob LRC gültig an der RS232
            End If
         Incr I_e2_rom_step                                                    ' Variable für Addresse im EEprom um 1 erhöhen                              '
      Next
Return
' --------------------------------------------------------------------------------------------------------------------------------------------------------------------

1w_reset:

 1wreset
 1wwrite &H55
 1wverify B_1w_lrc(1)
 1wwrite &H44

Return
' --------------------------------------------------------------------------------------------------------------------------------------------------------------------

1w_id:                                                                         ' 1wire User Byte 1 + 2 setzen
   1wreset
   '   1wwrite &H55                                                                ' Match ROM
      1wverify B_1w_lrc(1)                                                        ' Seriennummer
      1wwrite &H4E                                                                ' Schreibe Zwischenablage
      1wwrite B_1w_id(1)                                                          ' TH + User Byte 1
      1wwrite B_1w_id(2)                                                          ' TL + User Byte 2
   1wreset
   '   1wwrite &H55                                                                ' Match ROM
      1wverify B_1w_lrc(1)                                                        ' Seriennummer
      1wwrite &H48                                                                ' Kopiere Zwischenablage
   'Waitms 15
   1wreset
Return
' --------------------------------------------------------------------------------------------------------------------------------------------------------------------

'Return

A_lrc:
   Str_anzeige = "1wire Seriennummer"
      For I = 1 To 8 Step 1
         Str_anzeige = Str_anzeige + " : "
         Str_tmp_1 = str(b_1w_lrc(i))
         Str_anzeige = Str_anzeige + Format(str_tmp_1 , "000")
      Next Until I
   Print Str_anzeige
Return



A_memory:
   Str_anzeige = "1wire Messwert    "
      For I = 1 To 9 Step 1
         Str_anzeige = Str_anzeige + " : "
         Str_tmp_1 = Str(b_1w_memory(i))
         Str_anzeige = Str_anzeige + Format(str_tmp_1 , "000")
      Next Until I
   Print Str_anzeige
Return


1w_e2w_sernr:

   For I = 1 To 8 Step 1
       B_1w_lrc_new(i) = B_1w_lrc(i)
   Next

   B_1w_err_flag = 0


Return
' --------------------------------------------------------------------------------------------------------------------------------------------------------------------


Hier mal Daten von 4 Sensoren:

Sensor ID 5
1wire Seriennummer : 016 : 116 : 244 : 156 : 001 : 008 : 000 : 040
1wire Messwert : 170 : 000 : 005 : 255 : 255 : 255 : 012 : 016 : 093

Keine ID
1wire Seriennummer : 016 : 124 : 041 : 180 : 001 : 008 : 000 : 087
1wire Messwert : 170 : 000 : 075 : 070 : 255 : 255 : 012 : 016 : 135

Sensor ID 1
1wire Seriennummer : 016 : 037 : 002 : 157 : 001 : 008 : 000 : 132
1wire Messwert : 170 : 000 : 001 : 255 : 255 : 255 : 012 : 016 : 129

Keine ID
1wire Seriennummer : 016 : 229 : 255 : 156 : 001 : 008 : 000 : 222
1wire Messwert : 170 : 000 : 075 : 070 : 255 : 255 : 012 : 016 : 135

Hier noch mal eine Frage, ich habe ca. 30 Sensoren ausgelesen und die hatten immer die Werte 075 und 070 in den beiden User Bytes. Ist das bei euren Sensoren auch so??? Könnte das jemand von euch mal überprüfen ob das bei euren Sensoren auch so ist???


Gruß Jörg
 
Ist zwar schon älter, das ignoriere ich jetzt einfach mal.

Das Problem mit den Sensoren hatte ich auch schon, wenn ich an mein Gerät zB. 6 DS18S20 anschließe, welcher ist dann welcher?
ID auslesen ist kein Problem, aber zu welchem Kanal soll sie zugeordnet werden?

Eine Möglichkeit wäre;
1. DS einstecken
2. neuen DS suchen lassen
3. zuordnen
4. zurück zu 1. bis alle zugeordnet sind

Die Nachteile: relativ aufwendig zu Proggen, umständlich in der Handhabung

Meine Lösung: 6x 1Wire Kanäle/Pins,
jetzt ist zwar die Bezeichnung 1Wire absurd, dafür funktioniert es Perfekt, ich steck nen neuen DS ein, paar Sec später misst er schon die Temperatur.
Nachteil, klar 6 Pins belegt, deshalb benutz ich auch TQFP 64 dafür.
 

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