Bascom DS1820 ID Auslesen

guten Abend

bin mom bissel am verzweifeln, wie ich es anstelle, dass meine 4 ID´s von den DS1820 iwo abgespeichert werden, aber nicht temporär.
jetzt habe ich bissel im netz geschaut und und das mit den EEPROM gefunden. jetzt weis ich nicht ob man die ID`s auslesen soll und die dann dort Speicher ablegen soll, oder
die ID´s schon vorher auslesen und gleich fest reinschreiben und dann einfach abfragen wenn man die brauch.

Code:
$eeprom
Data &H00 'I always skip byte 0 due to a known AVR bug
Data &H10 , &H50 , &H4F , &HE3 , &H00 , &H08 , &H00 , &HE4 'Sensor 1
Data &H10 , &H1D , &H14 , &HE3 , &H00 , &H08 , &H00 , &H3E 'Sensor 2
Data &H10 , &H2D , &HCD , &H48 , &H01 , &H08 , &H00 , &HE8 'Sensor 3
Data &H10 , &HFD , &HE8 , &HE2 , &H00 , &H08 , &H00 , &H1F 'Sensor 4
$data
 
Hi Lutz,

jetzt weis ich nicht ob man die ID`s auslesen soll und die dann dort Speicher ablegen soll, oder
die ID´s schon vorher auslesen und gleich fest reinschreiben und dann einfach abfragen wenn man die brauch.
auslesen kannst du das EEPROM so oft wie du möchtest und da dir evtl auch mal nen Sensor flöten gehen kann würde ich folgendes vorschlagen ...

Du machst einen Menüpunkt mit dem du die IDs der Sensoren einlesen und im EEPROM abspeichern/einsortieren kannst.
Beim starten(booten) des Controllers liest du die IDs aus dem EEPROM aus und verwendest sie für die Abfragen der Temperatur. Aber die Fehlerroutine für zwar abgespeicherte aber grade nicht vorhandene IDs nicht vergessen !

Dann mußt du nicht genau diese DS18S20 verwenden sondern kannst die einfach einbauen und dann nachher über ein "Setup" zuweisen. Und wenn du beim löten einen verbrutzelst mußt du das Programm nicht ändern.

Gruß
Dino
 
Mit Menü meinst du jetzt eine Menüauswahl im Display? so komplex wollte ich es erstmal nicht machen :) da ich auch keine taster oder eingeplant hatte
 
da ich auch keine taster oder eingeplant hatte
OK ... ohne Bedienelemente mußt du das dann wohl fest ins Programm reinsetzen oder es beim Programmieren ins EEPROM brennen.
Also ein File fürs Flash mit dem Programm
und ein File fürs EEPROM mit den 1Wire-IDs.
 
Hallo Cassio
Habe mir bereits HTERM aus dem Netz geholt. Kennst du eine BD dazu? Ist auch leider auf engl. ist nicht meine Stärke. Es geht auch mit Beispielen und anderen Sachen dazu.
achim
 
hterm ist doch recht leicht zu verstehen, was willste denn genau machen ?
 
Hallo Lutze53,

ich habe dir hier mal ein Stück Code angehängt. Habe ich aktuell in einem Projekt verwendet. Vielleicht hilft dir das weiter.

Code:
$regfile = "m88def.dat"
$crystal = 8000000
$hwstack = 256
$swstack = 256
$framesize = 128

'Ports:

Ddrb = &B0000_1001
Portb = &B1111_0111
Ddrc = &B0011_0100
Portc = &B1100_1011
Ddrd = &B1110_1000
Portd = &B1111_1111

'LED rot auf Portb.0; LED grün auf Portd.7;
'Sda = Pind.4 ; SCL = pind.5 (Hardware TWI)
'Jumper S1 auf Portb.1
'Lüfter an Portb.3
'Maximal 3 Temperatursensoren DS18S20 an PORTC.2

Led_rot Alias Portb.0
Led_gruen Alias Portd.7

Const Ee_sid1 = 2
Const Ee_sid2 = 10
Const Ee_sid3 = 18
Const An = 0
Const Aus = 1

Dim Sc(9) As Byte , Sensor As Byte , W As Word
Dim Sid1str As String * 8 , Sid2str As String * 8 , Sid3str As String * 8 , Sidtempstr As String * 8
Dim Sid1(8) As Byte At Sid1str Overlay , Sid2(8) As Byte At Sid2str Overlay , Sid3(8) As Byte At Sid3str Overlay
Dim Sidtemp(8) As Byte At Sidtempstr Overlay

Dim I As Byte , J As Byte

Config 1wire = Portc.2

J = Ee_sid1
 For I = 1 To 8                                             '3x8 bytes (Adressen DS18S20) aus Eeprom lesen
    Readeeprom Sid1(i) , J
    Incr J
 Next
 For I = 1 To 8
    Readeeprom Sid2(i) , J
    Incr J
 Next
 For I = 1 To 8
    Readeeprom Sid3(i) , J
    Incr J
 Next

 Sensor = 0                                                  'Auf Kabelbruch/Fehlfunktion/Vorhandensein überprüfen
