'-------------------------------------------------------------------------------- ' ' ' ' '-------------------------------------------------------------------------------- $regfile = "m328def.dat" $crystal = 16000000 $baud = 38400 $hwstack = 32 $swstack = 10 $framesize = 40 'конфигурация I2C Config Scl = Portc.5 Config Sda = Portc.4 Const Addr_schreiben = &B11101110 'адрес микросхемы + запись Const Addr_lesen = &B11101111 'адрес микросхемы + чтение Const Oversampling_setting = 1 Const Software_oversampling_setting = 1 Const R_ac1 = &HAA Const R_ac2 = &HAC Const R_ac3 = &HAE Const R_ac4 = &HB0 Const R_ac5 = &HB2 Const R_ac6 = &HB4 Const R_b1 = &HB6 Const R_b2 = &HB8 Const R_mb = &HBA Const R_mc = &HBC Const R_md = &HBE 'Const Oss = &H74 '1-стандарт Const Oss = &H34 ' 0-низкое потребление 'Const Oss = &Hb4 ' 2-точное измерение 'Const Oss = &Hf4 ' 3-супер точное Const Term_180 = &H2E Dim Ac1 As Integer , Mac1 As Byte At Ac1 + 0 Overlay , Lac1 As Byte At Ac1 + 1 Overlay Dim Ac1a As Long Dim Ac2 As Integer , Mac2 As Byte At Ac2 + 0 Overlay , Lac2 As Byte At Ac2 + 1 Overlay Dim Ac3 As Integer , Mac3 As Byte At Ac3 + 0 Overlay , Lac3 As Byte At Ac3 + 1 Overlay Dim Ac4 As Word , Mac4 As Byte At Ac4 + 0 Overlay , Lac4 As Byte At Ac4 + 1 Overlay Dim Ac5 As Word , Mac5 As Byte At Ac5 + 0 Overlay , Lac5 As Byte At Ac5 + 1 Overlay Dim Ac5a As Single Dim Ac6 As Word , Mac6 As Byte At Ac6 + 0 Overlay , Lac6 As Byte At Ac6 + 1 Overlay Dim B1 As Integer , Mb1 As Byte At B1 + 0 Overlay , Lb1 As Byte At B1 + 1 Overlay Dim B2 As Integer , Mb2 As Byte At B2 + 0 Overlay , Lb2 As Byte At B2 + 1 Overlay Dim B3 As Long Dim B3a As Long Dim B4 As Long Dim B5 As Long Dim B6 As Integer Dim B6a As Long Dim B7 As Long Dim Mb As Integer , Mmb As Byte At Mb + 0 Overlay , Lmb As Byte At Mb + 1 Overlay Dim Mc As Integer , Mmc As Byte At Mc + 0 Overlay , Lmc As Byte At Mc + 1 Overlay Dim Mc2 As Long Dim Md As Integer , Mmd As Byte At Md + 0 Overlay , Lmd As Byte At Md + 1 Overlay Dim Adres As Byte Dim Wert As Byte Dim Ut As Long , Mut As Byte At Ut + 0 Overlay , Lut As Byte At Ut + 1 Overlay Dim X1 As Long Dim X1t As Single Dim X2 As Long Dim X3 As Long Dim T As Single Dim T2 As Long Dim Temperatur As String * 6 Dim Luftdruck As String * 8 Dim Druck As Single Dim P As Long Dim P2 As Long Dim 2potenz15 As Long Dim 2potenz11 As Integer Dim 2potenz13 As Integer Dim 2potenz8 As Integer Dim 2potenz4 As Integer Dim 2potenz2 As Integer Dim 2potenz16 As Long Dim 2potenz12 As Integer Dim Potenz5255 As Single Dim Altitude As Single Dim Altitudes As String * 8 Dim Msb As Long Dim Lsb As Long Dim Up As Long , Mup As Byte At Up + 2 Overlay , Lup As Byte At Up + 1 Overlay , Xlup As Byte At Up + 0 Overlay Dim Druckvar As Byte Declare Sub Berechne_temp Declare Sub Berechne_druck Declare Sub Schreibe_bmp085(byval Adres As Byte , Byval Wert As Byte) Declare Sub Lese_roh_daten Declare Sub Messen Declare Sub Lese_bmp085n(byval Adres As Byte , Wert As Byte , Wept As Byte) ' считываем калибровочные данные Call Lese_bmp085n(r_ac1 , Lac1 , Mac1) Call Lese_bmp085n(r_ac2 , Lac2 , Mac2) Call Lese_bmp085n(r_ac3 , Lac3 , Mac3) Call Lese_bmp085n(r_ac4 , Lac4 , Mac4) Call Lese_bmp085n(r_ac5 , Lac5 , Mac5) Call Lese_bmp085n(r_ac6 , Lac6 , Mac6) Call Lese_bmp085n(r_b1 , Lb1 , Mb1) Call Lese_bmp085n(r_b2 , Lb2 , Mb2) Call Lese_bmp085n(r_mb , Lmb , Mmb) Call Lese_bmp085n(r_mc , Lmc , Mmc) Call Lese_bmp085n(r_md , Lmd , Mmd) Do Gosub Измерение T = T / 10 Temperatur = Fusing(t , "###.##") Potenz5255 = 1 / 5.255 Altitude = P / 101325 Altitude = Altitude ^ Potenz5255 Altitude = 1 - Altitude Altitude = Altitude * 44330 Druck = P Druck = Druck / 133.3224 'Druck = Druck * 0.0075 'Druck = Druck / 100 Luftdruck = Fusing(druck , "####.##") Altitudes = Fusing(altitude , "#####.##") Print "Temp " ; Temperatur ; " C," ; " Pressure " ; Luftdruck ; " mm.ct," ; " Altitude " ; Altitudes ; " m." Print Wait 1 Loop End Измерение: 'Измерение температуры Call Schreibe_bmp085(&Hf4 , Term_180) Adres = &HF6 Call Lese_bmp085n(adres , Lut , Mut) Call Berechne_temp Call Schreibe_bmp085(&Hf4 , &HB4 ) Adres = &HF6 Call Lese_bmp085n(adres , Mup , Lup ) ' "для использования точного измерения давления раскоментировать строки." 'I2cstart 'I2cwbyte Addr_schreiben 'I2cwbyte &HF8 'I2cstart 'I2cwbyte Addr_lesen 'I2crbyte Xlup , Nack 'I2cstop 'Print Bin(up) Shift Up , Right , 5 Call Berechne_druck Return Sub Lese_bmp085n(byval Adres As Byte , Wert As Byte , Wept As Byte) I2cstart I2cwbyte Addr_schreiben I2cwbyte Adres I2cstart I2cwbyte Addr_lesen I2crbyte Wert , Ack I2crbyte Wept , Nack I2cstop 'Waitms 15 End Sub Sub Schreibe_bmp085(byval Adres As Byte , Byval Wert As Byte) I2cstart I2cwbyte Addr_schreiben I2cwbyte Adres I2cwbyte Wert I2cstop Waitms 30 End Sub Sub Berechne_temp 'X1 Ut = Ut - Ac6 2potenz15 = 32768 '2 ^ 15 Ac5a = Ac5 / 2potenz15 X1t = Ut * Ac5a 'X2 2potenz11 = 2048 ' 2 ^ 11 Mc2 = Mc * 2potenz11 X3 = X1t + Md X2 = Mc2 / X3 'B5 B5 = X1t + X2 'T 2potenz4 = 16 ' 2 ^ 4 T2 = B5 + 8 T = T2 / 2potenz4 End Sub Sub Berechne_druck 'B6 B6 = B5 - 4000 'X1 2potenz12 = 4096 ' 2 ^ 12 B6a = B6 * B6 B6a = B6a / 2potenz12 X1 = B2 * B6a X1 = X1 / 2potenz11 'X2 X2 = Ac2 * B6 X2 = X2 / 2potenz11 'X3 X3 = X1 + X2 'B3 Ac1a = Ac1 * 4 Ac1a = Ac1a + X3 Shift Ac1a , Left , 3 Ac1a = Ac1a + 2 B3 = Ac1a / 4 2potenz13 = 8192 '2 ^ 13 B6a = B6 * Ac3 X1 = B6a / 8192 'X2 die zweite B6a = B6 * B6 B6a = B6a / 2potenz12 X2 = B1 * B6a 2potenz16 = 65536 '2 ^ 16 X2 = X2 / 2potenz16 'X3 die zweite X3 = X1 + X2 X3 = X3 + 2 2potenz2 = 4 ' 2 ^ 2 X3 = X3 / 2potenz2 'B4 B4 = X3 + 32768 B4 = B4 * Ac4 B4 = B4 / 2potenz15 If B4 <= 0 Then B4 = B4 * -1 'B7 B7 = Up - B3 B3a = 50000 Shift B3a , Right , 3 ' B7 = B7 * B3a If B7 <= 0 Then B7 = B7 * -1 If B7 < &H80000000 Then P = B7 * 2 P = P / B4 Else P = B7 / B4 P = P * 2 End If 2potenz8 = 256 '2 ^ 8 P2 = P / 2potenz8 X1 = P2 * P2 X1 = X1 * 3038 X1 = X1 / 2potenz16 ' nochmal X2 X2 = -7357 * P X2 = X2 / 2potenz16 P2 = P P = X2 + 3791 P = P + X1 P = P / 2potenz4 P = P + P2 End Sub