Ср мар 06, 2019 17:42:26
Ср мар 06, 2019 17:48:53
Ср мар 06, 2019 22:25:47
Чт мар 07, 2019 00:23:09
num2dec1(_bmp280_temp,2);
uart_puts("\r");
_bmp280_temp--;
_bmp280_temp^=0xFFFFFFFF;
num2dec1(_bmp280_temp,2);
uart_puts("\r");
// вывод в терминале
23.22
-23.22
Прошу прощения за мое невежество, но - не знаю. Пишу в 7 AtmelStudio, на уровне чайника с боольшим носиком.DESIER писал(а):А в каком компиляторе вы пишите?
Вт мар 19, 2019 15:41:14
if (temper_float >100) // если значение температуры перевалило в отрицательные значения
{
temper_float = 409.6-temper_float;
temper_float = -temper_float;
}
Вт мар 19, 2019 16:35:34
temperature = 1.32 C
pressure = 97999 Pa, 735.05 mmHg
RAW data
raw_pressure = 0x0004DCE0 := 318688
raw_temperature = 0x0006F840 := 456768
o
temperature = 1.27 C
pressure = 97997 Pa, 735.03 mmHg
RAW data
raw_pressure = 0x0004DCB0 := 318640
raw_temperature = 0x0006F7A0 := 456608
o
temperature = 1.19 C
pressure = 97994 Pa, 735.01 mmHg
RAW data
raw_pressure = 0x0004DC60 := 318560
raw_temperature = 0x0006F6A0 := 456352
o
temperature = 1.02 C
pressure = 98000 Pa, 735.06 mmHg
RAW data
raw_pressure = 0x0004DBA0 := 318368
raw_temperature = 0x0006F490 := 455824
/* И ВНЕЗАПНО!! */
o
temperature = 86 C
pressure = 97993 Pa, 735.00 mmHg
RAW data
raw_pressure = 0x0004DB10 := 318224
raw_temperature = 0x0006F280 := 455296
o
temperature = 85 C
pressure = 97995 Pa, 735.02 mmHg
RAW data
raw_pressure = 0x0004DB00 := 318208
raw_temperature = 0x0006F260 := 455264
# define BMP280_ST_DIG_T1_MIN UINT16_C ( 19000 )
# define BMP280_ST_DIG_T1_MAX UINT16_C ( 35000 )
# define BMP280_ST_DIG_T2_MIN UINT16_C ( 22000 )
# define BMP280_ST_DIG_T2_MAX UINT16_C ( 30000 )
# define BMP280_ST_DIG_T3_MIN INT16_C (- 3000 )
# define BMP280_ST_DIG_T3_MAX INT16_C (- 1000 )
# define BMP280_ST_DIG_P1_MIN UINT16_C ( 30000 )
# define BMP280_ST_DIG_P1_MAX UINT16_C ( 42000 )
# define BMP280_ST_DIG_P2_MIN INT16_C (- 12970 )
# define BMP280_ST_DIG_P2_MAX INT16_C (- 8000 )
# define BMP280_ST_DIG_P3_MIN INT16_C (- 5000 )
# define BMP280_ST_DIG_P3_MAX UINT16_C ( 8000 )
# define BMP280_ST_DIG_P4_MIN INT16_C (- 10000 )
# define BMP280_ST_DIG_P4_MAX UINT16_C ( 18000 )
# define BMP280_ST_DIG_P5_MIN INT16_C (- 500 )
# define BMP280_ST_DIG_P5_MAX UINT16_C ( 1100 )
# define BMP280_ST_DIG_P6_MIN INT16_C (- 1000 )
# define BMP280_ST_DIG_P6_MAX UINT16_C ( 1000 )
# define BMP280_ST_DIG_P7_MIN INT16_C (- 32768 )
# define BMP280_ST_DIG_P7_MAX UINT16_C ( 32767 )
# define BMP280_ST_DIG_P8_MIN INT16_C (- 30000 )
# define BMP280_ST_DIG_P8_MAX UINT16_C ( 10000 )
# define BMP280_ST_DIG_P9_MIN INT16_C (- 10000 )
# define BMP280_ST_DIG_P9_MAX UINT16_C ( 30000 )
Calibration coefficients
T1 28286
T2 26445
T3 50 X
P1 38173
P2 -11029
P3 3024
P4 6663
P5 -33 X
P6 -7 X
P7 15500
P8 -14600 X
P9 6000
WARNING! 4 ERROR[s] in calibration constants found.
Ср мар 20, 2019 10:45:28
При положительном значении ( S=0 ) код перевести в десятичный и умножить на 0,0625 °C.
При отрицательном значении ( S=1 ) сначала необходимо перевести дополнительный код в прямой. Для этого надо инвертировать каждый разряд двоичного кода и прибавить 1. А затем перевести в десятичный и умножить на 0,0625 °C.
uint32_t I2C1_ReadDataU24(uint8_t addr, uint8_t Reg)
{
uint8_t data[3];
uint32_t rezult =0;
data[0] = I2C1_MemoryRead(addr, Reg);
data[1] = I2C1_MemoryRead(addr, Reg + 1);
data[2] = I2C1_MemoryRead(addr, Reg + 2);
rezult = data[0];
rezult = rezult<<8;
rezult |= data[1];
rezult = rezult<<8;
rezult |= data[2];
return rezult;
}
Вт мар 26, 2019 16:16:28
Ср июн 15, 2022 06:40:39
Ср июн 15, 2022 12:42:25
Ср июн 15, 2022 17:11:00
Чт июн 16, 2022 17:14:39
Пт июн 17, 2022 07:55:21
BMPE_Cal.dig_P9 = I2C_Read8(BMPE_Address, 0x9E);
// Костыль. Датчик вешает шину, не позволяя дать NACK.
if ((GPIOF->IDR & GPIO_IDR_IDR_0) == 0) {
GPIOF->BSRR = GPIO_BSRR_BS_1;
GPIOF->MODER &= 0xFFFFFFF3;
GPIOF->MODER |= 0x00000004;
while ((GPIOF->IDR & GPIO_IDR_IDR_0) == 0) {
delay_us(5);
GPIOF->BSRR = GPIO_BSRR_BR_1;
delay_us(5);
GPIOF->BSRR = GPIO_BSRR_BS_1;
};
GPIOF->MODER &= 0xFFFFFFF3;
GPIOF->MODER |= 0x00000008;
};
InitI2C2();
uint8_t I2C_Read8(uint8_t DevAddr, uint8_t RegAddr) {
uint8_t value;
(void) (I2C2->ISR);
I2C2->TXDR = RegAddr;
I2C2->ICR = I2C_ICR_STOPCF;
I2C2->CR2 = (I2C_CR2_AUTOEND | ((DevAddr << 1) & 0xFE) | (1<<16) | I2C_CR2_START);
while (!(I2C2->ISR & (I2C_ISR_TXE | I2C_ISR_NACKF))) {};
if (I2C2->ISR & I2C_ISR_NACKF) {
I2C2->ICR = I2C_ICR_STOPCF | I2C_ICR_NACKCF;
delay_ms(1);
return -1;
};
I2C2->ICR = 0x3F38; // В очередной раз сбрасываем флаги
// Настраиваем модуль на чтение одного (1) байта, сразу готовимся ответить NACK, и запускаем (START) передачу.
I2C2->CR2 = (I2C_CR2_AUTOEND | I2C_CR2_NACK | ((DevAddr << 1) & 0xFE) | I2C_CR2_RD_WRN | (1<<16) | I2C_CR2_START);
while (!(I2C2->ISR & I2C_ISR_RXNE)) {}; // Успешно читаем результат
value = (I2C2->RXDR); // Возвращаем значение. STOP должен сгенерироваться самостоятельно (AUTOEND).
return value;
}
void I2C_Write8(uint8_t DevAddr, uint8_t RegAddr, uint8_t RegValue) {
I2C2->TXDR = RegAddr;
I2C2->ICR = 0x3F38;
I2C2->CR2 = (((DevAddr << 1) & 0xFE) | (2<<16) | I2C_CR2_START);
while (!(I2C2->ISR & I2C_ISR_TXE)) {}; // <--------- Вот тут виснем, ибо SCK = 1, SDA = 0. WTF?
I2C2->TXDR = RegValue;
while (!(I2C2->ISR & I2C_ISR_TXE)) {};
I2C2->CR2 = I2C_CR2_STOP;
}
Пт июн 17, 2022 17:01:15
Пн июн 20, 2022 06:22:17
SCK ````|____|````|____|````|____|````|____|````|____
SDA ``|__(s)___(0)__|````(1)```|___(0)__|``````````|_
Вт июн 21, 2022 18:44:45
Ср июн 22, 2022 06:29:35
Вт янв 31, 2023 18:53:13
Вт янв 31, 2023 19:09:54
Сб фев 04, 2023 14:03:25