PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DS1820 - Prg. liest regelmäßig Werte des falschen Sensors



mathias172
29.04.2008, 02:34
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.


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

papa_of_t
29.04.2008, 15:09
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?

mathias172
29.04.2008, 22:38
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.


'------------------------------------------------------------------------------
' 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

mathias172
30.04.2008, 00:36
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? :-k

helimike0705
30.04.2008, 16:40
http://www.pirnaer.de/bascom_fuer_myavr_temperatur_ds1820.html

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

Mike

mathias172
30.04.2008, 23:14
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.