Hallo,
habe einen DS18S20 an Portb.0 meines mega32 hängen. Folgendes Programm gibt mir als Temperatur immer 850 aus:
Die ID bekomme ich angezeigt. Hab 2 DS18S20 ausprobiert. Am Datenausgang habe ich einen 4,7k Pullup. Vielleicht sitz ich ja auch nur auf der Leitung. Vielleicht kann mir ja jemand von Euch helfen.Code:'--- Controller --- $regfile = "m32def.dat" $crystal = 16000000 $baud = 4800 $hwstack = 32 $swstack = 10 $framesize = 40 '--- Grafikroutine --- $lib "glcdKS108.lib" '--- DS18S20 --- Config 1wire = Portb.0 '--- Declare Subs --- Declare Sub Init Declare Sub Convallt Declare Function Decigrades(byval Sc(9) As Byte) As Integer '--- Dims --- Dim B As Byte Dim W As Word Dim Dg As Integer Dim Min1 As Integer Dim Min2 As Integer Dim Max1 As Integer Dim Max2 As Integer Dim Dsid1(8) As Byte Dim Sc(9) As Byte '--- Grafikdisplay --- Config Graphlcd = 128 * 64sed , Dataport = Porta , Controlport = Portc , Ce = 1 , Ce2 = 0 , Cd = 2 , Rd = 3 , Reset = 4 , Enable = 5 Cls Showpic 0 , 0 , Lcdblank Setfont Font6x8 Lcdat 2 , 32 , "Sensorcheck" Line(0 , 20) -(128 , 20 ) , 1 Wait 1 '--- Sensor --- Setfont Kayfont5x5 Dsid1(1) = 1wsearchfirst() If Dsid1(8) = Crc8(dsid1(1) , 7) Then Lcdat 4 , 2 , "CRC OK Sensor" Wait 1 For B = 1 To 8 Lcdat 5 , 2 , Hex(dsid1(b)) Next End If '--- Main Hauptprogramm --- Main: Call Convallt ' "Convert ALL T on the 1w-bus" Waitus 200 : Waitus 200 : Waitus 200 : Waitus 200 'if you use 2-wire, could be reduced to 200us 1wverify Dsid1(1) 'Issues the "Match ROM " Locate 1 , 1 If Err = 1 Then Lcdat 6 , 2 , "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)) Lcdat 7 , 2 , Dg End If End If Wait 1 Goto Main '--- Temperatur konvertieren --- Sub Convallt 1wreset ' reset the bus 1wwrite &HCC ' skip rom 1wwrite &H44 ' Convert T End Sub '--- Funktion zum auslesen des Temperatursensors --- 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 '--- Includes --- $include "kayfont5x5.font" $include "font6x8.font" '--- Bilder --- Lcdblank: $bgf "lcdblank.bgf"
mfg Kay







Zitieren

Lesezeichen