Led_rot = An
Waitms 200
1wverify Sid1(1)                                            'Sensor1 vorhanden?
If Err = 0 Then
   Led_gruen = An
   Waitms 200
   Led_gruen = Aus
   Waitms 200
   Set Sensor.0
End If
Waitms 200
1wverify Sid2(1)                                            'Sensor2 vorhanden?
If Err = 0 Then
   Led_gruen = An
   Waitms 200
   Led_gruen = Aus
   Waitms 200
   Set Sensor.1
End If
Waitms 200
1wverify Sid3(1)                                            'Sensor3 vorhanden?
 If Err = 0 Then
    Led_gruen = An
    Waitms 200
    Led_gruen = Aus
    Waitms 200
    Set Sensor.2
 End If
Led_rot = Aus
Waitms 200

W = 1wirecount()                                            'Wieviele Sensoren gibt es?
J = 0
 For I = 0 To 2                                             '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
    Toggle Led_rot
    Toggle Led_gruen
    Next I
    Sidtemp(1) = 1wsearchfirst()                            'Erster Sensor am Bus
    If Sidtempstr = Sid1str Or Sidtempstr = Sid2str Or Sidtempstr = Sid3str Then       'ID schon im EEPROM?
    Sidtemp(1) = 1wsearchnext()                             'Zweiter Sensor am Bus
   If Sidtempstr = Sid1str Or Sidtempstr = Sid2str Or Sidtempstr = Sid3str Then       'ID schon im EEPROM?
    Sidtemp(1) = 1wsearchnext()                             'Dritter Sensor am Bus
   End If
    End If
    1wverify Sidtemp(1)                                     'Nochmal überprüfen
    If Err = 0 Then                                         'Wenn in Ordnung...
    If Sensor.0 = 0 Then                                    'Sensor 1 nicht vorhanden?
   J = Ee_sid1                                              'In Position 1 im EEPROM
    Elseif Sensor.1 = 0 Then                                'Sonst in Position 2
    J = Ee_sid2
    Else
    J = Ee_sid3                                             'Oder 3
    End If
    For I = 1 To 8                                          'Schreibe ID ins EEPROM
    Writeeeprom Sidtemp(i) , J
    Incr J
    Next
    End If
    Waitms 200
    Led_gruen = An
    Waitms 200
    Led_gruen = Aus
    Goto 0
 End If
 
oh nice danke schaue ich mir mal an so etwas in der art habe ich gesucht :)

gruß lutze
 
so habe es mal für mich angepasst um selber zu sehen was passiert :)
sind aber noch 2 Fehler drin, die ich nicht finde.

2012-01-01 23-39-46_BASCOM-AVR IDE [2.0.7.1] - [D__Projekt Codes_GA_Projekt_1.bas].png

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 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , _
'                 Db7 = Portb.7 , E = Portb.0 , Rs = Portb.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                                  '
'-------------------------------------------'


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
   Print "Sensor 1 vorhanden"
   Waitms 200
   Set Sensor.0
End If

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

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

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

W = 1wirecount()                                            'Wieviele Sensoren gibt es?
J = 0
   Print "Sensoren: " + J
 For I = 0 To 2                                             '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
         Else
         If Sensor.1 = 0 Then                               'Sonst in Position 2
      J = Ee_dsid2
         Else
      J = Ee_dsid3
         Else
      J = Ee_dsid4
      End If
      For I = 1 To 8                                        'Schreibe ID ins EEPROM
      Writeeeprom Dsidtemp(i) , J
      Incr J
      Next
      End If
    Waitms 200
    Goto 0
 End If

Print Ee_dsid1
 
Hallo Lutze!

Auf Grund der fortgeschrittenen Stunde kann ich dir nur folgende Hinweise geben:

Einmal ist dies hier nicht richtig:
Code:
   Print "Sensoren: " + J

Du kannst kein Byte zu einem String addieren. :wink:



Bezüglich der Fehler mit den IF - End If Schleifen wird das Problem wohl am des Programmes liegen:
Code:
    [COLOR="#FF0000"]If[/COLOR] Err = 0 Then                                         'Wenn in Ordnung...
         [COLOR="#FF0000"]If[/COLOR] Sensor.0 = 0 Then                               'Sensor 1 nicht vorhanden?
      J = Ee_dsid1                                          'In Position 1 im EEPROM
         [COLOR="#0000FF"]Else[/COLOR]
         [COLOR="#FF0000"]If[/COLOR] Sensor.1 = 0 Then                               'Sonst in Position 2
      J = Ee_dsid2
        [COLOR="#0000FF"] Else[/COLOR]
      J = Ee_dsid3
        [COLOR="#0000FF"] Else[/COLOR]
      J = Ee_dsid4
      [COLOR="#008000"]End If[/COLOR]
      For I = 1 To 8                                        'Schreibe ID ins EEPROM
      Writeeeprom Dsidtemp(i) , J
      Incr J
      Next
      [COLOR="#008000"]End If[/COLOR]
    Waitms 200
    Goto 0
[COLOR="#008000"] End If[/COLOR]

Irgendwie sind da zu viele IF, ELSE und zu wenig END IF vorhanden, bzw. falsch verschachtelt. :cool:

Ich finde persönlich die Verschachtelung nicht ganz so gut gelöst, weil man schnell den Überblick verliert. :wink:


Grüße,
Cassio
 
mh stimmt, werde mal bissel schlafen gehen und morgen mal mit wachen auge drüber schauen :)

gruß lutze
 
Hallo,

wenn du aus den Elseif Else machst, dann funktioniert es halt nicht mehr.
Code:
If Err = 0 Then                                         'Wenn in Ordnung...
      If Sensor.0 = 0 Then                                  'Sensor 1 nicht vorhanden?
         J = Ee_sid1                                        'In Position 1 im EEPROM
      Elseif Sensor.1 = 0 Then                              'Sonst in Position 2
         J = Ee_sid2
      Elseif Sensor.2 = 0 Then                              'oder 3
         J = Ee_sid3
      Else
         J = Ee_sid4                                        'Oder 4
    End If
Weiter oben hast du noch einen Fehler bei der Printausgabe.
Code:
For I = 0 To 2                                             'Wieviele sind identifiziert? 
    J = J + Sensor.i 
Next
Da musst du aus der 2 noch eine 3 machen.

@Cassio
Da ist mir grad nichts besseres (kürzeres) eingefallen. Wenn es eingerückt ist, sollte man da schon folgen können;)
 
@Cassio
Da ist mir grad nichts besseres (kürzeres) eingefallen. Wenn es eingerückt ist, sollte man da schon folgen können


Hallo Stefan!

Ich weiß was du meinst und mache das ja selber auch so. :D


Mir ging es aber bei meiner Aussage auch nur darum, dass Lutze es selber merken muss. :wink:

Wenn er alles richtig eingerückt hätte, dann hätte er den Fehler bestimmt auch selber gesehen.......
auch dass es nur ELSEIF sein kann, und nicht mehrere ELSE in der selben Schleife. :)


Grüße,
Cassio
 
^^ ja habe es nochmal angeschaut und und fehler gefunden :) jetzt kompiliert es auch fehlerfrei
 
Hallo,

so wieder mal bissel Zeit zum weitermachen :)
Eine Frage habe ich noch, habe nochmal bissel das Forum durchgeschaut, wegen der richtigen Zuordnung der ID´s von mehreren Sensoren. Wäre es denn vorteilhaft man gibt den 4 Sensoren einen eigenen Port oder so wie ich es momentan habe die 4 ID´s vorher auslesen und schon fest im Code einfügen.
 
Hallo Lutze!

Was mir gerade einfällt.....
Irgendwann hat hier jemand mal über die selbe Eigenschaft nachgedacht und eine eigene "ID" im freien Speicher abgelegt.
Ich weiß gerade nicht mehr welcher Thread das war. :hmmmm:

Wenn ich ihn wieder finde, stelle ich den Link hier ein. :wink:
Zumindest ist das die bessere Wahl, als vier 1Wire-Busse nebeneinander! Geht das überhaupt? :hmmmm:


Grüße,
Cassio
 
ja ich glaub schon, wobei, wenn man mal überlegt macht dann der 1wire kein sinn mehr :)
 
Zumindest ist das die bessere Wahl, als vier 1Wire-Busse nebeneinander! Geht das überhaupt? :hmmmm:
ich hab irgendwann mal was über die 1Wire-Befehle in der Bascom-Referenz nachgesehen und da war glaube ich auch was drin für mehrere Busse.

Moment ...

var2 = 1WIRECOUNT( port , pin)
1WRESET , PORT , PIN
var2 = 1WREAD( bytes , port , pin)
var2 = 1WSEARCHFIRST( port , pin)
var2 = 1WSEARCHNEXT( port , pin)
1WWRITE var1 , bytes , port , pin

... also bei den Befehlen kann man angeben auf welchen Pin (und damit Bus) sie wirken sollen.

Gruß
Dino
 
Hallo Lutze!

Ich habe den LINK zur persönlichen Sensor-ID wieder gefunden!

Die Sensoren haben einen Speicherbereich, der für feste Werte eines Über- & Untertemperaturalarms gedacht ist.
Man kann diesen Speicher aber auch als User1 + User 2 Byte frei nutzen.

Du kannst dir ja mal den verlinkten Thread ganz durchlesen und dann überlegen, ob das eine Lösung wäre.


Grüße,
Cassio
 
ja genau Cassio, das auch der Beitrag den ich gefunden habe, ich sag mal so gesehen keine schlechte Idee, aber iwie bin ich mir da noch nicht so ganz sicher aber sich der Aufwand bei mir lohnt, bei den 4 Sensoren. mh...
 

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