mikrocontroller.net

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


Autor: Some One (someone)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Herbert K. (avr-herbi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

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

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

Autor: M. W. (hobbyloet)
Datum:

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

Autor: Some One (someone)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Some One (someone)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schaltung habe ich überprüft, jetzt bekomme immer 246 grad

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da fällt mir noch was ein.
Es gibt doch 2 verschiedene DS1820

Autor: Some One (someone)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Some One (someone)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.