mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom: Brauche Hilfe bei bestimmten DS1820 auswählen


Autor: M. .D (barracuda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich brauche für eine Temperaturregelung 2 Temperatursensoren des Typs 
DS1820. Ich bin schon soweit, dass ich die beiden Adressen der 2 
Sensoren herausfinden konnte. In ASCII Code lauten die:

1010734AB40108002C
10102F129D01080037

$regfile = "m32def.dat"
 $framesize = 32
 $swstack = 32
 $hwstack = 32
 $crystal = 16000000
 $baud = 9600


 Config Lcd = 16 * 2
 Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.4 , Db6 = Portc.5 , 
Db7 = Portc.1 , E = Portc.2 , Rs = Portc.0
 Config 1wire = Porta.0
 Dim A(8) As String * 20
 Dim B(8) As Byte
 Dim I As Byte

 A(1) = 1010734ab40108002c
Do
   1wverify A(1)
   If Err = 0 Then
      Cls
      Lcd "DS1820 angeschlossen"
   End If
Loop
End

So, was mach ich falsch?:D
weil wenn das hier klappt kann ich endlich weitermachen:D

Liebe Grüsse

Autor: John (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marius

Marius Dubach schrieb:
> Ich bin schon soweit, dass ich die beiden Adressen der 2
> Sensoren herausfinden konnte. In ASCII Code lauten die:
>
> 1010734AB40108002C
> 10102F129D01080037

Das sind keine ASCII Codes sondern Hex-Zahlen.
Dem entsprechend muss A() ein Byte-Arry sein und nicht String.

Gruß
John

Autor: M. .D (barracuda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi John

ich bekomms nicht gebacken. Hab jetzt A in ein Byte umgewandelt, jetzzt 
siehts so aus:

$regfile = "m32def.dat"
 $framesize = 32
 $swstack = 32
 $hwstack = 32
 $crystal = 16000000
 $baud = 9600


 Config Lcd = 16 * 2
 Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.4 , Db6 = Portc.5 , 
Db7 = Portc.1 , E = Portc.2 , Rs = Portc.0
 Config 1wire = Porta.0
 Dim A(8) As Byte


A(1) = 1010734ab40108002c



 Do
   1wverify A(1)
   If Err = 0 Then
      Cls
      Print "DS1820 angeschlossen"
      Else
      Print "Nicht angeschlossen"
      Wait 3
   End If
Loop
End


Natürlich bekomm ich jetzt aber ne fehlermeldung...

Kannst du mir nicht mal einen Fehlerfreien Codeschnipsel geben und 
erläutern?:) wär echt super:)

Autor: Joachim R. (bastelbaer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal Codeschnipsel aus meinem Datenlogger. Es sind nicht alle 
Variablen deklariert, sollte aber reichen zum Verständnis.

' Variablen für Sensoren
Dim Reg_no(10) As Byte
Dim Chip_data(8) As Byte
Dim Chip As Byte
Dim Temperatur As Integer
Dim Chip_anz As Byte

$eeprom
Data 0
Chiplist:
' 3 Chips mit Seriennummer defaultmässig im EEPROM
Data 3
Data &H10 , &HB0 , &H9A , &H65 , &H01 , &H08 , &H00 , &H3A
Data &H10 , &H7E , &HD8 , &H7E , &H01 , &H08 , &H00 , &H70
Data &H10 , &HA1 , &H0A , &H7F , &H01 , &H08 , &H00 , &HC2

$data
'################## Messung anstossen
1wreset                                                 ' reset the bus
1wwrite &HCC                                            ' skip rom
1wwrite &H44                                   ' Start Convert 
Temperatur
Waitms 500      ' etwas warten

' dann wollen wir mal die 1W-Chips auslesen
Readeeprom Chip_anz , Chiplist
If Chip_anz = 255 Then Chip_anz = 0
For Chip = 1 To Chip_anz
  Gl_temp = Chip - 1
  Gl_temp = Gl_temp * 8
  Incr Gl_temp
  For Gl_count = 1 To 8
    Incr Gl_temp
    Readeeprom Chip_data(gl_count) , Gl_temp
  Next Gl_temp
  1wverify Chip_data(1)

  If Err = 0 Then
    1wwrite &HBE
    Reg_no(1) = 1wread(9)                               'read bytes into 
ar
    Temperatur = Makeint(reg_no(1) , Reg_no(2))
    Temperatur = Abs(temperatur)
    Temperatur = Temperatur / 2
  End If
Next Chip_anz




#####################
' SCANNING 1WIRE-BUS
Chip_anz = 0
Gl_errorcount = 0

Do
  If Chip_anz = 0 Then
    Chip_data(1) = 1wsearchfirst()
  Else
    Chip_data(1) = 1wsearchnext()
  End If
  If Err = 0 Then
    1wverify Chip_data(1)
    If Err = 0 Then
      Incr Chip_anz
      Print "Chip " ; Chip_anz ; " ID: ";
      Gl_temp = Chip_anz - 1
      Gl_temp = Gl_temp * 8
      Incr Gl_temp
      For Gl_count = 1 To 8
        Print Hex(chip_data(gl_count)) ; " ";
        Incr Gl_temp
        Writeeeprom Chip_data(gl_count) , Gl_temp
      Next Gl_temp
      Gl_errorcount = 0
      Print ""
    Else
      Print "ERROR VERIFY, CHIP IGNORED " ; Gl_errorcount
     Err = 0
      Incr Gl_errorcount
      If Gl_errorcount = 100 Then Err = 1
    End If
  Else
    Incr Gl_errorcount
    If Gl_errorcount = 100 Then Err = 1
  End If
Loop Until Err = 1
Print "FOUND " ; Chip_anz ; " DEVICES"
Writeeeprom Chip_anz , Chiplist

Autor: M. .D (barracuda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bastelbaer, leider nicht

Aber vielleicht kannst du mir ja eine, für dich sicher einfache, Frage 
beantworten:

mit dem Codeschnipsel bekomm ich ja die Adresse des Chips und zwar im 
Hex-Format

 Dim A(8) As Byte
 Dim I As Byte


A(1) = 1wsearchfirst()

For I = 1 To 8                                              '
Print A(i);
Next
End

soweit richtig?

Das Programm liefert mir: 1?161157418018044 (was macht das fragezeichen 
da?)

In meinem fertigen Programmm will ich dann ja auswählen können, mit 
welchem Chip ich gerade kommunizieren möchte. Wieso klappt es nicht, 
wenn ich schreibe:

A(1) = 1?161157418018044

Kannst du mir sagen, wie ich das schreiben muss, dass ich oben in meinem 
Programm definieren kann

A=chip 1
B= Chip 2

usw?

bin leider aus deinen schnipseln nicht schlau geworden;)

Autor: John (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marius,
ich kenne mich mit BASCOM nicht so aus, aber sollte es nicht
A(1) = &H1010734ab40108002c
heissen, damit der Compiler weiß, dass es sich um einem Hex-Wert 
handelt? (Ist es in BASOM überhaupt möglich einem Byte-Arry direkt einen 
n-Byte Hex-Wert zuzuweisen?)

Was für eine Fehlermeldung bekommst Du? Die BASCOM Kenner können 
bestimmt etwas damit anfangen und Dir dann weiterhelfen.

Hier gibt es ein Beispiel:
http://www.rn-wissen.de/index.php/Bascom_und_1-Wire

Gruß
John

Autor: Joachim R. (bastelbaer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also das Fragezeichen macht mich jetzt etwas stutzig. Sollte nicht 
kommen.
Probier mal folgendes

A(1) = 1wsearchfirst()
For I = 1 To 8                                              '
  Print hex(A(i));" ";
Next
Print

End
Dann solltest du die Adresse des 1820 in Hex-Darstellung sehen.

' Zum Auslesen folgender Code. Bei den Variablen die einzelnen Werte der
' obrigen Ausgabe eintragen.
A(1)=&H10
A(2)=&HB0
A(3)=&H9A
A(4)=&H65
A(5)=&H01
A(6)=&H08
A(7)=&H00
A(8)=&H3A
' Hier wird der Chip angesprochen
1wverify A(1)
If Err=0 Then
  ' Hier das Auslesen anwerfen
  1wwrite &HBE
  ' und auslesen
  Reg_no(1) = 1wread(9)
  ' CRC-Check 9.Byte ist CRC-Summe der Daten
  If Reg_no(9) = Crc8(reg_no(1) , 8) Then
    ' Hier auswerten
  End If
Else
  Print "Error"
End If

Hast du auch den Widerstand der 1wire-Leitung richtig dimensioniert? Ich 
musste schon je nach Leitungslänge und Anzahl der Sensoren auf bis zu 1k 
runtergehen.

Autor: M. .D (barracuda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi john und joachim

am eende hats dann der Code von Joachim, gebracht:) danke vielmals euch 
beiden, hab zwar nen ganzen Tag für sone einfache Aufgabe gebraucht, 
dafür läufts jetzt:D

Danke:D

hier der "fertige" Code, wobei der Teil zum herausfinden der Adresse 
ausser Gefecht gesetzt ist, indem er als Kommentar markiert wurde

$regfile = "m32def.dat"
 $framesize = 32
 $swstack = 32
 $hwstack = 32
 $crystal = 16000000
 $baud = 9600


 Config Lcd = 16 * 2
 Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.4 , Db6 = Portc.5 , 
Db7 = Portc.1 , E = Portc.2 , Rs = Portc.0
 Config 1wire = Porta.0
 Dim A(8) As Byte
 Dim B As String * 20
 Dim I As Byte


A(1) = &H10
A(2) = &H73
A(3) = &H4A
A(4) = &HB4
A(5)=&H01
A(6)=&H08
A(7)=&H00
A(8) = &H2C




'A(1) = 1wsearchfirst()
'For I = 1 To 8                                              '
'  Print hex(A(i));" ";
'Next
'Print
'
'End



 Do
  1wverify A(1)
   If Err = 0 Then
      Cls
      Lcd "DS1820 angeschlossen"
      Wait 3
      Else
      Cls
      Lcd "Nicht angeschlossen"
     Wait 3
  End If
Loop
End

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.