Forum: Mikrocontroller und Digitale Elektronik Temepratur messen mit DS1820 und ATMEGA8


von Some O. (someone)


Lesenswert?

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:


' 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

von Herbert K. (avr-herbi)


Lesenswert?

Hallo,
wie wäre es mal in der Hilfe zu Bascom nach RS232 zu suchen?
Da soll es Beispiele geben, wie man Zeichen ausgibt.
Und wenn man geschickt kombiniert, tauscht man
For I = 1 To 8
   Lcd Hex(sc(i))
  Next
gegen die andere Ausgabe aus. Init der RS232 zu Begin wäre auch ganz 
praktisch.
Viele Grüße Herbert

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Statt
1
  ' Temperatur in 0,1 Grad Schritten ausgeben
2
  Locate 2 , 1
3
  Lcd T ; " Grad"

das probieren (habe selbst kein BASCOM)
1
  ' Temperatur in 0,1 Grad Schritten ausgeben
2
  ' Locate 2 , 1
3
  Print T ; " Grad"

http://avrhelp.mcselec.com/print.htm

von M. W. (hobbyloet)


Lesenswert?

Wie Stefan schon schrieb, hilft
Print weiter, natürlich muss sie eingebunden werden.

von Some O. (someone)


Lesenswert?

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

' Beispiel für das myAVR Board  1wire Temperatursensor an Pin 5 von Port 
C
$regfile = "m8def.dat"
$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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Some One schrieb:

> danke für die Antwort, mit diese Code bekomme nur FFFFFFFF

dann bist du in diesem else-Fall, allerdings müssten mehrere (8) Zeilen 
mit FFFFFFFF pro Sensorabfrage kommen.

>   ' Wenn Fehler Scratchpad zur Kontrolle Hexadezimal ausgeben

Wenn du sonst nichts gegenüber dem Democode verändert hast und die 
Sensor-IDs stimmen, bedeutet das am wahrscheinlichsten, dass der Sensor 
falsch angeschlossen ist. Näheres kann ich dazu nicht sagen, weil ich 
deinen Schaltplan zum Sensoranschluss nicht kenne.

von Some O. (someone)


Lesenswert?

schaltung habe ich überprüft, jetzt bekomme immer 246 grad

von Karl H. (kbuchegg)


Lesenswert?

Dann würde ich mal sagen:
Übernimm mal den Teil zur Ausgabe der Hex Bytes auch in den anderen 
Programmpfad und lass die die empfangenen Bytes ausgeben.

Dann schnappst du dir das Datenblatt zum DS1820 und versuchst die 
Berechnung nachzuvollziehen bzw. abzuklären, wie plausibel diese 
Ausgangswerte überhaupt sind.

von Karl H. (kbuchegg)


Lesenswert?

Da fällt mir noch was ein.
Es gibt doch 2 verschiedene DS1820

von Some O. (someone)


Lesenswert?

danke für deine antwort.

Karl heinz Buchegger schrieb:
> Dann würde ich mal sagen:
> Übernimm mal den Teil zur Ausgabe der Hex Bytes auch in den anderen
> Programmpfad und lass die die empfangenen Bytes ausgeben.


was meinst du genau, ich habe nicht verstanden

ich habe DS1820 TO-92

von Karl H. (kbuchegg)


Lesenswert?

Du kriegst vom Ds1820 8 Bytes zurück.

Wenn diese 8 Bytes einen CRC Fehler haben, dann gibst du bisher auch 
schon diese 8 Bytes aus.

So. Jetzt haben deine Daten keinen CRC Fehler. Nach menschl. Ermessen 
sollten sie daher richtig sein. Aber ist das tatsächlich so?
Du siehst dir diese 8 Bytes nirgends an, bzw. lässt sie dir nirgends 
ausgeben um das kontrollireen zu können, ob das was da ausgerechnet wird 
auch stimmen kann. Du rechnest aber mit diesen 8 Bytes!

Und genau da sollst du ansetzen.
Lass dir die 8 Bytes ausgeben und sieh mal nach, ob die plausibel sind. 
Getreu dem Motto: mit falschen Ausgangsdaten kann man keine richtigen 
Ergebniss erzielen.

von Some O. (someone)


Lesenswert?

das ist der code nach alle änderung
jetzt zeig die Temp. bis 32 grad, dann zeigt die Temp. in Minus...
die Genauigkeit muss ich noch überprüfen


code:

$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 / 10
  ' 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

von Karl H. (kbuchegg)


Lesenswert?

Anstatt dir Debughilfen einzubauen, entfernst du sie.

Wenn du meinst, das das der richtige Weg ist, dann sei es dir gegönnt, 
vor Code zu sitzen der nicht funktioniert und nicht zu wissen warum er 
nicht funktioniert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.