DS18B20 mit atmega8

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

    • DS18B20 mit atmega8

      Hallo,
      bitte um Hilfe, ich versuche jetzt schon eine Woche den Temperaturfühler ds18b20 (genaue Beschriftung: DALLAS 18B20 1804C4 +51AG)mit einem ATmega8-16PU auszulesen, bzw. anzusprechen.

      Source Code

      1. $regfile = "m8def.dat"
      2. $crystal = 8000000
      3. $hwstack = 64
      4. $swstack = 64
      5. $framesize = 64
      6. Config Lcd = 16 * 2
      7. Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
      8. Config 1wire = Portd.7
      9. Dim Dsid1(8) As Byte
      10. Dim Dsid2(8) As Byte
      11. Dim Sc(9) As Byte
      12. Dim W As Word
      13. 1wreset
      14. W = 1wirecount()
      15. Sc(1) = 1wsearchfirst()
      16. Cls
      17. Locate 1 , 1
      18. Lcd "Anzahl = "
      19. Locate 1 , 10
      20. Lcd W
      21. Locate 2 , 1
      22. Lcd Hex(sc(1))
      23. Waitms 500
      24. end
      Display All

      Auf dem LCD erscheint bei der Anzahl = 0 und in der 2.ten Zeile als Familiencode 00

      ich habe den Temperaturfühler so angeschlossen:

      1 Masse
      2 über 4k7 Ohm an +5V, und direkt an D7 des atmega8
      3 an +5V

      Muss man die 1wire Bibliothek evtl. laden, oder muss man den 1Wire irgendwie initialisieren?

      Oder funktioniert der DS18B20 nicht am ATmega8-16PU mit Bascom?

      Oder seht ihr bitte einen Fehler im Code.

      Danke
    • Um die Temperatur geht es noch nicht. Es wird der ds18b20 noch nicht erkannt.
      Das sc() mit 9 bytes ist vielleicht um 1 byte zu groß und nur das erste byte anzuzeigen zu wenig? In der Hilfe steht das so

      '[DIM variables used]
      'we need some space from at least 8 bytes to store the ID
      Dim Reg_no(8) As Byte
      'we need a loop counter and a word/integer for counting the ID's on the bus
      Dim I As Byte , W As Word
      'Now search for the first device on the bus


      Reg_no(1) = 1wsearchfirst()
      For I = 1 To 8 'print the number
      Print Hex(reg_no(i));
      Next
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Danke,

      die Temperaturmessung funktionierte ja, nicht, deswegen bin ich zurück auf die Basis und will erst einmal den Sensor erkennen.

      Das mit der for next Schleife werde ich heute probieren.

      Aber irgenwie hab ich das Bauchgefühl, dass aus dem Sensor gar nichts ausgelesen wird. Ich versuchte auch schon den Sensor parasitär zu schalten, also 1 und 3 auf Masse. Ohne Erfolg.

      Beim LCD hatte ich auch lange gesucht, bis ich auf initLcd gestoßen bin, seitdem funktioniert wenigsten mal das LCD.
      Bei 1wire muss ich nichts initialisieren, oder?

      1 auf +5v und 3 auf Masse traue ich mich nicht...nicht das ich den Sensor schrotte.

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

    • @ tschoeatsch


      Deinen Link habe ich auch schon öfters probiert...was mich bei diesem Code aber stört ist, dass er einen Atmega16 einliest aber bei der Bemerkung von einem Atmega8 schreibt

      Source Code

      1. $regfile = "m16def.dat" 'Atmega8 CPU
      2. $crystal = 16000000 'Quarz 16Mhz
      bei der Temperaturausgabe war es dann immer der Wert 255, also auch, dass da nichts oder was falsches eingelesen wurde...
    • Es sieht so als, als ob der DS18B20 keine Daten rausrückt.

      Das könnte folgende Ursachen haben.
      1. Pin 1 und 3 vertauscht (Sensor verpolt)
      2. DS19B20 Pin 2 nicht mit PinD.7 verbunden (verzählt?)
      3. PullUp an Datenleitung wirkt nicht (Datensignal Low)
      4. Dem DS18B20 fehlt die Masse oder 5V
      5. Sensor defekt
      Am besten mal mit dem Oszi die Spannungs- und Signalpegel prüfen vom Sensor und am ATMega.
    • @Mitch64

      zu1. wenn man den Sensor mit der flachen beschrifteten Seite ansieht, und die Pin nach unten schauen, dann ist links Pin1 = Masse und rechts Pin3 = +5V

      zu2. hab auch schon andere Pins probiert und tausendmal nachgezählt

      zu3. evtl. 1kOhm verwenden?

      zu4. hat alles 5V und Gnd

      zu5. habe von meinen 10 schon 6 umgesteckt

      zum Oszi. du Glücklicher, ich habe leider keins


      Ich möchte ja nur an einem Elektromotor die Temperatur messen, und bei Überschreitung von 40Grad einen Piepser einschalten.....dann werd ich zu guter letzt einen Bimetallschalter drankleben, oder habt ihr noch eine andere Idee die Temperatur, muss ja nicht genau sein, zu messen (Diode, oder anderer Fühler der mit atmega8 funktioniert?)
    • Phlox wrote:

      @Mitch64

      zu1. wenn man den Sensor mit der flachen beschrifteten Seite ansieht, und die Pin nach unten schauen, dann ist links Pin1 = Masse und rechts Pin3 = +5V

      zu2. hab auch schon andere Pins probiert und tausendmal nachgezählt

      zu3. evtl. 1kOhm verwenden?

      zu4. hat alles 5V und Gnd

      zu5. habe von meinen 10 schon 6 umgesteckt

      zum Oszi. du Glücklicher, ich habe leider keins


      Ich möchte ja nur an einem Elektromotor die Temperatur messen, und bei Überschreitung von 40Grad einen Piepser einschalten.....dann werd ich zu guter letzt einen Bimetallschalter drankleben, oder habt ihr noch eine andere Idee die Temperatur, muss ja nicht genau sein, zu messen (Diode, oder anderer Fühler der mit atmega8 funktioniert?)
      Grundsatz 1:
      Wenn etwas nicht funktioniert, dann ist etwas nicht korrekt.

      Grundsatz 2:
      Wenn es nirgendwo einen Fehler gibt und alle Bauteile in Ordnung sind, dann tut's auch.

      In deinem Fall stimmt wohl die Angabe bei $Crystal nicht.

      Dort sind 1,6MHz eingestellt. Hat du einen 1,6MHz Quarz angeschlossen?
    • OK, dann nochmal.

      Der Prozessor muss zwingend mit dem Takt laufen, der mit $Crystal eingestellt ist.
      Standardmäßig läuft ein Mega 8 mit 1MHz.

      1. Hast du Quarz angeschlossen mit 8 MHZ?
      2. Oder internen 8 MHz Oszillator verwendet?
      3. Fusebits korrekt eingestellt?
      Der DS18B20 muss im korrekten Timing angesteuert und ausgelesen werden. Stimmt realer Takt nicht mit Crystal-Angabe überein, wird es nicht funktionieren. Ob das nun die Ursache ist wird sich noch herausstellen.
    • Ich habe keinen externen quarz, ich dachte mit $crystal = 8000000 stelle ich den internen Oszillator auf 8Mhz. Weil in vielen posts gelesen habe, dass man den DS18B20 mit den ursprünglichen 1MHz nicht zum laufen bringt.

      Fusebits habe ich keine gesetzt, dachte die muss man nur bei externen Quarz setzen?

      Ich habe nur den Code von meinem ersten Posting auf den Atmega8 übertragen, muss ich da noch was ergänzen?
    • ich habe den internen Oszillator auf 8Mhz gestellt...und es hat funktioniert...

      Danke für die Hilfe


      ich habe das ganze nochmal mit 1Mhz probiert, und da geht gar nichts....also alles auf 8Mhz und gut ist....supi

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

    • Source Code

      1. $regfile = "m8def.dat"
      2. $crystal = 8000000
      3. $hwstack = 64
      4. $swstack = 64
      5. $framesize = 64
      6. Config Lcd = 16 * 2
      7. Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
      8. Config 1wire = Portd.7
      9. Dim Dsid1(8) As Byte
      10. Dim Dsid2(8) As Byte
      11. Dim Sc(9) As Byte
      12. Dim W As Word
      13. 1wreset
      14. W = 1wirecount()
      15. Sc(1) = 1wsearchfirst()
      16. DO
      17. Cls
      18. Locate 1 , 1
      19. Lcd "Anzahl = "
      20. Locate 1 , 10
      21. Lcd W
      22. Locate 2 , 1
      23. Lcd Hex(sc(1))
      24. Waitms 500
      25. LOOP
      26. end
      Display All
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • monkye wrote:

      Glückwunsch das alles läuft.

      Was in Deinem ersten Programm Code noch fehlt: die DO...Loop Schleife. Sonst läuft Dein Programm 1x durch und aus die Maus...
      Joa, es sollte trotzdem der Sensor gefunden werden. Mit der Schleife kann man aber mit meheren Sensoren spielen und die wechselweise an den Bus klemmen. Ich denke, das sollte im laufenden Betrieb möglich sein, weil ja ein reset gesendet wird. Allerdings nur dann, wenn das 'do' von Zeile 23 auf Zeile 18 verschoben wird.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch wrote:

      monkye wrote:

      Glückwunsch das alles läuft.

      Was in Deinem ersten Programm Code noch fehlt: die DO...Loop Schleife. Sonst läuft Dein Programm 1x durch und aus die Maus...
      Joa, es sollte trotzdem der Sensor gefunden werden. Mit der Schleife kann man aber mit meheren Sensoren spielen und die wechselweise an den Bus klemmen. Ich denke, das sollte im laufenden Betrieb möglich sein, weil ja ein reset gesendet wird. Allerdings nur dann, wenn das 'do' von Zeile 23 auf Zeile 18 verschoben wird.
      Danke für Deine Klarstellung. Auf jeden Fall sollte die Schleife nicht fehlen.
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.