Verständnisprobleme mit DS18B20 und 7Seg

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

    • Verständnisprobleme mit DS18B20 und 7Seg

      Hallo,

      ich möchte einen DS18B20 an einen AtMega48 anschließen und den Wert auf ein 7 Segment (4Digit) Display ausgeben.
      Leider habe ich einige Verständnisprobleme.
      Um den Sourcecode an meine Bedürfnisse anzupassen müsste ich verstehen was geschieht - das kann ich leider nicht.

      Source Code

      1. $regfile = "M32def.dat"
      2. $crystal = 16000000
      3. $baud = 38400
      4. Config 1wire = Portc.7
      5. Dim Ar(8) As Byte ' Array für SerienNr.
      6. Dim I As Byte
      7. Dim W As Word
      8. Sound Portd.7 , 400 , 450 ' BEEP bei RN-Control
      9. Print
      10. Print "1-Wire"
      11. Wait 1
      12. Ar(1) = 1wsearchfirst() ' 8 Bytes lesen, beschreibt Ar(1) bis Ar(8)
      13. ' gibts überhaupt ein Gerät
      14. If Err = 0 Then
      15. Do
      16. ' Ausgabe der SerienNr.
      17. For I = 1 To 8
      18. Print Hex(ar(i));
      19. Print " ";
      20. Next
      21. Print
      22. ' Nach weiterem Gerät suchen
      23. Ar(1) = 1wsearchnext() ' Seriennummer vom ächste Sensor, beschreibt Ar(1) bis Ar(8)
      24. Loop Until Err = 1 ' solange bis sich kein weiteres Gerät mehr meldet.
      25. End If
      26. Print "Fertig"
      27. W = 1wirecount() ' Anzahl der gefundenen Geräte zählen
      28. Print "Anzahl ";
      29. Print W
      30. Do
      31. Loop
      32. End
      Display All

      Quelle Sourcecode: rn-wissen.de/wiki/index.php/Bascom_und_1-Wire

      Hier macht mir der "Wait 1" Befehl Probleme da ich für das 7 Segment Display einen flotten Programmdurchlauf bräuchte. Natürlich könnte ich die Ausgabe an das 7 Segment Display auch per Timer erledigen lassen nur dann müsste ich den Chip mit mind. 4 Mhz betreiben und da das ding an Batterien hängt würde ich das gerne vermeiden.



      Source Code

      1. Do
      2. 1wverify Ar(1) ' Gerät mit der SerienNr. aus Ar() auswählen
      3. ' Gerät vorhanden
      4. If Err = 0 Then
      5. 1wwrite &H44 ' Temperaturmessung anstoßen
      6. Waitms 500 ' warten bis Messung fertig
      7. 1wverify Ar(1) ' Gerät mit der SerienNr. aus Ar(1)...Ar(8) auswählen
      8. 1wwrite &HBE ' Temperatur auslesen
      9. Sep(1) = 1wread(9) ' Daten in ein Array lesen, beschreibt Sep(1) bis Sep(9)
      10. For I = 1 To 9
      11. Print Hex(sep(i));
      12. Next
      13. Print
      14. ' Nur für die Temperatur wichtige Daten ausgeben
      15. Print Hex(sep(2));
      16. Print Hex(sep(1))
      17. ' High und Low-Byte, nach Datenblatt zusammen setzen und berechnen...
      18. Else
      19. Print "Fehler"
      20. End If
      21. Wait 1
      22. Loop
      Display All
      Quelle: rn-wissen.de/wiki/index.php/Bascom_und_1-Wire


      Auch hier sind die Waitms und Wait Befehle mein Problem. Wie könnte man sowas umgehen?



      Noch eine Frage: was bedeutet "&H" ? Ist das eine Zahlenwert/Adresse in Hexadezimaler Schreibtweise?


      Grüße & Danke!

      Alex
    • Ja: &h ist Präfix für eine Hexadezimalzahl.
      Im ersten Programmschnipsel ist das Wait vor der Hauptschleife - also unkritisch.
      Im zweiten Programmschnipsel das Waitms steht da, weil der Sensor Zeit zum Temperaturmessen bekommen muss. Je nach gewählter Auflösung unterschiedlich lange. Meist sieht man Waitms 750, weil man damit bei höchster Auflösung auf der sicheren Seite ist. Das entspricht dem Datenblatt.
      Vgl. Table 2
      datasheets.maximintegrated.com/en/ds/DS18B20.pdf


      Die Waits kann man umgehen, indem man einen 1-Sekundentimer definiert. In der Interruptroutine ein Flag setzen. Das Flag in der Hauptschleife abfragen. Wenn aufgetreten, dann erst Sensorwert auslesen und danach neue Temperaturmessung anstoßen. Dadurch bekommt der Sensor eine Sekunde Zeit zum neuen Temperaturmessen.
      Die Siebensegmentanzeige dann parallel mit Timer. Du musst nur gucken, dass die Timerinterrupts sich nicht gegenseitig reinfunken.
    • stefanhamburg wrote:

      Ja: &h ist Präfix für eine Hexadezimalzahl.
      Aha, dann kann ich das ganze auch dezimal schreiben?
      Tue mich mit der Hex bzw. Binär umrechnerei immer noch schwer.


      stefanhamburg wrote:


      Die Waits kann man umgehen, indem man einen 1-Sekundentimer definiert. In der Interruptroutine ein Flag setzen. Das Flag in der Hauptschleife abfragen. Wenn aufgetreten, dann erst Sensorwert auslesen und danach neue Temperaturmessung anstoßen. Dadurch bekommt der Sensor eine Sekunde Zeit zum neuen Temperaturmessen.
      Die Siebensegmentanzeige dann parallel mit Timer. Du musst nur gucken, dass die Timerinterrupts sich nicht gegenseitig reinfunken.
      Also warten bis Ereignis auftritt und dann in der Hauptroutine bearbeiten?
      Ja, ;) mit Timern und Interrupts wird das Programmieren immer lustig ;-D .
      Meistens funktioniert das ganze dann eine ganze weille nicht richtig oder aber nicht so wie es soll.

      Grüße
      Alex
    • Alex_T wrote:

      Aha, dann kann ich das ganze auch dezimal schreiben?
      Tue mich mit der Hex bzw. Binär umrechnerei immer noch schwer.
      Hallo Alex_T,
      Schau mal auf der Webseite von Uwe Sieber rein, da findest du ein kleines nützliches Tool zur Konvertierung der Zahlensysteme.
      Gruß Rudi
      Files
      Vielleicht fällt mir noch etwas ein...
    • Alex_T wrote:

      Hier macht mir der "Wait 1" Befehl Probleme da ich für das 7 Segment Display einen flotten Programmdurchlauf bräuchte. Natürlich könnte ich die Ausgabe an das 7 Segment Display auch per Timer erledigen lassen nur dann müsste ich den Chip mit mind. 4 Mhz betreiben und da das ding an Batterien hängt würde ich das gerne vermeiden.
      Bevor es zu spät ist, mit 1MHz kannst du nur mit tieferen Wissen deinen 1-wire Sensor auslesen.
      Dazu ist es nicht sinnvoll, wegen des Stromsparens den Takt zu reduzieren und dann eine stromhungrige 7-Segment Anzeige zu benutzen.
      Und zum dritten: Wenn die Anzeige von dir bzw vom Programm selbst multiplext wird, also keine eigene Intelligenz eingebaut hat, musst du 1-wire und 7-Segment Routinen ineinander verschachteln, damit du keine Aussetzer oder flackernde Anzeige bekommst.
    • stefanhamburg wrote:

      Du kannst ja mal damit anfangen, auf der Siebensegmentanzeige eine konstante Zahl anzeigen zu lassen. Als Basis kannst Du ein Programm aus dem Internet nehmen. Temperaturmessung dann im zweiten Schritt einbauen.
      Wobei Du JEDE Zeile Deines Programms verstehen musst. Frag sonst einfach.
      Nur Zusammenkopieren ohne Verstehen kannst Du vergessen.
      Hallo Stefan,

      7 Segment Anzeigen hab ich schon ziehmlich oft verwendet. Normalerweise verwende ich dafür einfach einen kompletten Port. Dieses mal wird es um einiges lustiger! Ich will für 2 Siebensegmentanzeigen 3 Schieberegister verwenden. Mit Schieberegistern und 7 Segment Anzeigen habe ich bereits gearbeitet und einige Projekte realisiert. Aber ich habe noch nie beides in kompination verwendet.

      Den DS18B20 Sensor wollte ich auch schon einige male verwenden. Habe aber noch nie welche zugeschickt bekommen (China) in Deutschland waren mir die die letzten Jahre immer zu teuer. Bei 5 Bestellversuchen hat mich keine einzige erreicht. Trotzdem das ich bei den selben Händlern schon ein paar mal gekauft hatte (andere komopnenten) ohne Probleme.

      Ich habe mir ausgedacht das ich Schieberegister 1 für 7Seg 1 verwende + Schieberegister 3 für GND von 7Seg1 dafür nutze ich die Prots Qa bis Qd und Schiebregister 2 für 7Seg 2 + Schieberegister 3 Port Qe bis QH. So müsste ich pro Programmdurchlauf jeweils eine Ziffer auf 7Seg1 und 7Seg2 gleichzeitig aktualisieren können. Dafür brauch ich zwar mehr Ports am MC aber dafür wirds interessant.

      Dieses mal hab ich welche in D bestellt und werd sie (hoffentlich) bald erhalten, ich freue mich schon auf die Arbeit mit den DS18B20 hab bisher nur mit NTCs gearbeitet und die sind extrem ungenau.

      Grüße
      Alex

      The post was edited 1 time, last by Alex_T ().

    • Rudi Einstein wrote:

      Hallo Alex_T,Schau mal auf der Webseite von Uwe Sieber rein, da findest du ein kleines nützliches Tool zur Konvertierung der Zahlensysteme.
      Gruß Rudi
      Hallo Rudi,

      das kenne ich bereits, dennoch vielen dank!
      Also dann kann ich das ganze auch in Dezimaler Schreibweise Adressieren?
      Dezimal fällt mir einfach leichter zu lesen. Hex und Dinär hab ich immer noch nicht drauf.

      Vielen dank
      Alex
    • Michael wrote:

      Bevor es zu spät ist, mit 1MHz kannst du nur mit tieferen Wissen deinen 1-wire Sensor auslesen.Dazu ist es nicht sinnvoll, wegen des Stromsparens den Takt zu reduzieren und dann eine stromhungrige 7-Segment Anzeige zu benutzen.
      Und zum dritten: Wenn die Anzeige von dir bzw vom Programm selbst multiplext wird, also keine eigene Intelligenz eingebaut hat, musst du 1-wire und 7-Segment Routinen ineinander verschachteln, damit du keine Aussetzer oder flackernde Anzeige bekommst.
      Ja, das hab ich auch schon gedacht werde das ganze mit mind. 4 Mhz laufen lassen. Auch an das verschachteln hab ich drüber nachgedacht anders wirds wohl kau funktionieren.

      Allgemeine Frage: muss ich auf die Antwort des DS18B20 warten?
      Also muss ich unmittelbar reagieren wenn der DS18B20 antwrotet?
      Oder ist das egal? und ich muss nur mind. 1 Sekunde warten?
      Mit der 1 wire kommunikation hab ich noch nie gearbeitet.
      Interrupts benutz ich auch nur selten.

      Grüße
      Alex
    • Dieses Projekt macht mich extrem kribbelig.
      Da ich dieses mal nicht alles auf Steckboards zusammenstecken kann.
      Dafür ist der ganze aufbau einfach zu komplex, mir fehlt es schon an drähten hierfür.

      Es muss gleich alles im gelöteten zustand funktionieren. Das ist ziehmlich aufregend.

      Möchte bei dem Projekt 2 Senosren gleichzeitig anzeigen lassen.
    • stefanhamburg wrote:

      Du musst nicht auf die Antwort des Sensors warten. Nach Anstoßen der Messung kannst Du ganz andere Sachen machen lassen und nach insgesamt mehr als 750 ms holst Du Dir das Messergebnis vom Sensor ab.
      Sorry für meine schlecht formulierte Frage. ?(
      Ich meinte: ist es egal wann ich die Antwort abhole?
      Dann könnte ich auf die Interrupts verzichten und nach etwa 740 ms bis 1100 ms die Antwort einfach holen.
      Dafür könnte ich einfach eine Zeitabfrage oder einen durchlaufzähler verwenden.
      Das würde für mich ein paar Fehlerquellen liquidieren.

      Grüße
      Alex
    • Alex_T wrote:

      Ich meinte: ist es egal wann ich die Antwort abhole?
      Dann könnte ich auf die Interrupts verzichten und nach etwa 740 ms bis 1100 ms die Antwort einfach holen.
      Dafür könnte ich einfach eine Zeitabfrage oder einen durchlaufzähler verwenden.
      Das würde für mich ein paar Fehlerquellen liquidieren.
      Dem DS1820 ist das egal. Nach dem Befehl, eine Mesung zu machen, musst du ihm mindestens 750ms Zeit lassen, bevor der stabile Wert im Scatchpad steht.
      Der Wert steht so lange dort, bis er durch eine neue Messung überschrieben wird.