BMP280 Sensör Kullanımı

Başlatan Elektronikprojem, 24 Mayıs 2021, 08:28:39

Elektronikprojem

Merhaba,
BMP280 sensörle ilgili çalışma yapacağım fakat tam anlayamadım. Bu konu hakkında bilgisi olan var mı?
Picbasic, proton veya diğer derleyicilerde örnek kodu olan varsa paylaşırsa çok sevinirim.
Hepinize iyi günler diliyorum.


ete

Data sheet2e bir göz attım da epeyce karmaşık geldi bana öyle bir seferde okunup anlaşılacak bir sensör değil maalesef. Basic de örnek kod ben bulamadım Naci Bulmuş. Beklenildiği şekilde Arduino için bir sürü kütüpane mevcut. Aşağıda link veriyorum. Youtube videolarda mevcut. Nasıl faydalanırsın bilmem.

https://www.arduinolibraries.info/libraries/adafruit-bmp280-library

Aşağıdaki linkte de hembağlantı hemde kütüphane kullanımı konusunda epeyce bilgi verilmiş. Okumanda yarar var sanırım.

https://simple-circuit.com/arduino-bmp280-sensor-lcd/

Ete

Elektronikprojem

@dnaci  teşekkürler.

@ete hocam 64 bit değişkenlerden bahsedilince kafam karıştı açıkcası. Basic formunda bir kod buldum ama mantığı anlayamadım. Kodu da çalıştıramadım.

ete

bulduğun kodu koy buraya bakalım.

Ete

Elektronikprojem

Kodlar aşağıdadır.
'********************************************************************
'*  Name    : BME280-Demo.pbp                                       *
'*  Author  : Henrik Olsson                                         *
'*  Notice  : Copyright (c) 2020 Henrik Olsson                      *
'*          : All Rights Reserved                                   *
'*  Date    : 2020-10-13                                            *
'*  Version : 1.0                                                   *
'*  Notes   : This program shows how to use the BME280.pbp include  *
'*          : file to read (via SPI) and display values from the    *
'*          : BME280 sensor.                                        *
'********************************************************************

' [1] As always you need to configure and setup your particular device.
' I'm doing that in a separate file for my particular development board.
INCLUDE "HWConfig.pbp"

' [2] The BME280.pbp file expects aliases for the following:  
BME280_CS   VAR LATH.2              ' Chip select  (output)
BME280_CLK  VAR PORTC.3             ' Clock pin    (output)
BME280_MISO VAR PORTC.4             ' PIC Data In  (input)
BME280_MOSI VAR PORTC.5             ' PIC Data Out (output)

' [3] Then we're ready to include the BME280.pbp file.
INCLUDE "BME280.pbp"

' [4] Configure the BME280 sensor.
' See section 5.4.3 in the datasheet.
BME280_Reg = $F2                    ' Control humidity register
BME280_Data = %00000011             ' 4x oversampling for humidity
GOSUB BME280_Write

' See section 5.4.5 in the datasheet
BME280_Reg = $F4                    ' Control register
BME280_Data = %01101111             ' 4x oversampling for temp and pressure, normal mode
GOSUB BME280_Write

' See section 5.4.6 in the datasheet
BME280_Reg = $F5                    ' Config register
BME280_Data = %11101000             ' 20ms standby time, IIR coefficient 4, 4 wire SPI
GOSUB BME280_Write

' Read in all the compensation/calibration coefficients from the sensor.
GOSUB BME280_GetTrimValues

'---------------------------------------------------------------------------------
Main:
    GOSUB BME280_GetRawValues
    GOSUB BME280_CompensateValues
    
    ' At this point variables Temperature, Pressure and Humidity contains the properly compensated
    ' values and can, for example, be displayed as follows.
    HSEROUT2[SDEC Temperature/100,".", DEC Temperature//100, "°C ", DEC Pressure/100, ".",_
              DEC Pressure//100, "hPa ", DEC Humidity/1000, ".", DEC Humidity //1000, "%RH",13]    
    
    PAUSE 1000
Goto Main

http://www.picbasic.co.uk/forum/content.php?r=558-BME280-Example

ete

#6
Öncelikle senin sensör BMP280, örnek kod ise BME280 sensöre ait. Benzermidir değilmidir bilmiyorum ama her iki üründe BOSCH üretimi olarak piyasada mevcut.

Dikkat edersen iki adet include dosyası var bunları programın olduğu klasöre eklemen gerekir. Birincisi yani HWConfig dosyası onu tüklemen gerekmez kendi işlemcine ait configleri programın başına koy yeterli.
Diğer dosya BMP280.pbp önemli. Onu kesinlikle vermen gerek. Açık şekilde yazmışlar bu dosyayıda yada sanırım zip dosyasında mevcut.
Aslında kendi şemanı koyarsan ona uygun düzenlemeleri belki yapabilirim.
Ete

Elektronikprojem

#7
Ete hocam diğer dosyada denemeler yaptım ama şu anda elimde 16f628a var. Bu günlerde de bulunduğum yerden dolayı yeni bir denetleyici siparişi veremiyorum. BMP280 dosyasının içerisinde long türü değişken olduğu için 16f serisinde kullanamıyorum. Bu sebeple sanki bu iş basicle biraz zor olacak gibi. Araştırdığım kadarıyla BME280 ile BMP280 aynı şey.Bahsedilen kütüphane içeriği;

'****************************************************************************
'*  Name    : BME280.pbp                                                    *
'*  Author  : Henrik Olsson                                                 *
'*  Notice  : Copyright (c) 2020 Henrik Olsson                              *
'*          : All Rights Reserved                                           *
'*  Date    : 2020-10-13                                                    *
'*  Version : 1.0                                                           *
'*  Notes   : This is an include file containing routines to read (via SPI) *
'*            temperature, pressure and humidity from the BME280 Digital    *
'*            humidity, pressure and temperature sensor from BOSCH.         *
'*                                                                          *
'*          : Uses 107 bytes of RAM and roughly 6.5kB of FLASH.               *
'*                                                                          *
'*  History:  v1.0 - 2020-10-13                                             *
'*            Initial version                                               *
'****************************************************************************

' Code expects some aliases to be defined BEFORE including this file, namely:
' BME280_CS   VAR LATH.2
' BME280_CLK  VAR PORTC.3
' BME280_MISO VAR PORTC.4
' BME280_MOSI VAR PORTC.5
'
' Then you can include this file:
' INCLUDE "BME280.pbp"


adc_T           VAR LONG                ' Raw temperature value as read from sensor.
adc_P           VAR LONG                ' Raw pressure value as read from sensor.
adc_H           VAR WORD                ' Raw humidity value as read from sensor.

Temperature     VAR LONG                ' Final temperature value in units of 0.01 degrees C.
Pressure        VAR LONG                ' Final pressure value in units of 1Pa.
Humidity        VAR LONG                ' Final humidity value in units of 0.001%.

' Compensation / trimming parameters to be read from the BME280.
' Datatypes listed as comments are how they are defined in the datasheet.
dig_T1          VAR WORD                ' Unsigned short
dig_T2          VAR LONG                ' Signed short, we cast to LONG when read.
dig_T3          VAR LONG                ' Signed short, we cast to LONG when read.

dig_P1          VAR WORD                ' Unsigned short.
dig_P2          VAR LONG                ' Signed short, we cast to LONG when read.
dig_P3          VAR LONG                ' Signed short, we cast to LONG when read.
dig_P4          VAR LONG                ' Signed short, we cast to LONG when read.
dig_P5          VAR LONG                ' Signed short, we cast to LONG when read.
dig_P6          VAR LONG                ' Signed short, we cast to LONG when read.
dig_P7          VAR LONG                ' Signed short, we cast to LONG when read.
dig_P8          VAR LONG                ' Signed short, we cast to LONG when read.
dig_P9          VAR LONG                ' Signed short, we cast to LONG when read.

dig_H1          VAR BYTE                ' Unsigned char.
dig_H2          VAR LONG                ' Signed short, we cast to LONG when read.
dig_H3          VAR BYTE                ' Unsigned char.
dig_H4          VAR WORD                ' Signed short, we cast to LONG when read.
dig_H5          VAR WORD                ' Signed short, we cast to LONG when read.
dig_H6          VAR LONG                ' Signed char, we cast to LONG when read.

' These variables are used in all three compensation routines and needs to be included all the time.
var1            VAR LONG
var2            VAR LONG

' These are not needed if humidity is not going to be used.
var3            VAR LONG
var4            VAR LONG
var5            VAR LONG

' This is used in all three compensation routines
t_fine          VAR LONG

BME280_Reg      VAR BYTE
BME280_Data     VAR BYTE

tmp_B           VAR BYTE                ' Temporary variable.


' Actual code below this point, jump over as to not execute unless specifically called.
GOTO OverBME280

'----------------------------------------------------------------------------------------------------------------------
BME280_Read:
    ' Basic read function.
    ' Set BME280_Reg to whatever address you want to read.
    ' Data at that address will be returned in BME280_Data 
    BME280_Reg.7 = 0 
    BME280_CS = 0
    SHIFTOUT BME280_MOSI, BME280_CLK, 5, [128 + BME280_Reg]
    SHIFTIN  BME280_MISO, BME280_CLK, 6, [BME280_Data]
    BME280_CS = 1
RETURN
'----------------------------------------------------------------------------------------------------------------------

'----------------------------------------------------------------------------------------------------------------------
BME280_Write:
    ' Basic write function.
    ' Set BME280_Reg to whatever address you want to write and
    ' BME280_Data to whatever value you want to write to that address.
    BME280_REg.7 = 0
    BME280_CS = 0
    SHIFTOUT BME280_MOSI, BME280_CLK, 5, [BME280_Reg, BME280_Data]
    BME280_CS = 1
RETURN
'----------------------------------------------------------------------------------------------------------------------

'----------------------------------------------------------------------------------------------------------------------
BME280_Reset:
    ' This will perform a reset of the device, same as power on (according to datasheet).
    BME280_Reg = $E0
    BME280_Data = $B6
    GOSUB BME280_Write
RETURN
'----------------------------------------------------------------------------------------------------------------------

'----------------------------------------------------------------------------------------------------------------------
BME280_CompensateValues:
' The execution time for compensating all three values are measured
' to around 2190us with the PIC running at 64MHz

'------------------------------------------------------------------
' Optimized Temperature conversion, verified to work with negative temperatures
' Execution time at 64MHz is around 300us
'------------------------------------------------------------------
    var1 = (((adc_T >> 3) - (dig_T1 << 1)) * dig_T2) / 2048
    var2 =  (((( (adc_T >> 4) - dig_T1) * ((adc_T >> 4) - dig_T1)) / 4096) * dig_T3) / 16384
    t_fine = var1 + var2
    Temperature = (t_fine * 5 + 128) / 256

'------------------------------------------------------------------
'------------ Pressure compensation, working version --------------
'------------------------------------------------------------------
    ' Execution time at 64MHz is around 1230us
    var1 = (t_fine / 2) - 64000
    var2 = (((var1 / 4) * (var1 / 4)) / 2048) * dig_P6
    var2 = var2 + (var1 * dig_P5 * 2)
    var2 = (var2 / 4) + (dig_P4 * 65536)
    var1 =((dig_P3 * ((var1 / 4) * var1 / 4) / 8192) / 8) +  ((dig_P2 * var1) / 2)
    var1 = var1 / 262144
    var1 = ((32768 + var1) * dig_P1) / 32768
    
    IF var1 = 0 THEN
        Pressure = 0
        RETURN
    ENDIF
    
    Pressure = ABS((1048576 - adc_P) - (var2 / 4096)) * 3125
    
    IF Pressure < $80000000 THEN
      Pressure = (Pressure / 2) / (ABS(var1))
    ELSE
      Pressure = (Pressure / ABS(var1)) * 2
    ENDIF
    
    var1 = (dig_P9 * ( (Pressure >> 3) * (Pressure >> 3) / 8192)) / 4096
    var2 = ((Pressure >> 2) * dig_P8) / 8192
    
    Pressure = Pressure + ((var1 + var2 + dig_P7) / 16)

'------------------------------------------------------------------
'----------- Humidity compensation, working version ---------------
'------------------------------------------------------------------
    ' Execution time at 64MHz is around 660us
    var1 = t_fine - 76800   
    var2 = adc_H << 14                                  ' adc_H is unsigned so we can use left shift instead of dived here
    var3 = dig_H4 * 1048576
    var4 = dig_H5 *  var1
    var5 = (((var2 - var3) - var4) + 16384) / 32768
    var2 = (var1 * dig_H6) / 1024
    var3 = (var1 * dig_H3) / 2048
    var4 = ((var2 * (var3 + 32768)) / 1024) + 2097152
    var2 = ((var4 * dig_H2) + 8192) / 16384
    var3 = var5 * var2
    var4 = ((var3 / 32768) * (var3 / 32768)) / 128
    var5 = var3 - ((var4 * dig_H1) / 16)
    
    IF Var5 < 0 THEN
      var5 = 0
    ENDIF
    
    IF var5 > 419430400 THEN
      var5 = 419430400
    ENDIF
    
    Humidity = var5 >> 12
    
    IF Humidity > 102400 THEN
      Humidity = 102400
    ENDIF

RETURN
'----------------------------------------------------------------------------------------------------------------------


'----------------------------------------------------------------------------------------------------------------------
BME280_GetRawValues:
    
    ' Make sure we don't have any "residue" in the highest significant byte of the variables
    ' since we're only shifting in 24 bits. adc_H is 16bits and we're shifting in 16bits so
    ' no need for any special attention there.
    adc_P.BYTE3 = 0
    adc_T.BYTE3 = 0
    
    BME280_Reg = $F7
    BME280_Reg.7 = 0 
    BME280_CS = 0
       
    SHIFTOUT BME280_MOSI, BME280_CLK, 5, [128 + BME280_Reg]
    SHIFTIN BME280_MISO, BME280_CLK, 6, [adc_P.BYTE2, adc_P.BYTE1, adc_P.BYTE0, adc_T.BYTE2, adc_T.BYTE1, adc_T.BYTE0, adc_H.BYTE1, adc_H.BYTE0]

    BME280_CS = 1

    ' Temperature and pressure are left justified, needs to be shifted right four places.
    adc_P = adc_P >> 4
    adc_T = adc_T >> 4

RETURN
'----------------------------------------------------------------------------------------------------------------------

      
'----------------------------------------------------------------------------------------------------------------------
BME280_GetTrimValues:
    ' This routines reads the trim/compensation constants from the sensor.
    ' For some reason there's a gap in the memory map, first group of data are between 0x88 and 0xA1 (with 0xA0 skipped).
    ' and second group is from 0xE1 and 0xE7 with digits H4 and H5 spanning three bytes
    ' Since these values never change for the specific sensor it would be possible to
    ' read these once and hardcode them into their respective variables, or even better in
    ' that case, change the variables to constants.
    ' Most values (but not all) are 16bit signed as they are read from the sensor.
    ' But PBP does not do signed arithmetic on 16bit variables so we're storing them in LONGs.
    ' But for that to work properly we need "move" the sign bit (if the value) is negative.
        
    dig_T1 = 0 : dig_T2 = 0 : dig_T3 = 0
    dig_P1 = 0 : dig_P2 = 0 : dig_P3 = 0
    dig_P4 = 0 : dig_P5 = 0 : dig_P6 = 0
    dig_P7 = 0 : dig_P8 = 0 : dig_P9 = 0
    dig_H1 = 0 : dig_H2 = 0 : dig_H3 = 0
    dig_H4 = 0 : dig_H5 = 0 : dig_H6 = 0
    
    ' Read 0x88 thru 0xA1. 0xA0 is not in use so dump that in tmp_B
    BME280_Reg = $88
    BME280_Reg.7 = 0 
    BME280_CS = 0

    SHIFTOUT BME280_MOSI, BME280_CLK, 5, [128 + BME280_Reg]
    SHIFTIN BME280_MISO, BME280_CLK, 6, [dig_T1.BYTE0, dig_T1.BYTE1, dig_T2.BYTE0, dig_T2.BYTE1, dig_T3.BYTE0, dig_T3.BYTE1,_
                                         dig_P1.BYTE0, dig_P1.BYTE1, dig_P2.BYTE0, dig_P2.BYTE1, dig_P3.BYTE0, dig_P3.BYTE1,_
                                         dig_P4.BYTE0, dig_P4.BYTE1, dig_P5.BYTE0, dig_P5.BYTE1, dig_P6.BYTE0, dig_P6.BYTE1,_
                                         dig_P7.BYTE0, dig_P7.BYTE1, dig_P8.BYTE0, dig_P8.BYTE1, dig_P9.BYTE0, dig_P9.BYTE1,_
                                         tmp_B, dig_H1]
    
    IF dig_T2.15 = 1 THEN
        dig_T2 = -ABS(dig_T2.LOWWORD)
    ENDIF

    IF dig_T3.15 = 1 THEN
        dig_T3 = -ABS(dig_T3.LOWWORD)
    ENDIF
   
    IF dig_P2.15 = 1 THEN
        dig_P2 = -ABS(dig_P2.LOWWORD)
    ENDIF
    
    IF dig_P3.15 = 1 THEN
        dig_P3 = -ABS(dig_P3.LOWWORD)
    ENDIF

    IF dig_P4.15 = 1 THEN
        dig_P4 = -ABS(dig_P4.LOWWORD)
    ENDIF
    
    IF dig_P5.15 = 1 THEN
        dig_P5 = -ABS(dig_P5.LOWWORD)
    ENDIF
    
    IF dig_P6.15 = 1 THEN
        dig_P6 = -ABS(dig_P6.LOWWORD)
    ENDIF
    
    IF dig_P7.15 = 1 THEN
        dig_P7 = -ABS(dig_P7.LOWWORD)
    ENDIF
    
    IF dig_P8.15 = 1 THEN
        dig_P8 = -ABS(dig_P8.LOWWORD)
    ENDIF
    
    IF dig_P9.15 = 1 THEN
        dig_P9 = -ABS(dig_P9.LOWWORD)
    ENDIF
       
    BME280_CS = 1

    BME280_Reg = $E1
    BME280_Reg.7 = 0 
    BME280_CS = 0
    SHIFTOUT BME280_MOSI, BME280_CLK, 5, [128 + BME280_Reg]
    SHIFTIN BME280_MISO, BME280_CLK, 6, [dig_H2.BYTE0, dig_H2.BYTE1, dig_H3, dig_H4.BYTE0, tmp_B, dig_H5.BYTE0, dig_H6]
    
    IF dig_H2.15 = 1 THEN
        dig_H2 = -ABS(dig_H2.LOWWORD)
    ENDIF
    
    dig_H4 = dig_H4 << 4
    dig_H5 = dig_H5 << 4                                           ' Make room for lower 4 bits
    dig_H4 = dig_H4 + (tmp_B & %00001111)                          ' Extract lower 4 bits of dig_H4
    
    tmp_B = tmp_B >> 4                                             ' Extract lower 4 bits of dig_H5
    dig_H5 = dig_H5 + (tmp_B & %00001111)

    BME280_CS = 1    
RETURN


'***********************************************************************************************************************
'********* Optional debug code below this point. Will get included with #DEFINE BME280_DEBUG
'***********************************************************************************************************************
#IFDEF BME280_DEBUG

Testcase:
    adc_T = 530386 : adc_P = 345501 : adc_h = 28680
    GOSUB BME280_CompensateValues : GOSUB PrintValues
    
    adc_T = 486770 : adc_P = 330198 : adc_h = 35867
    GOSUB BME280_CompensateValues : GOSUB PrintValues
    
    adc_t = 468750 : adc_p = 324532 : adc_h = 27951
    GOSUB BME280_CompensateValues : GOSUB PrintValues
    
    adc_t = 455100 : adc_p = 320161 : adc_h = 29389
    GOSUB BME280_CompensateValues : GOSUB PrintValues
    
    adc_t = 438939 : adc_p = 314970 : adc_h = 31164
    GOSUB BME280_CompensateValues : GOSUB PrintValues
    
    adc_t = 427235 : adc_p = 311954 : adc_h = 38152
    GOSUB BME280_CompensateValues : GOSUB PrintValues
    
    adc_t = 410521 : adc_p = 290230 : adc_h = 22123
    GOSUB BME280_CompensateValues : GOSUB PrintValues
    
    adc_t = 380734 : adc_p = 414855 : adc_h = 32123
    GOSUB BME280_CompensateValues : GOSUB PrintValues
RETURN

PrintValues:
    HSEROUT2[DEC i, ": ", "Temp: ", SDEC Temperature, "   P: ", SDEC Pressure, "  RH: " , DEC Humidity, "   t_fine: ", SDEC t_fine, 13]
RETURN


PrintTrimValues:
    HSEROUT2["dig_T1: ",  DEC dig_T1, 13]
    HSEROUT2["dig_T2: ", SDEC dig_T2, 13]
    HSEROUT2["dig_T3: ", SDEC dig_T3, 13]
    
    HSEROUT2["dig_P1: ",  DEC dig_P1, 13]
    HSEROUT2["dig_P2: ", SDEC dig_P2, 13]
    HSEROUT2["dig_P3: ", SDEC dig_P3, 13]
    HSEROUT2["dig_P4: ", SDEC dig_P4, 13]
    HSEROUT2["dig_P5: ", SDEC dig_P5, 13]
    HSEROUT2["dig_P6: ", SDEC dig_P6, 13]
    HSEROUT2["dig_P7: ", SDEC dig_P7, 13]
    HSEROUT2["dig_P8: ", SDEC dig_P8, 13]
    HSEROUT2["dig_P9: ", SDEC dig_P9, 13]
    
    
    HSEROUT2["dig_H1: ",  DEC dig_H1, 13]
    HSEROUT2["dig_H2: ", SDEC dig_H2, 13]
    HSEROUT2["dig_H3: ",  DEC dig_H3, 13]
    HSEROUT2["dig_H4: ", SDEC dig_H4, 13]
    HSEROUT2["dig_H5: ", SDEC dig_H5, 13]
    HSEROUT2["dig_H6: ", SDEC dig_H6, 13]
RETURN

#ENDIF

OverBME280:

aRci

merhaba
18f denetleyicilerde long tipi değişken kullanılabilir. bende bir arkadaş sayesinde öğrendim. sadece 18f programlarken Compile kısmında use PBPL seçeneği tıklanmış olmalı



Alıntı yapılan: elektronarge - 24 Mayıs 2021, 19:17:32Ete hocam diğer dosyada denemeler yaptım ama şu anda elimde 16f628a var. Bu günlerde de bulunduğum yerden dolayı yeni bir denetleyici siparişi veremiyorum. BMP280 dosyasının içerisinde long türü değişken olduğu için 16f serisinde kullanamıyorum. Bu sebeple sanki bu iş basicle biraz zor olacak gibi. Araştırdığım kadarıyla BME280 ile BMP280 aynı şey.Bahsedilen kütüphane içeriği;

'****************************************************************************
'*  Name    : BME280.pbp                                                    *
'*  Author  : Henrik Olsson                                                *
'*  Notice  : Copyright (c) 2020 Henrik Olsson                              *
'*          : All Rights Reserved                                          *
'*  Date    : 2020-10-13                                                    *
'*  Version : 1.0                                                          *
'*  Notes  : This is an include file containing routines to read (via SPI) *
'*            temperature, pressure and humidity from the BME280 Digital    *
'*            humidity, pressure and temperature sensor from BOSCH.        *
'*                                                                          *
'*          : Uses 107 bytes of RAM and roughly 6.5kB of FLASH.              *
'*                                                                          *
'*  History:  v1.0 - 2020-10-13                                            *
'*            Initial version                                              *
'****************************************************************************

' Code expects some aliases to be defined BEFORE including this file, namely:
' BME280_CS  VAR LATH.2
' BME280_CLK  VAR PORTC.3
' BME280_MISO VAR PORTC.4
' BME280_MOSI VAR PORTC.5
'
' Then you can include this file:
' INCLUDE "BME280.pbp"


adc_T          VAR LONG                ' Raw temperature value as read from sensor.
adc_P          VAR LONG                ' Raw pressure value as read from sensor.
adc_H          VAR WORD                ' Raw humidity value as read from sensor.

Temperature    VAR LONG                ' Final temperature value in units of 0.01 degrees C.
Pressure        VAR LONG                ' Final pressure value in units of 1Pa.
Humidity        VAR LONG                ' Final humidity value in units of 0.001%.

' Compensation / trimming parameters to be read from the BME280.
' Datatypes listed as comments are how they are defined in the datasheet.
dig_T1          VAR WORD                ' Unsigned short
dig_T2          VAR LONG                ' Signed short, we cast to LONG when read.
dig_T3          VAR LONG                ' Signed short, we cast to LONG when read.

dig_P1          VAR WORD                ' Unsigned short.
dig_P2          VAR LONG                ' Signed short, we cast to LONG when read.
dig_P3          VAR LONG                ' Signed short, we cast to LONG when read.
dig_P4          VAR LONG                ' Signed short, we cast to LONG when read.
dig_P5          VAR LONG                ' Signed short, we cast to LONG when read.
dig_P6          VAR LONG                ' Signed short, we cast to LONG when read.
dig_P7          VAR LONG                ' Signed short, we cast to LONG when read.
dig_P8          VAR LONG                ' Signed short, we cast to LONG when read.
dig_P9          VAR LONG                ' Signed short, we cast to LONG when read.

dig_H1          VAR BYTE                ' Unsigned char.
dig_H2          VAR LONG                ' Signed short, we cast to LONG when read.
dig_H3          VAR BYTE                ' Unsigned char.
dig_H4          VAR WORD                ' Signed short, we cast to LONG when read.
dig_H5          VAR WORD                ' Signed short, we cast to LONG when read.
dig_H6          VAR LONG                ' Signed char, we cast to LONG when read.

' These variables are used in all three compensation routines and needs to be included all the time.
var1            VAR LONG
var2            VAR LONG

' These are not needed if humidity is not going to be used.
var3            VAR LONG
var4            VAR LONG
var5            VAR LONG

' This is used in all three compensation routines
t_fine          VAR LONG

BME280_Reg      VAR BYTE
BME280_Data    VAR BYTE

tmp_B          VAR BYTE                ' Temporary variable.


' Actual code below this point, jump over as to not execute unless specifically called.
GOTO OverBME280

'----------------------------------------------------------------------------------------------------------------------
BME280_Read:
    ' Basic read function.
    ' Set BME280_Reg to whatever address you want to read.
    ' Data at that address will be returned in BME280_Data 
    BME280_Reg.7 = 0 
    BME280_CS = 0
    SHIFTOUT BME280_MOSI, BME280_CLK, 5, [128 + BME280_Reg]
    SHIFTIN  BME280_MISO, BME280_CLK, 6, [BME280_Data]
    BME280_CS = 1
RETURN
'----------------------------------------------------------------------------------------------------------------------

'----------------------------------------------------------------------------------------------------------------------
BME280_Write:
    ' Basic write function.
    ' Set BME280_Reg to whatever address you want to write and
    ' BME280_Data to whatever value you want to write to that address.
    BME280_REg.7 = 0
    BME280_CS = 0
    SHIFTOUT BME280_MOSI, BME280_CLK, 5, [BME280_Reg, BME280_Data]
    BME280_CS = 1
RETURN
'----------------------------------------------------------------------------------------------------------------------

'----------------------------------------------------------------------------------------------------------------------
BME280_Reset:
    ' This will perform a reset of the device, same as power on (according to datasheet).
    BME280_Reg = $E0
    BME280_Data = $B6
    GOSUB BME280_Write
RETURN
'----------------------------------------------------------------------------------------------------------------------

'----------------------------------------------------------------------------------------------------------------------
BME280_CompensateValues:
' The execution time for compensating all three values are measured
' to around 2190us with the PIC running at 64MHz

'------------------------------------------------------------------
' Optimized Temperature conversion, verified to work with negative temperatures
' Execution time at 64MHz is around 300us
'------------------------------------------------------------------
    var1 = (((adc_T >> 3) - (dig_T1 << 1)) * dig_T2) / 2048
    var2 =  (((( (adc_T >> 4) - dig_T1) * ((adc_T >> 4) - dig_T1)) / 4096) * dig_T3) / 16384
    t_fine = var1 + var2
    Temperature = (t_fine * 5 + 128) / 256

'------------------------------------------------------------------
'------------ Pressure compensation, working version --------------
'------------------------------------------------------------------
    ' Execution time at 64MHz is around 1230us
    var1 = (t_fine / 2) - 64000
    var2 = (((var1 / 4) * (var1 / 4)) / 2048) * dig_P6
    var2 = var2 + (var1 * dig_P5 * 2)
    var2 = (var2 / 4) + (dig_P4 * 65536)
    var1 =((dig_P3 * ((var1 / 4) * var1 / 4) / 8192) / 8) +  ((dig_P2 * var1) / 2)
    var1 = var1 / 262144
    var1 = ((32768 + var1) * dig_P1) / 32768
    
    IF var1 = 0 THEN
        Pressure = 0
        RETURN
    ENDIF
    
    Pressure = ABS((1048576 - adc_P) - (var2 / 4096)) * 3125
    
    IF Pressure < $80000000 THEN
      Pressure = (Pressure / 2) / (ABS(var1))
    ELSE
      Pressure = (Pressure / ABS(var1)) * 2
    ENDIF
    
    var1 = (dig_P9 * ( (Pressure >> 3) * (Pressure >> 3) / 8192)) / 4096
    var2 = ((Pressure >> 2) * dig_P8) / 8192
    
    Pressure = Pressure + ((var1 + var2 + dig_P7) / 16)

'------------------------------------------------------------------
'----------- Humidity compensation, working version ---------------
'------------------------------------------------------------------
    ' Execution time at 64MHz is around 660us
    var1 = t_fine - 76800  
    var2 = adc_H << 14                                  ' adc_H is unsigned so we can use left shift instead of dived here
    var3 = dig_H4 * 1048576
    var4 = dig_H5 *  var1
    var5 = (((var2 - var3) - var4) + 16384) / 32768
    var2 = (var1 * dig_H6) / 1024
    var3 = (var1 * dig_H3) / 2048
    var4 = ((var2 * (var3 + 32768)) / 1024) + 2097152
    var2 = ((var4 * dig_H2) + 8192) / 16384
    var3 = var5 * var2
    var4 = ((var3 / 32768) * (var3 / 32768)) / 128
    var5 = var3 - ((var4 * dig_H1) / 16)
    
    IF Var5 < 0 THEN
      var5 = 0
    ENDIF
    
    IF var5 > 419430400 THEN
      var5 = 419430400
    ENDIF
    
    Humidity = var5 >> 12
    
    IF Humidity > 102400 THEN
      Humidity = 102400
    ENDIF

RETURN
'----------------------------------------------------------------------------------------------------------------------


'----------------------------------------------------------------------------------------------------------------------
BME280_GetRawValues:
    
    ' Make sure we don't have any "residue" in the highest significant byte of the variables
    ' since we're only shifting in 24 bits. adc_H is 16bits and we're shifting in 16bits so
    ' no need for any special attention there.
    adc_P.BYTE3 = 0
    adc_T.BYTE3 = 0
    
    BME280_Reg = $F7
    BME280_Reg.7 = 0 
    BME280_CS = 0
      
    SHIFTOUT BME280_MOSI, BME280_CLK, 5, [128 + BME280_Reg]
    SHIFTIN BME280_MISO, BME280_CLK, 6, [adc_P.BYTE2, adc_P.BYTE1, adc_P.BYTE0, adc_T.BYTE2, adc_T.BYTE1, adc_T.BYTE0, adc_H.BYTE1, adc_H.BYTE0]

    BME280_CS = 1

    ' Temperature and pressure are left justified, needs to be shifted right four places.
    adc_P = adc_P >> 4
    adc_T = adc_T >> 4

RETURN
'----------------------------------------------------------------------------------------------------------------------

      
'----------------------------------------------------------------------------------------------------------------------
BME280_GetTrimValues:
    ' This routines reads the trim/compensation constants from the sensor.
    ' For some reason there's a gap in the memory map, first group of data are between 0x88 and 0xA1 (with 0xA0 skipped).
    ' and second group is from 0xE1 and 0xE7 with digits H4 and H5 spanning three bytes
    ' Since these values never change for the specific sensor it would be possible to
    ' read these once and hardcode them into their respective variables, or even better in
    ' that case, change the variables to constants.
    ' Most values (but not all) are 16bit signed as they are read from the sensor.
    ' But PBP does not do signed arithmetic on 16bit variables so we're storing them in LONGs.
    ' But for that to work properly we need "move" the sign bit (if the value) is negative.
        
    dig_T1 = 0 : dig_T2 = 0 : dig_T3 = 0
    dig_P1 = 0 : dig_P2 = 0 : dig_P3 = 0
    dig_P4 = 0 : dig_P5 = 0 : dig_P6 = 0
    dig_P7 = 0 : dig_P8 = 0 : dig_P9 = 0
    dig_H1 = 0 : dig_H2 = 0 : dig_H3 = 0
    dig_H4 = 0 : dig_H5 = 0 : dig_H6 = 0
    
    ' Read 0x88 thru 0xA1. 0xA0 is not in use so dump that in tmp_B
    BME280_Reg = $88
    BME280_Reg.7 = 0 
    BME280_CS = 0

    SHIFTOUT BME280_MOSI, BME280_CLK, 5, [128 + BME280_Reg]
    SHIFTIN BME280_MISO, BME280_CLK, 6, [dig_T1.BYTE0, dig_T1.BYTE1, dig_T2.BYTE0, dig_T2.BYTE1, dig_T3.BYTE0, dig_T3.BYTE1,_
                                        dig_P1.BYTE0, dig_P1.BYTE1, dig_P2.BYTE0, dig_P2.BYTE1, dig_P3.BYTE0, dig_P3.BYTE1,_
                                        dig_P4.BYTE0, dig_P4.BYTE1, dig_P5.BYTE0, dig_P5.BYTE1, dig_P6.BYTE0, dig_P6.BYTE1,_
                                        dig_P7.BYTE0, dig_P7.BYTE1, dig_P8.BYTE0, dig_P8.BYTE1, dig_P9.BYTE0, dig_P9.BYTE1,_
                                        tmp_B, dig_H1]
    
    IF dig_T2.15 = 1 THEN
        dig_T2 = -ABS(dig_T2.LOWWORD)
    ENDIF

    IF dig_T3.15 = 1 THEN
        dig_T3 = -ABS(dig_T3.LOWWORD)
    ENDIF
  
    IF dig_P2.15 = 1 THEN
        dig_P2 = -ABS(dig_P2.LOWWORD)
    ENDIF
    
    IF dig_P3.15 = 1 THEN
        dig_P3 = -ABS(dig_P3.LOWWORD)
    ENDIF

    IF dig_P4.15 = 1 THEN
        dig_P4 = -ABS(dig_P4.LOWWORD)
    ENDIF
    
    IF dig_P5.15 = 1 THEN
        dig_P5 = -ABS(dig_P5.LOWWORD)
    ENDIF
    
    IF dig_P6.15 = 1 THEN
        dig_P6 = -ABS(dig_P6.LOWWORD)
    ENDIF
    
    IF dig_P7.15 = 1 THEN
        dig_P7 = -ABS(dig_P7.LOWWORD)
    ENDIF
    
    IF dig_P8.15 = 1 THEN
        dig_P8 = -ABS(dig_P8.LOWWORD)
    ENDIF
    
    IF dig_P9.15 = 1 THEN
        dig_P9 = -ABS(dig_P9.LOWWORD)
    ENDIF
      
    BME280_CS = 1

    BME280_Reg = $E1
    BME280_Reg.7 = 0 
    BME280_CS = 0
    SHIFTOUT BME280_MOSI, BME280_CLK, 5, [128 + BME280_Reg]
    SHIFTIN BME280_MISO, BME280_CLK, 6, [dig_H2.BYTE0, dig_H2.BYTE1, dig_H3, dig_H4.BYTE0, tmp_B, dig_H5.BYTE0, dig_H6]
    
    IF dig_H2.15 = 1 THEN
        dig_H2 = -ABS(dig_H2.LOWWORD)
    ENDIF
    
    dig_H4 = dig_H4 << 4
    dig_H5 = dig_H5 << 4                                          ' Make room for lower 4 bits
    dig_H4 = dig_H4 + (tmp_B & %00001111)                          ' Extract lower 4 bits of dig_H4
    
    tmp_B = tmp_B >> 4                                            ' Extract lower 4 bits of dig_H5
    dig_H5 = dig_H5 + (tmp_B & %00001111)

    BME280_CS = 1    
RETURN


'***********************************************************************************************************************
'********* Optional debug code below this point. Will get included with #DEFINE BME280_DEBUG
'***********************************************************************************************************************
#IFDEF BME280_DEBUG

Testcase:
    adc_T = 530386 : adc_P = 345501 : adc_h = 28680
    GOSUB BME280_CompensateValues : GOSUB PrintValues
    
    adc_T = 486770 : adc_P = 330198 : adc_h = 35867
    GOSUB BME280_CompensateValues : GOSUB PrintValues
    
    adc_t = 468750 : adc_p = 324532 : adc_h = 27951
    GOSUB BME280_CompensateValues : GOSUB PrintValues
    
    adc_t = 455100 : adc_p = 320161 : adc_h = 29389
    GOSUB BME280_CompensateValues : GOSUB PrintValues
    
    adc_t = 438939 : adc_p = 314970 : adc_h = 31164
    GOSUB BME280_CompensateValues : GOSUB PrintValues
    
    adc_t = 427235 : adc_p = 311954 : adc_h = 38152
    GOSUB BME280_CompensateValues : GOSUB PrintValues
    
    adc_t = 410521 : adc_p = 290230 : adc_h = 22123
    GOSUB BME280_CompensateValues : GOSUB PrintValues
    
    adc_t = 380734 : adc_p = 414855 : adc_h = 32123
    GOSUB BME280_CompensateValues : GOSUB PrintValues
RETURN

PrintValues:
    HSEROUT2[DEC i, ": ", "Temp: ", SDEC Temperature, "  P: ", SDEC Pressure, "  RH: " , DEC Humidity, "  t_fine: ", SDEC t_fine, 13]
RETURN


PrintTrimValues:
    HSEROUT2["dig_T1: ",  DEC dig_T1, 13]
    HSEROUT2["dig_T2: ", SDEC dig_T2, 13]
    HSEROUT2["dig_T3: ", SDEC dig_T3, 13]
    
    HSEROUT2["dig_P1: ",  DEC dig_P1, 13]
    HSEROUT2["dig_P2: ", SDEC dig_P2, 13]
    HSEROUT2["dig_P3: ", SDEC dig_P3, 13]
    HSEROUT2["dig_P4: ", SDEC dig_P4, 13]
    HSEROUT2["dig_P5: ", SDEC dig_P5, 13]
    HSEROUT2["dig_P6: ", SDEC dig_P6, 13]
    HSEROUT2["dig_P7: ", SDEC dig_P7, 13]
    HSEROUT2["dig_P8: ", SDEC dig_P8, 13]
    HSEROUT2["dig_P9: ", SDEC dig_P9, 13]
    
    
    HSEROUT2["dig_H1: ",  DEC dig_H1, 13]
    HSEROUT2["dig_H2: ", SDEC dig_H2, 13]
    HSEROUT2["dig_H3: ",  DEC dig_H3, 13]
    HSEROUT2["dig_H4: ", SDEC dig_H4, 13]
    HSEROUT2["dig_H5: ", SDEC dig_H5, 13]
    HSEROUT2["dig_H6: ", SDEC dig_H6, 13]
RETURN

#ENDIF

OverBME280:

Elektronikprojem

@aRci 18F serisinde long değişken kullanıyorum zaten. Ama şu anda elimde 16f628a var. Ondan dolayı zor oluyor. CCS C de bir örnek buldum. Onu deneyeceğim. Örnek aşağıdadır.
@ete hıocam dediğiniz gibi bme280 ile bmp280 aynı değil galiba. Ama registerler aynı görünüyor.

https://simple-circuit.com/pic16f877a-bme280-sensor-ccs-c/

ete

Bu sensörün register yapısı nedeni ile bir sürü 32 bit (Long) değişken kullanılmış.
Bu değişkenler yerine 16 bit değişken kullanmak çok zor gözüküyor. Bence deneme bile.
18F serisi ile ancak bu işi yapabilirsin sanırım.
Diğer taraftan bütün işi BME280.PBP dosyasının yaptığını söylemiştim. Bu dosya sisteme include edilmeden önce sensöre ait haberleşme bacaklarının kendi programında belirlenmesi gerekiyor. Bunuda unutma.
' BME280_CS   VAR LATH.2
' BME280_CLK  VAR PORTC.3
' BME280_MISO VAR PORTC.4
' BME280_MOSI VAR PORTC.5
Diğer dikkatimi çeken husus ise programı yazan kişi Seri LCD kullanarak değerleri ekrana yazdırmış gözüküyor. Sen normal kullanacak isen BPE280 içindeki seri LCD komutlarınıda değiştirmen gerekir.

Ete

Dtmf

Zamaninda ete hocamla bu konuda baya ugrasmistik sagolsun. :).bu bmp180 icin yazilmis bir program basinc pascal cinsinden okunuyor.

Device =16F877A
  XTAL = 20
  ALL_DIGITAL TRUE
 TRISA=0:PORTA=0
 TRISB=0:PORTB=0
 TRISC=%11000000:PORTC=0
 TRISD=0:PORTD=0        
 TRISE=0:PORTE=0
;-------------------------------------------------------------------------------
Declare LCD_TYPE alpha  
Declare LCD_LINES 2
Declare LCD_INTERFACE 4
Declare LCD_DTPIN PORTB.4
Declare LCD_RSPIN PORTB.0
Declare LCD_ENPIN PORTB.1
Symbol SDA =PORTC.7
Symbol  SCL =PORTC.6

  Symbol BMP180 = $EE  'BMP180 I2C address
  Symbol CalDatStAd = $AA 'Start address for cal. data.
  Symbol InitConvReg = $F4
  Symbol PReadReg = $34 
  Symbol TReadReg = $2E 
  Symbol BASINCOKU=$F6 
  
  Dim wAC2 As Word
  Dim wAC3 As Word
  Dim wMB As Word
  Dim wMC As Word

;_______________________________
  Dim AC1 As Word
  Dim AC2 As Word;ISARETLI
  Dim AC3 As Word ;ISARETLI
  Dim AC4 As Word
  Dim AC5 As Word   ;WORD
  Dim AC6 As Word ;WORD

  Dim B1 As Word
  Dim B2 As Word
  Dim B6 As DWord  ;BU DEGISKENDEGRINI DWORD OLACAK OLMAZSA HESAPLAR FARKLI CIKAR (- )DEGERLI DEGISKENLER MUTLAKA DWORD OLARAK ALINMALI
  
  Dim B3 As Word
  Dim B4 As Word
  Dim B7 As DWord
  
  
  
  Dim MB As Word;ISARETLI
  Dim MC As Word;ISARETLI
  Dim MD As Word
;________________________________
  Dim OSS As Byte 
  OSS=3       ; OSS DEGERI BURADA AYARLANDI
  Dim UP As  Word
  Dim UPM As  Word
  Dim UPL As Word
  Dim UPX As Byte
  Dim UPLONG As DWord
  
  Dim UT As Word    ;WORD
  Dim UTXL As Word    ;WORD
  Dim PT As Word

  Dim X1 As DWord
  Dim X2 As DWord
  Dim X3 As DWord
  
  Dim XC As Word
  Dim XD As Word
;==================================
Dim XX1 As DWord
Dim XX2 As DWord
Dim XX3 As DWord
Dim PTOPLA As DWord
 Dim P As DWord
 Dim PR As DWord
 
  Dim YUK As DWord         ; YUK 
;==================================
       Dim T As Float
       DelayMS 1000
 ;GoSub KALIBRE
 ;AC1=126
 ;AC2=-77
 ;AC3=-14149
 ;AC4=32346
 ;AC5=25949
 ;AC6=16606
 ;B1=6515
 ;B2=4
 ;MB=-32768
 ;MC=-8711
 ;MD=2242
 
       DelayMS 500
 Cls      ;EKRANI TEMIZLE
 UPLONG=0
;===========================================
BASLA: 
;I2CIn SDA,SCL,$EE,$AA, [AC1,AC2,AC3,AC4,AC5,AC6,B1,B2,MB,MC,MD];BU BOLUMU KALIBRE DEGERLERINI ALDIKTAN SONRA BIR KOSEYE NOT EDIYORUZ VE KAPATIYORUZ BIDAHA KULLANMIYORUZ 
DelayMS 100
                 I2COUT SDA,SCL,BMP180,InitConvReg,[TReadReg] 
                  DelayMS 10  
                 I2CIN SDA,SCL,BMP180,$F6,[UT]
                 UT=(UT.HighByte<<8) + UT.LowByte
                 UT=UT+3000
                 
                 DelayMS 10
                GoSub Thesap
                 
                Print At 1,1,"C: ",Dec T
                 Print At 2,1,"UP:",Dec UP
                 Print At 3,1,"YUK:",SDEC YUK
                 Print At 4,1,"PASCAL:",Dec PR 
                 
