'MCU config
$regfile = "m8adef.dat"
$crystal = 8000000
$hwstack = 256
$swstack = 256
$framesize = 256



'I2C config
Config Sda = Portc.5
Config Scl = Portc.4

'UART config
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com1:" For Binary As #1






'******************************************
' Einstellungen für den BME280 Sensor

'Bitte dazu das Datenblatt lesen

'Sensoradresse
Const Bme280_adress = &HEC

'Oversampling
Const Osrs_t = &B101
Const Osrs_p = &B101
Const Osrs_h = &B101

'Mode Register
Const Mode_reg = &B11                                       'Normal Mode

't_sb
Const T_sb = &B000                                          't_sb = 0.5ms

'IIR Filter
Const Filter = &B100                                        'Filter = 16


'******************************************




'Variablen dimensionieren
Dim Txt As String * 10

'Datenarray für die i2c komunikation
Dim Wert_array(24) As Byte

'Kalibrierwerte vom Sensor

Dim Dig_p1 As Word
Dim Dig_p2 As Integer
Dim Dig_p3 As Integer
Dim Dig_p4 As Integer
Dim Dig_p5 As Integer
Dim Dig_p6 As Integer
Dim Dig_p7 As Integer
Dim Dig_p8 As Integer
Dim Dig_p9 As Integer


'unkompensierte Sensor Werte

Dim Up As Long


'kompensierte Sensor Werte
Dim T_fine As Long
Dim P_fine As Dword
T_fine=2200
Dim Pressure_old As Dword

'SUBs und FUNCTONs declarieren
Declare Sub I2c_write(byval Device_adres As Byte , Byval Reg_adres As Byte , Byval Wert As Byte)
Declare Sub I2c_read(byval Device_adres As Byte , Byval Reg_adres As Byte , Byval Wert_count As Byte )
Declare Sub Setup_bme280()
Declare Sub Read_bme280_value()


Declare Function Pressure_32() As Dword





'Initialisierung des BME280 Sensor
Call Setup_bme280()
'Kalibrierwerte vom Sensor lesen, Filterwerte schreiben






'*** Kalibrierwerte anzeigen







'*** Hauptprogramm

Do


  '** BME280 auslesen
  Call Read_bme280_value()
  'List die unkompensierten Wert vom Sensor,
  'diese werden in Ut, Up, Uh abgelegt






  '** Luftdruck mit 32bit Berechnung
  P_fine = Pressure_32()
  'Gibt den Luftdruck in hPa zurück, die Auflösung beträgt 0.01hPa
  'Der Wert 96386 entspricht 963.86hPa
  Txt = Str(p_fine)
  Txt = Format(txt , "00.00")
  Print #1 , "Legnyomas 32bit:   " ; Txt ; "hPa"



  Wait 1
Loop


End







Sub I2c_write(device_adres As Byte , Reg_adres As Byte , Wert As Byte)
  I2cstart
  I2cwbyte Device_adres
  I2cwbyte Reg_adres
  I2cwbyte Wert
  I2cstop
  Waitms 10
End Sub


Sub I2c_read(device_adres As Byte , Reg_adres As Byte , Wert_count As Byte )
  Local X As Byte
  Local Y As Byte
  Y = Wert_count - 1

  I2cstart                                                  'Start I2C
  I2cwbyte Device_adres                                     'Sende Slave Adresse
  I2cwbyte Reg_adres                                        'Register Adresse
  I2cstart
  Incr Device_adres
  I2cwbyte Device_adres                                     'sende Slave Adresse +1 für Lesen
  If Wert_count > 1 Then
    For X = 1 To Y
      I2crbyte Wert_array(x) , Ack                          'lese Wert
    Next
  End If
  I2crbyte Wert_array(wert_count) , Nack                    'lese Wert
  I2cstop
  Waitms 10
End Sub


Sub Read_bme280_value()
  Call I2c_read(bme280_adress , &HF7 , 8 )

  'unkompensierter Druckwert
  Up = Wert_array(1)
  Shift Up , Left , 8
  Up = Up + Wert_array(2)
  Shift Up , Left , 8
  Up = Up + Wert_array(3)
  Shift Up , Right , 4

  'unkompensierter Temperaturwert


  'unkompensierter Feuchtewert

End Sub









