DS18B20 TERMOSTAT DEVRESİNE İLAVE DEVRE SORUNU

Başlatan Makmuh, 12 Şubat 2018, 17:39:19

Makmuh

İnternetten Ceyhun Beyin paylaştığı termostat devresi üzerinde küçük bir değişiklik yaparak kullanmak istedim. Fakat bilmediğim bir şeyler var istediğim sonucu alamadım. Yapmak istediğim şey cok basit okunan sıcaklık değeri 30 derecenin üzerindeyse a4 pininden çıkış almak. bunun için aşağıdaki kodu yazdım.
*****************
IF ISI>30 THEN
    PORTA.4=0
    ELSE
    PORTA.4=1
    ENDIF
************
bunu yazdım herangi bir cıkış vermedi değiştirdim.
**********
IF ISI>30 THEN
    PORTA.4=1
    ELSE
    PORTA.4=0
    ENDIF
**********
bu şekilde yazdım yine olmadı. pic devre üzerinde yeni birşeyler ögreniyorum bir yerde hatam var ama bir türlü çözemedim. Devre çizimi ve kodları eke ekledim. Konu ile ilgili yardımınıza ihtiyaçım var.

Yanlış yazdığım veya söylediğim herşeyden dolayı şimdiden özür dilerim.

ete

Yazdıklarınızda hata yok en azından ikinci şekil doğru. Yani PORTA.4 de bağlı olan Pompa rölesini çektirebilmek için PORTA.4 den HIGH çıkması gerekir. Hata şurada PORTA.4 pini open collectordür. Bu şu anlama geliyor. PORTA.4=1 dediğiniz zaman o pinden HIGH çıkmaz. Çıkması için oraya bir pullup direnc bağlamanız gerekir.  Bu pine 1K ile +5V verin sisteminiz çalışacaktır. Ama kod şöyle olmalı;
 IF ISI>30 THEN
    PORTA.4=1
    ELSE
    PORTA.4=0
ENDIF

Bu şekilde yazarsanız başka bir mahsur ortaya çıkacaktır. Sıcaklık bazen gider gelir yani 29,9 derecede sıcaklık bir 30,0 derece olur ardından okumada 29,9 olur. Bu durumda röleniz sürekli olarak kritikte kalıp çekip bırakır. Bunu önlemek için bir histerizi denile fark ortaya koymak gerekir. Örneğin 30 derece röle çeksin ama 28 derecede bıraksın veya tersi 31 de çeksin 29 da bıraksın gibi mutlaka araya 1 derecelik fark koyun.

Ete



Makmuh

öncelikle verdiğiniz cevap için çok teşekkür ederim. 3 gündür anlamaya çalışıyorum sorunu. Sorunun yanında baksa bir noktaya temas ettiğiniz için de ayrı yeten teşekkür ederim. Sizin söylediğinizden anladım kadarıyla programda bu adımları ekledim. Hatta set ısısınada 2 derecelık bir ust ısı tanımladım güzel çalıştı. Allah razı olsun

***********
    if porta.1=0 or porta.0=0 then
    goto ayaryap
    ELSE
    USTSET=set+2
    endif
    if ISI=>ustset then
    porta.3=0
    ENDIF
    if ISI<set then
    porta.3=1
    ENDIF
   
   
    IF ISI>30 THEN
    PORTA.4=1
    ELSE
    ENDIF
    IF ISI<29 THEN
    PORTA.4=0
    ELSE
    ENDIF

Makmuh

Bu programı 16f877a da uygulamayı  denedim.  Sorunum sıcaklık değerini okuyamiyorum ds18b 20 sensorunu 10 derece yapsamda 80 derece yapsamda sıcaklık hep -1 derece okuyorum.
  16f877a da dijital ve analog pinler varmış oyuzden olduğunu düşündüm ADCON1 = 7  komutunuda yazdım. Yine sonuç aynı ds18b 20 a tüm portlara bağlamaya rağmen sonuç hiç değişmiyor.
Nerede yanlış yaptığımı bir türlü bulamadım. Yardımcı olabilirmisiniz.

ete

Nerede yaptığını ben söyleyeyim hala farkında değilsin. Yanlışın buraya ne yaptığına dair hiç bir kod vermemende yatıyor. Ben yada biz müneccim değiliz nerede hata yaptığını ancak yazdıklarında bakarak var ise senin göremediğin hataları bulup sana söyleyerek bu sorunu çözebiliriz. Hiç bir şey vermezsen cevabım "mutlaka ya bağlantında yada programdaki kodlarında hata vardır" şeklinde olur buda seni tatmin etmeyecektir sanırım.
Ete

Makmuh

Anladım hatamı üzgünüm. Kusura bakmayın şehir dışındaydım o yüzden geç yazıyorum. Cevabınız baya tatmin ediciydi   :)
bağlantıları tekrar kontrol ettim ama yine bişey bulamadım. Oyüzden dosyaları yükledim.  Vereceginiz cevap için şimdiden teşekkür ederim.

POWER

proteus 8.5 kullanıyorum verilen dosyayı açamıyorum.versiyon yükseltmeden açmanın yöntemi varmıdır?

Makmuh

Benim Program versiyonda 8.5 ti sanırım neden acamadigini anlamadım ama daha önce kısmı jpeg olarak almıştım şeması ekte veriyorum.

ete

Ölümcül hata!!!!.
Programın en başına bakıyoruz hep birlikte;
'***********Program Başlangıcı***********
lcdout $FE,1
LCDOUT $FE,$80,ISARET,DEC ISI,".",DEC1 (Float),Derece,"C "
PAUSE 500
GOSUB SENSOROKU
SENSOROKU:
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN

Daha ana çalışma kısmına gelmeden oraya GOSUB SENSOR_OKU diye bir komut yazmışsın.
Hadi onu yazmak büyük kusur değil. Ama hemen altına alt program olan SENSOR_OKU kısmını yerleştirip sonunda bir RETURN koyarsan program ne yapabilirki?.
GOSUB SENSOR_OKU komutu programı sensör okumaya gönderir. Sensörü okur ve RETURN denilince geri döner nereye dönecek tam tamına GOSUB SENSOR_OKU komut satırının bir altına orada ne var peki SENSOR_OKU etiketi var.
Anlayacağın tekrar oraya gelecek program ve yeniden sensör okuyacak ama sonunda RETURN görecek bu return bir GOSUB komutuna karşılık gelmediği için işlemci şaşıracak. Çünki oraya bir gosub ile gelmedi ve RETURN ile döneceği adres kayıtlı değil şaşırıp kilitlenir işlemci.
Her neyse programın doğru halini aşağıda veriyorum.

Ete

@ __config _BODEN_OFF  & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _XT_OSC
DEFINE OSC 4
CMCON=7
ADCON1 = 7
TRISA=%111111111
TRISB=0
TRISC=%111111111
TRISD=0
TRISE=0
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0


'***********LCD Tanımlamaları***********

DEFINE LCD_DREG        PORTB    'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT        4        'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG        PORTB    'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT        2        'LCD Enable Bacağı Hangi bite bağlı ?
define LCD RWREG    PORTB   'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT    1       'LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG    PORTB    'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT    0        'LCD RS bacağı Hangi Bite bağlı  ?
DEFINE LCD_BITS        4        'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES    2        'LCD Kaç sıra yazabiliyor   

'***********Özel Karakter Tanımlamaları
LCDOUT $FE,$40, 6, 9, 9, 6, 0, 0, 0, 0 'Derece İşareti
LCDOUT $FE,$48, 4, 14, 4, 4, 4, 4,14,0 'İ Harfi
LCDOUT $FE,$50, 14, 17, 16, 16,16,17,14,4 'Ç Harfi
LCDOUT $FE,$58, 14, 17, 16, 14,1, 17,14,4 'Ş Harfi

'***********Port Ayarları***********



PortA = 0
PortB = 0
PortC = 0 
PortD = 0
'***********Sensör Tanımlamaları***********

Busy        VAR BIT         ' Busy Status-Bit
HAM         VAR    WORD        ' Sensör HAM okuma değeri
ISI         VAR WORD        ' Hesaplanmış ISI değeri
Float       VAR WORD        ' Holds remainder for + temp C display
X           VAR WORD       
ISARET_BITI   VAR HAM.Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
EKSI_ISI   CON 1           ' Sıfır altında isaret biti=1  oluyor kontrol için
DERECE     CON 223         ' ° işareti
ISARET     VAR BYTE        '  ISI değeri için  +/-  işaret
TEMP        VAR word       ' Div32 bit hesap için geçici değişken
SYMBOL COMM_PIN=PORTC.2    ' One-wire Data-Pin "DQ" PortB.0 da
Set var byte

'***********LCD yi Kullanıma Hazır Hale Getir***********

LOW PORTB.1 'RW bacağı ekrana yazmaya imkan vermek için LOW yapıldı.
set=20

lcdout $FE,1
PAUSE 200   ' LCD nin kullanıma hazır hale gelebilmesi için gerekli süre
lcdout $FE,1

LCDOUT $FE,$80,"16F877A"                 
LCDOUT $FE,$C0, "***TERMOSTAT***"
pause 200

'***********Program Başlangıcı***********
lcdout $FE,1
LCDOUT $FE,$80,ISARET,DEC ISI,".",DEC1 (Float),Derece,"C "
PAUSE 500
gosub SENSOROKU
GOSUB HESAPLA
PAUSE 100

BASLA:
GOSUB SENSOROKU
GOSUB HESAPLA
    LCDOUT $FE,$80,"SICAKLIK:",ISARET,DEC ISI,".",DEC1 (Float),Derece,"C "  '2. satırda ısı
GOTO BASLA

Hesapla:                 ' Ham değerden Santigrat derece hesabı   
    ISARET  = "+"
    IF ISARET_BITI = EKSI_ISI THEN
       ISARET   = "-" 
       HAM=~HAM+2
    ENDIF
    ISI=HAM*10/16
    FLOAT = ISI//10
    ISI=ISI/10
    RETURN
   
SENSOROKU:
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
RETURN   


End

Makmuh

Teşekkürler sizin söylediğiniz gibi uyguladım. yanlız sıcaklık dercesi yine okuyamadım +0.1 C gösteriyor. Başla döngüsünün hemen üstündeki iki tane gosub satırını sildim denedim. yine olmadı ds18n20 bağladıgım dirençi 4.7 k yaptım yine olmadı. Gözümden kaçırdığım başka bir yer daha var sanırım.




@ __config _BODEN_OFF  & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _XT_OSC
DEFINE OSC 4
CMCON=7
ADCON1 = 7
TRISA=%111111111
TRISB=0
TRISC=%111111111
TRISD=0
TRISE=0



'***********LCD Tanımlamaları***********

DEFINE LCD_DREG        PORTB    'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT        4        'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG        PORTB    'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT        2        'LCD Enable Bacağı Hangi bite bağlı ?
define LCD RWREG    PORTB   'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT    1       'LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG    PORTB    'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT    0        'LCD RS bacağı Hangi Bite bağlı  ?
DEFINE LCD_BITS        4        'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES    2        'LCD Kaç sıra yazabiliyor   

'***********Özel Karakter Tanımlamaları
LCDOUT $FE,$40, 6, 9, 9, 6, 0, 0, 0, 0 'Derece İşareti
LCDOUT $FE,$48, 4, 14, 4, 4, 4, 4,14,0 'İ Harfi
LCDOUT $FE,$50, 14, 17, 16, 16,16,17,14,4 'Ç Harfi
LCDOUT $FE,$58, 14, 17, 16, 14,1, 17,14,4 'Ş Harfi

'***********Port Ayarları***********



PortA = 0
PortB = 0
PortC = 0 
PortD = 0
'***********Sensör Tanımlamaları***********

Busy        VAR BIT         ' Busy Status-Bit
HAM         VAR    WORD        ' Sensör HAM okuma değeri
ISI         VAR WORD        ' Hesaplanmış ISI değeri
Float       VAR WORD        ' Holds remainder for + temp C display
X           VAR WORD       
ISARET_BITI   VAR HAM.Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
EKSI_ISI   CON 1           ' Sıfır altında isaret biti=1  oluyor kontrol için
DERECE     CON 223         ' ° işareti
ISARET     VAR BYTE        '  ISI değeri için  +/-  işaret
TEMP        VAR word       ' Div32 bit hesap için geçici değişken
SYMBOL COMM_PIN=PORTC.2    ' One-wire Data-Pin "DQ" PortB.0 da
Set var byte

'***********LCD yi Kullanıma Hazır Hale Getir***********

LOW PORTB.1 'RW bacağı ekrana yazmaya imkan vermek için LOW yapıldı.
set=20

lcdout $FE,1
PAUSE 200   ' LCD nin kullanıma hazır hale gelebilmesi için gerekli süre
lcdout $FE,1

LCDOUT $FE,$80,"16F877A"                 
LCDOUT $FE,$C0, "***TERMOSTAT***"
pause 200

'***********Program Başlangıcı***********
lcdout $FE,1
LCDOUT $FE,$80,ISARET,DEC ISI,".",DEC1 (Float),Derece,"C "
PAUSE 500
gosub SENSOROKU
GOSUB HESAPLA
PAUSE 100

BASLA:
GOSUB SENSOROKU
GOSUB HESAPLA
LCDOUT $FE,$80,"SICAKLIK:",ISARET,DEC ISI,".",DEC1 (Float),Derece,"C "  '2. satırda ısı
GOTO BASLA

Hesapla:                 ' Ham değerden Santigrat derece hesabı   
    ISARET  = "+"
    IF ISARET_BITI = EKSI_ISI THEN
       ISARET   = "-" 
       HAM=~HAM+2
    ENDIF
    ISI=HAM*10/16
    FLOAT = ISI//10
    ISI=ISI/10
    RETURN
   
SENSOROKU:
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
RETURN   


End

ete

Simulasyonda yerleştirmiş olduğun işlemci üzerine sağ tıklarsan özelliklerine ulaşırsın (Edit Properties).
Ekrana gelen sayfada hem derlediğin programın (hex dosyasını) burada işlemciye göstermen hemde işlemci hangi OSC hızında çalışıyor ise onu ayarlaman gerekir. Programın 4Mhz OSC frekansında çalışmaktadır.  O sayfada "Processor Clock Frequency" ibaresinin karşısında ne yazıyor?  ben söyleyeyim 1Mhz yazıyor. Hemen anlayacağın gibi bu yanlış bir seçim yada tercih oluyor.
Sıcaklık sensörü OneWire haberleşme sistemini kullanır ve bu haberleşme tek kablo üzerinden tamamen "zaman" bazındaki puls değerleri ölçülerek haberleşme sağlanmaktadır. Sen oraya 1Mhz bırakırsan haberleşmeyi yapamaz. Oradaki değeri 4Mhz olarak değiştir sonra tekrar dene bakalım.

Ete


Makmuh

Teşekkür ederim. Tamda tahmin ettigimiz gibi bir hata yapıyormuş um.4 mhz yaptım düzeldi. Diğer aşamalara geçebilirim artık

Makmuh

İyi günler
Daha önce programı yardımınızla düzeltiğim devrenin pcb sini basmaya çalıştım.  Her kadar kötü bir işçilik yapsamda ilk olması hasebiyle mazur görürsünüz inş.
Şimdi pcb devesini tasarlarken 16f628a nın vss ve vcc bacagına hiç birşey bağlatmadı program. Bende o şekilde yaptım ve bastım. Program duzgun şekilde bilgisayarda çalışıyordu. Yanlız ben bu resimde attığım devrede çalıştıramadım. Lcd nin en alt satırında sadece içi dolu kareler çıkıyor. başka bir işlem yapmıyor.
16f628a nın vcc ve vss bacagına +5 v ve gnd bağladım. yine tepki vermedi. Lehimlerimi  ve yollarım düzgün tek tek ölçtüm.
16f628a nın programını cıkartıp tekrar pickit 2 ye okuttum okuyor.
Sizce nerede hata yapıyorum.

MC_Skywalker

VCC VDD uçlarını bağlamadan PIC çalışmaz.
Çalışmanı proteusile yaptın sanırım çalışma dosyalarını bir yer yükle, bakalım.

Makmuh

Çalışma dosyalarından kasıt proteus ve microcod dosyası ise deskop rar klasorunde var. onun dışında başka birşeyse biraz açıklarmısınız neyi istiyorsunuz. proteusun içinde hem pcb hemde seması var

Powered by EzPortal