Например TDA7294

Форум РадиоКот :: Просмотр темы - BMP085 не заводится
Форум РадиоКот
https://radiokot.ru/forum/

BMP085 не заводится
https://radiokot.ru/forum/viewtopic.php?f=61&t=80292
Страница 1 из 1

Автор:  Dj_Alex [ Чт ноя 08, 2012 18:17:45 ]
Заголовок сообщения:  BMP085 не заводится

Не могу завести BMP085 на Атмеге32 в Codevision. Датчик брался в деалэктриме уже распаянный с подтяжкой, конденсаторами и стабилизатором на 3,3 В. Мега питалась от 5 В и 3,8 В (ниже уже не показывает ЖК).
Проблема в том, что содержимое любого байта регистра возвращается как FF, да и при отключеном датчике программа работает также и показывает 255 (т.е. FF). Ощущение, что датчик совсем нерабочий.
вот код чтения
Код:
   i2c_start();
   i2c_write(BMP085_I2C_ADDRESS);
   i2c_write(0xAA);
   i2c_start();
   i2c_write(BMP085_I2C_ADDRESS | 1);
   ac1 =i2c_read(0);
   i2c_stop();

i2c_start() выдает 1, что означает шина свободна. Это значит нет устройств?

Как определить адреса устройств, которые висят на шине? В примере для Raspberry Pi значится #define BMP085_I2C_ADDRESS 0x77

Автор:  mas123 [ Чт ноя 08, 2012 19:35:38 ]
Заголовок сообщения:  Re: BMP085 не заводится

Dj_Alex писал(а):
Мега питалась от 5 В и 3,8 В
Если Мега работала на +5, то эти +5 были и по SDA/SDL. Могло пожечь датчик.
Dj_Alex писал(а):
Ощущение, что датчик совсем нерабочий.
Документация на датчик читалась?
Dj_Alex писал(а):
i2c_start() выдает 1, что означает шина свободна. Это значит нет устройств?
А что говорит документация CV на эту функцию? Что должно вернуть?

Dj_Alex писал(а):
Как определить адреса устройств, которые висят на шине? В примере для Raspberry Pi значится #define BMP085_I2C_ADDRESS 0x77
Понятно, вопрос о документации снимаю как неактуальный. Я уже не удивлен. Такое ощущение, что нынче не модно читать документацию :)))
4.2 Device and register address
The BMP085 module address is shown below. The LSB of the device address distinguishes between read (1) and write (0) operation, corresponding to address 0xEF (read) and 0xEE (write).


Имхо, гораздо проще, быстрее и интереснее открыть даташит на BMP085, даташит на TWI в Атмеге и за полчаса набросать функции записи/чтения. Вместо использования каких-то примеров, без понимания что и как там делается.
Спойлер
Код:
//----------
// команда чтения регистра BMP085
#define BMP085_R 0xEF

// команда записи регистра BMP085
#define BMP085_W 0xEE
//----------
void TwiInit()
{
    // Конфигурация TWI модуля
// Ftwi = F / ( 16 + 2 *TWBR * TWPS)
// Bit Rate: 250,000 kHz
    TWBR = 0;
    TWSR = ( (0<<TWPS1) | (0<<TWPS0) ); // делитель частоты = 1
    TWAR = 0x00;

    TWDR = 0xFF;                                      // Default content = SDA released.
    TWCR = (1 << TWEN)|                                 // Enable TWI-interface and release TWI pins.
         (0 << TWIE) | (0 << TWINT)|                      // Disable Interupt.
         (0 << TWEA) | (0 << TWSTA) | (0 << TWSTO)|           // No Signal requests.
         (0 << TWWC);                                 //
}
//----------