Function Pressure_32() As Dword
  Local Var1 As Long
  Local Var2 As Long
  Local X As Long
  Local Y As Long
  Local Z As Dword

  Var1 = T_fine
  Shift Var1 , Right , 1 , Signed
  Var1 = Var1 - 64000

  X = Var1
  Shift X , Right , 2
  Var2 = X * X
  Shift Var2 , Right , 11 , Signed
  Var2 = Var2 * Dig_p6

  X = Var1 * Dig_p5
  Shift X , Left , 1 , Signed
  Var2 = Var2 + X

  X = Var2
  Shift X , Right , 2 , Signed
  Y = Dig_p4
  Shift Y , Left , 16 , Signed
  Var2 = X + Y

  X = Var1
  Shift X , Right , 2 , Signed
  X = X * X
  Shift X , Right , 13 , Signed
  X = X * Dig_p3
  Shift X , Right , 3 , Signed
  Y = Dig_p2 * Var1
  Shift Y , Right , 1 , Signed
  Var1 = X + Y
  Shift Var1 , Right , 18 , Signed

  Var1 = 32756 + Var1
  Var1 = Var1 * Dig_p1
  Shift Var1 , Right , 15 , Signed

  If Var1 = 0 Then
    Pressure_32 = 0
    Exit Function
  End If

  X = 1048576 - Up
  Y = Var2
  Shift Y , Right , 12 , Signed
  X = X - Y
  Pressure_32 = X * 3125

  If Pressure_32 < &H80000000 Then
    Shift Pressure_32 , Left , 1 , Signed
    Pressure_32 = Pressure_32 / Var1
  Else
    Pressure_32 = Pressure_32 / Var1
    Pressure_32 = Pressure_32 * 2
  End If

  Z = Pressure_32
  Shift Z , Right , 3 , Signed
  Z = Z * Z
  Shift Z , Right , 13 , Signed
  Z = Z * Dig_p9
  Shift Z , Right , 12 , Signed
  Var1 = Z

  Z = Pressure_32
  Shift Z , Right , 2 , Signed
  Z = Z * Dig_p8
  Shift Z , Right , 13 , Signed
  Var2 = Z

  Z = Var1 + Var2
  Z = Z + Dig_p7
  Shift Z , Right , 4 , Signed
  Pressure_32 = Pressure_32 + Z
End Function





Sub Setup_bme280()
  Local X As Byte

  'BME280 schreibe Filter Wert und t_sb Einstellung
  X = T_sb
  Shift X , Left , 3
  X = X + Filter
  Shift X , Left , 2
  Call I2c_write(bme280_adress , &HF5 , X)

  'BME280 schreibe OSRS_h Wert (ctrl_hum register)
  Call I2c_write(bme280_adress , &HF2 , Osrs_h)

  'BME280 schreibe OSRS_t, OSRS_p, Mode Wert (ctrl_meas register)
  X = Osrs_t
  Shift X , Left , 3
  X = X + Osrs_p
  Shift X , Left , 2
  X = X + Mode_reg

  Call I2c_write(bme280_adress , &HF4 , X)

  'BME280 lese Kalibrierwerte
  Call I2c_read(bme280_adress , &H88 , 24 )



  Dig_p1 = Wert_array(8)
  Shift Dig_p1 , Left , 8
  Dig_p1 = Dig_p1 + Wert_array(7)

  Dig_p2 = Wert_array(10)
  Shift Dig_p2 , Left , 8
  Dig_p2 = Dig_p2 + Wert_array(9)

  Dig_p3 = Wert_array(12)
  Shift Dig_p3 , Left , 8
  Dig_p3 = Dig_p3 + Wert_array(11)

  Dig_p4 = Wert_array(14)
  Shift Dig_p4 , Left , 8
  Dig_p4 = Dig_p4 + Wert_array(13)

  Dig_p5 = Wert_array(16)
  Shift Dig_p5 , Left , 8
  Dig_p5 = Dig_p5 + Wert_array(15)

  Dig_p6 = Wert_array(18)
  Shift Dig_p6 , Left , 8
  Dig_p6 = Dig_p6 + Wert_array(17)

  Dig_p7 = Wert_array(20)
  Shift Dig_p7 , Left , 8
  Dig_p7 = Dig_p7 + Wert_array(19)

  Dig_p8 = Wert_array(22)
  Shift Dig_p8 , Left , 8
  Dig_p8 = Dig_p8 + Wert_array(21)

  Dig_p9 = Wert_array(24)
  Shift Dig_p9 , Left , 8
  Dig_p9 = Dig_p9 + Wert_array(23)

  Call I2c_read(bme280_adress , &HA1 , 1 )



  Call I2c_read(bme280_adress , &HE1 , 8 )


End Sub