Code:
	'******************************************************************************
'MR.SNEEZY - test code for FrSky using Bosch BMP085 baro sensor.
'This version is for PIC 18F1220  
'
'ADD/Do
'
'NOTES - 
'
'LAST ACTION - scratch my head...
'
'PIC 18F1220 port/pin alocations
'-------------------------------
'PortA.0/Pin 1 = Serial TX
'PortA.1/Pin 2 = LED
'PortB.0/Pin 8 = I2C SCL clock
'PortB.1/Pin 9 = I2C SDA data
'-----------------------
' PIC Defines
' ===========
 'Config bits 
'Config1H register
@ CONFIG OSC=INTIO2
    ' Oscillator switch OFF
    ' 
'Config2L register
@ CONFIG BOR=ON, PWRT=ON, BORV=27
    ' Brown out reset ON @ 2.7Volts
    ' Power-up timer ON
    '
'Config2H register
@ CONFIG WDT=ON
    ' Watch dog timer ON
    '
'Config3H register
@ CONFIG MCLRE=OFF
    'Reset pin disabled    
    '
'Config4L register
@ CONFIG STVR=ON, LVP=OFF, DEBUG=OFF
    ' Stack over/underflow ON
    ' Low Voltage programming OFF
    ' Background debugger OFF 
    
'    Include "modedefs.bas"          ' Include serial modes
'   DEFINE OSC 8 '8Mhz clock used. Note - Set PIC config fuses on programmer to use Internal RC OSC
' Define some constants if needed
        
' Software Defines (variables and pins)
    Cal_table   var word[11]         '11 word array to store calibration data
    lUpres      var long 
    lTemp_Var   var Long
    Temp_Var    var byte             'temp variable 
    Temp_Var2   var Word	         'temp variable
    Temp_Var3   var word             'temp variable
    UTemp       var word             'uncompensated temp reading
    UPres       var word             'uncompensated pressure reading
    i2c_Reg     var Byte             'variable for target i2c register address
    CPIN        var     PortB.0       ' I2C clock pin 
    DPIN        var     PortB.1       ' I2C data pin
    SO          Var     PortA.0        'Serial out pin
    LED         var     PortA.1        'Indicator LED, via 500ohm to +3.3V
    
'Alias's for calibration data in the sensor to match the Bosch parameter list names
    AC1     var     Cal_table[0]      '
    AC2     var     Cal_table[1]     'BMP085 has 11 16bit values stored in EEPROM
    AC3     var     Cal_table[2]     'First byte is at $AA last at $BF, two bytes per cal value
    AC4     var     Cal_table[3]     'Lowbyte is MSB (e.g $AA), Highbyte is LSB (e.g. $AB)
    AC5     var     Cal_table[4]     'some values are signed (not AC4, AC5, AC6)
    AC6     var     Cal_table[5]    
    B1      var     Cal_table[6]
    B2      var     Cal_table[7]
    MB      var     Cal_table[8]
    MC      var     Cal_table[9]    
    MD      var     Cal_table[10]    
    
' Initialise Processor - check for each PIC type 
' --------------------
    ADCON1 = %11111111              'Turn off all AD's     
    OSCCON = OSCCON | %01100000     'set INTRC to 4 MHZ
'    OSCCON = OSCCON | %01110000     'set INTRC to 8 MHZ
'    OSCTUNE = 0                      'OSC trim set to Null
    
' Set initial state of port pins as Input or Output
    TRISA = %11111100    'Input(0 = output, 1 = Input)
    TRISB = %11111100    '
    
' PIC initialization code
        Low So      'Must start low, or you get rubbish on the LCD at PIC boot up.
        Low LED     'LED on
        pause 5000  'led on for x seconds
        High LED    'LED off
        
        Serout2 SO,16780,[$FE,$01]               ' Clear LCD & home LCD cursor.
        pause 10                                ' wait for LCD to catch up
        Serout2 SO,16780,["   FrSky Vario    "]  ' Serial print 
        Serout2 SO,16780,[$FE,$C0]               ' Shift cursor to line2
        Serout2 SO,16780,[" Development Jig  "]  ' Serial print 
        Pause 3000                               'wait three seconds
        
        i2c_Reg =$AA                            'Start address of the BMP085 calibration data
        I2CREAD DPIN,CPIN,$EF,I2C_REG,[STR Cal_table\11],cal_error  'Read 11 reversed words out of sensor
        AC1 = (AC1.lowbyte<<8) + AC1.highbyte   'swap MSB and LSB of each to use in PBP (un-reverse then)    
        AC2 = (AC2.lowbyte<<8) + AC2.highbyte   'device stores the MSB in the Low byte, LSB in the High byte
        AC3 = (AC3.lowbyte<<8) + AC3.highbyte   
        AC4 = (AC4.lowbyte<<8) + AC4.highbyte          
        AC5 = (AC5.lowbyte<<8) + AC5.highbyte
        AC6 = (AC6.lowbyte<<8) + AC6.highbyte
        B1 = (B1.lowbyte<<8) + B1.highbyte
        B2 = (B2.lowbyte<<8) + B2.highbyte
        MB = (MB.lowbyte<<8) + MB.highbyte
        MC = (MC.lowbyte<<8) + MC.highbyte
        MD = (MD.lowbyte<<8) + MD.highbyte 
                               
        Serout2 SO,16780,[$FE,$01]             ' Clear LCD & home LCD cursor. 
        Pause 10                              ' wait for LCD to catch up
'Main loop -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Main:  
        Serout2 SO,16780,[$FE,$02]             'home LCD cursor.                           
         
        Gosub Read_temp
        lTemp_var = 0
        For Temp_var = 0 to 9
        Gosub Read_pres
        lTemp_var = ltemp_var + lUpres
        Next Temp_var
        lUpres = lTemp_Var / 10
        
        Serout2 SO,16780,["UT=",DEC utemp," "]       'Send Word size number to LCD
        Serout2 SO,16780,["UP=",DEC lupres," "]      'Send Word size number to LCD
                
'lets see whats in the cal data array for a checking math in Excel - Rem out Utemp and lUpres above 
'        Serout2 SO,16780,[$FE,$2]               ' Shift cursor to line_1 (128+addr) Note-Rem out Utemp and lUpres above
'        Serout2 SO,16780,[SDEC AC1," ",SDEC AC2," ",SDEC AC3]   'display three signed cal values
        Serout2 SO,16780,[$FE,$C0]               ' Shift cursor to line_2
        Serout2 SO,16780,[DEC AC4," ",DEC AC5," ",DEC AC6]   'display three unsigned cal values
        Serout2 SO,16780,[$FE,$94]               ' Shift cursor to line_3  
        Serout2 SO,16780,[SDEC B1," ",SDEC B2]   'display two signed cal values
        Serout2 SO,16780,[$FE,$D4]               ' Shift cursor to line_4          
        Serout2 SO,16780,[SDEC MB," ",SDEC MC," ",SDEC MD]  'display three signed cal values
 '        pause 100
        Toggle LED
        Goto main
        
'SUBROUTINES -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-      
Read_pres:
        i2c_Reg = $F4                         '$F4 is the control register address
        I2CWRITE DPIN,CPIN,$EE,I2C_REG,[$F4]  ' Write $34+(oss << 6) to set pressure conversion 
        Pause 30                              ' Delay 10ms after each write (30mS for HiRes results (oss=3))
        i2c_Reg = $F6                         '$F6 is the result register MSB
        I2CREAD DPIN,CPIN,$EF,I2C_REG,[lUpres],I2C_error  'Read pressure MSB, LSB, XLSB, $F9(not needed).
        lUpres = lUpres >> 13                 'remove result from $F9 (>>8) + left shift result back to 19bits (>>5)
                                              'it's because PBP reads four bytes if [Var] is a long...
        return                                'we only want top 19bits of the result.
              
Read_temp:
        i2c_Reg = $F4                         '$F4 is the control register address
        I2CWRITE DPIN,CPIN,$EE,I2C_REG,[$2E]  ' Write $2E to set temperature conversion 
        Pause 10                              ' Delay 10ms after each write
        i2c_Reg = $F6                         '$F6 is the result register MSB
        I2CREAD DPIN,CPIN,$EF,I2C_REG,[Utemp],I2C_error  'Read temperature MSB, LSB.
        return
        
I2C_error:
        Serout2 SO,16780,[$FE,$01]             ' Clear LCD & home LCD cursor. 
        Pause 10                              ' wait for LCD to catch up
        Serout2 SO,16780,["i2c bus read error"]       '        
        pause 2000        
        Toggle LED
        Goto main
         
Cal_error:
        Serout2 SO,16780,[$FE,$01]             ' Clear LCD & home LCD cursor. 
        Pause 10 
        Serout2 SO,16780,["i2c cal read error "]       '        
        
End
  
Bookmarks