- LiFePO4 Speicher Test         
Ergebnis 1 bis 6 von 6

Thema: DS1820 - Prg. liest regelmäßig Werte des falschen Sensors

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    01.01.2008
    Alter
    43
    Beiträge
    48

    DS1820 - Prg. liest regelmäßig Werte des falschen Sensors

    Anzeige

    Praxistest und DIY Projekte
    Einen wunderschönen guten Morgähn liebe Leute.

    Ich habe nun die halbe Nacht an einer Kleinigkeit gesessen. Ich wollte eine Funktion fürs Auslesen mehrerer Temperatursensoren schreiben und bin an einer ganz simplen Stelle gescheitert - einer function.

    Code:
    '------------------------------------------------------------------------------
    ' I2C:  Sda = Portc.4 Scl = Portc.5
    ' UART: RxD = Portd.0 TxD = Portd.1
    '------------------------------------------------------------------------------
    $regfile = "m32def.dat"
    $crystal = 8000000
    Declare Function Get_temp(ts As Byte) As Integer
    Dim ___lcdno As Byte                                        'Umschaltbyte für Anzeige :
    
    Config Lcd = 20 * 4                                         'Anzeigemodus 40 x 4 Zeichen
    Config Lcdpin = Pin , E = Portb.6 , Rs = Portb.7 , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E2 = Portb.5
    
    ___lcdno = 0                                                'auf Chip 1 schalten
    Initlcd                                                     'die beiden oberen Zeilen initialisieren
    Cls                                                         'die beiden oberen Zeilen löschen
    
    ___lcdno = 1
    Initlcd
    Cls
    Config 1wire = Portc.6
    Cls
    
    Dim Ar(8) As Byte
    Dim I As Byte
    Dim Sc(9) As Byte
    Dim Sensor As Byte
    Dim T As Integer
    Dim Test As Byte
    
    
    For Sensor = 1 To 1wirecount()
       If Sensor = 1 Then Ar(1) = 1wsearchfirst() Else Ar(1) = 1wsearchnext()
       Locate 1 , 1 : Lcd "Sensor" ; Sensor ; " ";
       For I = 1 To 8
        Lcd Hex(ar(i))
       Next
       Locate 2 , 1
       Test = Ar(1)
       Lcd Get_temp(test)
       Wait 3
    Next Sensor
    
    
    Function Get_temp(ts As Byte)
     1wreset
     1wwrite &HCC                                               'skip rom (an alle)
     1wwrite &H44                                               ' messen
     Waitus 200                                                 'zeit zum messen geben
     1wverify Ts                                                ' Den gewünschten Sensor auswählen
     1wwrite &HBE                                               ' Kommando READ SCRATCHPAD
     Sc(1) = 1wread(9)
     If Sc(9) = Crc8(sc(1) , 8) Then
       T = Makeint(sc(1) , Sc(2))                               ' Die Nachkommastelle entfernen
       T = T / 2                                                ' Temperatur in ganzen Grad Schritten ausgeben
     End If
     Get_temp = T
    End Function
    End
    Die Fehlermeldung, die da erscheint, zeigt auf Zeile 39: Lcd Get_temp(test)

    Fehler ist "Different parameter type passed then declared".

    Ich weiss ja, was Bascom von mir will. Ich versteh' nur nicht, wo ich da angeblich einen falschen Typ übergeben soll oder ich habe doch ein Grundsatzproblem

    Kann mir jemand von Euch bitte einen Denkanstoß geben? Gute Nacht erstmal

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    06.03.2007
    Beiträge
    7
    mach das mal in mehreren Schritten, so kannst Du besser analysieren:

    1) weise das Funktionsergebnis einer Variablen zu
    2) wandle die Variable in einen String
    3) gib den String aus (LCD strIrgendwas)

    wo hakt es jetzt?

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    01.01.2008
    Alter
    43
    Beiträge
    48
    Nirgens =D>
    Einfach nochmal das Funktionsergebnis statt direkt aufs Lcd in eine Variable und dann erst ausgeben.

    Ich ändere bei der Gelegenheit mal den Thread-Titel.

    Danke Dir für den Schubs

    Das Programm gibt nun ganz simpel nacheinander die Temperaturwerte und Chip-IDs der Temperatursensoren aus.

    Code:
    '------------------------------------------------------------------------------
    ' I2C:  Sda = Portc.4 Scl = Portc.5
    ' UART: RxD = Portd.0 TxD = Portd.1
    '------------------------------------------------------------------------------
    $regfile = "m32def.dat"
    $crystal = 8000000
    Declare Function Get_temp(ts As Byte) As Integer
    Dim ___lcdno As Byte                                        'Umschaltbyte für Anzeige :
    
    Config Lcd = 20 * 4                                         'Anzeigemodus 40 x 4 Zeichen
    Config Lcdpin = Pin , E = Portb.6 , Rs = Portb.7 , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E2 = Portb.5
    
    ___lcdno = 0                                                'auf Chip 1 schalten
    Initlcd                                                     'die beiden oberen Zeilen initialisieren
    Cls                                                         'die beiden oberen Zeilen löschen
    
    ___lcdno = 1
    Initlcd
    Cls
    
    Config 1wire = Portc.6
    
    Dim Ar(8) As Byte
    Dim I As Byte
    Dim Sc(9) As Byte
    Dim Sensor As Byte
    Dim T As Integer
    Dim Test As Byte
    Dim Temp2 As Integer
    
    For Sensor = 1 To 1wirecount()
       If Sensor = 1 Then Ar(1) = 1wsearchfirst() Else Ar(1) = 1wsearchnext()
       Locate 1 , 1 : Lcd "Sensor" ; Sensor ; " ";
       For I = 1 To 8
        Lcd Hex(ar(i))
       Next
       Locate 2 , 1
       Test = Ar(1)
       Temp2 = Get_temp(test)
       Temp3 = Str(temp2)
       Lcd Temp2
       Wait 3
    Next Sensor
    
    
    Function Get_temp(ts As Byte)
     1wreset
     1wwrite &HCC                                               'skip rom (an alle)
     1wwrite &H44                                               ' messen
     Waitus 200                                                 'zeit zum messen geben
     1wverify Ts                                                ' Den gewünschten Sensor auswählen
     1wwrite &HBE                                               ' Kommando READ SCRATCHPAD
     Sc(1) = 1wread(9)
     If Sc(9) = Crc8(sc(1) , 8) Then
       T = Makeint(sc(1) , Sc(2))                               ' Die Nachkommastelle entfernen
       T = T / 2                                                ' Temperatur in ganzen Grad Schritten ausgeben
     End If
     Get_temp = T
    End Function
    
    End

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    01.01.2008
    Alter
    43
    Beiträge
    48
    Okay, vergesst es. Die Werte stimmen nicht.

    Bei mehreren Sensoren merkt sich das Programm nur zwei IDs und nicht mehr. Dementsprechend bekomme ich auch nur zwei sinnvolle Temperaturen.

    Hmm... jemand eine Idee?

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.12.2006
    Alter
    58
    Beiträge
    117
    http://www.pirnaer.de/bascom_fuer_my...ur_ds1820.html

    Schau mal auf den untersten Programmcode.Vielleicht kannst du damit was anfangen.

    Mike

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    01.01.2008
    Alter
    43
    Beiträge
    48
    Leider nein. Das Programm fragt auch nur nach 1wsearchnext so wie meins auch. Das ist der Punkt, an dem ich die falsche Adresse bekomme und damit natürlich auch die falsche Temperatur.

    Allerdings bekomme ich auch mit diesem Programm den selben Effekt wie bei mir.

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress