I asked to make corrections and he(or it?) created new code, this time with SWORD type variables
when I asked what kind is SWORD variables is, it answered that these are variables not supported by PBP
After some discussion, it finally generated more "normal" looking code, but this needs PBPL, I never used it, can microcode studio modified to launch PBPL automatically?
Code:' PicBasic Pro Code to Read Pressure, Temperature, and Humidity from BME280 ' Define I2C pins DEFINE I2C_SCL PORTC.3 ' Define SCL pin (use appropriate pin) DEFINE I2C_SDA PORTC.4 ' Define SDA pin (use appropriate pin) ' Define BME280 I2C address Symbol BME280_Address = $EC ' BME280 I2C address (write mode, default 0x76) Symbol BME280_Read = $ED ' BME280 I2C address (read mode) ' Define BME280 registers Symbol BME280_Reg_Control_Hum = $F2 ' Humidity control register Symbol BME280_Reg_Control_Meas = $F4 ' Measurement control register Symbol BME280_Reg_Config = $F5 ' Configuration register Symbol BME280_Reg_Pressure_MSB = $F7 ' Pressure MSB register ' Variables for calibration and raw sensor data dig_T1 VAR WORD dig_P1 VAR WORD dig_H1 VAR BYTE dig_H2 VAR WORD dig_T2 VAR WORD dig_T3 VAR WORD dig_P2 VAR WORD dig_P3 VAR WORD dig_P4 VAR WORD dig_P5 VAR WORD dig_P6 VAR WORD dig_P7 VAR WORD dig_P8 VAR WORD dig_P9 VAR WORD dig_H3 VAR BYTE dig_H4 VAR WORD dig_H5 VAR WORD dig_H6 VAR BYTE adc_T VAR LONG adc_P VAR LONG adc_H VAR WORD t_fine VAR LONG ' Temporary variables for handling read data MSB VAR BYTE LSB VAR BYTE Result VAR WORD data0 VAR BYTE data1 VAR BYTE data2 VAR BYTE data3 VAR BYTE data4 VAR BYTE data5 VAR BYTE data6 VAR BYTE data7 VAR BYTE data8 VAR BYTE ' Subroutine to read an unsigned 16-bit value from a register ReadUInt16: I2CWRITE BME280_Address, [Reg] ' Send register address I2CREAD BME280_Read, [MSB], [LSB] ' Read MSB and LSB Result = (MSB << 8) + LSB ' Combine MSB and LSB into a 16-bit word RETURN ' Subroutine to read a signed 16-bit value from a register ReadInt16: I2CWRITE BME280_Address, [Reg] ' Send register address I2CREAD BME280_Read, [MSB], [LSB] ' Read MSB and LSB Result = (MSB << 8) + LSB ' Combine MSB and LSB into a 16-bit integer ' Handle signed 16-bit conversion IF Result > 32767 THEN Result = Result - 65536 ENDIF RETURN ' Subroutine to read an 8-bit value from a register ReadUInt8: I2CWRITE BME280_Address, [Reg] ' Send register address I2CREAD BME280_Read, [Result] ' Read 8-bit value RETURN ' Subroutine to read calibration data ReadCalibrationData: Reg = $88 : GOSUB ReadUInt16 : dig_T1 = Result Reg = $8A : GOSUB ReadInt16 : dig_T2 = Result Reg = $8C : GOSUB ReadInt16 : dig_T3 = Result Reg = $8E : GOSUB ReadUInt16 : dig_P1 = Result Reg = $90 : GOSUB ReadInt16 : dig_P2 = Result Reg = $92 : GOSUB ReadInt16 : dig_P3 = Result Reg = $94 : GOSUB ReadInt16 : dig_P4 = Result Reg = $96 : GOSUB ReadInt16 : dig_P5 = Result Reg = $98 : GOSUB ReadInt16 : dig_P6 = Result Reg = $9A : GOSUB ReadInt16 : dig_P7 = Result Reg = $9C : GOSUB ReadInt16 : dig_P8 = Result Reg = $9E : GOSUB ReadInt16 : dig_P9 = Result Reg = $A1 : GOSUB ReadUInt8 : dig_H1 = Result Reg = $E1 : GOSUB ReadInt16 : dig_H2 = Result Reg = $E3 : GOSUB ReadUInt8 : dig_H3 = Result Reg = $E4 : GOSUB ReadUInt8 : MSB = Result Reg = $E5 : GOSUB ReadUInt8 : LSB = Result dig_H4 = (MSB << 4) + (LSB & $0F) Reg = $E6 : GOSUB ReadUInt8 : MSB = Result dig_H5 = (MSB << 4) + (LSB >> 4) Reg = $E7 : GOSUB ReadUInt8 : dig_H6 = Result RETURN ' Subroutine to start the BME280 measurement StartMeasurement: I2CWRITE BME280_Address, [BME280_Reg_Control_Hum, $01] ' Set humidity oversampling to x1 I2CWRITE BME280_Address, [BME280_Reg_Control_Meas, $27] ' Set temp and pressure oversampling to x1, mode to normal I2CWRITE BME280_Address, [BME280_Reg_Config, $A0] ' Set standby time to 1000ms RETURN ' Subroutine to read raw data from the sensor ReadRawData: I2CWRITE BME280_Address, [BME280_Reg_Pressure_MSB] ' Set register pointer to pressure MSB I2CREAD BME280_Read, [data0, data1, data2, data3, data4, data5, data6, data7, data8] ' Read 8 bytes of data adc_P = (data0 << 12) + (data1 << 4) + (data2 >> 4) ' Pressure raw adc_T = (data3 << 12) + (data4 << 4) + (data5 >> 4) ' Temperature raw adc_H = (data6 << 8) + data7 ' Humidity raw RETURN ' Subroutine to calculate true temperature CalculateTemperature: var1 = (((adc_T >> 3) - (dig_T1 << 1)) * dig_T2) >> 11 var2 = (((((adc_T >> 4) - dig_T1) * ((adc_T >> 4) - dig_T1)) >> 12) * dig_T3) >> 14 t_fine = var1 + var2 T = (t_fine * 5 + 128) >> 8 RETURN T ' Subroutine to calculate true pressure CalculatePressure: var1 = (t_fine >> 1) - 64000 var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * dig_P6 var2 = var2 + ((var1 * dig_P5) << 1) var2 = (var2 >> 2) + (dig_P4 << 16) var1 = (((dig_P3 * (((var1 >> 2) * (var1 >> 2)) >> 13)) >> 3) + ((dig_P2 * var1) >> 1)) >> 18 var1 = ((32768 + var1) * dig_P1) >> 15 IF var1 = 0 THEN P = 0 ' Avoid division by zero ELSE P = (((1048576 - adc_P) - (var2 >> 12))) * 3125 IF P < $80000000 THEN P = (P << 1) / var1 ELSE P = (P / var1) * 2 ENDIF var1 = (dig_P9 * (((P >> 3) * (P >> 3)) >> 13)) >> 12 var2 = (((P >> 2)) * dig_P8) >> 13 P = P + ((var1 + var2 + dig_P7) >> 4) ENDIF RETURN P ' Subroutine to calculate true humidity CalculateHumidity: H = (t_fine - 76800) H = (((((adc_H << 14) - (dig_H4 << 20) - (dig_H5 * H)) + 16384) >> 15) * (((((((H * dig_H6) >> 10) * (((H * dig_H3) >> 11) + 32768)) >> 10) + 2097152) * dig_H2 + 8192) >> 14)) H = H - (((((H >> 15) * (H >> 15)) >> 7) * dig_H1) >> 4) H = (H < 0) ? 0 : H H = (H > 419430400) ? 419430400 : H RETURN (H >> 12) ' Main program Start: ' Initialize the BME280 sensor GOSUB ReadCalibrationData ' Read calibration coefficients GOSUB StartMeasurement ' Start measurement ' Main loop: read data continuously MainLoop: GOSUB ReadRawData ' Read raw data GOSUB CalculateTemperature ' Calculate true temperature GOSUB CalculatePressure ' Calculate true pressure GOSUB CalculateHumidity ' Calculate true humidity ' Display results (you can modify this to fit your output method) DEBUG "Temperature: ", DEC T, " C", 13, 10 DEBUG "Pressure: ", DEC P, " Pa", 13, 10 DEBUG "Humidity: ", DEC H, " %", 13, 10 PAUSE 1000 ' Wait 1 second before the next reading GOTO MainLoop





Bookmarks