unsigned int bmp085_ReadReg(char cAddr)
{
    r_Measure.bTwiError = 1; // ошибка i2c
    unsigned int data = 0xFFFF;
// старт TWI
    TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    while( !(TWCR & (1<<TWINT) ) );
    // Проверка статуса
    if( (TWSR & 0xF8) != TWI_START )
        return data;

// адрес устройства
    TWDR = BMP085_W;
    TWCR = (1<<TWINT) | (1<<TWEN);
    while( !(TWCR & (1<<TWINT)) );
    if( (TWSR & 0xF8) != TWI_MTX_ADR_ACK )
        return data;

// адрес регистра
    TWDR = cAddr;
    TWCR = (1<<TWINT) | (1<<TWEN);
    while( !(TWCR & (1<<TWINT)) );
    if( (TWSR & 0xF8) != TWI_MTX_DATA_ACK )
        return data;

// перезапуск i2c
    TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    while( !(TWCR & (1<<TWINT)) );
    if( (TWSR & 0xF8) != TWI_REP_START )
        return data;

// адрес устройства
    TWDR = BMP085_R;
    TWCR = (1<<TWINT) | (1<<TWEN);
    while( !(TWCR & (1<<TWINT)) );
    if( (TWSR & 0xF8) != TWI_MRX_ADR_ACK )
        return data;

// отсылаем ACK
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
    // Ожидание  выполнения
    while( !(TWCR & (1<<TWINT)) );
    //Проверка статуса
    if( (TWSR & 0xF8) != TWI_MRX_DATA_ACK )
        return data;
    // Чтение данных, MSB
    char cMSB = TWDR;

// отсылаем NACK
    TWCR = (1<<TWINT) | (1<<TWEN);
    // Ожидание  выполнения
    while( !(TWCR & (1<<TWINT)) );
    //Проверка статуса
    if( (TWSR & 0xF8) != TWI_MRX_DATA_NACK )
        return data;
    // Чтение данных, MSB
    char cLSB = TWDR;

//Put Stop Condition on bus
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
//Wait for STOP to finish
    while( TWCR & (1<<TWSTO) );

    data = (cMSB << 8) + cLSB;
    r_Measure.bTwiError = 0; // отработали успешно
    return data;
}

char bmp085_WriteReg(char cAddr, char cData)
{
// старт TWI
    TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    while( !(TWCR & (1<<TWINT) ) );
    // Проверка статуса
    if( (TWSR & 0xF8) != TWI_START )
        return 0;

// адрес устройства
    TWDR = BMP085_W;
    TWCR = (1<<TWINT) | (1<<TWEN);
    while( !(TWCR & (1<<TWINT)) );
    if( (TWSR & 0xF8) != TWI_MTX_ADR_ACK )
        return 0;

// адрес регистра
    TWDR = cAddr;
    TWCR = (1<<TWINT) | (1<<TWEN);
    while( !(TWCR & (1<<TWINT)) );
    if( (TWSR & 0xF8) != TWI_MTX_DATA_ACK )
        return 0;

// записываемые данные
    TWDR = cData;
    TWCR = (1<<TWINT) | (1<<TWEN);
    while( !(TWCR & (1<<TWINT)) );
    if( (TWSR & 0xF8) != TWI_MTX_DATA_ACK )
        return 0;

//Put Stop Condition on bus
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
//Wait for STOP to finish
    while( TWCR & (1<<TWSTO) );
    return 1; // отработали успешно
}

Автор:  Ser60 [ Чт ноя 08, 2012 19:44:08 ]
Заголовок сообщения:  Re: BMP085 не заводится

Согласно ДШ байт с I2C адресом для записи в BMP085 должен быть 0хЕЕ. Я не знаю как работает CodeVison, может он сдвигает адрес 0х77 на бит влево для получения 0хЕЕ. Однако, тогда, адрес для чтения 0х77 | 1 до сдвига будет тоже 0х77 (?) Попробуйте адреса 0хЕЕ и 0хEF.
http://www.bosch-sensortec.com/content/language1/downloads/BST-BMP085-DS000-05.pdf

Автор:  Zorg [ Вт янв 22, 2013 15:24:00 ]
Заголовок сообщения:  Re: BMP085 не заводится

Народ, аналогичная проблема, помогите понять алгоритм обращения к датчику. У меня есть адаптер USB <-> I2C на микроконтроллере PIC (с поддержкой шины). Обмен данными с этим адаптером осуществляется через виртуальный COM-порт, собственно, какие последовательности я должен слать, например в терминал, чтобы получить данные?

Автор:  ILYAUL [ Вт янв 22, 2013 15:37:44 ]
Заголовок сообщения:  Re: BMP085 не заводится

Цитата:
какие последовательности я должен слать, например в терминал, чтобы получить данные?

Цитата:
Понятно, вопрос о документации снимаю как неактуальный. Я уже не удивлен. Такое ощущение, что нынче не модно читать документацию

Ещё чего - читать документацию . Читать уже не модно. :cry:

Автор:  Zorg [ Вт янв 22, 2013 15:49:08 ]
Заголовок сообщения:  Re: BMP085 не заводится

Понимаю ваш сарказм, но хотелось бы услышать совет от понимающих людей.

Пример последовательности для чтения данных с регистра датчика температуры:
1. EE F4 2E - результат нулевой
2. 77 F4 2E - последовательность FF

Автор:  minakan [ Вт янв 22, 2013 16:20:44 ]
Заголовок сообщения:  Re: BMP085 не заводится

Проект на BMP085 с исходниками.
http://avrproject.ru/publ/barometr_na_bmp085/1-1-0-102

Автор:  Zorg [ Вт янв 22, 2013 16:42:21 ]
Заголовок сообщения:  Re: BMP085 не заводится

Спасибо, но если бы мне необходимо было получать данные микроконтроллером, то вопросов бы не было. У меня же замеры должны осуществляться компьютером через виртуальный COM-порт, который по сути выполняет функции шины I2C. И прежде чем написать софт, мне необходимо узнать, какую последовательность команд выставлять на шину I2C через тот же терминал, чтобы получить ответ от датчика.

Буду очень признателен за советы!

Автор:  minakan [ Вт янв 22, 2013 17:17:50 ]
Заголовок сообщения:  Re: BMP085 не заводится

Извините не понял сразу.
Да пожалуй и никто не поймет.
Вы ничего не сказали, что у вас за адаптер. Какой датчик температуры они там подключают...
Надо разбираться как реализован т.н. "автомат состояний" в вашем пике.
Обмен данных по iic шине с BMP085 приводится на стр. 15 даташита.
Морока в общем.
Проще к готовому проекту типа того, что я вам привел поддержку RS232 прикрутить.

Автор:  Ser60 [ Вт янв 22, 2013 17:22:39 ]
Заголовок сообщения:  Re: BMP085 не заводится

Zorg - народ прав, в том, что ответ на Ваш вопрос присутствут в явном виде в ДШ на сенсор. Именно, внизу на стр. 18 приведен (осциллограммы) пример какие нужно формировать сигналы на выводах SDA и SCL для чтения 2-х байт из сенсора. В проектах на МК для работы с сенсором формируются точно такие-же сигналы, какие Вам нужно будет генерировать через преобразователь USB-I2C. Поэтому посмотреть исходник работающего проекта будет очень полезно. Кстати, не забудьте о необходимости формирования сигналов типа START, STOP, ACK, NACK, которые не сводятся просто к посылке определенных байтов в сенсор.

Автор:  ILYAUL [ Вт янв 22, 2013 18:54:16 ]
Заголовок сообщения:  Re: BMP085 не заводится

Я могу проект на asm дать , вдруг он Вам ближе.

Автор:  vvsv [ Ср мар 12, 2014 00:56:36 ]
Заголовок сообщения:  Re: BMP085 не заводится

Подскажите у кого есть опыт работы с этим датчиком BMP085(BMP180).

Ниже написанный код неверно выдает показания с датчика завышает примерно на 29 мм.рт.ст.

В чем может быть причина?



Спойлер#define BMP085_R 0xEF // Write address
#define BMP085_W 0xEE // Read address
#define OSS 1 // Oversampling Setting

#include <i2c.h>

signed short ac1;
signed short ac2;
signed short ac3;
signed short b1;
signed short b2;
signed short mb;
signed short mc;
signed short md;
unsigned short ac4;
unsigned short ac5;
unsigned short ac6;


long bmp085Read2Bytes(unsigned char address)
{

unsigned int msb=0;
unsigned int lsb=0;
unsigned int data;



delay_ms(10);

i2c_start(); //посылаем команду "старт" в шину i2c
i2c_write(BMP085_W); //посылаем в шину адрес устройства
i2c_write(address); //посылаем в шину адрес читаемой ячейки
i2c_start(); // снова посылаем "старт" в шину
i2c_write(BMP085_R); //пишем адрес устройства(BMP085) + состояние “чтение”
msb=i2c_read(0); //принимаем данные с лини и сохраняем в переменную
i2c_stop();

delay_ms(10);

i2c_start();
i2c_write(BMP085_W);
i2c_write(address+1);
i2c_start();
i2c_write(BMP085_R);
lsb=i2c_read(0);
i2c_stop();
delay_ms(10);

data = (msb << 8 ) + lsb;

return data;
}

long bmp085Read3Bytes(unsigned char address)
{
unsigned char msb=0;
unsigned char lsb=0;
unsigned char xlsb=0;
long int data;


delay_ms(10);

i2c_start();
i2c_write(BMP085_W);
i2c_write(address);
i2c_start();
i2c_write(BMP085_R);
msb=i2c_read(0);
i2c_stop();
delay_ms(10);


delay_ms(10);

i2c_start();
i2c_write(BMP085_W); // Write required to clock in address
i2c_write(address+1); // Mem address
i2c_start(); // Restart
i2c_write(BMP085_R); // Device address for reading
lsb=i2c_read(0); // Read address
i2c_stop(); // Stop
delay_ms(10);

delay_ms(10);

i2c_start();
i2c_write(BMP085_W);
i2c_write(address+2);
i2c_start(); // Restart
i2c_write(BMP085_R);
xlsb=i2c_read(0);
i2c_stop(); // Stop
delay_ms(10);



data =(( msb<< 16)+ (lsb << 8 ) + xlsb) >> (8-OSS);

return data;
}

void BMP085_Calibration(void)
{

ac1 = bmp085Read2Bytes(0xAA);
ac2 = bmp085Read2Bytes(0xAC);
ac3 = bmp085Read2Bytes(0xAE);
ac4 = bmp085Read2Bytes(0xB0);
ac5 = bmp085Read2Bytes(0xB2);
ac6 = bmp085Read2Bytes(0xB4);
b1 = bmp085Read2Bytes(0xB6);
b2 = bmp085Read2Bytes(0xB8);
mb = bmp085Read2Bytes(0xBA);
mc = bmp085Read2Bytes(0xBC);
md = bmp085Read2Bytes(0xBE);

}



long bmp085ReadTemp(void)
{
i2c_start();

i2c_write(BMP085_W);
i2c_write(0xF4);
i2c_write(0x2E);
delay_ms(10);
i2c_stop();

delay_ms(10);

return bmp085Read2Bytes(0xF6);
}


long bmp085ReadPressure(void)
{
i2c_start();
i2c_write(BMP085_W);
i2c_write(0xF4);
i2c_write(0x34 | (OSS << 6));
i2c_stop();

delay_ms(2 + (3<<OSS));
return bmp085Read3Bytes(0xF6);

}


void bmp085Convert(unsigned long *pressure,long *temperature)
{
long x1, x2, x3, b3, b5 ,b6, ut, up;
unsigned long p,b4, b7;




ut = bmp085ReadTemp();
up = bmp085ReadPressure();

x1 = (((long) ut - (long) ac6) * (long) ac5) >> 15;
x2 = ((long) mc << 11) / (x1 + md);
b5 = x1 + x2;
*temperature = ((b5 + 8 ) >> 4);


b6 = b5 - 4000;
x1 = (b2 * ((b6 * b6) >> 12)) >> 11;
x2 = (ac2 * b6) >> 11;
x3 = x1 +x2;
b3 = (((((long)ac1 )*4 + x3) <<OSS) + 2) >> 2;
x1 = (ac3* b6) >> 13;
x2 = (b1 * ((b6*b6) >> 12) ) >> 16;
x3 = ((x1 + x2) + 2) >> 2;
b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
b7 = ((unsigned long)(up - b3) * (50000>>OSS));
if (b7 < 0x80000000)
p = (b7 << 1) / b4;
else
p = (b7 / b4) << 1;
x1 = (p >> 8 )*(p >> 8 );
x1 = (x1 * 3038) >> 16;
x2 = (-7357 * p) >> 16;
p += (x1 + x2 + 3791) >> 4; //press in Pa
p*=100; //для отображения с десятыми долями на моем устройстве.
*pressure= p / 1333; // press in mm Hg //надо делить на 133.322
}


:dont_know:

Автор:  mas123 [ Ср мар 12, 2014 21:29:44 ]
Заголовок сообщения:  Re: BMP085 не заводится

vvsv писал(а):
Ниже написанный код неверно выдает показания с датчика завышает примерно на 29 мм.рт.ст.
Завышение всегда одно и тоже - +29?

vvsv писал(а):
В чем может быть причина?
Уверен в том значении, от которого завышено?
Может быть врет не BMP, а "калибровочный" замеритель?

По коду вроде бы все правильно. Могу только посоветовать вывести все-все сырые значения (калибровочных регистров, сырой замер давления и температуры), посчитать руками и сравнить. Я в своё время так нашёл ошибку со скобками. :)

Автор:  vvsv [ Ср мар 12, 2014 22:16:00 ]
Заголовок сообщения:  Re: BMP085 не заводится

Спасибо.
Попробую.

Автор:  vvsv [ Вт мар 25, 2014 21:50:44 ]
Заголовок сообщения:  Re: BMP085 не заводится

Нашел где была ошибка. :))
исправил.

Теперь имеется библиотека для работы BMP180 ( BMP085) на CodeVisionAVR
Вложение:
BMP085.c [4.38 KiB]
Скачиваний: 852


Для получения значений давления и температуры вставляем строки:

BMP085_Calibration();
bmp085Convert(&pressure_,&temperature_);

Автор:  kk042fjv [ Чт дек 24, 2015 05:57:53 ]
Заголовок сообщения:  Re: BMP085 не заводится

Цитата:
Теперь имеется библиотека для работы BMP180 ( BMP085) на CodeVisionAVR

Прошу прощения за беспокойства, имеется датчик BMP180, хочу сделать метеостанцию, могу писать только CVAVR? подскажите какую библиотеку надо заменить? подскажите начинающему. Заранее спасибо.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/