Herkeze iyi geceler,
dht22 ısı-nem sensörü için kod mevcut.sensörün okunmasında problem yok.fakat kesme ile beraber çalıştıdığım zaman bir yerlerde takılıyor.tek başına sensör okuma kısmını gerçek devresinde uzun süre denedim problem yok.sensör kısmını iptal edip kesme bölümünü uzun süre denedim yine problem olmadı.fakat kesme ve sensör okuma kısmı beraber çalıştığı zaman bir iki dakika sonra kilitleniyor.stack sorunu yok.Protonu yeni kullamaya başladım kesmedemi bir problem var anlayamadım.
Device 16F628A
Config INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_ON,LVP_off,MCLRE_OFF ,BODEN_OFF
Xtal 4
TRISA =0
TRISB =0
PORTA =0
PORTB =0
INTCON=%10100000
TMR0=0
OPTION_REG=%10000101
On_Hardware_Interrupt GoTo KESME
CMCON =7
Declare All_Digital TRUE
Declare LCD_DTPin PORTB.0 ' LCD Data Pin
Declare LCD_RSPin PORTB.4 ' LCD RS Pin
Declare LCD_ENPin PORTA.4 ' LCD EN Pin
Declare LCD_Lines 2 ' LCD Satır
Declare LCD_Interface 4 ' LCD Data Pin Sayısı 4
Dim I As Byte
Dim TaMrUt As Word
Dim OnDaRuT As Byte
Dim tAmIsI As Word
Dim OnDaIsI As Byte
Dim cOnTroL As Byte
Dim DAKIKA As Word
Dim SANIYE As Byte
Dim SAY As Byte
Symbol dTa =PORTA.3
Cls
DAKIKA=0
SANIYE=0
SAY=0
DelayMS 200
BASLA:
GoSub EKRAN
PAUSE 100
OnDaRuT=TaMrUt
GoSub SeNsOROkU
OnDaRuT=TaMrUt
GoTo BASLA
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
SetBit TaMrUt,I
EndIf
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
SetBit tAmIsI,I
EndIf
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
SetBit cOnTroL,I
EndIf
While dTa =1
Wend
Next
Output dTa
dTa=0
OnDaRuT=TaMrUt//10 :TaMrUt =TaMrUt /10
OnDaIsI=tAmIsI//10 :tAmIsI =tAmIsI /10
Return
EKRAN:
Print At 1,1,Dec2 TaMrUt ,".",Dec1 OnDaRuT," RH ",Dec2 tAmIsI,".",Dec1 OnDaIsI," C"
Print At 2,6," "
Print At 2,1,Dec2 DAKIKA,":",Dec2 SANIYE
Print At 2,15,Dec2 SAY
DelayMS 400
Return
HaTa:
Print At 1,12," "
Print At 1,1,"S E N S O R"
Print At 2,1," "
Print At 2,6,"H A T A S I"
DelayMS 1000
GoTo SeNsOROkU
KESME:
Context Save
SAY=SAY+1
If SAY<61 Then GoTo CIK
SAY=0
SANIYE=SANIYE+1
If SANIYE >= 60 Then
SANIYE=0
DAKIKA=DAKIKA+1
If DAKIKA >= 60 Then
DAKIKA=0
EndIf
EndIf
CIK:
INTCON.2=0
Context Restore
End
İsi ve Proton dosyaları.
http://s7.dosya.tc/server5/ga4txx/DHT22.rar.html
Alıntı yapılan: POWER - 07 Mayıs 2018, 00:41:28Herkeze iyi geceler,
dht22 ısı-nem sensörü için kod mevcut.sensörün okunmasında problem yok.fakat kesme ile beraber çalıştıdığım zaman bir yerlerde takılıyor.tek başına sensör okuma kısmını gerçek devresinde uzun süre denedim problem yok.sensör kısmını iptal edip kesme bölümünü uzun süre denedim yine problem olmadı.fakat kesme ve sensör okuma kısmı beraber çalıştığı zaman bir iki dakika sonra kilitleniyor.stack sorunu yok.Protonu yeni kullamaya başladım kesmedemi bir problem var anlayamadım.
Herkez kelimesini görürlerse hiç şansın yok.
Onu diyim sana :)
Dahi anlamındaki de ayrı yazılır. (https://www.facebook.com/groups/mutlubirgelecek/?fref=mentions)
Power Hocam simülasyondamı oluyor bu sorun yoksa gerçek devredimi?
Sorunun while wend kullanımı ile alakalı olduğunu düşünüyorum.
Ayrıca kesme içinde tmr ön yüklemesi olması gerekiyor.
PAUSE 100 yeine delayms 100 kullanmalısınız.
sağol, mehmet salim hocam çözüm dışındaki cevabınızdan dolayı
FT hocam,sorun gerçek devredede simülasyondada oluyor.söylediklerinizi deneyeceğim.
Alıntı yapılan: POWER - 07 Mayıs 2018, 11:27:18sağol, mehmet salim hocam çözüm dışındaki cevabınızdan dolayı
FT hocam,sorun gerçek devredede simülasyondada oluyor.söylediklerinizi deneyeceğim.
Eywallah.
Biraz nükte katayım istedim :)
@POWER evet, senin hex dosyası kitleniyor simulasyonda 30sn 40sn sonra.
ben kodu tekrar derledim, 2 düzeltme yaptım pause ve declare
15dk çalıştırdım bir sorun yok. (versiyon 3.6.0.7)
*Bu arada proteusta bas kodunu gösterip, satır satır komutu çalıştırabiliyoruz.
(proton için geçerlidir)
Device 16F628A
Config INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_ON,LVP_off,MCLRE_OFF ,BODEN_OFF
Declare Xtal=4
TRISA =0
TRISB =0
PORTA =0
PORTB =0
INTCON=%10100000
TMR0=0
OPTION_REG=%10000101
On_Hardware_Interrupt GoTo KESME
CMCON =7
Declare All_Digital TRUE
Declare LCD_DTPin PORTB.0 ' LCD Data Pin
Declare LCD_RSPin PORTB.4 ' LCD RS Pin
Declare LCD_ENPin PORTA.4 ' LCD EN Pin
Declare LCD_Lines 2 ' LCD Satır
Declare LCD_Interface 4 ' LCD Data Pin Sayısı 4
Dim I As Byte
Dim TaMrUt As Word
Dim OnDaRuT As Byte
Dim tAmIsI As Word
Dim OnDaIsI As Byte
Dim cOnTroL As Byte
Dim DAKIKA As Word
Dim SANIYE As Byte
Dim SAY As Byte
Symbol dTa =PORTA.3
Cls
DAKIKA=0
SANIYE=0
SAY=0
DelayMS 200
BASLA:
GoSub EKRAN
DelayMS 100
OnDaRuT=TaMrUt
GoSub SeNsOROkU
OnDaRuT=TaMrUt
GoTo BASLA
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
SetBit TaMrUt,I
EndIf
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
SetBit tAmIsI,I
EndIf
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
SetBit cOnTroL,I
EndIf
While dTa =1
Wend
Next
Output dTa
dTa=0
OnDaRuT=TaMrUt//10 :TaMrUt =TaMrUt /10
OnDaIsI=tAmIsI//10 :tAmIsI =tAmIsI /10
Return
EKRAN:
Print At 1,1,Dec2 TaMrUt ,".",Dec1 OnDaRuT," RH ",Dec2 tAmIsI,".",Dec1 OnDaIsI," C"
Print At 2,6," "
Print At 2,1,Dec2 DAKIKA,":",Dec2 SANIYE
Print At 2,15,Dec2 SAY
DelayMS 400
Return
HaTa:
Print At 1,12," "
Print At 1,1,"S E N S O R"
Print At 2,1," "
Print At 2,6,"H A T A S I"
DelayMS 1000
GoTo SeNsOROkU
KESME:
Context Save
SAY=SAY+1
If SAY<61 Then GoTo CIK
SAY=0
SANIYE=SANIYE+1
If SANIYE >= 60 Then
SANIYE=0
DAKIKA=DAKIKA+1
If DAKIKA >= 60 Then
DAKIKA=0
EndIf
EndIf
CIK:
INTCON.2=0
Context Restore
End
[quote author=POWER link=msg=558371 date=1525642888]
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
SetBit cOnTroL,I
EndIf
While dTa =1
Wend
Next
dün akşam proğramı satır satır çalıştırdım.
yukarıdaki
While dTa =1
wend
döngüsünde takılıp kaldığı gördüm.bu döngüyü iptal edip çalıştırdım proğramı(simülasyon ver gerçek devresinde)bir sıkıntı olmadı.fakat iptal ettiğim bölümün sensörün sağlıklı çalışmasına etkisi nedir bilmiyorum.şimdi işte olduğum için imkanım yok sizin derlemenizide deneyeceğim maxim hocam.
:10000000000000000000DF28FF0003088301FE005D
:10001000492A8030A100FE309A2001309A207530A4
:10002000A6003030AB28A101A117AE00FE309A2007
:100030002E089A28A401A900AA01A01124080319D6
:10004000A0150530A3002730A8001030332003305E
:10005000A800E8303320A80164303320A8010A301A
:10006000332029083A28A7002A08A6002908A50055
:10007000BF202508A500A3030319A0112408031914
:100080004428230203184B282508031DA011A0199A
:100090004B28303E9A280800AC0005120612831641
:1000A00005120612F030860583122C08A018762857
:1000B0003E30A6008030AB203330AB008B201330B5
:1000C000A6008830AB208B206430AA208B206430BF
:1000D000AA202230AB008B20283075200C307520F0
:1000E00006307520A0142C0876282014AB00201CA4
:1000F00084280612033C031C892889200730A600A7
:10010000D030AB20031408002014FE3C03199828BB
:100110000616AB0E201C20100516F03086052B08A5
:100120000F3986040512AB0E20188B283230AA2016
:100130002C08DB28A11B4C280800A801A700FF30D1
:10014000A707031CA807031CDB280330A600DF3029
:10015000AB209F28A601E83EA500A609FC30031CA1
:10016000B428A5070318B128A5070000A60FB128D9
:100170002518BA28A51CBE280000BE280800AA0120
:10018000A9011030AB00260DA90DAA0D2708A90260
:100190002808031C280FAA020318D5282708A90736
:1001A00028080318280FAA070310A50DA60DAB0BEE
:1001B000C328250808008313831203130800830152
:1001C000A00107309F0083168501860183128501F7
:1001D0008601A0308B0081018530831681000730B5
:1001E00083129F000920B801B701B901BA01C830D4
:1001F0009D20A62164309D203008B20002213008E5
:10020000B200F9288316851183128515072908295C
:100210000000851105309D2085152830AA20831601
:10022000851512291329000083128519182914290C
:100230005030AA208519FD29B101B0010F30AF005F
:100240008519232920291E30AA20851D35292F082C
:10025000A200A501A601A20A0314A50DA60DA20BDA
:100260002D292608B1042508B004851D3829352913
:100270000130AF0203182029B401B3010F30AF00E1
:100280008519432940291E30AA20851D55292F088C
:10029000A200A501A601A20A0314A50DA60DA20B9A
:1002A0004D292608B4042508B304851D582955296D
:1002B0000130AF0203184029B6010730AF0085199D
:1002C00062295F291E30AA20851D70292F08A200EF
:1002D000A501A20A0314A50DA20B6B292508B604DB
:1002E000851D732970290130AF0203185F29831619
:1002F0008511831285113108A6003008A500A801D8
:100300000A30A700BF202908B2003108A600300833
:10031000A500A8010A30A700BF20B0002608B10040
:100320003408A6003308A500A8010A30A700BF20A2
:100330002908B5003408A6003308A500A8010A3032
:10034000A700BF20B3002608B40008008030A10039
:1003500013200230A4003008A9003108AA001D2093
:100360002E304C200130A40032081B2020304C20BD
:1003700052304C2048304C2020304C204C204C2017
:100380000230A4003308A9003408AA001D202E3032
:100390004C200130A40035081B2020304C20433075
:1003A0004C208030A100C530132020304C204C2040
:1003B0004C204C204C204C204C204C204C20803099
:1003C000A100C03013200230A4003708A90038086B
:1003D000AA001D203A304C200230A40039081B200E
:1003E0008030A100CE3013200230A4003A081B2038
:1003F0000130A80090309E2008008030A1008B3092
:10040000132020304C204C204C204C204C2080309D
:10041000A100132053304C2020304C2045304C207C
:1004200020304C204E304C2020304C2053304C207B
:1004300020304C204F304C2020304C2052304C206B
:100440008030A100C030132020304C204C204C20A4
:100450004C204C208030A100C530132048304C2067
:1004600020304C2041304C2020304C2054304C2047
:1004700020304C2041304C2020304C2053304C2038
:1004800020304C2049304C200330A800E8309E201A
:100490000229BA0A3D303A02031C632ABA01B90A9A
:1004A0003C303902031C632AB901B70A0319B80AA0
:1004B000B808031D5F2A3C303702031C632A8312ED
:1004C0000313B801B7010B117E088300FF0E7F0EE6
:0604D0000900692A6A2AF6
:02400E00103F61
:00000001FF
maxim hocam derlemeden sonra sigorta ayarları ile ilgili tek satırlık mesaj veriyor onun anlamı nedir?
nedir mesaj?
(https://ibb.co/jcUMyy)
Hocam kusura bakmayın yoğunluktan dolayı geciktim.Sizin düzeltme yaptığınız proğramda,hazır verdiğiniz hex dosyasınıda denedim malesef donma yapıyor.Bu aralar biraz yoğunum üzerinde fazla çalışamıyorum.hata/uyarı mesajınında resmini verdim çok önemli değil anladığım kadarıyla.
oradaki mesaj uyarı (hint) bende çıkmıyor bu arada
birinci mesajda verdiğim proğramdaki sigorta ayarlarını 16f88 için kullanamıyorum hata veriyor
(https://ibb.co/jOEr0d)
olmaz tabi o ayar 16F628A için
@CONFIG_REQ
@__CONFIG _CONFIG1, INTRC_IO & WDT_OFF & PWRTE_ON & MCLR_OFF & BODEN_ON & LVP_OFF & WRT_PROTECT_OFF & CP_OFF & CPD_OFF & DEBUG_OFF
iyi geceler,
dht22 nin okunması ile ilgili proğram.
Device = 16F88
@CONFIG_REQ
@__CONFIG _CONFIG1, INTRC_IO & WDT_OFF & PWRTE_ON & MCLR_OFF & BODEN_OFF & LVP_OFF & WRT_PROTECT_OFF & CP_OFF & CPD_OFF & DEBUG_OFF
Xtal 4
'Device = 16F628A
'Config INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_ON,LVP_off,MCLRE_OFF ,BODEN_OFF
'Xtal 4
TRISA=%00000000
TRISB=%11100000
PORTA=0
PORTB=0
OPTION_REG.7=0
CMCON =7
ANSEL=0
Declare All_Digital TRUE
Declare LCD_DTPin PORTB.0 ' LCD Data Pin
Declare LCD_RSPin PORTB.4 ' LCD RS Pin
Declare LCD_ENPin PORTA.4 ' LCD EN Pin
Declare LCD_Lines 2 ' LCD Satır
Declare LCD_Interface 4 ' LCD Data Pin Sayısı 4
Symbol dTa =PORTA.3
Dim Y As Byte
Dim I As Byte
Dim TaMrUt As Word
Dim OnDaRuT As Byte
Dim tAmIsI As Word
Dim OnDaIsI As Byte
Dim cOnTroL As Byte
Dim saat As Byte
Dim dakika As Byte
Dim saniye As Byte
DelayMS 400
BASLA:
GoSub SeNsOROkU
GoSub EKRAN
DelayMS 100
GoTo BASLA
EKRAN:
Print At 1,1,"ISI= ",Dec2 tAmIsI,".",Dec1 OnDaIsI ," C "
Print At 2,1,"NEM= ",Dec2 TaMrUt ,".",Dec1 OnDaRuT," RH "
Return
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
If dTa=1 Then
SetBit TaMrUt,I
EndIf
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
If dTa=1 Then
SetBit tAmIsI,I
EndIf
While dTa =1
Wend
Next
cOnTroL=0
For I=7 To 0 STEP-1 '7 de hata veriyo.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
If dTa=1 Then
SetBit cOnTroL,I
EndIf
''-------------------------------BURASI SORUNLU-------------------------------------------
While dTa =1
Wend
''''---------------------------------------------------------------------------------------
Next
Output dTa
dTa=0
OnDaRuT=TaMrUt//10
TaMrUt =TaMrUt /10
OnDaIsI=tAmIsI//10
tAmIsI =tAmIsI /10
Return
HaTa:
Print At 1,12," "
Print At 1,1,"S E N S O R"
Print At 2,1," "
Print At 2,6,"H A T A S I"
DelayMS 1000
Return
End
16f628 ile simülasyonda ve gerçek devresinde de sorunsuz çalışıyor.16f88 için sigorta ayarlarını ve ansel=0 ekleyip derleme yapıyorum sorunsuz derliyor.fakat simülasyondada gerçek devresindede sensor hatası veriyor.aynı sensoru kullanıyorum.atladım nokta nerde bilemedim.
tüm dosyaları yüklüyorum.
http://s7.dosya.tc/server6/hmvtwv/ISI-NEM.rar.html
16F88 dahili osilatörü tek seçenekli değildir. (628A da tek seçenek 4Mhz vardır) .
Bu nedenle OSCCON registerine de değer vererek çalışma freansını belirlemek gerekir.
Zaten aynı kod birini çalıştırıyor diğerini çalıştırmıyor ise kesinlikle zamanlama hatası var demektir. Onun da yaratan OSCCON registerine değer verilmemesi olmalıdır.
OSCCON=%01101100 bu değer 4Mhz içindir.
Verip deneyin lütfen.
Ete
Hocam,
verdiğiniz değerleri uyguladım sorun çözüldü.Teşekkür ederim.
benim de bir sorum olacak bu konu ile ilgili..
Benimde mesela herhangi bir seri ile DHT11 kullanırken 4mhz de çalıştırdığımda sorun yok ama farklı bir ihtiyaç için atıyorum 20mhz çalışmak istediğimde DHT11 ile haberleşemiyorum.
Anladığım kadarıyla haberleşme kısmı delayms ile yapıldığı için kristal değiştiğinde sorun yaratıyor.Bu durumu nasıl çözeriz ?
yani bekleme sürelerini kullanacağımız kristal e göre tekrar mı hesaplamak gerek yoksa ekstra bir ayar mı gerekiyor ?
ETE hocam;
şimdi delayms 100 dediğimizde, 4mhz ile 40 mhz arasında 100mS lerin farkı oluyormu? oluyorsa ben yanlış biliyorum demektir.
Normal şartlarda programlara eklediğiniz çalışma frekansını belirleyen komut satırları;
DEFINE OSC 4 veya DEFINE OSC 20 yada Xtal = 4 veya Xtal = 20 gibi komutlar işte bu işe yaramaktadır. Derleyici bu komuta göre delayms 100 denildiği zaman;
4 mhz de 100.000 komut çevrimi (bir komut çevrimi 1us dir)
20 mhz de ise 500.000 komut çevrimi (1 komut çevrimi 0,2us dir) kadar süre geçireceğini bilir.
Sonuçta programcının bir tedbir alması gerekmiyor. 4mhz de 100 ms lik gecikme komutu ile 20 Mhzde 100ms lik gecikme komutu aynı sürelerde bekleme yaptırır.
DHT sensör ile çalışırken kodlara çok dikkat etmek gerekir. Bazı kodlar vardır örneğin 4 mhz de çalışırken oraya 10 adet NOP komutu eklerseniz bu 10us lik bir gecikme yaratır. Ama aynı komutlar 20 Mhz de 2 us lik bir gecikme yaratır. Sonuçta kodları inceleyip süreye etki eden komutları tespit etmek ona göre yeniden hesaplayıp yazmak gerekir. DHT kodları aklımda değil şu an kim etkiler bilmeden bunları yazıyorum. Kısaca 20Mhzde çalışmıyor ise sorunu süreye etki eden komutlarda aramak ve bazen de bir pinin hem giriş hem çıkış olarak kullanılırken dönüşüm için yeterli süre verilip verilmediğine bakmak gerekir. Malup DHT tek pin den haberleşen bir sensör. Bunun anlamı haberleşme pini bazen giriş bazen çıkış çalışır. O pini girişten çıkışa çevirmek az da olsa bir süre gerektirebilir. 4 Mhzde dikkate alınmayan bu süre 20 Mhz de alınması gereken bir tedbir olarak karşınıza çıkabilir.
Sonuçta sistem yüksek frekansta çalışmıyor ise bu tür farklara dikkat etmek gerekir.
Ete