16f628'li ds 18b20 lcd'li artı ve eksi sıcaklık ayarlanabilir termostat devresi

Başlatan hkalaycioglu, 29 Ekim 2012, 15:48:47

hkalaycioglu

devre gayet güzel çalışıyor yapmak isteyenler için program ve devre linki  asağıdadır.

https://rapidshare.com/files/2582615186/628 ile.DSN

@ DEVICE pic16F628 'işlemci 16F628
@ DEVICE pic16f628,WDT_OFF
@ DEVICE pic16f628,PWRT_OFF
@ DEVICE pic16f628,BOD_OFF
@ DEVICE pic16f628,LVP_OFF
@ DEVICE pic16F628,PROTECT_OFF
@ DEVICE pic16f628,MCLR_OFF
@ DEVICE pic16f628,INTRC_OSC_NOCLKOUT

CMCON = 7
TRISA=%00110111
TRISB=%00000010

PORTA=0
PORTB=0

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
     
'---------------------------değişkenler-----------------------------------------
    SYC      VAR    BYTE
    TERM     VAR    BYTE
    SAYI     VAR    BYTE
    AYAR     VAR    BYTE
    TSEN     VAR    WORD
    TSET     VAR    WORD
   
    ALT      VAR    WORD
   
    EK       VAR    BYTE       
    ALARM1   VAR    word
    ALARM2   VAR    word
    E1        VAR    BYTE
    E2        VAR    BYTE
    MENU    VAR     PORTA.0
    YUKARI  VAR     PORTA.1
    ASAGI   VAR     PORTA.2
    Busy       VAR BIT         ' Busy Status-Bit
    a var byte
   
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   
eksi var byte   
ISARET_BITI   VAR HAM.Bit12   '   +/- 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 BYTE       ' Div32 bit hesap için geçici değişken
SYMBOL COMM_PIN=PORTB.1

LCDOUT $FE,$40,4,14,14,14,14,31,31,0
lCDOUT $FE,$48,$6,$9,$9,$6,$0,$0,$0,$0        'derece işareti

GIRIS:
   
   LCDOUT $FE,$80,"I S I A L A R M "           
   lcdout $FE,$C0," D E V R E S I  "
    PAUSE 2000
         LCDOUT $FE,1
   
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
     '-------------------------------------------------------------------------------
BASLANGIC:
SYC=0

READ $01,A:IF A=255 THEN A=0
READ $11,term:IF term=255 THEN term=1
read $02,eksi
read $03,ISARET

read $38,EK:IF EK=255 THEN EK=0
                 
BASLA: 

        GOSUB SENSOROKU
        GOSUB EKRAN1
        GOSUB ISIKONTROL
       

   

IF MENU=1 THEN  GOTO AYAR_MENUSU
goto BASLA       
'---------------------------------------EKRANA YAZ -----------------------------
EKRAN1:
  ALARM1=ALT/10:ALARM2=ALT//10
  lcdout $FE,$80,"ISI =",ISARET,DEC3 ISI,",",DEC1 (FLOAT),1,"C"
 
  lcdout $fe,$C0,"SET =",eksi,DEC3 term,",",DEC1 A,1,"C"

   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
Hesapla:                 ' Ham değerden Santigrat derece hesabı
    ISARET  = "+"
    IF ISARET_BITI = EKSI_ISI THEN
       ISARET   = "-"
       
       ham=~ham+2
    endif
    float = (HAM*10)/16   
    ISI=float/10
    write $03,ISARET
    RETURN 
'----------------------------ISI KONTROL----------------------------------------

ISIKONTROL:
READ $38,EK
READ $11,term:IF term=255 THEN term=1
read $02,eksi
read $03,ISARET

TSET=(term*10)+a:TSEN=FLOAT
       if eksi=ISARET then             
     
        if tsen=<(TSET-EK) then
         
         low PORTA.3
         'LCDOUT $FE,$CD," "
         LCDOUT $FE,$CE," "
          lcdout $fe,$CF," "
         
          else
          high PORTA.3
          'lcdout $fe,$CD,0
          lcdout $fe,$CE,0
         lcdout $fe,$CF,0           
         
         endif
          endif           
       
      IF MENU=1 THEN  GOTO AYAR_MENUSU
RETURN



BIP:
    HIGH PORTA.3   
pause 50
     LOW PORTA.3 
  RETURN
