avatar_Hattuşa

DHT22 PROTON CODE

Başlatan Hattuşa, 07 Mayıs 2017, 11:50:51

Hattuşa

slm
dht22 yi okumak için sitede proton kodu aradım ama bulamadım. hernedense protonda yazanlarda sanki anlaşmış gibi basicte yazmış, bende basic kodunu alıp protona çevirdim. lazım olan olur diye de buraya ekliyorum. bas dosyası ve proteus 8.6 dosyası ektedir

Device 16F628A
Xtal 4
TRISA =0
TRISB =0
PORTA =0
PORTB =0
Declare All_Digital TRUE
CMCON =7
Declare LCD_DTPin PORTB.4  ' LCD Data Pin   
Declare LCD_RSPin PORTB.2  ' LCD RS Pin
Declare LCD_ENPin PORTB.3  ' LCD EN Pin
Declare LCD_Lines 2        ' LCD Satır
Declare LCD_Interface 4    ' LCD Data Pin Sayısı 4
Cls
DelayMS 100

Symbol dTa   =PORTA.0

Dim I As Byte
Dim TaMrUt As Word
Dim OnDaRuT As Byte
Dim tAmIsI As Word
Dim OnDaIsI As Byte
Dim X As Byte
Dim cOnTroL As Byte
Dim SeC As Bit


BaSLa:
Cls
DelayMS 10
Print At 1,1,"ISI ="
Print At 2,1,"NEM ="
MaIn:
GoSub SeNsOROkU
Print At 1,7,Dec tAmIsI,",",Dec OnDaIsI," "
Print At 2,7,Dec TaMrUt,",",Dec OnDaRuT," "
DelayMS 100
GoTo MaIn



SeNsOROkU:     
          Output dTa
           dTa =1
           DelayUS 5
           dTa =0
           DelayMS 5      '1-10 ms bekle
           dTa =1         'Data pinini High yap
           DelayUS 40      '40 us bekle
           Input dTa
           DelayUS 5
           While dTa =0 :Wend
           DelayUS 80
           If dTa =1 Then HaTa

           TaMrUt=0
            For I=15 To 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
              While dTa =0:Wend 
               DelayUS 30
              If dTa =1 Then LoadBit TaMrUt,I,1
              While dTa =1:Wend
             Next

            tAmIsI=0
            For I=15 To 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
              While dTa=0:Wend
               DelayUS 30
              If dTa=1 Then LoadBit tAmIsI,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
               DelayUS 30
              If dTa=1 Then LoadBit cOnTroL,I,1
              While dTa =1:Wend 
            Next
            Output dTa
            dTa=0
             OnDaRuT=TaMrUt//10 :TaMrUt =TaMrUt /10
             OnDaIsI=tAmIsI//10 :tAmIsI =tAmIsI /10
            Return
HaTa:
SeC =0
For X =0 To 50
Toggle SeC
If SeC =1 Then Print At 1,3,"SENSOR HATASI"
If SeC =1 Then Print At 1,3,"             "
DelayMS 200
Next X
GoTo BaSLa

End

F®T

Eline sağlık Selami hocam.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

mustafa_cmbz

Selami abi hortlatıyorum konuyu ama şöyle bir sıkıntım var..

kod güzel çalışıyor fakat 4mhz ile sorun yok devrede serial haberleşme için 20mhz kristal kullanmam gerek bu kez de dht22 çalışmıyor.

Nası etcez?

ete

