-         

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 37

Thema: 4 Stück DS1820 auslesen und anzeigen mit BASCOM

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101

    4 Stück DS1820 auslesen und anzeigen mit BASCOM

    Anzeige

    Hallo!
    Ich möchte mehrere DS1820 am 1Wire Bus auslesen und am LCD anzeigen.
    Bei den 4 Stück die ich habe, hab ich die IDs ausgelesen, ich kann sie auch alle einzeln Anzeigen lassen, möchte aber, dass alle 4 in 3s Abstand die Temperatur in einer Zeile des LCD angezeigen. Wie macht man das. Im Forum hab ich schon gestöbert aber so richtig was gefunden hab ich nicht.

    Mein Code ist folgender:
    Code:
    '///////////////////////////////////////////////////////////////////////////////
    ' Funktion:
    ' Zeigt die Temperaturen der am 1Wire Bus angeschlossenen DS1820 an
    ' Wichtig: der 4,7k Ohm Widerstand muß angeschlossen sein sonst gehts nicht!
    ' Im 64Bit ROM des DS1820 sind der Familycode (8Bit), eine Seriennummer (8x8Bit)
    ' die es nur einmal gibt und ein CRC-Byte (8Bit) abgelegt.
    ' Der DS1820 mißt die Umgebungstemperatur im Bereich von -55...+125C in 0,5Grad
    ' Schritten
    '
    ' Meine 4 DS1820 haben die folgende Adressen:
    ' DS1820_1 => 10 6A E8 5F 01 08 00 8C
    ' DS1820_2 => 10 8B 23 25 01 08 00 73
    ' DS1820_3 => 10 7B D6 60 01 08 00 14
    ' DS1820_4 => 10 13 FD 5F 01 08 00 2C
    '
    '///////////////////////////////////////////////////////////////////////////////
    $regfile = "m8def.dat"
    $crystal = 14745600           'Externes Quarz   14,7456 Mhz
    'Achtung: damit der ext. Quarz aktiv wird => die Fusebits entsprechend einstellen.
    'Extern Cristal , bei mir alle Bits = 111 111
    $baud = 9600
    '-------------------------------------------------------------------------------
    '/// Definitionen //////////////////////////////////////////////////////////////
    '-------------------------------------------------------------------------------
    '/// LCD- DISPLAY 4x20
    'LCD im 4Bit I/O Mode
    Config Lcd = 20 * 4
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4
    Config Lcdpin = Pin , Db7 = Portd.5 , E = Portd.7 , Rs = Portd.6
    Cursor Off Noblink
    Cls
    
    ' Pin für 1wire Schnittstelle festlegen. => DS1820 am Port C.5
    Config 1wire = Portc.5
    Dim Ds1820_id(8) As Byte
    
    'Die Adresse meines DS1820 die ich vorher ausgelesen habe:
    ' Adrese Erster DS1820
    Ds1820_id(1) = &H10
    Ds1820_id(2) = &H6A
    Ds1820_id(3) = &HE8
    Ds1820_id(4) = &H5F
    Ds1820_id(5) = &H01
    Ds1820_id(6) = &H08
    Ds1820_id(7) = &H00
    Ds1820_id(8) = &H8C
    
    ' Die anderen Codes wären:
    ' DS1820_2 => 10 8B 23 25 01 08 00 73
    ' DS1820_3 => 10 7B D6 60 01 08 00 14
    ' DS1820_4 => 10 13 FD 5F 01 08 00 2C
    
    Dim Sc(9) As Byte
    Dim T As Integer
    Dim T1 As Integer
    Dim I As Byte
    Cls                           ' Clear LCD
    
    Do
    'Alle angeschlossenen DS1820 zum Messen veranlassen
     1wreset                      '1Wire Reseten
     1wwrite &HCC                 'Schreibt die Variable CC= Überspringen der Adresierung?
     1wwrite &H44                 'Starten der Temperaturmessung
     Waitus 200
    
    'Den gewünschten Sensor auswählen
     1wverify Ds1820_id(1)        'Prüft ob eine ID im 1Wire Bus zugänglich ist
              ' Wenn=0 zurückgeliefert wird, ist eine gültige ID vorhanden
              ' Wenn eine 1 geliefert wird, ist ein ERR aufgetreten
    
    'Kommando READ SCRATCHPAD
     1wwrite &HBE                 'Liest alle Bytes de Scratchpad Memory.
     Sc(1) = 1wread(9)
    
     If Sc(9) = Crc8(sc(1) , 8) Then
      T = Makeint(sc(1) , Sc(2))  'komprimiert zwei Bytes in die Integervariable T
    
    'Die Nachkommastelle entfernen
      T = T / 2
    
    'Temperatur in ganzen Grad ausgeben
      Locate 1 , 11
      Lcd "T1=" ; T ; " C"        ' Anzeige erfolgt so: T1=23 C
     Else
    
     'Wenn Fehler, Scratchpad zur Kontrolle Hexadezimal ausgeben
      Locate 2 , 1
    
    'Ausgabe
     For I = 1 To 8
       Lcd Hex(sc(i))
      Next
     End If
    
    'Ausgabe alle 0,5 Sekunden
     Waitms 500
    Loop
    
    End

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hallo,
    schreib die IDs aller Sensoren in ein 32 Byte Array.
    Dann eine Schleife über die 4 Sensoren.
    In der Schleife darfst du dann nicht
    Skip_rom = &HCC angeben
    sondern musst du die ID übertragen

    1wreset
    1wwrite &H55 'Match_rom
    1wwrite Ds1820_id(i) , 8 '8 Byte ID wird uebertragen
    1wwrite &HBE 'Read_scratchpad
    Sc(1) = 1wread(9)

    Entweder alle zusammen neu starten
    1wreset 'jetzt wird wieder die Konvertierung gestartet, alle parallel
    1wwrite &HCC 'Skip_rom
    1wwrite &H44 'start conversion

    oder einzeln mit
    1wreset
    1wwrite &H55 'Match_rom
    1wwrite Ds1820_id(id) , 8
    1wwrite &H44 'start conversion

    Gruß

    Rolf

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Hallo Rolf!
    Geht das nicht einfacher? Ich bin Anfänger und hab schon mal Probleme die 32 Byte in ein Array zu kriegen, geschweige denn wieder raus.
    Gruß
    Hans

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Ehrlich gesagt, kann ich das nicht ganz verstehen.
    Du tauschst einen Befehl

    1wwrite &HCC

    durch zwei Befehle

    1wwrite &H55
    1wwrite Ds1820_id(i) , 8

    aus. Noch einfacher?

    Die ID vom ersten Sensor hast du doch schon im Array, also die anderen 3 auch noch da rein schreiben.
    Dann

    For id=1 to 25 step 8
    1wreset
    1wwrite &H55
    1wwrite Ds1820_id(id) , 8
    1wwrite &HBE
    Sc(1) = 1wread(9)
    ... Auswerten
    next id

    Klar?

    Gruß

    Rolf

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Ok,
    das hört sich gut an. Danke!
    Gruß
    Hans

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.10.2004
    Ort
    Baoding
    Alter
    37
    Beiträge
    687
    Bascom bietet auch noch ein paar HIGH-Level-Befehle für 1Wire an wie 1wsearchfirst und 1wiresearchnext.
    Also erst mal für jeden Sensor ein Byte-Array erstellen.
    Code:
    Dim Sensor_rom_1(8) As Byte
    Dim Sensor_rom_2(8) As Byte
    Dim Sensor_rom_3(8) As Byte
    Dim Sensor_rom_4(8) As Byte
    Jetzt kann man die Rom-Werte einlesen.

    Code:
    Sensor_rom_1(1) = 1wsearchfirst()
    Sensor_rom_2(1) = 1wsearchnext()
    Sensor_rom_3(1) = 1wsearchnext()
    Sensor_rom_4(1) = 1wsearchnext()
    Jetzt kann man von jedem Sonsor die Temperatur einlesen
    Code:
    1wreset 'RESET 1Wire
    1wwrite &HCC 'an alle
    1wwrite &H44 'Temperaturmessung
    Wait 1 'ne Sekunde warten für Messung
    1wverify Sensor_rom_1(1) ' nur ersten Sensor ansprechen
    1wwrite &HBE ' Temperatur auslesen
    Daten(1) = 1wread(9) 'Daten einlesen

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    @Rofo88

    Weniger Speicher braucht er dadurch auch nicht.
    Dafür kann er jetzt nicht mehr eine einfache For-Schleife benutzen, da die IDs in verschiedenen Variablen stehen.

    In meinen Applikationen verwende ich nie 1wsearchnext, weil ich nicht weiß, ob die Sensoren immer in der gleichen Reihenfolge antworten. Und da du normalerweise bestimmte Temperaturen (z.B. einen innen und einen außen) messen lassen möchtest, wäre eine andere Reihenfolge ziemlich schlecht.

    Grundsätzlich macht man in einer Schleife die Reihenfolge anders herum, erst auslesen und dann die Konvertierung wieder starten. bis der Sensor wieder mit auslesen dran ist, ist er längst fertig. Beim ersten mal auslesen kommt dabei natürlich Blödsinn. Aber ich habe mir das Wait gespart.

    Gruß

    Rolf

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.10.2004
    Ort
    Baoding
    Alter
    37
    Beiträge
    687
    @for_ro

    Es ging auch nicht darum weniger Flash zu verbrauchen sondern es einfacher zu machen!

    Sollte sich an den Sensoren nichts ändern liefert 1wireserchnext immer die gleiche Reihenfolge.

    Grundsätzlich macht man in einer Schleife die Reihenfolge anders herum, erst auslesen und dann die Konvertierung wieder starten
    naja ob das für nen Anfänger der richtige Tipp ist [-X
    Wenn man weis das der erste Wert falsch ist kann man damit Arbeiten

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Zitat Zitat von Rofo88
    Sollte sich an den Sensoren nichts ändern liefert 1wireserchnext immer die gleiche Reihenfolge.
    Woher weißt du das? Ich habe so eine Aussage bei Dallas noch nie gelesen.

    Zitat Zitat von Rofo88
    Es ging auch nicht darum weniger Flash zu verbrauchen sondern es einfacher zu machen!
    Ich denke, es ist umständlicher. Er hat die Adressen schon alle, warum sollte er sie dann jedesmal neu bestimmen.

    Gerade Anfängern rate ich nie, ein Wait zu benutzen. Bei der Initialisierung von einem Display oder so ist das ok, aber nicht in einer Schleife, die dauernd ausgeführt wird, schon gar nicht von einer Sekunde.
    Und schau dich mal hier im Forum nach Code zu den Sensoren um, immer steht da Konvertierung starten, warten, auslesen. Jeder kopiert das und denkt, das müsste so sein.

    Wenn man vor der Schleife schon mal die Konvertierung startet, stimmt auch der erste Wert.

    Aber sei's drum, jeder so wie er es mag.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Hallo zusammen!
    Ich bin noch dabei das ganze zu verarbeiten und bei mir einzubaun, das dauert noch.
    Bisher geht leider noch nix. Ich verstehs aber schon besser als Gestern.
    Gruß
    Hans

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •