Y

DHT11 Sensörünü okuyamıyorum.

Başlatan yilber92, 12 Ocak 2013, 21:58:01

ete

Haklısın bir kusur bırakmışım. Yukarıdaki kod'u düzelttim. Oradan yeniden alıp denermisin lütfen.
Ete

Reytabu

Hocam denedim yine aynı,
startta low 18 ms, high 40 us olmayacak mıydı?
ona göre de denedim yine aynı
START_VER:
          OUTPUT DTA
          DTA=0
          PAUSE 18
          DTA=1
          PAUSEUS 40
          INPUT DTA
          RETURN

ete

Program tamamen diğer programın bir kopyası niteliğinde. Pause süreleride oradakilerle uyumlu.
Yine çalışmıyor ise Basic komut gecikmeleri sonuç alınmasını etkiliyor demektir.
Yada diğer çalışan devrede deneme yapmak gerekir. Bir eksiklik yada hata olmaması için.
Enteresan bir durum gerçekten. Bu kadar inatçı olacağını düşünmemiştim.
İlk yazdığım programında çalışması gerekirdi aslında. Çalışmıyor ise sorunu başka yerde aramak gerekir sanırım.
Her neyse sağlık olsun sakin kafa ile yeniden üstünde düşüneceğim.

Ete

Reytabu

Ete Hocam

Pulsin komutlu programı defalarca test ettim.
Sensörden gelen yanıtları 40 bitlik dizi değişkenin haricinde, 5 adet 8 er bitlik dizi değişkenlerine  yerleştirdim. Dizi değişken kullanmadan doğrudan okunan palsi rutubet ve sıcaklık rakamlarına yerleştirdim.
Denemelerin tamamında rutubet tamsayı, rutubet onda sayı,sıcaklık tamsayı, sıcaklık onda sayı ve son 8 kontrol bitlerini de ekrana getirerek kontrol ettim.
Ortak sonuç şuydu: rutubet tam sayı, rutubet onda sayı ve sıcaklık tamsayı değerleri yüksek değerler ve sıcaklık onda değer ve kontrol bitleri hep sıfır olarak gözüküyordu. Yani 8 er bitlik 3 paket geliyor gibiydi. Daha doğrusu gelen 40 bit değerlerinin tamamı 3 değişkene(rutubet tamsayı, rutubet ondasayı ve sıcaklık tamsayı) ilave oluyor. Bu yüzden değerler yüksek çıkıyor diye düşünüyorum. Sonuç olarak sensörden gelen 40 bit veriyi ilgili 5 değişkene  pulsin komutlarıyla aktaramıyoruz.

Devre  C dilindeki program devremde sağlıklı çalıştığından devreden kaynaklanan bir sorun yok.

Timer2 kesmesi konusunda hiç bir bilgim olmadığından herhengi bir denemede bulunamıyorum. C dili programını yazan arkadaş,
timer 2 kullanmadan da programın çalıştığını söylemiş ve aşağıdaki kodları vermiş:
Bu kodların PBP deki karşılıkları nedir acaba?

You can also simplify the ReadByte subroutine without using the Timer2 module. The following version of ReadByte subroutine works equally well. Once the data pin is detected
high, wait for 40 μs and check the data line again. If it is still high, it is 1, else 0.



unsigned short ReadByte(){
unsigned short num = 0, t;
DataDir = 1;
for (i=0; i<8; i++){
while(!Data);
Delay_us(40);
if(Data) num |= 1<<(7-i);
while(Data);
}
return num;

ete

Tmr2 kesmesi kullanmak şart değil elbette. Kesme kullanarakmsüre aşımlarını kontrol etmiş vatandaş. Bizde aynısını yaptık ama olmadı. Ben senkron yakalamakta zorlandığımızı düşünüyorum.
Zira işin püf noktası data paketinin baş kısmını yakalamakta  sensör mantığı basit bende defalarca okudum. İstek yapacaksın. Şekli belli. İstekten sonra sensör sana cavap verecek. Burası çok önemli cevabı iyi yakalamak gerek. Sorunda burada. Cevabı yakalamış isen gerisi sıralı 40 adet bit okumaktan ibaret. Aslında 80 tane bit veriliyor. Ama bitlerin ne olduğuna high biti süresi karar verdiği için onları alıp test ediyoruz. Bit süreleri us cinsinden olunca karar işleminde zaman kaybetmemek için onları süre bazında kayıt edip sonradan test ederek ayrıştırmıştım. Ama olmadı. Sonra C dilinin benzerini yazdım oda olmadı. Uzaktan ancak bu kadar oluyorvdemekki deyip uğraşmayı bıraktım. Yapılacak iş , dta pinine bir lojik analizör bağlayıp olayı görsel olarak incelemek ve hata nerede ise oraya tenbir uygulamak gerekir. 
Ete

ete

#35
C dilinde yazılmış örnek programa benzeterek yazdığım programın baş tarafına;
PR2=0
Komutunu ilave ederek yeniden denermisin. ?
Bu eksik kalmış. Aslında başlangıç değeri sıfırdır diye düşünmüştüm ama sanırım sıfırlamak gerekiyor. Zira TMR2 sayacı PR2 registerine  bakarak kesme oluşturuyor. Pr2=0 ise her 256 us de bir kesme oluşturması gerek. Pr2 bir değere sahip ise sayac o seğere gelince kesme oluşuyor.
Bir dene ve sonucu bildir lütfen.
Ete

Not: Bir iki yer daha değiştirdim ve tekrar üzerine yenisini kayıt ettim. En iyisi yeniden yükle ve dene.

Reytabu

Hocam

pr2=0 ilave edince sensör hatası veriyor.
pr2 yi ilave etmeyince program bir yerde bloke oluyor ve ekrana hiç bir bilgi gelmiyor.

Saygılarımla

ete

Bu hatalar sensörün RESPONSE yani cevap kısmını aşamadığımızı gösteriyor.
Anlamsız bir şekilde bizim okuma programı sensörden cevabı ya alamıyor yada hatalı alıyor.
Data sheet açıklamalarına bakılırsa. Start komutu verildikten sonra data pini giriş olarak ayarlanıp bırakılıyor.
Ardından sensör kendisi data pinini önce 54us boyunca LOW da tutuyor ve hemen ardından 80us boyunca HIGH da tutup ardından 40 bitlik bilgiyi aktarıyor.
Görüldüğü gibi kilit nokta cevap sinyalinin uygun şekilde alınıp alınmadığının kjontrol edilmesi gerekiyor.
Sensörün çalıştığından emin isek bu bölüm değişik metodlarla test edilebilir.

Metod-1:
Önce bir while wend döngüsü ile  işin LOW kısmı test edilmeden geçilir.
INPUT DTA
WHILE DTA=0:WEND

hemen ardından 80us lik bir gecikme koyulup gelen veriler alınmaya başlanır.
Hatta emin olmak için 85us lik bir gecikme verilip data paketi içine girilir.
PAUSEUS 85
IF DTA=1 then hata demek belkide hatalı ölçümü engeller. Zira DTA hala 1 ise bir hata var demektir. Değilse data bitlerine girdiniz demek oluyor.
BU aşamadan sonra ilk data bitinin içindesiniz demektir. Gelen bitler iki bit ile ifade edildiğine göre, ve ilk gelen LOW sinyali olacağına göre bir while wend döngüsü ile bu kısımı atlarız. ardından gelen HIGH bit süresi 40us den büyük ise bit=1 değilse bit=0 olacaktır. O halde önce bir döngü kurup bu döngü içinde teker teker bitleri almak gerekir.
SAYI=0
FOR I=7 to 0  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE DTA=0:WEND  'sinyalin low kısmını atladık.
   Pauseus 40
  IF DTA=1 then SAYI.0[I]=1
  while dta=1:wend 'sinyal hala high konumunda ise onu bitir.
Next
Bu şekilde ilk 8 bitlik bilgi alınmış olur.
Benzer şekilde diğer byte lar da alınıp işleme koyulmalıdır.

Cevap kısmını kesme ile yapmanın mantığı da şöyle:
Cevabın ilk kısmı 54us lik bir LOW sinyali şeklinde
TMR2 kesmesini aktive edip TMR2 yi sıfırlayıp while wend ile LOW sinyalinin bitmesini bekliyoruz. Ancak while wend içine kesme içinde set edilecek bir değişkenide katıyoruz. Yani,
WHILE DTA=0 and TOUT=0:WEND
komutunda TOUT kesme içinde Set edilmektedir. Buda ancak TMR2 sayacının 256 ya ulaşması halinde kesme oluşacak ve TOUT=1 olacaktır.
Dolayısıyla While wend döngüsünden iki şekilde çıkılacaktır.
Ya DTA=1 olacak veya TOUT=1 olacaktır.
Şayet cevap doğru çalışıp DTA ucu 54us LOW da kalıp sonra HIGH olur ise döngü sona erecektir.
Yok olmadı beklemede kaldı ise bu seferde TMR2 değeri 256 ya ulaşınca kesme oluşturacak ve TOUT=1 olacağı için wend döngüsü bozulacak ve program döngüden çıkacaktır. Çıkar çıkmaz hemen TOUT=1 ise git hata mesajını ver diyoruz.
Değil ise 54us sonrasında kendiliğinden çıkmış demek oluyor ve bu seferde cevabın HIGH kısmını test ediyoruz.
TOUT=1 olmadan çıkıldığı için TMR2 kesmesi hala aktif demektir. Yalnızca TMR2 yi sıfırlayıp bu seferde aynı işi HIGH sinyali için yapıyoruz.
WHILE DTA=1 and TOUT=0:WEND
bu döngüden de iki şekilde çıkılabilir. Birincisi ya DTA ucu 80us boyunca High da kalıp sonra ilk data biti olan LOW konumuna geçmesi ile birlikte döngü sona erecektir. Yada HIGH da takılı kalacak ve TMR2 kesmesi oluşarak yeniden TOUT=1 olacaktır.
O halde döngüden çıkıldıktan sonra önce  IF TOUT=1 then git sensör hatası ikazı ver diyoruz.
Değilse zaten data bitlerine girilmiş demek olur. O halde kesmeyi kapatıp data bitlerini almamız gerekir.
Bütün bunların karşılığı şöyle oluyor,
TMR2=0: TMR2ON=1:TOUT=0
WHILE DTA=0 AND TOUT=0:WEND
IF TOUT=1 THEN
   check=1:Return
ENDIF
TMR2=0
WHILE DTA=1 AND TOUT=0:WEND
IF TOUT=1 then
   Check=1:Return
ENDIF
TMR2ON=0
RETURN
bu kodların mutlaka çalışması gerekir.
Biraz oyna istersen bu kodlarla.
Ete

Reytabu

Hocam

Şükürler olsun programı sonunda çalıştırdım.
Çok basit bir mantığı varmış. Senkron sorunu yaşadığımızı siz söyleyince
tekrar düşündüm. Pulsin komutunın  sensörden gelen 80 us luk yanıtı almada bir
sorun yaşamamasından( PULSIN Dta,1,SURE ) , acaba döngülerde program çok zaman kaybediyor ve 40 biti
almada karmaşa ondan mı yaşıyoruz diye düşündüm ve hiç döngü vs kullanmadan aşağıdaki programı bilgilerim çerçevesinde yeniden yazdım. Program sağlıklı şekilde ölçüm yapıyor. Allah sizden razı olsun. Çok teşekkür ederim. Çok zaman harcadınız bu program için.


Saygılarımla

not: sizde bu arada yanıt yazmışsınız o kodlarla da çalıştıracağım inşallah.



Saygılarımla
DEFINE OSC 4

TRISA=0  'A portu çıkış olarak ayarlandı.
TRISB=0  'B portu çıkış olarak ayarlandı.
PORTA=0
CMCON=7

SURE    var byte
ISI0 VAR BYTE
ISI1 VAR BYTE
ISI2 VAR BYTE
ISI3 VAR BYTE
ISI4 VAR BYTE
ISI5 VAR BYTE
ISI6 VAR BYTE
ISI7 VAR BYTE
ISIO0 VAR BYTE
ISIO1 VAR BYTE
ISIO2 VAR BYTE
ISIO3 VAR BYTE
ISIO4 VAR BYTE
ISIO5 VAR BYTE
ISIO6 VAR BYTE
ISIO7 VAR BYTE
NEM0 VAR BYTE
NEM1 VAR BYTE
NEM2 VAR BYTE
NEM3 VAR BYTE
NEM4 VAR BYTE
NEM5 VAR BYTE
NEM6 VAR BYTE
NEM7 VAR BYTE
NEMO0 VAR BYTE
NEMO1 VAR BYTE
NEMO2 VAR BYTE
NEMO3 VAR BYTE
NEMO4 VAR BYTE
NEMO5 VAR BYTE
NEMO6 VAR BYTE
NEMO7 VAR BYTE
KONT0 VAR BYTE
KONT1 VAR BYTE
KONT2 VAR BYTE
KONT3 VAR BYTE
KONT4 VAR BYTE
KONT5 VAR BYTE
KONT6 VAR BYTE
KONT7 VAR BYTE


TAMRUT  VAR BYTE
ONDARUT VAR BYTE
TAMISI  VAR BYTE
ONDAISI VAR BYTE
control var byte
symbol dta=portA.0 'sensor dATA PİNİ PORTA.0 A BAĞLI

PAUSE 1000


BASLA:


output dta
LOW DTA
Pause 18       '18 ms bekle
DTA=1           'Data pinini High yap
Pauseus 40   '40 us bekle
input dta
PULSIN Dta,1,SURE
PULSIN DTA,1,NEM7
PULSIN DTA,1,NEM6
PULSIN DTA,1,NEM5
PULSIN DTA,1,NEM4
PULSIN DTA,1,NEM3
PULSIN DTA,1,NEM2
PULSIN DTA,1,NEM1
PULSIN DTA,1,NEM0
PULSIN DTA,1,NEMO7
PULSIN DTA,1,NEMO6
PULSIN DTA,1,NEMO5
PULSIN DTA,1,NEMO4
PULSIN DTA,1,NEMO3
PULSIN DTA,1,NEMO2
PULSIN DTA,1,NEMO1
PULSIN DTA,1,NEMO0
PULSIN DTA,1,ISI7
PULSIN DTA,1,ISI6
PULSIN DTA,1,ISI5
PULSIN DTA,1,ISI4
PULSIN DTA,1,ISI3
PULSIN DTA,1,ISI2
PULSIN DTA,1,ISI1
PULSIN DTA,1,ISI0
PULSIN DTA,1,ISIO7
PULSIN DTA,1,ISIO6
PULSIN DTA,1,ISIO5
PULSIN DTA,1,ISIO4
PULSIN DTA,1,ISIO3
PULSIN DTA,1,ISIO2
PULSIN DTA,1,ISIO1
PULSIN DTA,1,ISIO0
PULSIN DTA,1,KONT7
PULSIN DTA,1,KONT6
PULSIN DTA,1,KONT5
PULSIN DTA,1,KONT4
PULSIN DTA,1,KONT3
PULSIN DTA,1,KONT2
PULSIN DTA,1,KONT1
PULSIN DTA,1,KONT0


TAMRUT=0
IF NEM0>5 THEN TAMRUT.0[0]=1
IF NEM1>5 THEN TAMRUT.0[1]=1
IF NEM2>5 THEN TAMRUT.0[2]=1
IF NEM3>5 THEN TAMRUT.0[3]=1
IF NEM4>5 THEN TAMRUT.0[4]=1
IF NEM5>5 THEN TAMRUT.0[5]=1
IF NEM6>5 THEN TAMRUT.0[6]=1
IF NEM7>5 THEN TAMRUT.0[7]=1

ONDARUT=0
IF NEMO0>5 THEN ONDARUT.0[0]=1
IF NEMO1>5 THEN ONDARUT.0[1]=1
IF NEMO2>5 THEN ONDARUT.0[2]=1
IF NEMO3>5 THEN ONDARUT.0[3]=1
IF NEMO4>5 THEN ONDARUT.0[4]=1
IF NEMO5>5 THEN ONDARUT.0[5]=1
IF NEMO6>5 THEN ONDARUT.0[6]=1
IF NEMO7>5 THEN ONDARUT.0[7]=1

TAMISI=0
IF ISI0>5 THEN TAMISI.0[0]=1
IF ISI1>5 THEN TAMISI.0[1]=1
IF ISI2>5 THEN TAMISI.0[2]=1
IF ISI3>5 THEN TAMISI.0[3]=1
IF ISI4>5 THEN TAMISI.0[4]=1
IF ISI5>5 THEN TAMISI.0[5]=1
IF ISI6>5 THEN TAMISI.0[6]=1
IF ISI7>5 THEN TAMISI.0[7]=1

ONDAISI=0
IF ISIO0>5 THEN ONDAISI.0[0]=1
IF ISIO1>5 THEN ONDAISI.0[1]=1
IF ISIO2>5 THEN ONDAISI.0[2]=1
IF ISIO3>5 THEN ONDAISI.0[3]=1
IF ISIO4>5 THEN ONDAISI.0[4]=1
IF ISIO5>5 THEN ONDAISI.0[5]=1
IF ISIO6>5 THEN ONDAISI.0[6]=1
IF ISIO7>5 THEN ONDAISI.0[7]=1

control=0
IF KONT0>5 THEN control.0[0]=1
IF KONT1>5 THEN control.0[1]=1
IF KONT2>5 THEN control.0[2]=1
IF KONT3>5 THEN control.0[3]=1
IF KONT4>5 THEN control.0[4]=1
IF KONT5>5 THEN control.0[5]=1
IF KONT6>5 THEN control.0[6]=1
IF KONT7>5 THEN control.0[7]=1





LCDOUT $FE,1 
LCDOUT $FE,$80,"NEM=",DEC TAMRUT,",",DEC ONDARUT
LCDOUT $FE,$C0,"ISI=",dec TAMISI,",", DEC ONDAISI
PAUSE 800

GOTO BASLA




END

Reytabu


Alıntı yapılan: ete - 27 Mart 2013, 13:32:22
Bu hatalar sensörün RESPONSE yani cevap kısmını aşamadığımızı gösteriyor.
Anlamsız bir şekilde bizim okuma programı sensörden cevabı ya alamıyor yada hatalı alıyor.
Data sheet açıklamalarına bakılırsa. Start komutu verildikten sonra data pini giriş olarak ayarlanıp bırakılıyor.
Ardından sensör kendisi data pinini önce 54us boyunca LOW da tutuyor ve hemen ardından 80us boyunca HIGH da tutup ardından 40 bitlik bilgiyi aktarıyor.
Görüldüğü gibi kilit nokta cevap sinyalinin uygun şekilde alınıp alınmadığının kjontrol edilmesi gerekiyor.
Sensörün çalıştığından emin isek bu bölüm değişik metodlarla test edilebilir.

Metod-1:
Önce bir while wend döngüsü ile  işin LOW kısmı test edilmeden geçilir.
INPUT DTA
WHILE DTA=0:WEND

hemen ardından 80us lik bir gecikme koyulup gelen veriler alınmaya başlanır.
Hatta emin olmak için 85us lik bir gecikme verilip data paketi içine girilir.
PAUSEUS 85
IF DTA=1 then hata demek belkide hatalı ölçümü engeller. Zira DTA hala 1 ise bir hata var demektir. Değilse data bitlerine girdiniz demek oluyor.
BU aşamadan sonra ilk data bitinin içindesiniz demektir. Gelen bitler iki bit ile ifade edildiğine göre, ve ilk gelen LOW sinyali olacağına göre bir while wend döngüsü ile bu kısımı atlarız. ardından gelen HIGH bit süresi 40us den büyük ise bit=1 değilse bit=0 olacaktır. O halde önce bir döngü kurup bu döngü içinde teker teker bitleri almak gerekir.
SAYI=0
FOR I=7 to 0  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE DTA=0:WEND  'sinyalin low kısmını atladık.
   Pauseus 40
  IF DTA=1 then SAYI.0[I]=1
  while dta=1:wend 'sinyal hala high konumunda ise onu bitir.
Next
Bu şekilde ilk 8 bitlik bilgi alınmış olur.
Benzer şekilde diğer byte lar da alınıp işleme koyulmalıdır.



Ete hocam

Önerdiğiniz while/wend li yönteme göre aşağıdaki programı yazdım. Fakat ısı ve nem değerleri
sıfır çıkıyor. while/wend mantığının tam kavrayamadığımdan sonuç alamadım. Mantığını biraz açıklayabilir misiniz? While wend Komutları hatalı mı kullandık acaba. Mutlaka değer görmeliydik bence.
BASLA:


output dta
LOW DTA
Pause 18       '18 ms bekle
HIGH DTA           'Data pinini High yap
Pauseus 40   '40 us bekle
input dta
WHILE DTA=0:WEND
PAUSEUS 85

IF DTA=1 then HATA

TAMRUT=0
FOR I=7 to 0  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE DTA=0:WEND 
   Pauseus 40
  IF DTA=1 then TAMRUT.0[I]=1
  while dta=0:wend
Next

ONDARUT=0
FOR I=7 to 0  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE DTA=0:WEND
   Pauseus 40
  IF DTA=1 then ONDARUT.0[I]=1
  while dta=0:wend
Next

TAMISI=0
FOR I=7 to 0  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE DTA=0:WEND
    Pauseus 40
  IF DTA=1 then TAMISI.0[I]=1
  while dta=0:wend 
Next

ONDAISI=0
FOR I=7 to 0  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE DTA=0:WEND 
   Pauseus 40
  IF DTA=1 then ONDAISI.0[I]=1
  while dta=0:wend
 
Next

control=0
FOR I=7 to 0  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE DTA=0:WEND
   Pauseus 40
  IF DTA=1 then control.0[I]=1
  while dta=0:wend
 
Next

LCDOUT $FE,1 
LCDOUT $FE,$80,"NEM=",DEC TAMRUT,",",DEC ONDARUT
LCDOUT $FE,$C0,"ISI=",dec TAMISI,",", DEC ONDAISI
PAUSE 800

GOTO BASLA

hata:
LCDOUT $FE,1 
LCDOUT $FE,$80,"SENSOR HATASI"

GOTO BASLA

END







ete

#40
Hata döngüde;
Bir döngü küçük sayıda büyük sayıya doğru kurulabildiği gibi ( for i= 0 to 7)
Büyük sayıdan küçük sayıya doğruda kurulabilir ( for i= 7 to 0 step -1)
Biz bu alternatifi kullanıyoruz ancak step -1 vermemişsin. Sorun bu olsa gerek.
While wend de bir döngü şeklidir ve sayıya drğil şarta bağlı olarak sürdürülür.
While data=0:wend. Komut satırının açıklaması şöyle. Dta değeri sıfır olduğu müddetçe bekle yani döngüyü sürdür. Dta=1 olunca yada sıfırdan farklı hale gelince döngüyü bitir veya döngüden çık demektir.
Hatayı düzeltip tekrar dene istersen.

Bu arada başka hata da var aynı döngüde açıklamalı olarak tekrar yazıyorumm
FOR I=7 TO 0 STEP -1. 'Döngüyü 7 den 0 ra doğru kurduk
WHILE DTA=0:WEND. ' dta girişi sıfır ise bekle çünkü gelen bilginin ilk konumu low
PAUSEUS 40 '40us bekledik dta hala 1 ise demekki o bit =1
IF DTA=1 THEN SAYI.0[I]=1
WHILE DTA=1:WEND' dta hala 1 ise onu aşmalıyız bu komut tekrar low oluncaya kadar bekler
Next

Biliyorsun sensör data bitlerini yollarken low bit için 54us ( hatırladığım bu ) low ardından aynı süre hıgh veriyor. High biti için yine  belli süre low ardından 80 us high veriyor. Yani sondaki yani ikinci verilen high biti bitin şeklini ayarlıyor. Bundan yararlanarak bitleri ayıklıyoruz.
İlk gelen bit 7 bit sonra 6. Bit şeklinde sıralı gittiği için döngüye 7 den başlıyoruz.
Önce baştaki sabit low süresi işimize yaramadığı için onu geçiyoruz. Bunu while dta=0:wend komutu ile yapıyoruz. Bu komut aşıldığı zaman dta=1 olmuş demektir. Hemen 40us lik bir gecikme koyuyoruz. Sonra dta ya bakıyoruz. Şayet hala 1 ise demekki uzun high konumunda yani gelen bit high değilse kısa high verilmiş demektir ki bu bit low olur bizim bit zaten default low olduğundan bir şey yapmadan bir sonraki bite geçiyoruz. Temel mantık budur. Burada gelen bit uzun high yani 1 ise dta=1 olmamduruöu en azından 80 us süreceği için bu süreyide bitirmek gerekir. Bunun için oraya while dta=1 : wend.  Komut satırını koyduk.
Ete

Reytabu

Hocam

Çok teşekkür ederim.
Kodları dediğiniz gibi düzenleyince program çalıştı.
Emeğinize sağlık. Sayenizde internet ortamında
pic basic pro programında çalışan ilk DHT11 programı
sitemizde.
Saygılarımla
DEFINE OSC 4

TRISA=0  'A portu çıkış olarak ayarlandı.
TRISB=0  'B portu çıkış olarak ayarlandı.
PORTA=0
CMCON=7

SURE    var byte
I       VAR BYTE
TAMRUT  VAR BYTE
ONDARUT VAR BYTE
TAMISI  VAR BYTE
ONDAISI VAR BYTE
X       VAR BYTE
control var byte

symbol dta=portA.0 'sensor dATA PİNİ PORTA.0 A BAĞLI


BASLA:


output dta
LOW DTA
Pause 18       '18 ms bekle
HIGH DTA           'Data pinini High yap
Pauseus 40   '40 us bekle
input dta
WHILE DTA=0:WEND
PAUSEUS 85

IF DTA=1 then HATA

TAMRUT=0
FOR I=7 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE DTA=0:WEND 
   Pauseus 40
  IF DTA=1 then TAMRUT.0[I]=1
  while dta=1:wend
Next



ONDARUT=0
FOR I=7 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE DTA=0:WEND
   Pauseus 40
  IF DTA=1 then ONDARUT.0[I]=1
  while dta=1:wend
Next

TAMISI=0
FOR I=7 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE DTA=0:WEND
    Pauseus 40
  IF DTA=1 then TAMISI.0[I]=1
  while dta=1:wend 
Next

ONDAISI=0
FOR I=7 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE DTA=0:WEND 
   Pauseus 40
  IF DTA=1 then ONDAISI.0[I]=1
  while dta=1:wend
 
Next

control=0
FOR I=7 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE DTA=0:WEND
   Pauseus 40
  IF DTA=1 then control.0[I]=1
  while dta=1:wend
 
Next

LCDOUT $FE,1 
LCDOUT $FE,$80,"NEM=",DEC TAMRUT,",",DEC ONDARUT
LCDOUT $FE,$C0,"ISI=",dec TAMISI,",", DEC ONDAISI
PAUSE 800

GOTO BASLA

hata:
LCDOUT $FE,1 
LCDOUT $FE,$80,"SENSOR HATASI"

GOTO BASLA

END

ete

Yine akıl galip geldi diyorum. Tabiiki çalışmalarınıda göz ardı etmemek gerek. Sende epeyce şey öğrendin bu arada.
Her neyse sonunda sensörü çalıştırdığımıza sevindim doğrusu. Biraz geç oldu ama sonu iyi oldu.
Ete

veliusta

Alıntı yapılan: ete - 29 Mart 2013, 09:48:16
Yine akıl galip geldi diyorum. Tabiiki çalışmalarınıda göz ardı etmemek gerek. Sende epeyce şey öğrendin bu arada.
Her neyse sonunda sensörü çalıştırdığımıza sevindim doğrusu. Biraz geç oldu ama sonu iyi oldu.
Ete

Merhaba hocam. Elimde DHT11 Sensörü var. Yukarıdaki kodu derledim. Fakat hangi işlemciyi kullanacağız bilmiyorum.LCD ve Sensör bağlantısı nasıl olacak? Devre şeması verebilir misiniz?

ete

Söz konuus kod yalnızca 1 adet pic pini kullanarak DHT11 sensöründen okuma yapıyor.
18 pinli herhangi bir işlemci kullanılabilir.
Bir işlemci ve bir LCD ile birlikte bir şema oluşturmak çok zor olmasa gerek.
İlişikteki PDF dosyasında ilgili şemayı çizmeye çalıştım.

Ete

Powered by EzPortal