Клеммы, реле, разъемы Degson со склада в России
Новичок
 
Регистрация: 16.03.2011
Адрес: украина харьков
Сообщений: 102
Репутация: 29
19 2
0 0
 
28.06.2013 10:47 #1
pic16f690 не читает DHT11 проблема следующего характера... есть библиотека DHT11 нормально использующаяся на pic24 в микробасике. прилепил ее к piic16 и не читается DHT11... такое впчатление что неправильно работает Delay_ms.

так вот - я написал задержку свою на таймере расчитав предварительно период задержки в 1мкс и сделал while() с счетчиком внутри для проверки времени изменения стартовых действий DHT и вот что получилось... вместо 80мкс я получил 5. был я склонен думаль что частота работы pic16 не соответствует установленой в интерпритаторе... ан нет.. проверив биты настройки частоты - выяснил что все верно. 4 мгц. кстати у меня на работающем устройстве DHT опрашивается значительно чаще рекомендуемой частоты. проблем нет. и 10кОм. это только схема. на устройстве стоит 4.7кОм.больше мыслей пока нет. и прошу по существу... не надо обижать производителей и программистов написавших микроС и микроВасик.

Код:
 sub function OW_Read_Bit_DHT () as byte
 dim i, j, DHT_dat as byte
 DHT_dat = 0
 result = 0
 for j = 7 to 0 step - 1
 i = 0
 while (DHT_bit = 0)
 Delay_us(1)
 if i > 70 then ER_MK.4 = 1 break end if
 INC(i)
 wend
 Delay_us(40)
 If DHT_bit = 1 Then
 result.j = DHT_bit
 end if
 i = 0 '
 while (DHT_bit = 1)
 Delay_us(1)
 if i > 70 then ER_MK.4 = 1 break end if
 INC(i)
 wend
 next j
 end sub

 sub function Read_DHT11() as byte
 dim i as byte
 DHT_byte as byte[4]
 result = 1
 DHT_bit_Direction = 0
 DHT_bit = 0
 Delay_ms(1
 DHT_bit_Direction = 1
 Delay_us(40)
 if DHT_bit = 1 then result = 1 exit end if 'датчик не ответил
 Delay_us(80)
 if DHT_bit = 0 then result = 1 exit end if 'датчик не ответил
 i = 0
 while (DHT_bit = 1)
 Delay_us(1)
 if i > 80 then result = 1 exit end if
 INC(i)
 wend
 DHT_byte[0] = OW_Read_Bit_DHT ()
 DHT_byte[1] = OW_Read_Bit_DHT ()
 DHT_byte[2] = OW_Read_Bit_DHT ()
 DHT_byte[3] = OW_Read_Bit_DHT ()
 Sum_Byte = OW_Read_Bit_DHT ()
 DHT_bit_Direction = 0
 DHT_bit = 1
 i = DHT_byte[0] + DHT_byte[2]
 if i = Sum_Byte then
 iSHT_Humi = DHT_byte[0]
 iSHT_Temp = DHT_byte[2] * 16
 result = 0 'если все ок возврат "0" , нет - "1"
 end if

 end sub
Вложения
Тип файла: zip Новая папка.zip (78.3 Кб, 0 просмотров)
Последний раз редактировалось Dtolok; 02.07.2013 в 10:09.
Оценка
Новичок
 
Регистрация: 18.11.2009
Сообщений: 2
Репутация: 11
1 0
0 0
 
01.07.2013 20:43 #2
Уж извините за неточность но насколько я помню в PIC16 один машинный цикл занимает 4 такта. Возникают вопросы:
1. Как вы при тактовой частоте 4МГц умудряетесь рассчитать задержку в 1мкс да еще цикл проверки всунули?
2. Как у Вас при этом получилось вместо 20мкс задержка в 5 мкс?

Я думаю что если найдется ответ на эти вопросы то и разберетесь и с вашей проблемой.
Оценка
Новичок
 
Регистрация: 16.03.2011
Адрес: украина харьков
Сообщений: 102
Репутация: 29
19 2
0 0
 
02.07.2013 01:35 #3
поправте ......The clock input to the Timer2 module is the system
instruction clock (FOSC/4). 4000000/4 = 1000000 или 1/1000000 = 1мкс
вот процедура
Код:
sub procedure Pausa_us(dim us as byte)
       TMR2 = 0
       PR2 = us
       T2IF_bit = 0
       T2CON = %00000100
       while( T2IF_bit = 0 )
       wend
       TMR2ON_bit = 0
end sub
если Pausa_us(1) то задержка 1мкс. или не так?
Последний раз редактировалось Dtolok; 02.07.2013 в 10:10.
Оценка
Новичок
 
Регистрация: 18.11.2009
Сообщений: 2
Репутация: 11
1 0
0 0
 
03.07.2013 07:55 #4
Ну не совсем так. На выполнение каждой команды, если предположить что компилятор переведет их в одну асм команду а также если упустить возможность выполнения некоторых команд ассемблера за два машинных цикла (наскоко я помню машинный цикл = тактовая частота / 4), тогда у Вас только на Вызов даной функции уйдет ~1-8 машинных циклов + по одному машинному циклу на команду (это групое предположение). И того получим
sub procedure Pausa_us(dim us as byte) - 8мкс
TMR2 = 0 - 1мкс
PR2 = us - 1мкс
T2IF_bit = 0 - 1мкс
T2CON = %00000100 - 1мкс
while( T2IF_bit = 0 ) - 1мкс ??? (врядли эта конструкция такая быстрая)
wend
TMR2ON_bit = 0 - 1мкс
end sub - 1мкс (скорее всего больше)

И того минимум 15 мкс. То что таймер один раз тикнул это ерунда.
Оценка
Ответ
Похожие темы
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход
Электронные компоненты. Скидки 15%, кэшбэк 15% и бесплатная доставка от ТМ Электроникс
Часовой пояс GMT +3, время: 03:05.
Обратная связь РадиоЛоцман Вверх