Bascom DS1820 ID Auslesen

Hallo Lutze!

Nun ja..... das User-Byte in jedem Sensor einmal zu beschreiben ist ja nun nicht gerade aufwendig. :wnk:
Wäre zumindest eine Möglichkeit.....

Ansonsten bleibt dir immer noch eine ordentliche Variablenverwaltung. :cool:


Grüße,
Cassio
 
Hallo Lutze,

was passt dir denn an meinem Beispielcode nicht? Der speichert doch die ID's der einzelnen Sensoren im Eeprom in der Reihenfolge wie sie angesteckt werden. Da ist die Zuordnung gesichert und man muss die nicht vorher auslesen oder im Code hinterlegen. Oder hast du den noch gar nicht angeschaut?
 
^^ ach stimmt das habe ich glatt vergessen :), das wollte ich doch ausprobieren
 
so...

hab den code von dir nochmal rausgekramt
aber leider wird mir auf dem Display nix angezeigt :(

Code:
'-------------------------------------------'
'     Mikrocontroller/Chip                  '
'-------------------------------------------'
$regfile = "m32def.dat"                                     'ATMEGA32 Registerdatei
$crystal = 8000000                                          'Externer Quarz 8Mhz
$hwstack = 256                                              'HardwareStack
$swstack = 256                                              'SoftwareStack
$framesize = 128                                            'Framesize
$baud = 9600                                                'Baudrate

'-------------------------------------------'
'     LCD Konfiguration                     '
'-------------------------------------------'
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.0 , Rs = Portc.1
Config Lcd = 16 * 2


'-------------------------------------------'
'     1Wire Konfiguration                   '
'-------------------------------------------'
Config 1wire = Porta.1


'-------------------------------------------'
'     Deklarationen                         '
'-------------------------------------------'
Const Ee_dsid1 = 2
Const Ee_dsid2 = 10
Const Ee_dsid3 = 18
Const Ee_dsid4 = 26

'-------------------------------------------'
'     Variablen                             '
'-------------------------------------------'
Dim Sc(9) As Byte , Sensor As Byte , W As Word
Dim Dsid1str As String * 8 , Dsid2str As String * 8 , Dsid3str As String * 8 , Dsid4str As String * 8 , Dsidtempstr As String * 8
Dim Dsid1(8) As Byte At Dsid1str Overlay , Dsid2(8) As Byte At Dsid2str Overlay , Dsid3(8) As Byte At Dsid3str Overlay , Dsid4(8) As Byte At Dsid4str Overlay
Dim Dsidtemp(8) As Byte At Dsidtempstr Overlay

Dim I As Byte , J As Byte

'-------------------------------------------'
'     Main                                  '
'-------------------------------------------'
Cls
Cursor Noblink

Do

J = Ee_dsid1
 For I = 1 To 8                                             '4x8 bytes (Adressen DS18S20) aus Eeprom lesen
    Readeeprom Dsid1(i) , J
    Incr J
 Next
 For I = 1 To 8
    Readeeprom Dsid2(i) , J
    Incr J
 Next
 For I = 1 To 8
    Readeeprom Dsid3(i) , J
    Incr J
 Next
 For I = 1 To 8
    Readeeprom Dsid4(i) , J
    Incr J
 Next

Sensor = 0
Waitms 200
1wverify Dsid1(1)                                           'Sensor1 vorhanden?
If Err = 0 Then
   Locate 1 , 1
   Lcd "Sensor 1 vorhanden"
   Waitms 200
   Set Sensor.0
End If

Waitms 200
1wverify Dsid2(1)                                           'Sensor2 vorhanden?
If Err = 0 Then
   Locate 1 , 1
   Lcd "Sensor 2 vorhanden"
   Waitms 200
   Set Sensor.1
End If

Waitms 200
1wverify Dsid3(1)                                           'Sensor3 vorhanden?
 If Err = 0 Then
   Locate 1 , 1
   Lcd "Sensor 3 vorhanden"
    Waitms 200
    Set Sensor.2
 End If

Waitms 200
1wverify Dsid4(1)                                           'Sensor4 vorhanden?
 If Err = 0 Then
   Locate 1 , 1
   Lcd "Sensor 4 vorhanden"
    Waitms 200
    Set Sensor.3
 End If

Waitms 200

W = 1wirecount()                                            'Wieviele Sensoren gibt es?
J = 0

 For I = 0 To 3                                             'Wieviele sind identifiziert?
    J = J + Sensor.i
 Next

 If J < W Then                                              'Wenn neuer Sensor vorhanden
    For I = 1 To 6                                          'Signal für Anlernen
    Waitms 300
    Next I
    Dsidtemp(1) = 1wsearchfirst()                           'Erster Sensor am Bus
    If Dsidtempstr = Dsid1str Or Dsidtempstr = Dsid2str Or Dsidtempstr = Dsid3str Or Dsidtempstr = Dsid4str Then       'ID schon im EEPROM?
    Dsidtemp(1) = 1wsearchnext()                            'Zweiter Sensor am Bus
    If Dsidtempstr = Dsid1str Or Dsidtempstr = Dsid2str Or Dsidtempstr = Dsid3str Or Dsidtempstr = Dsid4str Then       'ID schon im EEPROM?
    Dsidtemp(1) = 1wsearchnext()                            'Dritter Sensor am Bus
    If Dsidtempstr = Dsid1str Or Dsidtempstr = Dsid2str Or Dsidtempstr = Dsid3str Or Dsidtempstr = Dsid4str Then       'ID schon im EEPROM?
    Dsidtemp(1) = 1wsearchnext()                            'Vierter Sensor am Bus
    End If
 End If

    1wverify Dsidtemp(1)                                    'Nochmal überprüfen

 If Err = 0 Then                                            'Wenn in Ordnung...
      If Sensor.0 = 0 Then                                  'Sensor 1 nicht vorhanden?
            J = Ee_dsid1                                    'In Position 1 im EEPROM
         Elseif Sensor.1 = 0 Then                           'Sonst in Position 2
            J = Ee_dsid2
         Elseif Sensor.2 = 0 Then
            J = Ee_dsid3
         Else
            J = Ee_dsid4
         End If

      End If

      For I = 1 To 8                                        'Schreibe ID ins EEPROM
      Writeeeprom Dsidtemp(i) , J
      Incr J
      Next

 End If
    Waitms 200
End If

Loop
End
 
Hallo!

Hab jetzt den Faden nicht durchgeackert, aber im Eröffnungspost hing das Display an Port B.
Wenns denn jetzt an Port C hängt, hast JTAG abgeschaltet?

MfG
 
Hallo,

das ist eigentlich nicht dafür gedacht, in eine Schleife gepackt zu werden. Daran liegt es aber nicht. Geht das Display? Mach mal eine Testausgabe vor der Schleife. Wenn das Display geht, dann ist der Sensor wohl falsch angeschlossen.
 
Hallo!

Hab jetzt den Faden nicht durchgeackert, aber im Eröffnungspost hing das Display an Port B.
Wenns denn jetzt an Port C hängt, hast JTAG abgeschaltet?

MfG

ja JTAG ist aus :)