I2COUT SDA,SCL,BMP180,$F4,[$34+ (OSS << 6)]
DelayMS 100
I2CIN SDA,SCL,BMP180,$F6,[UPM,UPL,UPX]   ;UPL
UP=UPM-800    ;BU BOLUME KALIBRASYON YAPILDI -----------------------------KALIBRASYON YAPILDI------------------------------
GoSub BHESAP
DelayMS 500
Print At 2,1,"                    "                                                            
Print At 3,1,"                    "
Print At 4,1,"                    "
GoTo BASLA
;=====================sıcaklık hesap=======================
Thesap:
X1 = ((UT-22910)*32757)  ;X1 = ((UT-23153)*32757)
X1=X1/32768              
    X2 = (-11799*2048)   ;8711 OLABILIR
    X2 = X2/(X1 +5800)
    X3=X1+X2
    T =X3/16;18.5 
    T=X3/100  
Return
;=======================BASINC HESAPLAMA=============================
BHESAP:
B6 =X3-4000;3950                                    
    XX1 = (B6*B6)/4096 
    XX1 = (40 * XX1)/2048 ;B2  
                                      ; BU BOLUM TAMAM DEGERLER NORMAL
    XX2= -72*B6/2048 ;AC2
    XX3= XX1 + XX2 ;XX3
