Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: demanik, ivan_fd  
промлема с DHT11
DNM Дата: Вт, 02.12.2014, 09:19  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 75
Репутация: 0   ±
Замечания:   ±
На сайте с 29.09.2011

Статус: Offline

Здравствуйте!
Недавно начал писать на протоне и столкнулся с тем, что по непонятным причинам, правильно написанная и скомпилированная программа не хочет работать если в ней используются, например pulsin или pulsout. если более конкретно, то пример программы, находящийся в Servo - работает не правильно, он же в picbasic pro работает без проблем. Почему, я так и не понял.

Сейчас осваивая NRF 24L01, используя пример предоставленный MiX@$,  решил подключить DHT11 и передавать по радиоканалу. Причем пример программы для работы с радио модулями работает отлично, а вот ранее работающая  в picbasic pro программа опроса датчика, отказывается работать напрочь, пришел к выводу, что что-то не так с задержками и pulsin, но как решить проблему так и не знаю.
Может кто тоже сталкивался с этим?
Пример кода для датчика, используемый мной:

Код
Device = 16F877   
   Config XT_OSC , WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CP_OFF , DEBUG_OFF
    Xtal 20
' ================================Íàñòðîéêà LCD ===============================================
                    
Declare LCD_Type=0         ' Òèï ÆÊÈ - áóêâåííî-öèôðîâîé   
Declare LCD_DTPin PORTB.4         ' Ïîðò äàííûõ ÆÊÈ   
Declare LCD_ENPin PORTB.3         ' Óïðàâëåíèå öåïüþ E   
Declare LCD_RSPin PORTB.2         ' Óïðàâëåíèå öåïüþ RS   
Declare LCD_Interface 4           ' 4-õ áèòíàÿ ðàçðÿäíîñòü øèíû äàííûõ    
Declare LCD_CommandUs 2000        ' Çàäåðæêà ïåðåä ïîñûëêîé êîìàíäû   
Declare LCD_DataUs 50             ' Çàäåðæêà ïåðåä ïîñûëêîé äàííûõ   
Declare LCD_Lines 2               ' Êîëè÷åñòâî ñòðîê ÆÊÈ   

TRISD = %00000000      
TRISB = %00000000
TRISC = %00001100
ADCON1 = %00000111
'pic 16F877
'PORTB.0 - äàò÷èê
   '-------------------------- Íà÷àëî -------------------------------------------
Dim imp As Byte      
Dim temp As Byte     
Dim hum As Byte      
Dim chksm As Byte   
Dim temp1 As Byte   
Dim hum1 As Byte     

Dim test As Byte     
Dim i As Byte                     
'-------------------------- Íàñòðîéêà TMR0 äëÿ ïðåðûâàíèé --------------------
OPTION_REG = %10001000
TMR0 = $00         ' Çíà÷åíèå ðåãèñòðà TMR0
                      
'-------------------------- Ãëàâíàÿ ïðîãðàììà -------------------------
   MainProgram:
    DelayMS 1000                        'ïðèâîäèì ñåíñîð â ðàáî÷åå ñîñòîÿíèå

loop:
chksm=0
TRISB.0 = 0                        'port b íà âûõîä
PORTB.0=1                          'âûñîêèé óðîâåíü íà äàò÷èê
DelayMS 50                         'íåìíîãî ïîäîæäåì
PORTB.0=0:DelayMS 18               'óñòàíîâèì íà  18ms íèñêèé óðîâåíü - çàïðîñ äàò÷èêà
PORTB.0=1:DelayUS 30               'óñòàíîâèì íà  30us âûñîêèé óðîâåíü - îñâîáîäèì øèíó
imp = PulsIn PORTB.0,1             'æäåì ïîêà âûñîêèé óðîâåíü
If imp > 130 Then GoTo loop1
If imp < 80 Then GoTo loop
'-------------------------------Ñ÷èòûâàíèå ïàðàìåòðîâ-------------------------
imp = 0
For i = 7 To 0 Step -1
imp = PulsIn PORTB.0,1               
If imp >70 Then
SetBit hum,i
Else
ClearBit hum,i
EndIf
Next i

For i = 7 To 0 Step -1
imp = PulsIn PORTB.0,1            
If imp >70 Then
SetBit hum1,i
Else
ClearBit hum1,i
EndIf
Next i

For i = 7 To 0 Step -1
imp = PulsIn PORTB.0,High            
If imp >70 Then
SetBit temp,i
Else
ClearBit temp,i
EndIf
Next i

For i = 7 To 0 Step -1
imp = PulsIn PORTB.0,High            
If imp >70 Then
SetBit temp1,i
Else
ClearBit temp1,i
EndIf
Next i

For i = 7 To 0 Step -1
imp = PulsIn PORTB.0,High           
If imp >70 Then
SetBit chksm,i
Else
ClearBit chksm,i
EndIf
Next i
   Print 1,1, #hum," %"
   Print 2,1, #temp," C"
DelayMS 3000                        
GoTo loop

loop1:

DelayMS 10
Print 1,1, "sensor not ready"       
GoTo loop                     
                            
                      
GoTo  MainProgram