BIPBIP:
     HIGH PORTA.3   
    PAUSE 50
      LOW PORTA.3
    PAUSE 100
     HIGH PORTA.3
    PAUSE 50
      LOW PORTA.3
RETURN
'-------------------------------------------------------------------------------




AYAR_MENUSU:
GOSUB BIP
WHILE MENU=1:WEND
GOSUB TEMIZLE
SYC=0
AYARLAR:
IF YUKARI=1 THEN
GOSUB BIP
WHILE YUKARI=1:WEND
SYC=SYC+1
  IF SYC=3 THEN SYC=0
ENDIF

IF ASAGI=1 THEN
GOSUB BIP
WHILE ASAGI=1:WEND
SYC=SYC-1
  IF SYC=255 THEN SYC=2
ENDIF
GOSUB DURUM
GOTO AYARLAR

DURUM:
SELECT CASE SYC
CASE 0
lcdout $fe,$80,"ISITICI AYARLARI"
LCDOUT $FE,$C0,"              "
IF MENU=1 then
WHILE MENU=1:WEND

GOSUB BIP
GOTO TERM_KONTROL
ENDIF

CASE 1
lcdout $fe,$80,"ISI HASSASIYET  "
LCDOUT $FE,$C0,"   A Y A R I "
IF MENU=1 then
WHILE MENU=1:WEND
GOSUB BIP
GOTO HASSASIYET
ENDIF

CASE 2
lcdout $fe,$80,"MENUDEN CIKIS   "
LCDOUT $FE,$C0,"              "   
IF MENU=1 THEN AYARLANDI
END SELECT

RETURN

TERM_KONTROL:
       GOSUB TEMIZLE
       if term=255 then term=0 
       term=0
       
      READ $01,a:READ $11,term:read $02,eksi   
SET_AYAR:
ALARM1=ALT/10:ALARM2=ALT//10
LCDOUT $FE,$80,"ISI LiMiTiNi SEC"
LCDOUT $FE,$C0,"AYAR:",eksi,DEC3 term,",",DEC1 A,1,"C"
   write $02,eksi

 
           IF YUKARI=1 then
              if eksi="+" then
                a=a+1
                gosub bip
                if a=10 then
                 a=0:term=term+1
                  if term>125 then term=125
                endif
              else
                a=a-1
                gosub bip
                if a=255 then
                 
                A=9 :term=term-1
                if term=255 then
                 term=0:eksi="+":A=1
                               
                 endif
                endif
              endif   
              PAUSE 150
           ENDIF
           
           IF ASAGI=1 then
             if eksi="+" then
             
               A=A-1
               gosub bip
               if a=255 then
               a=9:
                   term=term-1
               IF TErm=255 then
                     term=0:eksi="-":A=1
                   
                   endif
                 endif   
                 goto CIK
             else
             a=a+1
              gosub bip
             if a=10 then
               a=0:
                  term=term+1
             IF term=55 then term=55
               endif 
             endif
             pause 150
            endif       
             
CIK:             
             PAUSE 150
         
         
iF MENU=1 THEN
         
         WRITE $01,a
         WRITe $11,term
       
         GOTO AYAR_MENUSU
         ENDIF
                     
GOTO SET_AYAR 

HASSASIYET:
GOSUB TEMIZLE
HASSAS:
E1=EK/10:E2=EK//10
LCDOUT $FE,$80,"HASSASIYET"
LCDOUT $FE,$C0,"AYARI:",DEC1 E1,",",DEC1 E2,1,"C"
IF YUKARI=1 THEN
EK=EK+1
PAUSE 100
gosub BIP
endif
IF EK=01 THEN EK=51
IF ASAGI=1 THEN
EK=EK-1
gosub BIP
PAUSE 100
endif
IF EK=51 THEN EK=01
IF MENU=1 THEN
WRITE $38,EK:PAUSE 10
GOTO AYAR_MENUSU
ENDIF
GOTO HASSAS   




AYARLANDI:
           IF MENU=1 then AYARLANDI
       lcdout $fe,1
      LCDOUT $FE,$80,"AYARLAR  ....  "
      LCDOUT $FE,$C0,"KAYDEDILDI....  "
       GOSUB BIPBIP
       AYAR=1
       SYC=0
       PAUSE 800
       
        GOSUB TEMIZLE
        goto BASLANGIC       
TEMIZLE:
        lcdout $fe,1
RETURN       
END
   
   



vardar07

Alıntı yapılan: hkalaycioglu - 29 Ekim 2012, 15:48:47
devre gayet güzel çalışıyor yapmak isteyenler için program ve devre linki  asağıdadır.

https://rapidshare.com/files/2582615186/628 ile.DSN
   
Arkadaşım çalışman için emeğine sağlık. Yalnız link ölü yeniden yayınlama şansın varmı. Ayrıca derlemede kırmızı ile belirtilen yerde hata veriyor. Acaba orası HIGH PortA.3 mü olacak.

ISIKONTROL:
READ $38,EK
READ $11,term:IF term=255 THEN term=1
read $02,eksi
read $03,ISARET
TSET=(term*10)+a:TSEN=FLOAT
       if eksi=ISARET then             
      if tsen=<(TSET-EK) then
         low PORTA.3
         'LCDOUT $FE,$CD," "
         LCDOUT $FE,$CE," "
          lcdout $fe,$CF," "
         else
     high PORTAşğ.3
           
        'lcdout $fe,$CD,0
          lcdout $fe,$CE,0
         lcdout $fe,$CF,0           
           endif
          endif           
       IF MENU=1 THEN  GOTO AYAR_MENUSU
RETURN

hkalaycioglu

https://rapidshare.com/files/2582615186/628 ile.DSN    linki kopyala öyle adres satırına yapıştır  üzerine tıklarsan linkin hepsini almadığı için  hata veriyor


ISIKONTROL:
READ $38,EK
READ $11,term:IF term=255 THEN term=1
read $02,eksi
read $03,ISARET

TSET=(term*10)+a:TSEN=FLOAT
       if eksi=ISARET then             
     
        if tsen=<(TSET-EK) then
         
         low PORTA.3
         'LCDOUT $FE,$CD," "
         LCDOUT $FE,$CE," "
          lcdout $fe,$CF," "
         
          else
          high PORTA.3
          'lcdout $fe,$CD,0
          lcdout $fe,$CE,0
         lcdout $fe,$CF,0           
         
         endif
          endif           
       
      IF MENU=1 THEN  GOTO AYAR_MENUSU
RETURN


high porta.3 olacak

~ENES~

adresi bütün kopyalayıp yapıştırdım  yne olmadı mümkünse devrenin resmini koyar mısınız çizmeye çalışayım ...
ALLAH'a teslim olmuş bir insan ! Ne sultan tanir , ne sadrazam !

sinancnc

Alıntı yapılan: enes1153 - 13 Şubat 2013, 23:38:37
adresi bütün kopyalayıp yapıştırdım  yne olmadı mümkünse devrenin resmini koyar mısınız çizmeye çalışayım ...

http://etepic.com/index.php?topic=73.new;topicseen#new

Üsteki linkte ete hocanın projesi var ben yaptım evde kullanıyorum...
Paylaşmayı seven insan toprak olup gitmez. Bir şeyler bırakır...!

kursadkurtbey

Hocam çok teşekkür ederim açıklamalarınız için. simülasyonu göndermeye çalışıyorum fakat ileti göndermede dosya ekleme yapamıyorum. açılmış olan konu üzerinden göndermeye çalışacağım hocam.
- dediğiniz gibi eprom kayıt yok programda.
- ekranda set değeri ve set2 değeri görünüyor fakat ayara gittiğimde sağlıklı set ve set2 ayarı yapılamıyor. tuşa bastığımda anında bi değişiyor bi değişmiyor. yani ekranda set değerini ayarlayıp kayıt ettikten sonra set2 ayarına geçiş yapamıyorum. bunu nasıl yapabilirim.
- peki hocam set2 ile hiç uğraşmayıp set değerinin 1 derece altına düştüğünde devreye girip set değerine ulaştığında devreden çıkacak programı nasıl yazabiliriz?

ilginize şimdiden teşekkür ederim.

ete

