Hi Leute,
ich habe jetzt den Wirdestand drin, leider bekomme ich nur am LCD 255 angezeigt. Ich verwende übrigend den DS18S20+
Muss ich da am Code was anders machen?
Gruß
SteKoLos
Hallo zusammen,
beim DS18B20 müssen 2 Bytes gelesen werden und dann durch 16 geteilt werden.
Gruß Socke
Hi Leute,
ich habe jetzt den Wirdestand drin, leider bekomme ich nur am LCD 255 angezeigt. Ich verwende übrigend den DS18S20+
Muss ich da am Code was anders machen?
Gruß
SteKoLos
www.ldap2doc.de -geniale MS Wordvorlagen Schnittstelle zum MS Active Directory-
Welchen Code benutzt du denn?Zitat von stekolos
Hi,
so wie ich deinen Code interpretiere, liest du nur 1 byte aus. Der Sensor liefert aber 2 Byte als Temperaturwert. Am besten das komplette Scratchpad auslesen (also 9 Byte einschließlich CRC).
Ich hab das so gemacht:
' ROM-Kommandos
Const DS_SEARCH_ROM = &hF0
Const DS_READ_ROM = &h33
Const DS_MATCH_ROM = &h55
Const DS_SKIP_ROM = &hCC
Const DS_APARL_SEARCH = &hEC
' Funktions-Kommandos
Const DS_CONVERT = &h44
Const DS_WRITE_SCRATCHPAD = &h4E
Const DS_READ_SCRATCHPAD = &hBE
Const DS_COPY_SCRATCHPAD = &h48
Const DS_RECALL = &hB8
Const DS_READ_POWER_SUPPLY = &hB4
Dim BusData(9)
Dim DSTemp as Integer at DSData(1) Overlay
Dim Temperatur as Single
1wreset pind , 4
1wwrite DS_SKIP_ROM , 1 , pind , 4
1wwrite DS_READ_SCRATCHPAD , 1 , PinD , 4
BusData(1) = 1wread(9 , PinD , 4) ' 9 Datenbyte ins Array laden
Waitms 800
1wreset pind , 4
1wwrite DS_SKIP_ROM , 1 , pind , 4
1wwrite DS_CONVERT , 1 , pind , 4
' Temperatur aus Array BusData lesen und umrechnen
Temperatur=DSTemp/2
Das Programm ist auf einen einzelnen Sensor am Bus ausgelegt (Skip Rom). Das kannste aber umschreiben für deine Zwecke.
Mitch.
Hallo zusammen,
nach längerem melde ich wieder zurück.
Ich habe den Code von Mitch64 getestet, leider geht es nicht.
Ich benutze das AVRFunk Board von Pollin mit einem Mega8 und Bascom.
Weiter habe ich den Temperatursensor DS18S20+ an PortB4 über die parasitäre Stromversorgung angeschlossen. (direkte Versugrung geht leider auch nicht)
Meine Fragen: Laut Datenblatt muss ich dem 1Wire Bus mitteilen wie die Stromversorgung erfolgt. Wie kann ich das machen?
Kann ich den 1Wire Bus an einem beliebigen PIN des Mega8 machen?
Hat jemand das Pollin Board mit dem DS18S20+ im Einsatz?
Muss der exterene Quartz einen bestimmten Wert haben? Derzeit habe ich einen 12MHz drin.
Der Sensor wurde auch nicht mit dem Code gefunden:
http://www.rn-wissen.de/index.php/Ba...er_Ger.C3.A4te
Ich verzweifle langsam, aber ich denke es muss eine rationale Lösung geben.
Für eure Ideen schon mal besten Dank.
Gruß SteKoLos
www.ldap2doc.de -geniale MS Wordvorlagen Schnittstelle zum MS Active Directory-
Hallo SteKoLos,
Beim 1Wire-Bus muss das Timing stimmen. Du kannst da nicht einfach irgend ein Quarz rein drücken nach belieben.
Du must unbedingt in den Fusebits den externen Quarz einstellen. Und in deinem Code muss dann auch der 12MHz angegeben werden ($Crystal=12000000), sonst wird das nichts.
Wenn das nicht stimmt, geht natürlich nichts. Den Temperatursensor kannste im Prinzip an jeden Pin hängen, allerdings muss das im Source dann auch so konfiguriert bzw. angepasst werden.
Vielleich postest du mal deinen Code. Dann kann man dir bestimmt besser helfen.
Mitch.
Hallo Mitch,
das dachte ich mir eben, ich habe gerade im Netz gesucht.
Kannst du mir sagen wie ich die Fusebits einstellen muß?
Ich benutze Bascom und PonyProg. Ich habe gelesen, dass das mit den FuseBits nicht ganz ohne Gefahr verbunden ist. Ich kenne mich damit leider noch garnicht aus. Bin eben neu in der Materie.
Gruß
SteKoLos
www.ldap2doc.de -geniale MS Wordvorlagen Schnittstelle zum MS Active Directory-
Ich stelle die Fuses immer mit Bascom ein. Mit Poniprog geht das auch, aber ich kenne das Teil zu wenig.
Ich vermute einfach mal, dass dein Atmega mit 1MHz internem Takt läuft. Du kannst ja mal spaßeshalber im Code den Wert von $Crystal auf 1000000 einstellen, compilieren und Proggen. Wenns dann geht, liegt es an den Fuses.
Hab da etwas gefunden, was dir weiter helfen sollte:http://wiki.ctbot.de/index.php/Ponyprog
Soweit ich das auf die schnelle Blicke musst du die Fuses CKSEL3 bis CKSEL0 einstellen. Wenn du mit Bascom Flashen kannst, kann ich dir besser weiter helfen.
Bascom zeigt mir an, beim ATmega8, wenn ich den auf externes Quarz schalten würde, dass die Einstellung SUT=11 und CKSEL=1111 in Ordnung wäre. Diese Bits setzen. Ob ein gesetztes Häkchen=1 entspricht muste noch raus bekommen.
Hallo zusammen,
ich habe folgende Konfiguration der Fuse Bits:
(in PonyProg)
BOOTSZ1
BOOTSZ0
SUT0
CKSEL3
CKSEL2
CKSEL1
Häcken drin, was beutet: BIT = 0
Bei den Andern FuseBits ist nichts aktiviert was BIT =1 bedeutet.
An meinem Pollin Board habe ich ein zweizeiliges LCD dran, diese funktioniert auch.
Ich habe verwende den internen Quarz, hoffe ich jedenfalls.
Nach dem ich jetzt das Programm (siehe unten) hochgeladen habe, erhalte ich auch die Seriennummern der Sensoren.
Wenn ich einen Sensor abklemme erhalte ich auch die Fehlermeldung, das der entsprechende Sensor nicht am Bus ist.
Leider erhalte ich nur irgendwelche Werte als Min, MAX und aktuelle Temperatur.
Kann es sein, dass der Code mit der Umwandlung der 9 Bits falsch ist?
oder muss ich einen speziellen Quarz verwenden?
Im Anhang ist die LCD Ausgabe.
Das Beispiel ist von dem Bascom Hersteller MCS.
Folgenden Code habe ich drin:
[/code]Code:$regfile "m8def.dat" $crystal = 1000000 Declare Sub Init Declare Sub Convallt ' Convert T on ALL sensors Declare Function Decigrades(byval Sc(9) As Byte) As Integer Config Lcd = 16 * 2 'wir verwenden ein 16*2 Zeichen Display ' Im I/O Mode wird jeder Prozessor Pin einzeln angegeben Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portd.5 , Rs = Portd.6 Cursor Off Noblink Config 1wire = Portd.4 '0,1,2 NOP 3,4,5,6,7 works good ON MY Equipment 'Temp variables Dim B As Byte Dim W As Word 'Program variables 'Implicit Err created by compiler Dim Dg As Integer 'DECIgrades, I call it, cause I have no space for commas on the display.... Dim Min1 As Integer Dim Min2 As Integer Dim Max1 As Integer Dim Max2 As Integer Dim Dsid1(8) As Byte 'Dallas ID 64 bits incl CRC Dim Dsid2(8) As Byte 'When used like this : DsId(1) = 1wread(8) 'DsId(1) = family code 'Ds1820 10h, DS18B20 28h, Ds18s20 10h 'DsId(2) '48 Bits Serial, LSB 'DsId(3) 'DsId(4) 'DsId(5) 'DsId(6) 'DsId(7) '48 Bits Serial, MSB 'DsId(8) '8 CRC Dim Sc(9) As Byte 'Scratchpad 0-8 72 bits incl CRC, explanations for DS18b20 'Sc(1) 'Temperature LSB 'Sc(2) 'Temperature MSB 'Sc(3) 'TH/user byte 1 also SRAM 'Sc(4) 'TL/user byte 2 also SRAM 'Sc(5) 'config also SRAM x R1 R0 1 1 1 1 1 - the r1 r0 are config for resolution - write FF to byte for 12 bit - others dont care 'Sc(6) 'res 'Sc(7) 'res 'Sc(8) 'res 'Sc(9) '8 CRC 'DALLAS DS18B20 ROM and scratchpad commands''''''''''''''''''''''''''1wwrite.... '&H 33 read rom - single sensor '&H 55 match rom, followed by 64 bits '&H CC skip rom '&H EC alarm search - ongoining alarm >TH <TL '&H BE read scratchpad '&H 44 convert T Cls Lcd "This is a 2sensor DS18B20 thermometer" Locate 2 , 1 Lcd " by gote@sys-op.com" For B = 1 To 20 Shiftlcd Left Waitms 250 Next Cls W = 1wirecount() ' Here I assume 2 sensors - no errorcontrol made, but would be easy to do with the "Err"-variable ' Getting the two sensors IDs. Dsid1(1) = 1wsearchfirst() Do Dsid2(1) = 1wsearchnext() Loop Until Err = 1 ' If displayed, everything went well. ' First sensor identified and stored in variable If Dsid1(8) = Crc8(dsid1(1) , 7) Then ' Control that the received CRC match the calculated Locate 1 , 1 Lcd "CRC OK Sensor 1 ID" Wait 1 Locate 1 , 1 For B = 1 To 8 Lcd Hex(dsid1(b)) Next End If ' Second sensor If Dsid2(8) = Crc8(dsid2(1) , 7) Then Locate 2 , 1 Lcd "CRC OK Sensor 2 ID" Wait 1 Locate 2 , 1 For B = 1 To 8 Lcd Hex(dsid2(b)) Next End If Wait 1 Cls Init ' Main loop Do Convallt ' "Convert ALL T on the 1w-bus" Waitms 800 'if you use 2-wire, could be reduced to 200us 1wverify Dsid1(1) 'Issues the "Match ROM " Locate 1 , 1 If Err = 1 Then Lcd "Err " 'Err = 1 if something is wrong Elseif Err = 0 Then 'lcd " Sensor found" 1wwrite &HBE Sc(1) = 1wread(9) 'read bytes into array If Sc(9) = Crc8(sc(1) , 8) Then Dg = Decigrades(sc(9)) If Min1 > Dg Then Min1 = Dg If Max1 < Dg Then Max1 = Dg Lcd Dg : Locate 1 , 7 : Lcd Min1 : Locate 1 , 14 : Lcd Max1 End If End If 1wverify Dsid2(1) Locate 2 , 1 If Err = 1 Then Lcd "DsId2 not on bus " Elseif Err = 0 Then ' lcd " Sensor found " 1wwrite &HBE Sc(1) = 1wread(9) If Sc(9) = Crc8(sc(1) , 8) Then Dg = Decigrades(sc(9)) If Min2 > Dg Then Min2 = Dg If Max2 < Dg Then Max2 = Dg Lcd Dg : Locate 2 , 7 : Lcd Min2 : Locate 2 , 14 : Lcd Max2 End If End If Wait 1 Loop End 'end program 'Sets variables and LCD for further use''''''''''''''''''''''''''''''''''''''''' Sub Init Cls Lcd " Min Max" Locate 2 , 1 Lcd " Min Max" Min1 = 999 ' to get a real value from start Min2 = 999 End Sub 'Makes the Dallas "Convert T" command on the 1w-bus configured in "Config 1wire = Portb. " 'WAIT 200-750 ms after issued, internal conversion time for the sensor'''''''''' 'SKIPS ROM - so it makes the conversion on ALL sensors on the bus simultaniously 'When leaving this sub, NO sensor is selected, but ALL sensors has the actual 'temperature in their scratchpad ( within 750 ms ) Sub Convallt 1wreset ' reset the bus 1wwrite &HCC ' skip rom 1wwrite &H44 ' Convert T End Sub 'Makes a integer value of the first two bytes in scratchpad''''''''''''' 'Works on DS18 B 20 , observe "B". The R0 and R1 in Sc(5) tells you how many bits are accurate Function Decigrades(byval Sc(9) As Byte) Decigrades = 0 Decigrades = Makeint(sc(1) , Sc(2)) Decigrades = Decigrades * 10 Decigrades = Decigrades / 16 End Function ' If you have DS1820 or DS18 S 20 , you can use this algo instead: ' Observe that DsId1(1) contains the info value of which sensor is used. '( Function Decigrades(byval Sc(9) As Byte) Dim Tmp As Byte , T As Integer , T1 As Integer Tmp = Sc(1) And 1 ' 0.1C precision If Tmp = 1 Then Decr Sc(1) T = Makeint(sc(1) , Sc(2)) 'Print Hex(t) 'Print T T = T * 50 'here we calculate the 1/10 precision like T = T - 25 'DS18S20 data sheet T1 = Sc(8) - Sc(7) T1 = T1 * 100 T1 = T1 / Sc(8) T = T + T1 Decigrades = T / 10 'As integer, this routine gives T*10, with 1/10 degree precision End Function ')
www.ldap2doc.de -geniale MS Wordvorlagen Schnittstelle zum MS Active Directory-
Hallo,
du machst aber ne komische Umrechnung.
Da braucht man doch garnix viel rechnen.
Definier doch einfach eine Integervariable als Overlay auf die Arrayadresse. Das ist viel bequemer.
Du hast ja dein Array so definiert:
Dim Sc(9) as Byte
Wenn die Daten eingelesen sind, ist der Temperaturwert in Sc(1) und Sc(2) und zwar in der Reihenfolge Lowbyte dann Highbyte.
Definier eine Variable z.B.
Dim TemperaturInteger as Integer at Sc(1) overlay
und eine Single-variable für den Realwert.
Dim Temperatur as Single
Dann die Variable lesen und du hast fast den Temperaturwert. Noch durch 2 Teilen bei Auflösung 0,5°C oder durch 10 bei Auflösung 0,1°C.
Temperatur=TemperaturInteger/2 ' in °C mit Kommastelle
Das sollte bei allen DS18xxx funktionieren.
Mitch
Lesezeichen