Более подробно здесь: http://asemlab.net/
Сообщение отредактировал DNM - Вт, 02.12.2014, 10:24
ЯНДЕКС Дата: 02.12.2014
xvovanx Дата: Вт, 02.12.2014, 10:04  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 328
Репутация: 59   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

В прогу сильно не вникал, но сразу бросилось в глаза:

If imp < 80us Then GoTo loop
DNM Дата: Вт, 02.12.2014, 10:25  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 75
Репутация: 0   ±
Замечания:   ±
На сайте с 29.09.2011

Статус: Offline

Цитата xvovanx ()
If imp < 80us Then GoTo loop
исправил, но
компилятор не выдавал ошибки, кстати почему?

проблема остается


Более подробно здесь: http://asemlab.net/
Сообщение отредактировал DNM - Вт, 02.12.2014, 10:27
ADMIN Дата: Вт, 02.12.2014, 11:26  |                                                                                                                Сообщение # 4
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Возможно, разницы и нет, но в последних версиях компилятора пишется PulseIn, насколько я помню. Нет возможности проверить
DNM Дата: Вт, 02.12.2014, 12:08  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 75
Репутация: 0   ±
Замечания:   ±
На сайте с 29.09.2011

Статус: Offline

Цитата ADMIN ()
Возможно, разницы и нет, но в последних версиях компилятора пишется PulseIn, насколько я помню. Нет возможности проверить

попробовал - компилятор глотает и pulsin и pulsein
вечером зашью и проверю..
странно , что компилятор так работает... angry


Более подробно здесь: http://asemlab.net/
MiXaS Дата: Вт, 02.12.2014, 12:56  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Дмитрий, здравствуйте! Есть у меня пример работы с DHT 21, точно не помню чем они отличаются (протоколом всмысле), но вроде я этот код подсовывал под DHT 11 и чуток что-то менял. Сразу скажу, что DHT 11 = shit. Лучше взять DHT21 с камнем AM2302.

Цитата DNM ()
Config XT_OSC


Думаю лучше заменить на HS_OSC
ivan_fd Дата: Вт, 02.12.2014, 16:15  |                                                                                                                Сообщение # 7
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

И вообще лучше не использовать PulseIn. Можно обойтись и без него.
MiXaS Дата: Ср, 10.12.2014, 00:55  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

DNM, Вы разобрались с проблемой? Прошу обратить Ваше внимание на то, что если Вы подключили к пику с частотой 4 МГц, (Вы как-то мне фото слали с 2 пиками, лдин был на 4 МГц),то работать не будет, по крайней мере я не смог запустить dht 22 на этом кварце, так как в инструкции к команде pulsein написано, что результат измерения это не микросекунды, а какие–то еденицы. Так при частоте 4 МГц 1 ед=10 мкс, а при частоте 20 МГц 1 ед= 2мкс. Я пробовал переписывать код с учетом этих знаний, но увы, эту команду нужно заменить своим микрокодом.
NeirRon Дата: Сб, 28.02.2015, 12:32  |                                                                                                                Сообщение # 9
Группа: Пользователи
Ранг:  Новенький
Сообщений: 1
Репутация: 0   ±
Замечания:   ±
На сайте с 10.02.2015

Статус: Offline

Написал не большую библиотеку для DHL11, может кому пригодиться. Датчик не выдавал десятичные значения, по этому запись десятичных значений в переменные я убрал
 
Вызов из главной программы:
 
Код
 Include "DHL11.pbp"
Cls
DelayMS 100

main:

GetDHL11(PORTD.0, Hum, Temp, ChkSum)
If ChkSum <> (Hum + Temp) Then Cls:Print At 1,1," Check Sum Error! ":GoTo main

Print At 1,1,"H:  ",Dec Hum," %    "
Print At 2,1,"T:  ",Dec Temp,223,"C    "  

DelayMS 1000
GoTo main


Переменные Hum, Temp, ChkSum в главной программе объявлять не нужно. Название переменных может быть любым.
 
Если датчик не готов, то значение переменных будет равным:

Hum  = 0
Temp = 0
ChkSum=1
 
Прикрепления: DHL11.pbp (3.9 Kb)
доцент2 Дата: Чт, 12.01.2017, 19:32  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 291
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Подскажите в чем может быть проблема.
Подключил датчик DHT11 к МК с частотой 4МГц.
Логический анализатор показывает, что датчик выдает посылку в соответствии с описанием.
Программа определяет наличие датчика.
Но читает посылку с ошибками (пробовал на дисплей выводить в двоичном формате).
Последние 8 бит почему то всегда %00000000.
Соответственно проверка не проходит.

Добавлено (10.01.2017, 23:05)
---------------------------------------------
Разобрался.
На частоте МК 4МГц данный датчик работать не хочет. Не хватает разрешения Pulsin.
Работает в протеусе с 8МГц и выше. В железе завтра попробую.

Добавлено (12.01.2017, 19:32)
---------------------------------------------
В железе заработало!
Прикрепления: DHT11.rar (22.6 Kb)

Сообщение отредактировал доцент2 - Чт, 12.01.2017, 19:38
  • Страница 1 из 1
  • 1
Поиск: