Mehrere DS18B20

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Mehrere DS18B20

      Moin Moin,
      ich habe folgendes Problem: Ich möchte bis zu 4 Stück DS18B20 möglichst schnell auslesen und in einem LCD Display anzeigen. Momentan habe ich 4 Sensoren an 4 Pins und dazu eine Routine, die ich 4x aufrufe was natürlich recht lange dauert. Die Anzahl der Pins ist egal, aber es sollte irgendwie schneller gehen.
      Meine aus dem Netz geklaute Routine:

      Source Code

      1. Config Single = Scientific , Digits = 2
      2. Dim DS18B20(9) As Byte
      3. Dim TempD1 As Single
      4. Dim TempD2 As Single
      5. Dim TempD3 As Single
      6. Dim TempD4 As Single
      7. Dim Itemperature As Integer At DS18B20 Overlay 'enthält Temp. in 0.0625°C
      8. .
      9. .
      10. .
      11. .
      12. Config 1wire = Portd.2
      13. 1wreset 'Initialisierung
      14. 1wwrite &HCC 'Skip ROM Kommando
      15. 1wwrite &H44 'Convert Temperature Kommando
      16. waitms 850
      17. 1wreset 'Initialisierung
      18. 1wwrite &HCC 'Rom überspringen, nur 1 Sensor
      19. 1wwrite &HBE 'Temperatur auslesen
      20. DS18B20(1) = 1wread(9) 'Daten in ein Array lesen
      21. TempD1 = Itemperature * 0.0625 'umrechnen des DS18B20 Wertes in Grad Celsius
      22. 'ausgabe
      23. locate 1,3
      24. lcd TempD1
      Display All
      Habt ihr da nen Tip für mich wie ich das beschleunigen kann? Ich habe gelesen, das man die Sensoren auf einen Pin legen, die Seriennummern auslesen und ins Programm eintragen kann, das möchte ich aber nicht. Die Sensoren sollen Anhand der Porteingänge eindeutig zuzuordnen sein.

      Gruß
      Stefan
    • Hallo @17b
      war nur ne Trockenübung. Vielleicht hilft es dir weiter.

      BASCOM Source Code

      1. ' Insanity
      2. ' Trockentest ;-)
      3. ' Atmel Typ
      4. $Regfile="m328pdef.dat"
      5. $hwstack=32
      6. $swstack=32
      7. $framesize=40
      8. ' Quarz
      9. $crystal = 8000000
      10. ' Variablen und Prozeduren Declarieren
      11. Declare Sub Temp_messen_start
      12. Declare Sub Temp_lesen_start
      13. ' Variablen und Konstaten
      14. Dim Sc(9) As Byte
      15. Dim Temperatur(4) As Single
      16. ' falls sich mal das programm aufhängt:-)
      17. ' in ms
      18. Config Watchdog = 2048
      19. Start Watchdog
      20. ' Hauptprogramm
      21. Do
      22. Call Temp_messen_start
      23. Waitms 800
      24. Call Temp_lesen_start
      25. Print Temperatur(1)
      26. Print Temperatur(2)
      27. Print Temperatur(3)
      28. Print Temperatur(4)
      29. Waitms 100
      30. Reset Watchdog
      31. Loop
      32. End
      33. Sub Temp_messen_start
      34. 'DS18B20 Bus
      35. Config 1wire = Portc.0
      36. 1wreset
      37. 1wwrite &HCC ' Überspringe Rombefehl Seriennummer weglassen
      38. 1wwrite &H44 ' Messen
      39. Config 1wire = Portc.1
      40. 1wreset
      41. 1wwrite &HCC ' Überspringe Rombefehl Seriennummer weglassen
      42. 1wwrite &H44 ' Messen
      43. Config 1wire = Portc.2
      44. 1wreset
      45. 1wwrite &HCC ' Überspringe Rombefehl Seriennummer weglassen
      46. 1wwrite &H44 ' Messen
      47. Config 1wire = Portc.3
      48. 1wreset
      49. 1wwrite &HCC ' Überspringe Rombefehl Seriennummer weglassen
      50. 1wwrite &H44 ' Messen
      51. End Sub
      52. Sub Temp_lesen_start
      53. Local Dummy As Integer
      54. Config 1wire = Portc.0
      55. 1wreset
      56. 1wwrite &HCC
      57. 1wwrite &HBE ' Start Daten lesen
      58. Sc(1) = 1wread(9) ' Gelesene Daten ins Array
      59. Dummy = Makeint(sc(1) , Sc(2))
      60. Temperatur(1) = Dummy * 0.0625
      61. Config 1wire = Portc.1
      62. 1wreset
      63. 1wwrite &HCC
      64. 1wwrite &HBE ' Start Daten lesen
      65. Sc(1) = 1wread(9) ' Gelesene Daten ins Array
      66. Dummy = Makeint(sc(1) , Sc(2))
      67. Temperatur(2) = Dummy * 0.0625
      68. Config 1wire = Portc.2
      69. 1wreset
      70. 1wwrite &HCC
      71. 1wwrite &HBE ' Start Daten lesen
      72. Sc(1) = 1wread(9) ' Gelesene Daten ins Array
      73. Dummy = Makeint(sc(1) , Sc(2))
      74. Temperatur(3) = Dummy * 0.0625
      75. Config 1wire = Portc.3
      76. 1wreset
      77. 1wwrite &HCC
      78. 1wwrite &HBE ' Start Daten lesen
      79. Sc(1) = 1wread(9) ' Gelesene Daten ins Array
      80. Dummy = Makeint(sc(1) , Sc(2))
      81. Temperatur(4) = Dummy * 0.0625
      82. End Sub
      Display All
    • Es gibt laut der Hilfe auch eine andere möglichkeit

      BASCOM Source Code

      1. ' Insanity
      2. ' Trockentest ;-)
      3. ' Atmel Typ
      4. $Regfile="m328pdef.dat"
      5. $hwstack=32
      6. $swstack=32
      7. $framesize=40
      8. ' Quarz
      9. $crystal = 8000000
      10. ' Variablen und Prozeduren Declarieren
      11. Declare Sub Temp_messen_start
      12. Declare Sub Temp_lesen_start
      13. ' Variablen und Konstaten
      14. Dim Sc(9) As Byte
      15. Dim Temperatur(4) As Single
      16. ' falls sich mal das programm aufhängt:-)
      17. ' in ms
      18. Config Watchdog = 2048
      19. Start Watchdog
      20. ' Hauptprogramm
      21. Do
      22. Call Temp_messen_start
      23. Waitms 800
      24. Call Temp_lesen_start
      25. Print Temperatur(1)
      26. Print Temperatur(2)
      27. Print Temperatur(3)
      28. Print Temperatur(4)
      29. Waitms 100
      30. Reset Watchdog
      31. Loop
      32. End
      33. Sub Temp_messen_start
      34. 1wreset Portc,0
      35. 1wwrite &HCC ,1,Portc,0 ' Überspringe Rombefehl Seriennummer weglassen
      36. 1wwrite &H44 ,1,Portc,0 ' Messen
      37. 1wreset Portc,1
      38. 1wwrite &HCC ,1,Portc,1 ' Überspringe Rombefehl Seriennummer weglassen
      39. 1wwrite &H44 ,1,Portc,1 ' Messen
      40. 1wreset Portc,2
      41. 1wwrite &HCC ,1,Portc,2 ' Überspringe Rombefehl Seriennummer weglassen
      42. 1wwrite &H44 ,1,Portc,2 ' Messen
      43. 1wreset Portc,3
      44. 1wwrite &HCC ,1,Portc,3 ' Überspringe Rombefehl Seriennummer weglassen
      45. 1wwrite &H44 ,1,Portc,3 ' Messen
      46. End Sub
      47. Sub Temp_lesen_start
      48. Local Dummy As Integer
      49. 1wreset Portc,0
      50. 1wwrite &HCC,1,Portc,0
      51. 1wwrite &HBE,1,Portc,0 ' Start Daten lesen
      52. Sc(1) = 1wread(9,Portc,0) ' Gelesene Daten ins Array
      53. Dummy = Makeint(sc(1) , Sc(2))
      54. Temperatur(1) = Dummy * 0.0625
      55. 1wreset Portc,1
      56. 1wwrite &HCC,1,Portc,1
      57. 1wwrite &HBE,1,Portc,1 ' Start Daten lesen
      58. Sc(1) = 1wread(9,Portc,1) ' Gelesene Daten ins Array
      59. Dummy = Makeint(sc(1) , Sc(2))
      60. Temperatur(1) = Dummy * 0.0625
      61. 1wreset Portc,2
      62. 1wwrite &HCC,1,Portc,2
      63. 1wwrite &HBE,1,Portc,2 ' Start Daten lesen
      64. Sc(1) = 1wread(9,Portc,2) ' Gelesene Daten ins Array
      65. Dummy = Makeint(sc(1) , Sc(2))
      66. Temperatur(1) = Dummy * 0.0625
      67. 1wreset Portc,3
      68. 1wwrite &HCC,1,Portc,3
      69. 1wwrite &HBE,1,Portc,3 ' Start Daten lesen
      70. Sc(1) = 1wread(9,Portc,3) ' Gelesene Daten ins Array
      71. Dummy = Makeint(sc(1) , Sc(2))
      72. Temperatur(1) = Dummy * 0.0625
      73. End Sub
      Display All
      Man sollte aber denn gleichen Port benutzen
    • Du kannst Dir auch einmal Tabelle 2 auf Seite 9 im Datenblatt ansehen, wenn es Dir um schnell hintereinander Abfragen geht:
      datasheets.maximintegrated.com/en/ds/DS18B20.pdf
      Wenn Du bei der Auflösung Abstriche machen kannst, dann musst Du nach dem Anstoßen der Messungen nicht die berühmten 750ms warten.
      Prinzip ist ja immer:
      - Sensoren zum Messen anstoßen
      - den Sensoren >=750 ms Zeit geben (in der Zeit können auch abdere Dinge gemacht werden - muss nicht durch WAIT verbraten werden)
      - Werte abfragen, umrechnen und ausgeben.
      Wie Du weißt, kann man die Sensoren an EINEN Pin anschließen - ist kein Hexenwerk. Dann kann man auch alle Sensoren gleichzeitig zum Messen anstoßen.
      Wenn es Dir um schnelles Auslesen geht, würde ich
      - alle Sensoren an einen Pin anschließen
      - die Auflösung heruntersetzen
      - In der Schleife
      o alle Sensoren in einer Schleife auslesen und Werte in ein Array speichern
      o Messung bei allen anstoßen
      o Werte umrechnen und ausgeben
      o etwas abwarten (nach Tabelle abzüglich eventueller zeitfressender LCD- oder sonstiger Befehle)
    • stefanhamburg wrote:

      in der Zeit können auch abdere Dinge gemacht werden - muss nicht durch WAIT verbraten werden
      richtig, das kann man auch wunderbar im Sekundentakt machen, wenn man sowieso eine Uhr im Programm laufen hat.

      P.S.: Single-Berechnungen kosten sehr viel Zeit und sind für die Rechnung des DS1820 nicht nötig:
      Vergiss nicht, dass es 2 verschiedene Typen gibt.
      Beispiel: DS1820 DS18S20 DS18B20 Temperatursensor 1Wire
    • Wow, viel Input.
      Insanity, ich fang mal oben an die Vorschläge abzuarbeiten. Mal sehen wo ich lande.

      Stefan, hört sich auch nicht schlecht an. Eigentlich am passensten. Mal sehen ob ich da einen passenden Codeschnipsel finde

      Michael, die Chips sind definitiv 18B20. Die Zeit anstatt für wait für was anderes zu nutzen, so weit bin ich noch nicht. Bin ja froh das es bisher einigermassen läuft.

      Bis hierhin erstmal Danke!