Me again, but need REAL help now


Results 1 to 34 of 34

Threaded View

  1. #34


    Did you find this post helpful? Yes | No

    Talking Beer for everyone!!!!

    I found this code posted by NavMicroSystems, made some SLIGHT changes, and it works perfectly. Cheers to everyone. This works for both the SHT1x and the SHT7x sensors. I have pasted the code below for everyone to see, and play with should the need arise. Thanks again to everyone who spent time trying to make my little project work. Beers are on me (sorry, no delivery outside of my local area)
    Code:
    '** Pin-Assingments
    DEFINE xtal 4
    Define  LCD_DREG        PORTB
    Define  LCD_DBIT        4
    Define  LCD_RSREG       PORTB
    Define  LCD_RSBIT       1
    Define  LCD_EREG        PORTB
    Define  LCD_EBIT        3
    portB.2=0
    output portb.2
    dta VAR PORTD.0 ' Sensor Data
    clk VAR PORTD.1 ' Sensor Clock
    
    '** Constants
    
    cmdtr CON %00000011 ' Command "read temperature"
    cmdhr CON %00000101 ' Command "read humitity"
    
    '** Variables
    
    result VAR WORD ' RAW Data from Sensor
    chksum VAR BYTE ' Checksum
    cmd VAR WORD ' Sensor Command
    RHlin VAR WORD ' Rel. Humidity (RH) Linear (% *10)
    RHtc VAR WORD ' Rel. Humidity (RH) temp. compensated (% *10)
    Temp VAR WORD ' Temperature (°C *100)
    DP VAR WORD ' Dewpiont (°C *10)
    
    
    '** Temp variables used in div. calculations
    
    TempDP VAR WORD
    Rchk VAR BYTE 
    logEW VAR WORD
    sign VAR BIT
    wy VAR WORD
    wz VAR WORD
    wj VAR WORD
    wx VAR WORD
    i VAR BYTE
    ix VAR BYTE
    bt VAR BIT
    
    
    Pause 500
    LCDOut $FE,1,"** SHT 71 **"
    PAUSE 1000
    
    main:
    
    GoSub init
    cmd = cmdtr
    GoSub readsensor
    Temp=result-3995
    GoSub init
    cmd = cmdhr
    GoSub readsensor
    RHlin=(26542-(54722**result+result))**result-40 ' RH linear
    RHtc=655+(result*5)+(result**15917) 
    RHtc=(RHtc**(Temp/10+2480))-(RHtc**2730)+RHlin ' RH temp. compensated
    
    'GoSub dewpoint
    
    LCDOut $FE,$80," ",$DF,"C","   ",$25,"RH","   DP "
    LCDOut $FE,$C0,DEC2 (TEMP/100),".",DEC1 (temp/10)," ",DEC2 RHlin/10,".",DEC1 RHLin'," ",DEC2 ABS DP/10,".",DEC1 ABS dp
    pause 1000
    GoTo main
    
    '** Init Sensor
    init: 
    High dta 
    Low clk 
    For i=1 to 10 
    High clk
    Pause 1 
    Low clk
    Pause 1 
    Next i 
    Call tstart 
    Return 
    
    '** start transfer
    tstart:
    High clk
    Pause 1 
    Low dta 
    Pause 1 
    Low clk
    Pause 1 
    High clk
    Pause 1 
    High dta 
    Pause 1 
    Low clk
    Return 
    
    '** get Data from Sensor
    readsensor:
    GoSub tstart
    GoSub WaitSensor
    
    ShiftOut dta,clk,1,[cmd\8] ' send command
    Input dta ' wait acknowledge 
    Low clk
    While dta=1 
    Wend
    PulsOut clk,10 ' send ack 
    While dta=0 
    Wend
    While dta=1 ' wait for conversion to complete
    Wend 
    Low clk
    ShiftIn dta,clk,0,[result.highbyte\8] ' get first byte
    Low dta 
    PulsOut clk,10 ' send ack 
    ShiftIn dta,clk,0,[result.lowbyte\8] ' get second byte
    Low dta 
    PulsOut clk,10 ' send ack 
    ShiftIn dta,clk,0,[chksum\8] ' get third byte (checksum)
    High dta 
    PulsOut clk,10 ' send ack 
    Input dta ' End of Transmission
    Input clk 
    
    Return
    
    '** Dewpoint Calculation
    ' See: SENSIRION Application Note "Dewpoint Calculation"
    ' logEW = (0.66077+7.5*T/(237.3+T)+(log(RH)-2)
    ' DP = ((0.66077-logEW)*237.3)/(logEW-8.16077)
    
    DewPoint:
    
    TempDP=Temp/10
    logEW=6608
    sign=TempDP.bit15
    wz=ABS TempDP
    wx=(7*wz)+(wz/2) 
    wy=2373+wz
    wj=wx/wy
    For ix=15 to 0 step -1
    wx=(wx//wy)<<1
    wz.bit0(ix)=wx/wy
    Next
    wx=(-sign^((wj*10000)+(wz**10000)))+sign 
    logEW=wx+logEW
    wx=RHtc
    wj=(NCD wx) - 1
    wx=wx<<(15-wj)
    wz=0
    For ix=14 to 0 step -1
    wy=wx**wx
    wz.bit0(ix)=wy.bit15
    bt=~wy.bit15
    wx=(wy<<bt)+(bt &&="" wx.bit15)="">
    Next
    
    wx=((wj*4000)**49321)+(wz**6021)
    logEW=wx+logEW-30000 
    sign=logEW.bit15
    logEW=(-sign^(((ABS logEW)+2)/4))+sign
    wx=1652-logEW
    sign=~wx.bit15
    wx=ABS wx
    wy=20402-logEW
    wj=wx/wy
    
    For ix=15 to 0 step -1
    wx=(wx//wy)<<1
    wz.bit0(ix)=wx/wy
    Next
    
    DP=((23730**wz)+5)/10
    DP=(-sign^DP)+sign
    
    Return
    
    WaitSensor:
    result=4096
    Loop:
    result=result-1
    IF dta && result.bit11 Then Loop
    Return
    End
    </bt)+(bt>
    Last edited by ScaleRobotics; - 5th January 2011 at 04:02. Reason: added code tags

Similar Threads

  1. real time clock
    By maria in forum Code Examples
    Replies: 44
    Last Post: - 1st March 2022, 12:13
  2. real time clock - PCF8583
    By maria in forum mel PIC BASIC Pro
    Replies: 14
    Last Post: - 15th April 2010, 15:41
  3. Real time clock ICs
    By Eng4444 in forum mel PIC BASIC Pro
    Replies: 66
    Last Post: - 20th October 2008, 16:05
  4. Real time clock... what a headache!
    By Eng4444 in forum mel PIC BASIC
    Replies: 2
    Last Post: - 8th June 2006, 21:56
  5. Timer in real time
    By martarse in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 29th July 2005, 14:24

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts