Например TDA7294

Форум РадиоКот :: Просмотр темы - Некорректный ответ от SHT21
Форум РадиоКот
http://radiokot.ru/forum/

Некорректный ответ от SHT21
http://radiokot.ru/forum/viewtopic.php?f=57&t=166536
Страница 1 из 1

Автор:  densir [ Пт ноя 01, 2019 16:08:49 ]
Заголовок сообщения:  Некорректный ответ от SHT21

Всем доброго здоровья.
Столкнулся с проблемой и не вижу где же я ошибся. Прошу помочь подсказать кто может:)
Суть в следующем, есть МК Атемега32(по сути не важно какая) и датчик влажности/температуры SHT21. Пытаюсь подружить их по шине I2C. проверяю аботу в протеусе 8 версии. и вот тут получаю ошибки в чтении с датчика.
Ниже участок кода для работы с I2C


Запускаю в протеусе и смотрю в I2C дебаггер, от него получаю такую картину:
см вложение.

Как видно из скрина, то ответы от датчика идут через один.
ответ 95 и 12 - корректный
следом за этим идут данные 12 и 12 - и это уже бред. и так по кругу.
Где то есть ошибка, вопрос где? прошу помочь

Добавлено after 2 hours 27 minutes 7 seconds:
Опытным путем, пришел к выводу что проблема где то тут



Вложения:
Безымянный.jpg [124.53 KiB]
Скачиваний: 160

Автор:  NStorm [ Пт ноя 01, 2019 16:59:11 ]
Заголовок сообщения:  Re: Некорректный ответ от SHT21

Ну а если задержку на 1 с раскомментировать - работает как надо?

Автор:  Dimon456 [ Пт ноя 01, 2019 17:44:31 ]
Заголовок сообщения:  Re: Некорректный ответ от SHT21

Попробуйте так
Код:
//Функция чтения с шины TWI (I2C) ПОСЛЕДНЕГО БАЙТА
unsigned char I2C_ReadLastByte(void)
{
   TWCR &= (~(1<<(TWEA)));
   TWCR |= (1<<TWINT)|(1<<TWEN);//включим прием данных
   while(!(TWCR&(1<<TWINT)));//подождем пока установится TWIN
   return TWDR;
}

Автор:  densir [ Пт ноя 01, 2019 18:00:45 ]
Заголовок сообщения:  Re: Некорректный ответ от SHT21

Ну а если задержку на 1 с раскомментировать - работает как надо?

Нет, в протеусе она ни на что не влияет. в железе 100 оставлю.

Добавлено after 38 seconds:
Попробуйте так
Код:
//Функция чтения с шины TWI (I2C) ПОСЛЕДНЕГО БАЙТА
unsigned char I2C_ReadLastByte(void)
{
   TWCR &= (~(1<<(TWEA)));
   TWCR |= (1<<TWINT)|(1<<TWEN);//включим прием данных
   while(!(TWCR&(1<<TWINT)));//подождем пока установится TWIN
   return TWDR;
}

Попробовал. Результата нет