Hallo,

das ist eigentlich nicht dafür gedacht, in eine Schleife gepackt zu werden. Daran liegt es aber nicht. Geht das Display? Mach mal eine Testausgabe vor der Schleife. Wenn das Display geht, dann ist der Sensor wohl falsch angeschlossen.

Ja das LCD und die Sensoren funktionieren, habe ja 2min vorher die Temperatur anzeigen lassen.


so, heute morgen nochmal in aller Frische um 5 Uhr weitergearbeitet :)

habe mal die Anzahl auf dem Display anzeigen lassen, er findet auch 4 Sensoren, was mich nur wundert wenn das er beim reset nichts anzeigt das Sensor X vorhanden ist.
Hab dann mal den ersten zum messen eingebunden, aber :( leider habe ich die 4kb von der Demoversion überschritten. rofl

Code:
'-------------------------------------------'
'     Mikrocontroller/Chip                  '
'-------------------------------------------'
$regfile = "m32def.dat"                                     'ATMEGA32 Registerdatei
$crystal = 8000000                                          'Externer Quarz 8Mhz
$hwstack = 256                                              'HardwareStack
$swstack = 256                                              'SoftwareStack
$framesize = 128                                            'Framesize
$baud = 9600                                                'Baudrate

'-------------------------------------------'
'     LCD Konfiguration                     '
'-------------------------------------------'
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.0 , Rs = Portc.1
Config Lcd = 16 * 2


'-------------------------------------------'
'     1Wire Konfiguration                   '
'-------------------------------------------'
Config 1wire = Porta.1


'-------------------------------------------'
'     Deklarationen                         '
'-------------------------------------------'
Const Ee_dsid1 = 2
Const Ee_dsid2 = 10
Const Ee_dsid3 = 18
Const Ee_dsid4 = 26

'-------------------------------------------'
'     Variablen                             '
'-------------------------------------------'
Dim Sc(9) As Byte , Sensor As Byte , W As Word
Dim Dsid1str As String * 8 , Dsid2str As String * 8 , Dsid3str As String * 8 , Dsid4str As String * 8 , Dsidtempstr As String * 8
Dim Dsid1(8) As Byte At Dsid1str Overlay , Dsid2(8) As Byte At Dsid2str Overlay , Dsid3(8) As Byte At Dsid3str Overlay , Dsid4(8) As Byte At Dsid4str Overlay
Dim Dsidtemp(8) As Byte At Dsidtempstr Overlay

Dim T1 As Integer
Dim T2 As Single
Dim T3 As Single
Dim T As Integer
Dim I As Byte
Dim J As Byte

'-------------------------------------------'
'     Main                                  '
'-------------------------------------------'
Cls
Cursor Noblink

Locate 1 , 1
Lcd "Thermometer..."
Wait 2


J = Ee_dsid1
 For I = 1 To 8                                             '4x8 bytes (Adressen DS18S20) aus Eeprom lesen
    Readeeprom Dsid1(i) , J
    Incr J
 Next
 For I = 1 To 8
    Readeeprom Dsid2(i) , J
    Incr J
 Next
 For I = 1 To 8
    Readeeprom Dsid3(i) , J
    Incr J
 Next
 For I = 1 To 8
    Readeeprom Dsid4(i) , J
    Incr J
 Next

Sensor = 0
Waitms 200
1wverify Dsid1(1)                                           'Sensor1 vorhanden?
If Err = 0 Then
   Locate 1 , 1
   Lcd "Sensor 1 vorhanden"
   Waitms 200
   Set Sensor.0
End If

Waitms 200
1wverify Dsid2(1)                                           'Sensor2 vorhanden?
If Err = 0 Then
   Locate 1 , 1
   Lcd "Sensor 2 vorhanden"
   Waitms 200
   Set Sensor.1
End If

Waitms 200
1wverify Dsid3(1)                                           'Sensor3 vorhanden?
 If Err = 0 Then
   Locate 1 , 1
   Lcd "Sensor 3 vorhanden"
    Waitms 200
    Set Sensor.2
 End If

Waitms 200
1wverify Dsid4(1)                                           'Sensor4 vorhanden?
 If Err = 0 Then
   Locate 1 , 1
   Lcd "Sensor 4 vorhanden"
    Waitms 200
    Set Sensor.3
 End If

Waitms 200

W = 1wirecount()                                            'Wieviele Sensoren gibt es?
J = 0

Locate 2 , 1
Lcd W

 For I = 0 To 3                                             'Wieviele sind identifiziert?
    J = J + Sensor.i
 Next

 If J < W Then                                              'Wenn neuer Sensor vorhanden
    For I = 1 To 6                                          'Signal für Anlernen
    Waitms 300
    Next I
    Dsidtemp(1) = 1wsearchfirst()                           'Erster Sensor am Bus
    If Dsidtempstr = Dsid1str Or Dsidtempstr = Dsid2str Or Dsidtempstr = Dsid3str Or Dsidtempstr = Dsid4str Then       'ID schon im EEPROM?
    Dsidtemp(1) = 1wsearchnext()                            'Zweiter Sensor am Bus
    If Dsidtempstr = Dsid1str Or Dsidtempstr = Dsid2str Or Dsidtempstr = Dsid3str Or Dsidtempstr = Dsid4str Then       'ID schon im EEPROM?
    Dsidtemp(1) = 1wsearchnext()                            'Dritter Sensor am Bus
    If Dsidtempstr = Dsid1str Or Dsidtempstr = Dsid2str Or Dsidtempstr = Dsid3str Or Dsidtempstr = Dsid4str Then       'ID schon im EEPROM?
    Dsidtemp(1) = 1wsearchnext()                            'Vierter Sensor am Bus
    End If
 End If

    1wverify Dsidtemp(1)                                    'Nochmal überprüfen

 If Err = 0 Then                                            'Wenn in Ordnung...
      If Sensor.0 = 0 Then                                  'Sensor 1 nicht vorhanden?
            J = Ee_dsid1                                    'In Position 1 im EEPROM
         Elseif Sensor.1 = 0 Then                           'Sonst in Position 2
            J = Ee_dsid2
         Elseif Sensor.2 = 0 Then
            J = Ee_dsid3
         Else
            J = Ee_dsid4
         End If

      End If

      For I = 1 To 8                                        'Schreibe ID ins EEPROM
      Writeeeprom Dsidtemp(i) , J
      Incr J
      Next

 End If
    Waitms 200
End If

Do

' Alle angeschlossenen DS1820 zum Messen veranlassen
 1wreset
 1wwrite &HCC
 1wwrite &H44

 Waitms 800
 ' Den gewünschten Sensor auswählen
 1wverify Dsid1(1)
 ' Kommando READ SCRATCHPAD
 1wwrite &HBE
 Sc(1) = 1wread(9)
 If Sc(9) = Crc8(sc(1) , 8) Then
 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
 T1 = T2 * 10
 T3 = T - T1
 Locate 2 , 4
 Lcd T2 ; "." ; T3 ; Chr(223) ; "C"
 'Lcd T ; Chr(223) ; "C"
 End If

' Ausgabe alle 0,5 Sekunden
 Waitms 500

Loop
End
 
Hallo Lutze,

mach mal noch das
Code:
For I = 1 To 6                                          'Signal für Anlernen     Waitms 300
Next I
raus. Das macht bei dir keinen Sinn. Und schau noch mal in meinen Beispielcode. Du hast das Goto 0 unterschlagen.
 
oh stimmt hab das gelöscht iwie, oki werde ich nochmal überarbeiten,

aber ich glaub ich muss erstmal heute bascom vollversion erwerben sonst kommt ich nicht weiter :)

zudem ist heute noch der Logic Anlayzer aus England gekommen, freu :)
 
ok also das goto 0 hat nix gebracht außer das er immer wieder die Anzahl der Sensoren erscheinen lässt, als wäre es in der Schleife

dann habe ich mal bei angesteckten 4 Sensoren einen abgezogen, und resetet naja war ihm egal er hat dann die dsid1 von dem anderen genommen und dort die Temperatur ausgegeben die dann an erster stelle war :(


naja konnte aber mal den LA testen :)
1wire_1.png
 
Hallo,

ich hab mal was aus nem Programm von mir hier reingestellt. Das ist das Timing eines 1Wire-Busses ...

Code:
[FONT=Courier New]; ##################################################################
; ##################################################################
; #### Dallas 1-Wire-Subroutinen ###################################
; ##################################################################
; ##################################################################
 
; PD4 ---------------- 1Wire
;
;
;            __                  ___________              _________
; Init/Reset   |________________/           |____________/     :
;              :                :           :            :     :
;              |                |- 15-60us -|- 60-240us -|     |
;              |- >=480us ------|--------- >=480us ------------|
;              |- Master Tx ----|----------- Master Rx --------|
;
;
;           ___                             _______  <1us _______________________
; Master Tx    |___________________________/       |_____/  :        :        :
;              :        :        :        :        :        :        :        :
;              |- 15us -|- 15us -|- 30us -|        |- 15us -|- 15us -|- 30us -|
;              |----- 60-120us -----------|- >1us -|----- 60-120us -----------|
;              |     Slave-Sample^        |        |     Slave-Sample^        |
;              |- Master Write 0-Slot ----|        |- Master Write 1-Slot ----|
;
;
;           ___ >1us                        _______ >1us   ______________________
; Master Rx    |____ ________///////////////       |____ // : :               :
;              :    :   : :               :        :    :   : :               :
;              |- 15us ---|--- 45us ------|- >1us -|- 15us ---|--- 45us ------|
;              |    :   ^Master-Sample    |        |    :   ^Master-Sample    |
;              ##### vom Master generiert          ##### vom Master generiert
;
[/FONT]
Du hast bei deiner Messung 2MHz Samplerate eingestellt. Also alle 500ns (0,5µs) eine Abtastung.