Bütün yapman gereken şey ağzından çıkan lafları program kodlarına dönüştürmek. Yapabiliyorsan tabiiki.
Yapabildiğini varsayıyorum yoksa programı nasıl yaarız diye sormazdın herhalde.
Nedir ağzından çıkan şey, bakalım,
" peki hocam set2 ile hiç uğraşmayıp set değerinin 1 derece altına düştüğünde devreye girip set değerine ulaştığında devreden çıkacak programı nasıl yazabiliriz?"
Genel anlamda olaya baktığımız anda elimizde bir sensörden okunan sıcaklık (ISI) ve bir de SET sıcaklığımız olduğunu görüyoruz. Peki şartımız nedir? ISI set değerin 1 derece altına düşerse (IF ISI<(SET-1) devreye girecek ve SET değere ulaştığında ise (IF ISI=SET) devreden çıkacak. Peki ne devreye girecek ne çıkacak. Herhalde devrede bağlı ROLE olsa gerek.
O halde komut setimiz;
IF ISI<(SET-1) THEN ROLE=1
IF ISI=>SET THEN ROLE=0
demek yeterli olacaktır. Bazen düşünüyorumda bunları düşünmek çokmu zor acaba.? Bilmeyen için zor ama mantıkda mı çalıştırılmıyor acaba.
Bu program zaten rastgele metodla yazılmış. Bir sürü belirsizlikler var.
- TUŞLAR SYMBOL komutu altında tanımlanmalı ve PORT ismi kullanılmadan sembol adlarına göre işlem yaptırılmalı. BUnu neden söylüyorum?, bu tür programlarda bir SEC tuşu olur ve onunla ayar menüsüne girersiniz. Artır tuşu ile artırma eksilt tuşu ile eksiltme yapar ve tekrar SEC tuşuna basılınca da ayar tamamlandı deyip kayıt altına alır ve başlangıca dönersiniz.
Bu programda kiminle AYAR menüsüne gidildiği nasıl çıkıldığı karışıklığa uğramış. Benim yöntemim buna düzen getirecektir.
- Ayar menüsüne girdiğinizde SEC tuşu bırakılıncaya kadar programı kontrol etmeniz gerekir. AKsi halde alt satırlarda tekrar SEC tuşu ile ayar menüsünden çıkacağınız için ayara girer çıkarsınız hatta basmaya devam ederseniz tekrar girer tekrar çıkarsınız.
- Ayar işlemi sıra ile yapılmalı sadece yapılan ayar ekrana verilmelidir. Hem SET hem SET2 diye ayarınız var ise önce SET ayar işini tamamlayıp sonra SET2 ayarına geçmelisiniz.
- SET ve SET2 diye isimler kullanmak karışıklığa sebep olur. Hangisi düşük hangisi yüksek nokta bilemezsiniz. Yerine ALT ve UST gibi isimler kullanmak işinizi kolaylaştıracaktır.
-Ondalıklı sistem de devreye alınacak ise sıcaklığın ondalık hanesi ayrılmadan hem ayar hemde kontrol yapılmalıdır. Örnekle açıklayacak olursak 23,5 derece 235 olarak hafızada tutulmalı okunan sıcaklıkda onadılıklı dahil okunmalı dır. Programda zaten öyle okunmasına rağmen sonradan ondalık kaldırılıyor.
- Set değerleri mutlaka epromda kayıt altında tutulmalı. Ondalık kısmıda dahil olunca hem sıcaklık hem set değişkenleri WORD tipinden seçilmeli her biri için 2 kayıt adresi kullanılmalı.
- Sıcaklık karşılaştırmasında sıcaklık set değerden küçük ise devreye al değilse devreden çıkart derseniz komutun biri devreye alır diğeri çıkarmaya çalışır ve sürekli bir aç kapa durumu meydana gelir. Bu durumda İF komutlarında ELSE kullanmamaya özen gösterin.
Bu programı aslında bu anlattıklarıma uygun olarak neredeyse yeniden yazdım. Her şeyi düzelttim. Verecektim burada ama biraz daha uğraşasın diye vermiyorum.
Ne amaçla isteniyor bu istenenler bilmiyorum ihtiyaçmıdır ödevmidir çokda önemli değil benim için. Benzer program örnekleride vermiştim zaten. Sonuçta vereceğim mutlaka ama ne zaman belli değil!!.
Ete

kursadkurtbey

Arkadaşlar herkese iyi çalışmalar. ETE hocanın dersleri ışığında oda termostat devresini yaptım 3 gündür evimde sorunsuz çalışıyor. ETE hocama tekrar teşekkürler bu arada. çalışma şekli şöyledir:
- oda ısısı set değerinin 1 derece altına düştüğü anda röle devreye giriyor ve kombiyi çalıştırıyor. set değerine geldiğinde kombi devreden çıkıyor.
-kombi devrede olduğunda lcd ekran ışığı yanıyor devreden çıktığında ekran ışığı sönüyor.
-ayrıca yukarı veya aşağı butonuna basılı tutulduğu müddetçe sadece ekran ışığı yanıyor. bunu da gece ışıklar sönmüş durumda iken ekranı görmek amacıyla yaptım.  :D

yapacak arkadaşlara kolay gelsin...       

mg1980

Bu vesileyle @Ete hocama bir soru sormak istiyorum:
Programlarınızın bazılarında ısı hesabı için "HESAPLA" etiketinde ...(HAM+1), bazılarında ise ...(HAM+2) var. Ben bunu kalibrasyon düşüncesiyle yaptığınızı düşünüyorum. Aksi halde ısıyı birinde 1 derece, diğerinde 2 derece fazla okuyor.Bunu hem Arduino(DS18B20) ile hem de DS3231 ile test ettim. Yanılıyor muyum hocam ? Teşekkür ederim.

onurinci

@kursadkurtbey
bu yeni proteus dosyasını açamıyoruz ,eskisine export imkanı varmı ?.. yoksa gridleri kaldırarak resim paylaşabilirmisiniz..?

ete

Biz programlarda PBP matematiği kullanıyoruz. PBP matematiği gizli 32 bit hesaplamaya dayanır. Tek dikkat edilecek husu hesapları 32 bit yapar ama sen sonucu direk alamazsın.
Önceden ADC hesaplarında (Ham+1) mantığını çok kullanıyor idim. Ama son günlerde vazgeçtim. HAM+1 şeklinde kullanmak hesap kolaylığı getiriyor. Ama sıfır ve sıfıra yakın değerlerde hesabın ham kısmına 1 eklediğimiz için tam sıfır değer yakalamak mümkün olmuyor.
Örnek vereyim. ADC den bir değer okuyup onu ortam sıcaklığına çevirdiğimizi farzedeleim. En yüksek okunacak sıcaklık (1023 e karşılık gelen) 50 derece ise hesabı şöyle yapıyoruz.
50/1024 =0,048828125 Bunu 256 ile çarpıyoruz bize 12,5 değerini veriyor. 50 yerine 500 alıp Bunu 1024 de bölüp 256 ile çarpınca da bize 125 değerini veriyoruz. Bu hesap modeli HAM+1 e göre bir örnektir. HAM=1023 olacak ve buna 1 ekleyince 1024 olacaktır. Bu durumda okunan ADC değerine 1 ekleyip 125 ile /* operatörü kullanıp çarparsam bana direk 10 ile çarpılmış sıcaklığı verecektir sistem. Bu örnekte pek farketmedi ama bazen 1 eklenmesi sorun çıkartabiliyor ve olması gerekenden 1 fazlasını hesap ediyorsun. Aslında 1 ekleyerek hesaplamanın mantığıda 0-1023 arası değerlerin toplamda 1024 kademe olmasıdır. dolayısıyla hesaplanacak değeri 1024 kademeye bölerek birim ADC okumasına karşılık gelen birim değeri buluyorsun yanlış değil sonuçta

Aynı hesabı direk 1023 ile yaparsak. 500/1023=0,4887585532746823 * 256 =125,1221896383187 şeklinde epeyce küsüratlı bir değer veriyor. Bunu 125 olarak kullanırsan 1023 e karşılık hiç bir zaman 50 hesaplayamıyorsun 49 hesaplıyorsun. Bu durumda 125 yerine 1252 değerini alıp sonucu 10 bölerek bu sorunu aşıyorum.
İşin temeli budur.

Bu arada  A/*B  operatörü bize şunu yapar, A ile B yi 32 bit olarak çarpar ve sonucu 256 ya bölerek verir. Bu nedenle sabit çarpan olan B yi hesaplarken önceden 256 ile çarparak eşitliğin bozulmamasını sağlamış oluyoruz.

Ete


mg1980


kursadkurtbey

onurinci
yüklemeye çalıştım umarım olmuştur. baskı devresini de pdf olarak yükledim. ancak lcd ekran ledini sonradan eklediğim için baskı devrede yoktur. dışarıdan bağlantısını yaptım.

iyi çalışmalar


onurinci


Powered by EzPortal