Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Датчик Si7021
Датчик Si7021
throgvar Дата: Чт, 30.06.2016, 14:25  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 25
Репутация: 0   ±
Замечания:   ±
На сайте с 14.09.2012

Статус: Offline

Коллеги, кто работал с датчиком Si7021, подскажите, что делаю не так? PIC16F628A, I2C софтверный, само собой, на одной шине висят часы DS3231 и вышеуказанный датчик. C часами все прекрасно - данные записываются и читаются, а с Si7021 всегда читается 01FF... Вот процедура измерения/чтения влажности, где ошибка?


Сообщение отредактировал throgvar - Чт, 30.06.2016, 17:28
ЯНДЕКС Дата: 30.06.2016
Matrix252005 Дата: Чт, 30.06.2016, 16:59  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 682
Репутация: 36   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Приятного времени суток!!!!

throgvar, попробуйте свой проект в протеусе, в нем есть модель SHT21, она похожа с Si7021...


THE TRUTH IS OUT THERE.

С уважением, Николай.
ivan_fd Дата: Чт, 30.06.2016, 18:21  |                                                                                                                Сообщение # 3
Группа: Модераторы
Ранг:  Специалист
Сообщений: 915
Репутация: 54   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

throgvar,  тот кусок кода, что Вы дали ничего не говорит. Давайте нормальный.
Датчик 3.3в., надеюсь Вы уровни согласовали. И адрес датчика 0x40, а не 0x80.


Меня все время преследуют умные мысли...но я быстрее!!!
Сообщение отредактировал ivan_fd - Чт, 30.06.2016, 18:23
ivan_fd Дата: Чт, 30.06.2016, 18:22  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Специалист
Сообщений: 915
Репутация: 54   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Matrix252005, быстренько пишите еще один пост. Любой. smile

Меня все время преследуют умные мысли...но я быстрее!!!
throgvar Дата: Чт, 30.06.2016, 18:45  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 25
Репутация: 0   ±
Замечания:   ±
На сайте с 14.09.2012

Статус: Offline

ivan_fd, датчик взял на готовой платке c обвязкой (стаб и конвертер уровней)
Если приписать к адресу 0x40 ноль или единицу справа (младший бит, R/W) - получаем 0x80 или 0x81.

Вот код всей проги, после небольшой оптимизации, не повлиявшей на результат.



Сообщение отредактировал throgvar - Чт, 30.06.2016, 18:46
ivan_fd Дата: Чт, 30.06.2016, 19:33  |                                                                                                                Сообщение # 6
Группа: Модераторы
Ранг:  Специалист
Сообщений: 915
Репутация: 54   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Фото платы с двух сторон можете сделать.
Завтра посмотрю на даташит датчика.


Меня все время преследуют умные мысли...но я быстрее!!!
throgvar Дата: Чт, 30.06.2016, 20:34  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 25
Репутация: 0   ±
Замечания:   ±
На сайте с 14.09.2012

Статус: Offline

ivan_fdстраница товара на EBAY
вот схема
Заранее спасибо!

Сообщение отредактировал throgvar - Чт, 30.06.2016, 20:36
AndrF Дата: Чт, 30.06.2016, 21:33  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 159
Репутация: 3   ±
Замечания:   ±
На сайте с 03.02.2012

Статус: Offline

Другая похожая платка с датчиком. В отличии от вышеприведенного меряет давление, температуру и влажность. Совместима по выводам разьемчика..
throgvar Дата: Чт, 30.06.2016, 22:13  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 25
Репутация: 0   ±
Замечания:   ±
На сайте с 14.09.2012

Статус: Offline

AndrFнемного дешевле
Matrix252005 Дата: Пт, 01.07.2016, 10:40  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 682
Репутация: 36   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Приятного времени суток!!!

Цитата ivan_fd ()
Matrix252005, быстренько пишите еще один пост. Любой.
Спасибо Иван!!! Что то я не заметил этого...  surprised

Добавлено (01.07.2016, 08:08)
---------------------------------------------
throgvar, есть пару вопросов по Вашему коду:

зачем Вы 2 раза считываете влажность???

Цитата throgvar ()
If second<>oldsec Then Call humid: Call termo:Call humid
попробуйте накидать отдельную прогу, для считывания с Si7021...
Вы пробовали свой код в протеусе???

И наконец, попробуйте так:

humid:
          BStart
          BusOut wr7021
          BusOut $e5
          BReStart
          BusOut rd7021
          humidity.HighByte=BusIn
          humidity.LowByte=BusIn
          CRC = BusIn                   ' это может и не нужно
          BusNack
          BStop
Return

Добавлено (01.07.2016, 10:40)
---------------------------------------------
throgvar, попробуйте этот пример:

main:

    BStart
        BusOut $80
        BusOut $F3
        DelayMS 100 
        BReStart
        BusOut $81
        temper.HighByte = BusIn

        temper.LowByte = BusIn
'        CRC = BusIn 
    BStop

    BStart
        BusOut $80
        BusOut $F5
        DelayMS 100 
        BReStart
        BusOut $81
        humidity.HighByte = BusIn

        humidity.LowByte = BusIn
        CRC = BusIn 
    BStop

    tempr = (temper / 65536)
    tempr = (-46.85 + (175.72 * tempr))

    humidit = (humidity/ 65536)
    humidit =  (-6 + (125 * humidit))

'    Print At 1, 1, Hex4 CRC
    Print At 2, 1, Dec2 humidit, " ", Dec2 tempr

    DelayMS 500

GoTo main


THE TRUTH IS OUT THERE.

С уважением, Николай.
throgvar Дата: Пт, 01.07.2016, 10:41  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 25
Репутация: 0   ±
Замечания:   ±
На сайте с 14.09.2012

Статус: Offline

Matrix252005, двойное измерение - ошибка, там было чтение CRC, не заметил

в протеусе не пробовал, да и зачем протеус, если уже собран макет? Да ине очень я протеусу доверяю, в личной практике был случай, когда простенькая прога, управляющая встроенными PWM в протеусе работала, а в железе - нет.

Ваша версия кода с Si7021 считывает нули, а вдобавок сбивает чтение с часов: вместо времени через раз считываются FF
Matrix252005 Дата: Пт, 01.07.2016, 10:52  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 682
Репутация: 36   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Да... Забыл добавить: 

Dim tempr As Float
Dim humidit As Float

Проверял в проте.... Температура вроде бы в норме... А вот влажность врет...

Добавлено (01.07.2016, 10:52)
---------------------------------------------
Да... Еще... Попробуйте вместо $F3 и $F5 поставить $Е3 и $Е5...

Да я тоже не доверяю проту.... Но иногда можно....

Да и тех МК, с которыми я работаю, их просто нет в проте...


THE TRUTH IS OUT THERE.

С уважением, Николай.
throgvar Дата: Пт, 01.07.2016, 11:20  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 25
Репутация: 0   ±
Замечания:   ±
На сайте с 14.09.2012

Статус: Offline

Matrix252005, спасибо за подсказку! После команды на измерение влажности нужна была задержка, 100 мс - перебор, вполне достаточно 20.
И еще, ваш код выдает FF в младшем байте, немного поправил - все заработало

humid:
BStart
BusOut $80
BusOut $F5
DelayMS 20
BReStart
BusOut $81
humidity.HighByte = BusIn
BusAck
humidity.LowByte = BusIn
BusNack
BStop
Return

termo:
BStart
BusOut $80
BusOut $e0
BReStart
BusOut $81
temper.HighByte = BusIn
BusAck
temper.LowByte = BusIn
BusNack
BStop
Return

температуру лучше читать командой E0, она не запускает измерение, а выдает температуру, при которой в последний раз мерялась влажность, т.е. работает быстрее и экономичнее.

Сообщение отредактировал throgvar - Пт, 01.07.2016, 13:14
Matrix252005 Дата: Пт, 01.07.2016, 11:30  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 682
Репутация: 36   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Цитата throgvar ()
Matrix252005, спасибо за подсказку!
biggrin Всегда ПЛЗ!!!


THE TRUTH IS OUT THERE.

С уважением, Николай.
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Датчик Si7021
Страница 1 из 11
Поиск: