Sonsivri
 
*
Welcome, Guest. Please login or register.
Did you miss your activation email?
November 23, 2024, 02:57:12 14:57


Login with username, password and session length


Pages: [1]
Print
Author Topic: Dallas Ibutton CRC check in picbasic  (Read 6892 times)
0 Members and 1 Guest are viewing this topic.
antico2
Newbie
*
Offline Offline

Posts: 16

Thank You
-Given: 10
-Receive: 2


« on: April 30, 2008, 02:15:42 02:15 »

Does anyone have developed the code to check the CRC of an ibutton connected via one-wire to a pic port ?

I'm studing how to develop it, there's someone who want speak about ?
Logged
ogul
Newbie
*
Offline Offline

Posts: 15

Thank You
-Given: 169
-Receive: 10


« Reply #1 on: May 01, 2008, 10:45:50 10:45 »

 'org. prg:
'http://www.picbasic.co.uk/forum/showthread.php?t=7533
;-------------------------  Port Assignments --------------------------------

;   PORTB.6   DS18B20 - Data Line

;--------------------------- Setup DEFINE;s ----------------------------------

    DEFINE  OSC 4
    DEFINE  ADC_BITS        10      ; Set resolution of conversion
    DEFINE  ADC_CLOCK       8       ; Set clock source (x/FOSC or FRC)
    DEFINE  ADC_SAMPLEUS    50      ; Set sampling time (in uS)
   
;------------------------  Port Initialization -------------------------------

    CCP1CON = %00000000         ; Disable CCP Module
    SSPCON.5 = 0                ; Disable SSP Module
    TXSTA.5 = 0                 ; Disable AUSART Tx
    RCSTA.7 = 0                 ; Disable Serial Port
    ANSEL = %01000000           ; Set analog ports to digital mode except RB7/AN6
    CMCON = %00000111           ; Turn off comparator
    OPTION_REG.6 = 0
    ADCON1 = %10000000   

    TRISA = %100000
    TRISB = %11110101

;----------------------------- Debug Settings ----------------------------------

    cmd                 con     254         ; Control byte
    clr                 con     1           ; Clear the display
    line1               con     128         ; Move cursor to home position on line 1
    line2               con     192         ; Move cursor to home position on line 2
    line3               con     148         ; Move cursor to home position on line 3
    line4               con     212         ; Move cursor to home position on line 4

; ----------------------------- Port Aliases ---------------------------------

    DSDataPin           var     portb.6
   
;---------------------- Miscellaneous Variables ------------------------------

    i                   var     byte            ; Loop counter
    x                   var     word            ; Variable for calculations
    DataBit             var     bit             ; Bit shift variable
    dummy               var     word            ; Dummy variable for DIV32 function
    DataByte            var     byte            ; Byte to perform CRC calculation on
    DQ                  var     byte[9]         ; 9 Byte Arrray for DS18B20 data
    CRCCalc             var     byte            ; Calculated CRC value
    NegBit              var     rawtemp.Bit11   ; +/- indicator: 1 = < 0ºC
    RawTemp             var     word            ; Raw Temperature
    SignC               var     byte            ; +/- Sign for celcius temperature
    SignF               var     byte            ; +/- Sign for fahrenheit temperature
    TempC               var     word            ; Temperature in ºC
    TempF               var     word            ; Temperature in ºF
    TempK               var     word            ; Temperature in Kelvin
    CRCError            var     byte            ; Temperature Sensor CRC Error Flag

;--------------------------- Main Program Loop -------------------------------

main:
    gosub ReadDS18B20
    lcdout cmd,line1,SignC,dec3 TempC/100,".",dec2 TempC//100,223,"C"
    lcdout cmd,line2,SignF,dec3 TempF/100,".",dec2 TempF//100,223,"F"
    lcdout cmd,line3," ",dec3 TempK/100,".",dec2 TempK//100," K"
    goto main

;---------------------------- Read DS18B20 Sensor ------------------------------

ReadDS18B20:
    owout DSDataPin,1,[$CC,$44]     ; Tell sensor to start a temperature conversion
    owout DSDataPin,1,[$CC,$BE]     ; Tell sensor you want to read the temperature
    owin DSDataPin,0,[STR DQ\9]     ; Receive temperature from the sensor
    RawTemp.Byte0 = DQ[0]           ; Extract the temperature portion and put it in its one word variable
    RawTemp.Byte1 = DQ[1]                     
    gosub GetCRC                    ; Calculate the CRC for comparison
    gosub ConvertCelcius            ; Convert temperature to ºC
    gosub ConvertToFahrenheit       ; Convert temperature to ºF
    gosub ConvertToKelvin           ; Convert temperature to K
    return

;------------------------ Calculate the CRC from Byte 9 ------------------------

GetCRC:
    for x = 0 to 7                  ; Get CRC for each of the 8 bytes
    DataByte = DQ
  •                 ; Assign array pointer using value of x
    gosub CalcCRC                   ; Get CRC value
    next x                          ; Repeat until all bytes are done
    if DQ[8] <> CRCCalc then        ; Do the CRC values match?
        CRCError = 1                ; Set flag indicating a problem with this sensor
        else                       
        CRCError = 0                ; Set flag indicating no problem with this sensor
    endif                           
    CRCCalc = 0                     ; Reset CRC calculation variable
    return

;--------------------- CRC Bit Calcuation Method -------------------------------

CalcCRC:
    for i = 0 to 7                     ; Do for all 8 bits in DataByte
     DataBit = CRCCalc.0 ^ DataByte.0  ; XOR bit0 of DataByte and CRC
     DataByte = DataByte >> 1          ; Position DataByte for next bit test
     if DataBit = 0 then Shift         ; If test bit not set, just shift CRCCalc
     CRCCalc = CRCCalc ^ $18           ; If set, account for EXOR feedback

shift:
     CRCCalc = CRCCalc >> 1            ; Shift right the CRCCalc byte
     CRCCalc.7 = DataBit               ; CRC bit 0 to bit bucket
    next i                             ; Data bit rotates into CRC bit 7
    return

;--------------------------- Convert to Celcius --------------------------------

ConvertToCelcius:
    if negbit = 1 then
        SignC = "-"
        else
        SignC = "+"
    endif
    if SignC = "-" then
        dummy = 0
        RawTemp.Byte0 = RawTemp.Byte0 ^ 255
        RawTemp.Byte1 = RawTemp.Byte1 ^ 255
        dummy = 625 * RawTemp + 1
          TempC = DIV32 100
          else
        dummy = 625 * RawTemp
        TempC = DIV32 100
    endif
    return
   
;------------------------ Convert to Fahrenhiet --------------------------------

ConvertToFahrenheit:
    if SignC = "+" then
        SignF = "+"
        dummy = TempC * 18
        TempF = div32 10
        TempF = TempF + 3200
        else
        TempF = (tempc + 5000) * 900
        TempF = DIV32 500
        if TempC => 1778 and SignC = "-" then
            TempF = TempF - 12200
            SignF = "-"
            else            
            TempF = 12200 - TempF
            SignF = "+"
       endif   
    endif
   return

;-------------------------- Convert to Kelvin ----------------------------------

ConvertToKelvin:
   if SignC = "-" then
       TempK = 27315 - TempC
        else
       TempK = tempC + 27315
     endif
     return
Logged
Pages: [1]
Print
Jump to:  


DISCLAIMER
WE DONT HOST ANY ILLEGAL FILES ON THE SERVER
USE CONTACT US TO REPORT ILLEGAL FILES
ADMINISTRATORS CANNOT BE HELD RESPONSIBLE FOR USERS POSTS AND LINKS

... Copyright © 2003-2999 Sonsivri.to ...
Powered by SMF 1.1.18 | SMF © 2006-2009, Simple Machines LLC | HarzeM Dilber MC