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