Форум РадиоКот 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 не заводится |
Цитата: какие последовательности я должен слать, например в терминал, чтобы получить данные? Цитата: Понятно, вопрос о документации снимаю как неактуальный. Я уже не удивлен. Такое ощущение, что нынче не модно читать документацию Ещё чего - читать документацию . Читать уже не модно. |
Автор: | 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 } |
Автор: | 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_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/ |