Code:
'PIC 18F1220 port/pin allocations
'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
'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
' -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
'Config Directive settings for MPASM (fuses)
@ __CONFIG _CONFIG1H, _IESO_OFF_1H & _FSCM_OFF_1H & _INTIO2_OSC_1H
@ __CONFIG _CONFIG2L, _PWRT_ON_2L & _BOR_ON_2L & _BORV_27_2L
@ __CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_32K_2H
@ __CONFIG _CONFIG3H, _MCLRE_OFF_3H
@ __CONFIG _CONFIG4L, _DEBUG_OFF_4L & _LVP_OFF_4L & _STVR_OFF_4L
@ __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L
@ __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
@ __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L
@ __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
@ __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L
@ __CONFIG _CONFIG7H, _EBTRB_OFF_7H
DEFINE OSC 8 '8Mhz clock used.
' 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 'Long variable for Uncompensated Pressure
lTemp_Var var Long 'Long temporary variable
Temp_Var var byte 'Byte temp variable
Temp_Var2 var Word 'Word temp variable
Temp_Var3 var word '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]
' Initialize Processor - check for each PIC type
' -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
ADCON1 = %11111111 'Turn off all AD's
' OSCCON = %01100111 'set INTRC to 4 MHZ
OSCCON = %01110111 'set INTRC to 8 MHZ
' OSCTUNE = 0 'OSC trim set to Null
' Include "modedefs.bas" ' Include serial modes
' 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, not cleared.
Gosub Read_temp 'get Temp via I2C
lTemp_var = 0 'Clear the last pressure reading
For Temp_var = 0 to 9 'start of 10x averaging routine
Gosub Read_pres 'get Long uncompensated pressure via I2C
lTemp_var = ltemp_var + lUpres
Next Temp_var
lUpres = lTemp_Var / 10 'finish of 10x Averaging routine
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 'flash the 'im alive' 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
'trap and display I2C problems
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"] 'no ACK from I2C device
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
Now I have to convert this code below to PBPL and get a 'compensated' reading of the temperature and pressure.... Quite a few intermediate variables are needed.
Bookmarks