' Документация на датчик BMP085 - http://www.adafruit.com/datasheets/BST- … 000-06.pdf
' Документация на датчик BMP180 - https://ae-bst.resource.bosch.com/media … 001-10.pdf
' Документация на датчик BMP180 - https://ae-bst.resource.bosch.com/media … 000-09.pdf
'===============================================================================
' К О Н Ф И Г У Р А Ц И Я К О Н Т Р О Л Л Е Р А ATMEGA_328P
'===============================================================================
$map ' Получаем карту распределения памяти компилятором Bascom
$regfile = "m8def.dat" 'http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf
$crystal = 8000000
$framesize = 64 ' Размер области используемой и необходимой для преобразований
$hwstack = 64 ' Размер аппаратного стека
$swstack = 64 ' Размер программного стека
'===============================================================================
' К О Н Ф И Г У Р А Ц И Я USART
'===============================================================================
$baud = 38400
' Ucsr0a.1 = 1 ' Двойная скорость работы USART, скорость трансляции = $baud * 2
Print "Скорость трансляции USART: 38400 бод"
Print ' Пустая строка
Print ' Пустая строка
'===============================================================================
' К О Н Ф И Г У Р А Ц И Я Ш И Н Ы i2c
'===============================================================================
Config Sda = Portc.4 ' Конфигурация вывода Sda
Config Scl = Portc.5 ' Конфигурация вывода Scl
Config I2cdelay = 1 ' Скорость работы шины I2c на программном уровне
I2cinit ' Инициализация шины I2c
Waitms 50
'===============================================================================
' К О Н Ф И Г У Р А Ц И Я BMP085 или BMP180
'===============================================================================
' Ревизию документации можно посмотреть: внизу последней страницы Datasheet
' http://www.adafruit.com/datasheets/BST- … 000-06.pdf
'Смотреть стр.17, п.п.4.2 документации (BST-BMP085-DS000-06 | Revision 1.3 | August 2011) на датчик BMP085
Const Адрес_запись_bmp085 = &HEE
Const Адрес_чтение_bmp085 = &HEF
'Используемые константы
Const Const_точность_измерений_bmp085 = 3 ' Смотреть документацию
'------------------ Настраиваем точность измерения ---------------------------
' Использовалась документация: BST-BMP085-DS000-06 | Revision 1.3 | August 2011
' стр.12; таблица 3; возможные варианты: 0; 1; 2; 3
'+------------------------+----------------+----------------------+-------------+------------+
'| Режим | Значение "oss" | Время преобразования | Потребление | Разрешение |
'+------------------------|----------------+----------------------+-------------+------------+
'| ultra low power | 0 | 4.5 ms | 3 мкА | 0.5 m |
'| standart | 1 | 7.5 ms | 5 мкА | 0.4 m |
'| high resolution | 2 | 13.5 ms | 6 мкА | 0.3 m |
'| ultra high resolution | 3 | 25.5 ms | 12 мкА | 0.25 m |
'+------------------------+----------------+----------------------+-------------+------------+
Const Const_коррекция_показаний = 57 ' Коррекция показаний
Const Const_стандартная_атмосфера = 101325 ' Международная стандартная атмосфера — 101325 Паскалей
' Const Const_50000 = 50000 ' Константа используется в расчёте давления
'Смотреть стр.15, п.п.3.6 документации (BST-BMP085-DS000-06 | Revision 1.3 | August 2011) на датчик BMP085
Const Const_1делить5255 = 1 / 5.255 ' Для расчёта высоты над уровнем моря
Dim Точность_измерений_bmp085 As Byte : Точность_измерений_bmp085 = Const_точность_измерений_bmp085
Dim Oss As Byte
'Переменные для чтения и хранения калибровочных констант датчика BMP085
'Пишутся производителем в EEPROM BMP085, стр.12 документации
'Смотреть стр.12 п.п.3.4 документации (BST-BMP085-DS000-06 | Revision 1.3 | August 2011) на датчик BMP085
Dim Ac1 As Integer
Dim Ac1_low As Byte At Ac1 Overlay
Dim Ac1_high As Byte At Ac1 + 1 Overlay
Dim Ac1a As Long
Dim Ac2 As Integer
Dim Ac2_low As Byte At Ac2 Overlay
Dim Ac2_high As Byte At Ac2 + 1 Overlay
Dim Ac3 As Integer
Dim Ac3_low As Byte At Ac3 Overlay
Dim Ac3_high As Byte At Ac3 + 1 Overlay
Dim Ac4 As Word
Dim Ac4_low As Byte At Ac4 Overlay
Dim Ac4_high As Byte At Ac4 + 1 Overlay
Dim Ac5 As Word
Dim Ac5_low As Byte At Ac5 Overlay
Dim Ac5_high As Byte At Ac5 + 1 Overlay
Dim Ac5a As Single
Dim Ac6 As Word
Dim Ac6_low As Byte At Ac6 Overlay
Dim Ac6_high As Byte At Ac6 + 1 Overlay
Dim B1 As Integer
Dim B1_low As Byte At B1 Overlay
Dim B1_high As Byte At B1 + 1 Overlay
Dim B2 As Integer
Dim B2_low As Byte At B2 Overlay
Dim B2_high As Byte At B2 + 1 Overlay
Dim Mb As Integer
Dim Mb_low As Byte At Mb Overlay
Dim Mb_high As Byte At Mb + 1 Overlay
Dim Mc As Integer
Dim Mc_low As Byte At Mc Overlay
Dim Mc_high As Byte At Mc + 1 Overlay
Dim Mc2 As Long
Dim Md As Integer
Dim Md_low As Byte At Md Overlay
Dim Md_high As Byte At Md + 1 Overlay
'Переменные для получения сырых данных температуры с BMP085
Dim Ut As Long
Dim Ut_low As Byte At Ut Overlay
Dim Ut_high As Byte At Ut + 1 Overlay
'Переменные для получения сырых данных давления с BMP085
Dim Up As Long
Dim Up_xlow As Byte At Up Overlay
Dim Up_low As Byte At Up + 1 Overlay
Dim Up_high As Byte At Up + 2 Overlay
'Переменные для расчётов температуры, давления и высоты, полученные с BMP085
'Именно такая размерность переменной B4, иначе будет ошибка в расчётах
'смотреть стр.14 документации (BST-BMP085-DS000-06 | Revision 1.3 | August 2011) на датчик BMP085
Dim B4 As Dword
Dim B3 As Long
Dim B3a As Long
Dim B5 As Long
Dim B6 As Long
Dim B6a As Long
Dim B7 As Long
Dim X1 As Long
Dim X2 As Long
Dim X2a As Long
Dim X3 As Long
Dim T As Long
Dim T_bmp085 As Long
Dim P_bmp085 As Long
Dim P2_bmp085 As Long
Dim X1t As Single
Dim T_bmp085_single As Single
Dim P_bmp085_single As Single
Dim Высота_bmp085_single As Single
'Переменные для готовых строковых значений с BMP085
Dim Высота_bmp085_str As String * 10
Dim Давление_bmp085_str As String * 10
Dim Температура_bmp085_str As String * 10
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
' З А П У С К И П Р Е Д В А Р И Т Е Л Ь Н Ы Е Н А С Т Р О Й К И
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'-------------- Разрешаем работу необходимых прерываний ----------------------
' Enable Int0
'------------ Разрешаем работу всех включенных прерываний --------------------
' Enable Interrupts
'===============================================================================
' Г Л А В Н Ы Й Ц И К Л
'===============================================================================
Главный_цикл:
'Обязательно читаем калибровочные константы, нужны для расчётов
Gosub Чтение_калибр_данных_bmp085
Gosub Запрос_температуры_bmp085
Gosub Запрос_давления_bmp085
Gosub Расчет_температуры_bmp085
Gosub Расчет_давления_bmp085
Gosub Расчет_высоты_bmp085
Print "Температура " ; Температура_bmp085_str ; " °C"
Print "Давление " ; Давление_bmp085_str ; " мм.р.с"
Print "Давление " ; P_bmp085 ; " Па"
Print "Высота " ; Высота_bmp085_str ; " метров"
Print
Print
Waitms 100
' Idle
Goto Главный_цикл:
End
'===============================================================================
' П О Д П Р О Г Р А М М Ы
'===============================================================================
'===============================================================================
Запрос_температуры_bmp085:
'-------------------------------------------------------------------------------
'Запрос температуры с BMP085
I2cstart
I2cwbyte Адрес_запись_bmp085
I2cwbyte &HF4 ' Адрес первой константы, остальные идут по порядку, итого 22 байта
I2cwbyte &H2E ' Запрос температуры
I2cstop
Waitms 5 ' Ждём, согласно документации на BMP085: 4.5 ms
'Получение температуры с BMP085
I2cstart
I2cwbyte Адрес_запись_bmp085
I2cwbyte &HF6 ' Адрес хранения температуры
I2crepstart
I2cwbyte Адрес_чтение_bmp085
I2crbyte Ut_high , Ack 'Адрес &HF6
I2crbyte Ut_low , Nack 'Адрес &HF7
I2cstop
' Print "Ut = " ; Ut
'-------------------------------------------------------------------------------
Return
'===============================================================================
'===============================================================================
Запрос_давления_bmp085:
'-------------------------------------------------------------------------------
'Запрос давления с BMP085
I2cstart
I2cwbyte Адрес_запись_bmp085
I2cwbyte &HF4 ' Адрес первой константы, остальные идут по порядку, итого 22 байта
' Выбираем точность измерения, датчиком BMP085
Select Case Точность_измерений_bmp085
Case 0 : I2cwbyte &H34 ' Запрос давления: &H34(OSS=0)
Case 1 : I2cwbyte &H74 ' Запрос давления: &H74(OSS=1)
Case 2 : I2cwbyte &HB4 ' Запрос давления: &HB4(OSS=2)
Case 3 : I2cwbyte &HF4 ' Запрос давления: &HF4(OSS=3)
End Select ' Select Case Точность_измерений_bmp085
I2cstop
'Ждём, согласно документации на BMP085: min 4.5 ms, в зависимости от OSRS(точности)
Select Case Точность_измерений_bmp085
Case 0 : Waitms 5 ' Согластно документации 4.5 ms
Case 1 : Waitms 10 ' Согластно документации 7.5 ms
Case 2 : Waitms 15 ' Согластно документации 13.5 ms
Case 3 : Waitms 30 ' Согластно документации 25.5 ms
End Select ' Select Case Точность_измерений_bmp085
'Получение давления с BMP085
I2cstart
I2cwbyte Адрес_запись_bmp085
I2cwbyte &HF6 ' Адрес хранения температуры
I2crepstart
I2cwbyte Адрес_чтение_bmp085
I2crbyte Up_high , Ack ' Адрес &HF6
I2crbyte Up_low , Ack ' Адрес &HF7
I2crbyte Up_xlow , Nack ' Адрес &HF8
I2cstop
'Не забываем про сдвиг на "oss" полученных данных с датчика BMP085
'UP = (MSB <<16 + LSB << 8 + XLSB) >> (8 - oss)
Oss = 8 - Точность_измерений_bmp085
Shift Up , Right , Oss ' Сдвигаем на "8 - oss", смотреть документацию стр.12
' Print "Up = " ; Up
'-------------------------------------------------------------------------------
Return
'===============================================================================
'===============================================================================
Расчет_высоты_bmp085:
'-------------------------------------------------------------------------------
'Смотреть стр.15, п.п.3.6 документации (BST-BMP085-DS000-06 | Revision 1.3 | August 2011) на датчик BMP085
Высота_bmp085_single = P_bmp085 / Const_стандартная_атмосфера
Высота_bmp085_single = Высота_bmp085_single ^ Const_1делить5255
Высота_bmp085_single = 1 - Высота_bmp085_single
Высота_bmp085_single = Высота_bmp085_single * 44330
Высота_bmp085_single = Высота_bmp085_single + Const_коррекция_показаний
Print "Высота single = " ; Высота_bmp085_single
' Высота_bmp085_str = Fusing(высота_bmp085_single , "#.&")
'-------------------------------------------------------------------------------
Return
'===============================================================================
'===============================================================================
Расчет_температуры_bmp085:
'-------------------------------------------------------------------------------
Ut = Ut - Ac6
X1t = Ut * Ac5a
X3 = X1t + Md
X2 = Mc2 / X3 ' Mc2 расчитывается при чтении калибровочных констант
B5 = X1t + X2
T = B5 + 8
Shift T , Right , 4 , Signed ' Аналог деления на 2^4
'Получаем температуру в "°С" с десятыми
T_bmp085_single = T / 10
Print "T_single = " ; T_bmp085_single
' Температура_bmp085_str = Fusing(t_bmp085_single , "&.&")
'-------------------------------------------------------------------------------
Return
'===============================================================================
'===============================================================================
Расчет_давления_bmp085:
'-------------------------------------------------------------------------------
B6 = B5 - 4000
B6a = B6 * B6
Shift B6a , Right , 12 , Signed ' Аналог деления на 2^12
X1 = B2 * B6a
Shift X1 , Right , 11 , Signed ' Аналог деления на 2^11
X2 = Ac2 * B6
Shift X2 , Right , 11 , Signed ' Аналог деления на 2^11
X3 = X1 + X2
'В документации строку формулы: B3 = (( AC1 * 4 + X3 ) << oss + 2 ) / 4
'следует понимать так: B3 = (( AC1 * 4 + X3 ) << oss ) + 2 ) / 4
Ac1a = Ac1 * 4
Ac1a = Ac1a + X3
Shift Ac1a , Left , Точность_измерений_bmp085
Ac1a = Ac1a + 2
B3 = Ac1a / 4
B6a = B6 * Ac3
X1 = B6a / 8192 ' 2^13
B6a = B6 * B6
Shift B6a , Right , 12 , Signed ' Аналог деления на 2^12
X2 = B1 * B6a
Shift X2 , Right , 16 , Signed ' Аналог деления на 2^16
X3 = X1 + X2
X3 = X3 + 2
Shift X3 , Right , 2 , Signed ' Аналог деления на 2^2
B4 = X3 + 32768 ' 2^15
B4 = B4 * Ac4
Shift B4 , Right , 15 , Signed ' Аналог деления на 2^15
B7 = Up - B3
B3a = 50000
Shift B3a , Right , Точность_измерений_bmp085
B7 = B7 * B3a
If B7 < &H80000000 Then
P_bmp085 = B7 * 2
P_bmp085 = P_bmp085 / B4
Else
P_bmp085 = B7 / B4
P_bmp085 = P_bmp085 * 2
End If
P2_bmp085 = P_bmp085
Shift P2_bmp085 , Right , 8 , Signed ' Аналог деления на 2^8
X1 = P2_bmp085 * P2_bmp085
X1 = X1 * 3038
Shift X1 , Right , 16 , Signed ' Аналог деления на 2^16
X2 = -7357 * P_bmp085
Shift X2 , Right , 16 , Signed ' Аналог деления на 2^16
P2_bmp085 = P_bmp085
P_bmp085 = X2 + 3791
P_bmp085 = P_bmp085 + X1
Shift P_bmp085 , Right , 4 , Signed ' Аналог деления на 2^4
P_bmp085 = P_bmp085 + P2_bmp085
'Переводим в привычные миллиметры ртутного столба
'1 Паскаль = ~ 0.0075006 мм рт. ст. Или 1 мм рт. ст. = ~ 133,3224 Паскаля
P_bmp085_single = P_bmp085 * 0.0075006
Print "P_bmp085 = " ; P_bmp085
Print "P_single = " ; P_bmp085_single
' Давление_bmp085_str = Fusing(p_bmp085_single , "#.&")
'-------------------------------------------------------------------------------
Return
'===============================================================================
'===============================================================================
Чтение_калибр_данных_bmp085:
'-------------------------------------------------------------------------------
'Читаем калибровочные константы с датчика давления BMP085
I2cstart
I2cwbyte Адрес_запись_bmp085
I2cwbyte &HAA ' Адрес первой константы, остальные идут по порядку, итого 22 байта
I2crepstart
I2cwbyte Адрес_чтение_bmp085
I2crbyte Ac1_high , Ack
I2crbyte Ac1_low , Ack
I2crbyte Ac2_high , Ack
I2crbyte Ac2_low , Ack
I2crbyte Ac3_high , Ack
I2crbyte Ac3_low , Ack
I2crbyte Ac4_high , Ack
I2crbyte Ac4_low , Ack
I2crbyte Ac5_high , Ack
I2crbyte Ac5_low , Ack
I2crbyte Ac6_high , Ack
I2crbyte Ac6_low , Ack
I2crbyte B1_high , Ack
I2crbyte B1_low , Ack
I2crbyte B2_high , Ack
I2crbyte B2_low , Ack
I2crbyte Mb_high , Ack
I2crbyte Mb_low , Ack
I2crbyte Mc_high , Ack
I2crbyte Mc_low , Ack
I2crbyte Md_high , Ack
I2crbyte Md_low , Nack
I2cstop
'Калибровочные константы реального датчика BMP085
' Ac1 = 7192
' Ac2 = -1185
' Ac3 = -14421
' Ac4 = 33300
' Ac5 = 25339
' Ac6 = 18518
' B1 = 5498
' B2 = 63
' Mb = -32768
' Mc = -11075
' Md = 2432
'Печатаем калибровочные константы датчика BMP085
' Print
' Print "Калибровочные константы BMP085"
' Print "Ac1 = " ; Ac1
' Print "Ac2 = " ; Ac2
' Print "Ac3 = " ; Ac3
' Print "Ac4 = " ; Ac4
' Print "Ac5 = " ; Ac5
' Print "Ac6 = " ; Ac6
' Print "B1 = " ; B1
' Print "B2 = " ; B2
' Print "Mb = " ; Mb
' Print "Mc = " ; Mc
' Print "Md = " ; Md
' Print
Mc2 = Mc * 2048 ' Аналог умножения на 2^11
' Print "MC2 = " ; Mc2
Ac5a = Ac5 / 32768 ' Аналог деления на 2^15
' Print "Ac5a = " ; Ac5a
'-------------------------------------------------------------------------------
Return
'===============================================================================