$regfile = "M8def.dat" $crystal = 3686400 $hwstack = 64 $swstack = 64 $framesize = 80 $baud = 9600 'Routine to read the SHT11 Humidity sensor chip 'By Stuart Leslie 'Contact stu@4sightinc.com with any questions 'Uses BascomAVR 'a .01 uf capacitor across VCC and Ground on the SHT11 really cleans up the data 'a pullup is required on "data" pin as shown in the data sheet Dim Ctr As Byte Dim Dataword As Word Dim Command As Byte Dim Dis As String * 20 Dim Calc As Single Dim Calc2 As Single Dim Rhlinear As Single Dim Rhlintemp As Single Dim Tempc As Single Dim Tempf As Single Const C1 = -4 Const C2 = 0.0405 Const C3 = -0.0000028 Const T1c = .01 Const T2 = .00008 Const T1f = .018 Sck Alias Portc.5 Dataout Alias Portc.4 Datain Alias Pinc.4 Declare Sub Getit() Ddrc = &B11111111 'all port b are output Config Pinc.5 = Output 'sck Config Pinc.4 = Output 'datain 'reset the serial communications first, it is easily confused! Set Dataout For Ctr = 1 To 12 Set Sck Waitus 2 Reset Sck Waitus 2 Next Ctr Do 'continually read the tempfature and humidity Command = &B00000011 Call Getit 'Get the temperature, puts result in "dataword" for us ' Tempf = T1f * Dataword Tempf = Tempf - 39.35 Tempc = T1c * Dataword 'get celcius for later calculations and for "the rest of the world" Tempc = Tempc - 39.66 Dis = Fusing(tempc , "###.##") Print "Temperatur = " ; Dis ; " (C)" Command = &B00000101 Call Getit 'get the humidity Calc = C2 * Dataword Calc2 = Dataword * Dataword 'that "2" in the datasheet sure looked like a footnote for a couple days, nope it means "squared"! Calc2 = C3 * Calc2 Calc = Calc + C1 Rhlinear = Calc + Calc2 Calc = T2 * Dataword Calc = Calc + T1c Calc2 = Tempc - 25 Calc = Calc2 * Calc Rhlintemp = Calc + Rhlinear Dis = Fusing(rhlintemp , "##.##") Print "relative Feuchte = " ; Dis ; " (rF%)" Wait 4 Loop Sub Getit() Local Datavalue As Word Local Databyte As Byte 'start with "transmission start" Set Sck Reset Dataout Reset Sck Set Sck Set Dataout Reset Sck 'now send the command Shiftout Dataout , Sck , Command , 1 Ddrc = &B11101111 'datain is now input Config Pinc.4 = Input 'datain Set Sck 'click one more off Reset Sck Waitus 10 'no idea why, but it doesn't work without it! Bitwait Pinc.4 , Reset 'wait for the chip to have data ready Shiftin Datain , Sck , Databyte , 1 'get the MSB Datavalue = Databyte Ddrc = &B11111111 Config Pinc.4 = Output Reset Dataout 'this is the tricky part- Lot's of hair pulling- have to tick the ack! Set Sck Reset Sck Ddrc = &B11101111 'datain is now input Config Pinc.4 = Input Shiftin Datain , Sck , Databyte , 1 'get the LSB Shift Datavalue , Left , 8 Datavalue = Datavalue Or Databyte 'don't tick the clock or ack since we don't need the CRC value, leave it hanging! Dataword = Datavalue Ddrc = &B11111111 Config Pinc.4 = Output Reset Dataout Set Sck Reset Sck Ddrc = &B11101111 'datain is now input Config Pinc.4 = Input Shiftin Datain , Sck , Databyte , 1 'not using the CRC value for now- can't figure it out! Anybody know how to impliment? 'Print "CRC value was - " ; Databyte Ddrc = &B11111111 Config Pinc.4 = Output Set Dataout Set Sck Reset Sck End Sub End