Wie man sieht gibt es Zeiten im Bereich von <1µs bis 15µs als kleinste Werte. Bei 15µs würde ich das noch durchgehen lassen. Die Messung der Zeiten von <1µs könnten bei dir bei lediglich 1-2 Abtastungen in dem Bereich schon eng werden.

Warum um alles in der Welt laßt ihr die Meßgeräte nicht mal auf höheren Samplingraten laufen ? Immer nach dem Motto ... Abtasttheorem ... doppelte Abtastrate reicht. Und danach wundern wenn man sich in der Interpretation der Falschmessung verzettelt. Das ganze Dilemma hatten wir grade bei Hemi mit seinem MP3-Codec. Bei ihm war zwar das Datensignal vorhanden (wohl auch stark verunstaltet aber da) und der Takt war in einzelnen Bereichen einfach weg.

Das Ding kann mit 24MHz (24MS/s) abtasten. Laßt es doch einfach mal zeigen was es kann. Wenn dir die Datei dann zu groß wird oder nicht die komplette Datensequenz in die Aufzeichnung paßt kann man immer noch runterdrehen. Du hast die volle Geschwindigkeit bezahlt. Warum nutzt du sie nicht. Du bekommst dadurch wesentlich bessere Zeitmessungen. Das hilft dir dabei eventuelle Timing-Probleme besser und genauer zu erfassen.

Immer auf Knautsch und "das reicht, mach nicht so hoch" arbeiten und nachher über den produzierten Müll wundern.

So ... das mußte mal raus. ;)

Gruß
Dino
 
:) Din0 hast ja recht, ich hatte gestern einfach mal bissel rumgespielt, und da gar nicht weiter drauf geachtet :)
 

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