;_______________________________________    
    B3= (408 * 4)+ XX3)<<OSS ;AC1
    B3= (B3+2)/4   ;B3 DEGERI NORMAL DEGER 425
 
    XX1 = (-14149 * B6)/8192  ; XX1 AC3 DEGERR NORMAL 2765
 
    XX2= (B6 * B6)/4096   ;DEGER 625
   XX2 = 6200 * XX2/65536 ;XX1 B1 ; DEGER NORMAL 59 ..=YUK = 6200 * XX2/65536
 
    XX3 = XX1 + XX2 
    XX3 = (XX3 + 2)/4 ;DEGER NORMAL707
;________________________________________
 
    B4 = (XX3 + 32768)
    B4 = (B4/32768)*32323 ;AC4   DEGER NORMAL 33055
;__________________________________________ BURAYA KADAR DEGERLER NORMAL

   B7=(UP-B3)*50000 ;PDEGERI 23843
                      If B7<$80000000 Then
                      P=(B7*2)/4
                      Else
                      P=(B7/B4)*2
                      EndIf
;P=P-2440
 XX1=(P/256)
 XX1=XX1*(P/256) ;DEGER NORMAL
 XX1=XX1-5500; BU BOLUME KALIBRASYON YAPILDI------74589 SABITLENDI--------------------KALIBRASYON YAPILDI------------------------------
 XX1=(XX1*3038)/65536 ;DEGER NORMAL
   
   X2=(-7117*P)/65536 ; -7859
   PR=XX1+XX2+3791
   PR=P+PR/16
Return
 


Elektronikprojem

@Dtmf teşekkür ederim. Deneyeceğim.
@ete hocam haklısınız long değişkenlerle yapılmış zaten. Dtmf'in verdiği kodları inceleyip onu deneyeceğim.

Powered by EzPortal