Мне почему то кажется что проблема в unsigned char I2C_Read(void), так как если его закоментировать, то в дебагере отображается получение первыйх восьми бит, и все корректно.
Если же закоментировать unsigned char I2C_ReadLastByte(void, то так же пишутся первые 8 бит, но каждый второй запрос с некорректным ответом

Во втором запросе, второй байт почему то попадает на первое место.

Автор:  NStorm [ Пт ноя 01, 2019 20:37:44 ]
Заголовок сообщения:  Re: Некорректный ответ от SHT21

А что у вас в I2C_Init(); ?

Добавлено after 26 minutes 57 seconds:
Проблема в Hold Master. Уж не знаю реализован ли в меге clock stretching, читать ДШ некогда уже. Но если будете без hold master отправлять запрос на измерение (I2C_SendByte(0b11110101);), то всё заработает.
А может это и глюк протеуса, т.к. проверял тоже в нём.

Добавлено after 8 minutes 8 seconds:
В ДШ написано, что в no hold master, сенсор должен прислать NACK в ответ на чтение, если данные не готовы. А в протеусе в этом режиме первая передача возвращает ACK, но данные с 0. Модель короче в протеусе походу кривая. Зато дальше так начинает работать. Проверяйте лучше в железе.

Автор:  densir [ Сб ноя 02, 2019 17:18:09 ]
Заголовок сообщения:  Re: Некорректный ответ от SHT21

NStorm, в I2C_Init(); у меня следующее:





Сделал, как вы посоветовали, без hold master, и все заработало корректно. проверю позже еще в железе, с hold master, а пока пусть так. Спасибо огромное!

Добавлено after 4 hours 55 minutes 54 seconds:
Так появился новый вопрос по этой же теме.
после того как получили данные от датчика температуры и склеили два байта для получения 16 битного значения, (sht21 отдает значение температуры в 14 битном значении). Согласно даташита нужно произвести вычисления по формуле temp=1*((data*175.72/65536)-46.85)
И вот тут моих знаний не хватает.



При такой записи, на экран выводится только целое значение температуры, без дробей. Логично предположить что нужно изменить тип переменной "temp",на float но в этом случае на экран выводится вообще что попало.
Решения пока не нашел (.

Автор:  Dimon456 [ Сб ноя 02, 2019 19:07:13 ]
Заголовок сообщения:  Re: Некорректный ответ от SHT21

densir писал(а):
При такой записи, на экран выводится только целое значение температуры, без дробей. Логично предположить что нужно изменить тип переменной "temp",на float но в этом случае на экран выводится вообще что попало.
Тут надо sprintf сказать что бы float выводил, что увеличит размер кода и sprintf (buffer, "%f", temp);.
Гораздо проще сделать
Код:
   float temp=1*((data*175.72/65536)-46.85);   
   int integer = (int)temp;
   int fractional = (int)(temp*100)%100;// 100 - 2 знака после запятой
   sprintf (buffer, "%1d.%02d", integer, fractional);

Автор:  densir [ Вс ноя 03, 2019 07:51:39 ]
Заголовок сообщения:  Re: Некорректный ответ от SHT21

Dimon456,
Огромное спасибо. Помогло. Добавил еще одну строку
Код:
fractional=fabs(fractional);

Без нее при отрицательных значених температуры получалась запись типа "-13,-10" вместо "-13,10". Сейчас все отлично! огромное спасибо!

Автор:  densir [ Вс ноя 17, 2019 11:56:11 ]
Заголовок сообщения:  Re: Некорректный ответ от SHT21

Дабы не плодить темы спрошу здесь, все равно эти вопросы по тому же устройству :)

В устройстве имеется многоуровневое меню, с подменю в пунктах. управление будет осуществляться китайским энкодером с кнопкой. Защита от дребезга контактов - программная(имеется счетчик, значение которого инкрементиуются/декрементируется и при достижении некого значения считается что кнопка нажата). так вот при нажатии кнопки возникает такая ситуация, что МК отрабатывает нажатие, переходит в подменю и видя что кнопка все еще нажата проваливается глубже. можно конечно увеличить значение счетчика при котором кнопка дожна срабатывать, но будет складываться впечатление что система тормозит. как можно обойти это? пока в голову ничего не приходит.

Автор:  uk8amk [ Вс ноя 17, 2019 16:36:48 ]
Заголовок сообщения:  Re: Некорректный ответ от SHT21

densir писал(а):
как можно обойти это?

Фиксируйте в программе момент перехода от ненажатого к нажатому состоянию кнопки. К примеру смену уровня H->L после прохождения программной фильтрации. Таким образом вы не будете зависеть от каких-либо задержек кроме минимальной задержки подавления дребезга контактов(20-50мс).

Автор:  NStorm [ Вс ноя 17, 2019 21:35:29 ]
Заголовок сообщения:  Re: Некорректный ответ от SHT21

densir, ждите "отжатия" кнопки и только потом снова начинайте фиксировать нажатие, с учетом антидребезга аналогично.

Автор:  densir [ Пн ноя 18, 2019 06:07:20 ]
Заголовок сообщения:  Re: Некорректный ответ от SHT21

NStorm,
Как же я сам не сообразил!?
Все гениальное просто. Дописал. Спасибо в очередной раз

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