Новичок
Регистрация: 16.03.2011
Адрес: украина харьков
Сообщений: 102
Репутация: 29
|
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
Последний раз редактировалось Dtolok; 02.07.2013 в 10:09.
|
||
Оценка
|
Новичок
Регистрация: 18.11.2009
Сообщений: 2
Репутация: 11
|
Уж извините за неточность но насколько я помню в PIC16 один машинный цикл занимает 4 такта. Возникают вопросы:
1. Как вы при тактовой частоте 4МГц умудряетесь рассчитать задержку в 1мкс да еще цикл проверки всунули? 2. Как у Вас при этом получилось вместо 20мкс задержка в 5 мкс? Я думаю что если найдется ответ на эти вопросы то и разберетесь и с вашей проблемой. |
||
Оценка
|
Новичок
Регистрация: 16.03.2011
Адрес: украина харьков
Сообщений: 102
Репутация: 29
|
поправте ......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
Последний раз редактировалось Dtolok; 02.07.2013 в 10:10.
|
||
Оценка
|
Новичок
Регистрация: 18.11.2009
Сообщений: 2
Репутация: 11
|
Ну не совсем так. На выполнение каждой команды, если предположить что компилятор переведет их в одну асм команду а также если упустить возможность выполнения некоторых команд ассемблера за два машинных цикла (наскоко я помню машинный цикл = тактовая частота / 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 мкс. То что таймер один раз тикнул это ерунда. |
||
Оценка
|
Обратная связь РадиоЛоцман Вверх |