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


von M. .. (barracuda)


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

von John (Gast)


Lesenswert?

Hallo Marius

M. 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

von M. .. (barracuda)


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

von Joachim R. (bastelbaer)


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

von M. .. (barracuda)


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

von John (Gast)


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

von Joachim R. (bastelbaer)


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.

von M. .. (barracuda)


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

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.