Миграция проектов на ПЛИС новых производителей
Новичок
 
Регистрация: 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 код Выкл.

Быстрый переход
Электронные компоненты. Бесплатная доставка по России
Часовой пояс GMT +3, время: 01:00.
Обратная связь РадиоЛоцман Вверх