#3
20 Mhz de ne değişiyor sence?
4 Mhz de 1 clk çevrimi yada bir komut çevrimi 1us dir (4/4=1 ve 1/1=1us. 20Mhz de ise 1/5=0,2us dir.
DHT22 tamamen zaman bazlı bir okuma sistemine sahip olup bu zamanlamaya çok dikkat etmek gerekiyor.
Yapılacak iş zamanları 20mHz göre dikkatlice inceleyip gereken düzenlemeyi yapmak olacaktır.
Normal şartlarda kod pause-puseus (veya delayus delayms) gibi komutlarla yazılmış ise programın başına define osc 20 veya xtal 20 şeklinde programın hangi kristal ile çalıştığını belirtirsen bu komutlar otomatikman komut çevrimine göre ayarlanırlar. Ancak timer kullanılarak zamanlama yapılmış ise bu yeni frekansa göre ayarlanmalıdır.

Ete

er-da

ısı göstermede eksi ısıları düzgün görüntülemiyor .kod da bu bölüm yok .

POWER

İyi geceler,
DHT-22 için verilen kodu isis de çalıştırdığımda,ısı ve nem değeri sıfır görünüyor.resmini verdiğim hatayı veriyor en sonunda kilitlenip kaılıyor.Resimdeki uyarı yada hatanın anlamı nedir?


Hattuşa

okuma ile alakalı proton kodunuz nedir? buraya eklerseniz yardımcı olmaya çalışırız

POWER

Proton IDE Version:2.0.1.0
Proton PIC BASIC Compiler
Loader version:3.5.2.7
Compiler Version:3.7.3.1

Hattuşa

hocam anlatamadım galiba özür, ben aşağıdaki gibi yazdığınız kodu sormuştum. neyse örnek şema ve kodu ekliyorum içinden ihtiyacınız olanı alırsınız. şema proteus 8.6 versiyon

16f628a ve dt22 kodudur

SeNsOROkU:      
          Output dTa
           dTa =1
           DelayUS 5
           dTa =0 
           DelayMS 5      '1-10 ms bekle
           dTa =1         'Data pinini High yap
           DelayUS 40      '40 us bekle
           Input dTa
           DelayUS 5
           While dTa =0 :Wend
           DelayUS 80
           If dTa =1 Then HaTa

           TaMrUt=0
            For I=15 To 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
              While dTa =0:Wend  
               DelayUS 30
              If dTa =1 Then LoadBit TaMrUt,I,1
              While dTa =1:Wend
             Next
 
            tAmIsI=0
            For I=15 To 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
              While dTa=0:Wend
               DelayUS 30
              If dTa=1 Then LoadBit tAmIsI,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 
               DelayUS 30
              If dTa=1 Then LoadBit cOnTroL,I,1
              While dTa =1:Wend  
            Next
            Output dTa
            dTa=0
             OnDaRuT=TaMrUt//10 :TaMrUt =TaMrUt /10
             OnDaIsI=tAmIsI//10 :tAmIsI =tAmIsI /10
            Return
HaTa:
 SeC =0
 For X =0 To 50
 Toggle SeC
 If SeC =1 Then Print At 1,3,"SENSOR HATASI"
 If SeC =1 Then Print At 1,3,"             "
 DelayMS 200
 Next X
 GoTo BaSLa
 

POWER

#9
pardon ben yanlış anlamışım.Sizin verdiğiniz kodu deniyorum.Kendimden bir şey eklemedim.çalıştırdığım zaman anlattığım hatayı veriyor.
Sizde problemsiz çalışıyormu hocam?

Hattuşa

isisde evet problemsiz çalışıyor

POWER

isis ve protonuda kaldırıp yeniden kurdum bir şey değişmedi.hep sensör hatası veriyor.proğramı adım adım çalıştırarak inceledim. dta=1 değerini aldığı için,
"If dTa =1 Then HaTa" komutundan dolayı hep sensör hata ekranı görüntüleniyor.fakat dta neden 0 değerini almıyor onu anlayamadım.sorun devam ediyor.

ete

#12
Proton kullanmadığım için kodu test edemiyorum. Ancak bu işle defalarca uğraştım. Zamanlama çok önemli bu sensörde. Bu nedenle PBP da çalışan kodları tekrar al ve aynı şeyleri yapmaya çalış. Mesela ben 10us vermişim sen 5us vermişsin. Açıklamada 1-10us gecikme deniliyor ama derleyiciye göre komut gecikmeleri etkili olabiliyor kimi daha hızlı kimi yavaş yapabiliyor aynı şeyleri. Bu nedenle ortadan değer verme uctan ve maksimuma yakın değerler ver öyle dene.
AYrıca çalışma frekansınada dikkat et. İşlemciye hangi frekansta çalıştığını mutlaka bildirki oda gecikmelerini ona göre ayarlasın. Kısaca zamanlamaya dikkat et.

Ete

Not: Pic projede bir başkasıda aynı dertten muzdarip ve sorunun Proton versiyon değişikliğinden kaynaklandığı düşünülüyor. Önceden çalışan kodlar çalışmaz olmuş. Seninde bu şekilde bir yenilemen var ise sorun muhtemelen odur ve eski versiyona dönmeye çalış bence.
Yeni çıkan versiyonlara hemen geçmeyin. Sorunsuzluğu onaylanmış ise geçin derim. Proton kullanmama sebeplerimin başında bu tür derleyici sorunlarının çok fazla olmasından kaynaklanıyor.  O kadar çok anlamsız kusuru varki pek çok kişi bilmiyor ama ben bunları gördüğüm için kullanmıyorum. Pek çok program doğru çalışabilir ama kusur denk gelirse karşına çıkıyor değilse farkında bile olmuyorsun.

POWER

ete hocam haklısınız eski versiyonlardan bir tanesini yükledim sorun kısmen düzeldi.şimdi isis de sensör hatası veriyor ama gerçek devresinde norma çalışyor.proton tam anlamıyla stabil çalışmıyor gibi.pic basic de donanımsal kesme özelliği de olsa ne güzel olurdu.

ete

Ne demek donanımsal kesme özelliği?
He rtürlü kesme var PBP de. Sorun kesmede değil. Sorun kesme oluştuğunda basic komutu işleniyor ise onu bitirmeden PBP kesmeye gitmez. Proton gidiyor olabilir.
Örnek vereyim.
PAUSE 100 dediğim zaman henü 20-30 ms geçmeden kesme oluşmu ise 100 ms bitmeden PBP kesme etiketine atlamaz. Bunun çaresini kesme kullandığımız programlarda gecikmeyi Pause 100 şeklinde değilde
FOR I=1 to 100
  PAUSE 1
NEXT
şeklinde verme şeklinde buluyoruz. Hatta Pause 1 yerine döngüyü artırıp Pauseus 5 vererek en fazla 5us gecikme ile kesme etiketine atlamak var.
Donanımsal kesme dediğin şey TMR kesmeleri USART kesmeleri ADC kesmeleri gibi şeyleri anlarım ben. Hepside PBP da mevcut.

Ete

Powered by EzPortal