Temperatur messen mit DS1820 und atmeg8

someone

Neues Mitglied
05. Mai 2010
7
0
0
Sprachen
Guten Tag an Alle,

ich habe an Euch eine Frage. Ich bin neu im Mikrokontoller- und Bascom-bereich. Ich möchte Temperaturen messen mit ds1820 und atmega8.
Die Schaltung und den Code habe ich schon. Aber der Code zeigt die Temperatur nur auf einem LCD. Aber ich möchte, dass die Temperatur nur auf
Bascom-Terminal angezeigt wird. Wie kann ich den Code ändern um das zu erreichen.

Danke im Voraus


CODE:



CodeBox BASCOM

' Beispiel für das myAVR Board 1 & 2 mit LCD und 1wire Temperatursensor an Pin 5 von Port C
$regfile = "m8def.dat"
$crystal = 3686411

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

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

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

Cls
Cursor Off
Locate 1 , 1 : Lcd "Mein Termometer"

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
' Temperatur in 0,1 Grad Schritten ausgeben
Locate 2 , 1
Lcd T ; " Grad"
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
 
Hi someone,


willkommen im Forum.

Du brauchst eine USB oder RS232- Verbindung (MAX232) zum PC. (Mit USB kenne ich mich nicht so aus, ich verwende nur die COM - Schnittstelle über den MAX).

Unterhalb von "Crystal" schreibst Du $baud=19200 (oder einen anderen Wert).

Im Programm ganz einfach statt Lcd T; "Grad" > Print T; " Grad" oder Print irgendetwas. Die Einstellungen der Baudraten müssen im Programm und im Terminal natürlich gleich sein.
Mit der Bascom- Hilfe hast Du schnell den Durchblick.


Grüsse,

Michael

- EDIT Verklickt
 
danke schön für deine Antwort. Die Kommunikation mit PC und $baud Werte habe schon erledigt.

Mein Problem ist, was kann ich im Code ändern, damit das Ergebnis nicht auf dem LCD anzeigen wird, sondern auf dem Bascom Terminal

lg
someone
 
Hi someone,

nun - die entsprechenden Zeilen auskommentieren. Du könntest z.B. im Programm die jeweilige Displayausgabe über einen Taster oder einen Tastendruck, etc. auswählen. Oder verstehe ich Dich da jetzt falsch?


Grüsse,

Michael
 
Hi someone,

gern geschehen. Übrigens gibt es von Marius Meissner eine deutsche Übersetzung der Bascom- Hilfe. Und das Buch von Roland Walter ist auch zu empfehlen.

Viel Spass beim weiteren Quälen des Atmels ;).


Grüsse,

Michael
 
danke für die Antwort, mit diese Code bekomme nur FFFFFFFF :confused: :confused:





CodeBox Bascom

$crystal = 3686411
$baud = 9600

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

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


Print "Mein Termometer"

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
' Temperatur in 0,1 Grad Schritten ausgeben

Print T ; " Grad"

Else
' Wenn Fehler Scratchpad zur Kontrolle Hexadezimal ausgeben

' Es passen nur 8 Byte
For I = 1 To 8

Print Hex(sc(i));

Next
Print
End If
' Ausgabe alle 0,5 Sekunden
Waitms 500
Loop

End
 
Hi someone,

bitte verwende beim Programmcode die CODE- oder HIGHLIGHT-Tags. Dadurch
wird der Programmcode anders formatiert (leserlicher) und besser vom restlichen
Text des Beitrags abgehoben. Nur so als Tip ;) Kannst dir das ja mal in deinem
Beitrag ansehen. Wenn du auf "Ändern" gehst siehst du wie es gemacht ist.

Für ne Fehlersuche müßte ich mir das mal genauer ansehen. Mal schauen ob ich
da heute abend evtl zu komme. Wenn ein anderer Lust und Zeit hat möchte
ich mich natürlich nicht dazwischendrängeln :D

Gruß
Dino
 
Hallo Someone!

Sag mal, hast du den Code "geschnitten" und nur die deiner Meinung nach wichtigen Teile hier eingestellt? :hmmmm:

Ich habe den Code nur mal überflogen.... muss mich da aber noch mal genauer dran setzen. Einige Vorgehensweisen wollen sich mir noch nicht erschließen! :hmmmm:

Welchen Controller benutzt du überhaupt? :confused:
Es fehlt z.B. schon die Angabe im Programmcode:
Code:
$crystal = 3686411
$baud = 9600

 
' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert

Config 1wire = Portc.5
....

Irgendwie komme ich da nicht weiter.....

Stell doch mal den kompletten Code hier ein!
Das macht bei einer Fehlersuche wesentlich mehr Sinn. ;)

Gruß,
Cassio
 
Hi Someone!

So, nun habe ich einfach mal den Mega8 im Programm nachträglich eingegeben.
Im Simulator läuft das Programm schon durch..... incl. Terminalausgabe.
Dies muss aber noch nichts bedeuten. ;)

Ich muss eben noch mal nachfragen....
Welchen DS1820 hast du denn?
Den DS18S20 oder den DS18B20 ?
Das Programm ist jedenfalls für den "S" ausgelegt.

Noch ne Frage....
Brauchst du unbedingt die CRC8 Prüfung?
Das Vergleichen der Seriennummern sollte zum sicheren Anspechen der Sensoren (wenn du dann irgendwann mal mehrere benutzen möchtest) doch ausreichen.

Gruß,
Cassio
 
Noch ne Frage....
Brauchst du unbedingt die CRC8 Prüfung?
Das Vergleichen der Seriennummern sollte zum sicheren Anspechen der Sensoren (wenn du dann irgendwann mal mehrere benutzen möchtest) doch ausreichen.
Hallo Cassio,
die beiden Dinge haben doch nichts miteinander zu tun.
Mit der CRC Überprüfung controllierst du, ob die Datenübertragung korrekt war. Und die kann gestört sein, ob du nun einen bestimmten Sensor ansprichst oder nicht.
In einem anderen Forum habe ich someone schon darauf hingewiesen, dass die Waitus 200 viel zu kurz sind und mindestens Waitms 700 nötig sind.
Daraufhin scheint sich jetzt auch etwas zu tun.

HBA
 
Hi HBA!

OK, da hast du natürlich Recht....
Es geht beim Check (CRC) ja nur um die Richtigkeit der Datenübertragung....
Da hatte ich mich mangels Zeit mal wieder "zu kurz" ausgdrückt.

Trotzdem muss es doch reichen, wenn er den Sensor mit seiner ID anspricht und anschließend die Daten ausliest.
Ich habe da bis jetzt noch keine Probleme mit gehabt, wenn ich mehrere Sensoren am BUS hatte.
Gut, OK, ich prüfe anschließend die Temperatur auf "Plausibilität" und ob sie in meinen Überwachungsrahmen passt.

Bei einigen Tests, als ich immer wieder mal "überzogene" Werte bekommen hatte, lag es letztlich auch nicht an der Datenübertragung des 1Wire sondern an zu kurzen Abständen zwischen den Befehlen 44h und BEh.
Seitdem aktiviere ich die Messung nur einmal in den ungeraden Sekunden und hole die Daten ebenfalls nur einmal in den geraden Sekunden ab.
Tja und was soll ich sagen..... die angeblichen "Fehlmessungen" gehören seither der Vergangenheit an. :)


Ich weiß aber auch nicht, wo Someone die Berechnungsformel her hat? :hmmmm:
Zur Berechnung der Temperatur auf 0,1C muss er doch nur:
Temperatur-LSB durch 2 teilen... (Temp1 = Byte0 / 2 weil diese in 0,5Grad Schritten gezählt wird)
Das Ergebnis minus 0,25 rechnen.... (Temp1 = Temp1 - 0,25)
Count_per_C minus Count_Remain nehmen.... (Temp = Byte7 - Byte6 des Scratchpad)
Das Ergebnis dann durch Count_per_C teilen.... (Temp = Summe / Byte7)
und dann beide Werte zusammen zählen! (Temp = Temp + Temp1)

Wozu also die Werte hochsetzen und mit x50 , -25, x100 und /10 rechnen? :hmmmm:

Gruß,
Cassio
 
Gut, OK, ich prüfe anschließend die Temperatur auf "Plausibilität" und ob sie in meinen Überwachungsrahmen passt.
Na ja, wenn ein bit umkippt und du statt 20° jetzt 30° bekommst, dann ist das ja schwierig festzustellen. Mit CRC Abfrage ganz leicht.

Wozu also die Werte hochsetzen und mit x50 , -25, x100 und /10 rechnen? :hmmmm:
Das ist die gleiche Rechnung wie deine, nur dass er sich die Single Variable spart und alles mit Integer rechnet. Beim Print kommt dann aber auch kein Komma raus.

HBA
 
Hi HBA!

Ja ja, ist schon klar....
Aber wozu soll das gut sein? :hmmmm:
Höchstens, wenn er die Werte über 7-Segmente ausgeben will.
Egal.....

Dann könnten seine angezeigten 246Grad ja auch durchaus stimmen.... eben 24,6Grad! ;)

Gruß,
Cassio
 
Ja ja, ist schon klar....
Aber wozu soll das gut sein?
Höchstens, wenn er die Werte über 7-Segmente ausgeben will.
?
Etwas widersprüchlich, findest du nicht?
Fragst du jetzt, wozu eine Checksumme am Ende einer Übertragung gut ist?
Und was hat das mit 7-Segment Anzeigen zu tun?

HBA
 
Hi HBA!

Nein, ich meinte dies "künstliche" hochrechnen der Werte, so dass er nachher keine Kommastelle mehr in der Ausgabe hat. ;)
Die CRC-Summe hatten wir ja schon geklärt.

Wenn er die drei Ziffern später auf einer 7-Segment ausgeben will, dann muss er die hunderter Zahl nur in Ziffern zerlegen.
Bei einer Kommazahl als Single, müsste er die Zahl erst mit "Int" und "Frac" aufteilen.

War das nun verständlich? :)

Grüße,
Cassio
 
vielen dank Cassio und HinterBlauenAugen für eure Antwort. :)

ich benutze die Atmega8 und DS18B20.

wie HinterBlauenAugen hat mir gesagt, habe die Zeit geändert, jetzt lüft es in ordnung bis 32 grad, nachher wird die Temp. im minus bereich angezeigt

übrigens das ist nicht mein code, habe im Internet gefunden und nur was nötig geändert wie Port und Freq usw. auch die Temp. habe gemacht durch 1000, also T = T / 1000.




die code siehst jetzt so aus :

$regfile = "m8def.dat"
$crystal = 11059200
$baud = 9600


Config 1wire = Portc.5

Dim Dsid(8) As Byte
' Die Adresse DS1820
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


Print "Mein Termometer"

Do
' Alle angeschlossenen DS1820 zum Messen veranlassen
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 700
1wwrite &HBE
' 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 / 1000
' Temperatur in 0,1 Grad Schritten ausgeben

Print T ; " Grad"

Else
' Wenn Fehler Scratchpad zur Kontrolle Hexadezimal ausgeben

' Es passen nur 8 Byte


Print "fehler"




Print
End If
' Ausgabe alle 0,5 Sekunden
Waitms 500
Loop

End



schönes woschenende
 
Hallo !

Ich habe persönlich noch nicht mit dem DS18B20 gearbeitet und von daher sind meine Überlegungen auch nur theoretisch.....

Der DS18B20 hat eine höhere Auflösung und der DS18S20 eine Kleinere.
Ich bin daher der Meinung, dass dein Code mit dem 8Byte-Array nicht ausreicht. :hmmmm:

Kannst ja HBA zur Sicherheit noch mal fragen.... hier, oder im anderen Forum. ;)

Wie oben schon erwähnt.... ich kenne persönlich nur den DS18S20!
Ich müsste mir also erst mal das Datenblatt von der B-Version besorgen und dort nachschauen. :rolleyes:

Es gibt hier aber schon Beispiele im Forum mit dem B-Sensor.....
Kann sein, dass "Logger" damit mal gearbeitet hat und dies im Thread eines LCD behandelt wurde. :hmmmm:
Bemüh doch einfach mal die Suche. ;)
Dann hast du auf alle Fälle ein fertiges Codebeispiel, mit dem du weiter experimentieren kannst.

Gruß,
Cassio
 

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