DS18B20 TERMOSTAT DEVRESİNE İLAVE DEVRE SORUNU

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


Makmuh

Hocam eklemişşiniz elinize sağlık. Nasıl eklediğinizide açıklarsanız iyi olur ben neden eklemeye çalıştığım zaman eklenmiyordu anlamadım.
Bide ben bunu daha sonra resimdeki gibi kablo atarak pic ekledim resimdeki gibi ama sadece lcd nın alt sarıtında dolu kareler gorunuyor başka bir işlem yok, ilk defa çalıştırmaya çalışıyorum o yuzden nerde hatam var başka bir yerde hata görebildiniz.

ete

LCD nin alt satırında kareler var ise bu işlemcinin çalışmadığını gösteriyor. Sen ona odaklan. Besleme voltajı tamammıdır. Tamam ise +5V mudur bunları gözlemle.
Ete

edoktem

çok saolun bu dersler çok faydalı oluyor ancak çok merak ettiğim bişey var bu konuda bir ip ucu verirmisiniz
DEFINE LCD_DREG   PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT   4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG   PORTB 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT   3 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTB 'LCD RW Bacağı PortB de bağlı
DEFINE LCD_RWBIT 2 'LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG   PORTB 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT   1 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS   4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES   2 'LCD 2 sıra olarak çalışıyor.

yukarıdaki şekilde lcd bacak larını tanımlıyoruz
bu kadarı tamam
peki data bacaklarını tek tek tanımlayabilirmiyiz
örneğin D1 portb.4 gibi

ete

Normalde Pic ile LCD data bacakları üzerinden haberleşir.
Haberleşme 8 bit üzerinden yapılır. Bu 8 adet data bacağı gertirdiği için bacak tasarrufu yapmak üzere bir kolaylık sağlayalım demişler ve %xxxx xxxx şeklindeki 8 bitlik data yı 2 ye ayırıp önce bir yarısını sonrada diğer yarısını yollayarak bunu sağlamışlar. Hal böyle olunca LCD ye bir şey yazdırırken  yani diyelimki 8 bitlik %11011100 şeklinde  bir bilgiyi LCD ye vermek için önce %1101 ve sonrada %1100 bilgisini göneriyoruz. Bunu yaparken de maskeleme yapılarak (işin ASM kısmında) bu 4er li bitler kolaylıkla ayrılıp yollanabilmektedir. Her bir data bacağını karışık şekilde tanımlarsan bu sefer derleyici bu bitleri teker teker ilgili yerlerinden alıp maskeleyip 4 erli bitler haline getirmesi gerekecektir. Bunun vakit alıcı bir sistem olmasından dolayı bu işten vazgeçmişler ve Data bitlerinin mutlak ve mutlak ya ilgili Port'da Bit_0 dan itibaren 4 bit yada Bit_4 den itibaren 4 bit olacak şekilde bağlantı yapılmasına karar vermişler. Anlayacağın Data bitleri karışık bağlanmıyor. BU basic için geçerli bir husus. LCD ye kendin ASM kullanarak hükmetmeye karar verirsen elbette bunu yapmak mümkün ama deveye hendek atlatacağını unutmamalısın.

Ete

edoktem

ilk önce cevapladığınız için çok teşekkür ederim. işin doğrusu elimde basılmış bir devre var ve baskı ile yeniden uğraşmak istemediğimden ve daha kolay kod yazdığım picbasic de yazmak istedim devreyi basan arkadaş sanırım picc de kod yazdığı için kafasına göre data pinlerini bağlamış şimdi oturup c de yazmam gerrekecek uğraşıcam anlaşılan napalım

Makmuh

Alıntı yapılan: ete - 28 Şubat 2018, 20:50:55
LCD nin alt satırında kareler var ise bu işlemcinin çalışmadığını gösteriyor. Sen ona odaklan. Besleme voltajı tamammıdır. Tamam ise +5V mudur bunları gözlemle.
Ete

İşemcide +5v var yanı voltmetre ile ölçtüğüm zaman +4,78v gösteriyor. İşlemciye odaklan dediğiniz için programı başka bir 16f628a yazdım onu taktım yine lcd nin altında dolu kutucuklar mevcut ne yaptıysam olmadı acaba yine programda mı hata yapıyorum



'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : ÜLKÜ MÜHENDİSLİK                                  *
'*  Version : 1.0                                               *
'*  Notes   : RB1=Enable                                        *
'*            RB2=R/W                                           *
'*            RB3=RS                                            *
'*            RB4=D4                                            *
'*            RB5=D5                                            *
'*            RB6=D6                                            *
'*            RB7=D7                                            *
'*            RA0=Sensör1                                       *
'*            RA1=Sensör2                                       *                 *
'*                                                              *
'****************************************************************

'***********Seri İletişim Dosyası***********
Include "MODEDEFS.BAS"     
@ __CONFIG _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF   
CMCON=7
DEFINE OSC 4




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

DEFINE LCD_DREG PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 3 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTB 'LCD RW Bacağı PortB de bağlı
DEFINE LCD_RWBIT 2 'LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 1 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 'LCD 2 sıra olarak çalışıyor.

define osc4

'***********Ö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ı***********

TRISA=%00111
TRISB=1

PortA=0
PortB=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=PORTB.0    ' One-wire Data-Pin "DQ" PortB.0 da
Set var byte
Altset var byte

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

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

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

LCDOUT $FE,$80,"ULKU MUHENDISLIK"             
LCDOUT $FE,$C0, "0 332 447 33 55"
pause 2000
lcdout $FE,1
LCDOUT $FE,$80,"Bismillahirrah"                       
LCDOUT $FE,$C0, "manirrahim"
pause 1000
lcdout $FE,1 

'***********Program Başlangıcı***********

Basla:


    gosub sensoroku

    LCDOUT $FE,$C0, "SET : ",#set
    PAUSE 500
   
    if porta.2=0 or porta.1=0 then
    goto ayaryap
    ELSE
    altset=set-4
    endif
if ISI=>set then
    porta.3=0
    ENDIF
    if ISI<Altset then
    porta.3=1
    ENDIF
   
   
    IF ISI>34 THEN
    PORTA.4=1
    ELSE
    ENDIF
    IF ISI<29 THEN
    PORTA.4=0
    ELSE
    ENDIF

   
   
   
Goto Basla

'***********1. Sensörü Oku***********

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
    ISI=HAM*10/16
    FLOAT = ISI//10
    ISI=ISI/10

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

'*********** Ayarlama Yap *********


ayaryap:


    LCDOUT $FE,$80,"AYARLA ve KAYDET"             
    LCDOUT $FE,$C0, "SET : ",#set,".0",0,"C "
     
    pause 75 
    if set=80 then
    else
        if porta.1=0 then
        set=set+1
        pause 100
        endif
    endif
   
    if set=35 then
    else
        if porta.2=0 then
        set=set-1
        pause 100
        endif
    endif
   
    if porta.0=0 then
    LCDOUT $FE,$80,"AYAR KAYDEDILDI "
    pause 1000
    goto basla
    endif
       
   
goto ayaryap

End





ete

Programında işlemcininhangi osilatörle çalışacağı belirtilmemiş.
Bunu yine programlayıcıdan ayarlıyor isen sorun yok. Ama oradan verdiğin sigorta ayarları sonucunda MCLR bacağının durumunuda değiştiriyor olabilirsin. Anlamak için Pic 4 nolu pinine 1K veya 10K ile +5V ver. Bakalım çalışacakmıdır.

Çalışmıyor ise ve sigorta ayarlarına dokunmuyor isen sigorta satırına OSC komutunu ekle. Kristal varsa ki resimlerde gözüküyor o halde _XT_OSC şeklinde komut eklemen gerekiyor.

Kartın bakır kalitesi berbat. O kalite ile o devrenin çalışmasını beklemek saflık olur bence.  Resimden bile lehimlerin çoğunun düzgün olmadığını görebiliyorum. Daha kaliteli pcb ler yapman gerek.

Programda    define osc4  şeklinde bir komut var bunu sil yanlış zaten. Yukarıda aynı komutu doğru olarak vermişsin ikincisine gerek yok.

Include "MODEDEFS.BAS"   komut satırını ilgilendiren bir satır göremedim bunuda sil bence boşuna yer işgal etmesin.

Bunun dışında Pic beslemesine dikkat et. 14 Nolu vcakta +5V , 5 nolu bacakta GND olmalı. Tersi var ise ölçü aletin - işareti ile aynı değeri gösterebilir.

TRISA registeri 8 bitliktir ve sen ona 5 bitlik bilgi vermişsin. Bit sayısını 8 bite çıkart.


Ete

Makmuh

#23
Teşekkürler ETE hocam
Mclr ye 10 k dirençle +5 volt bağladım devre çalıştı. :)
@ __CONFIG _XT_OSC & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF  sigorta ayarınıda bu şekilde yaptım.


Benim anlamadığım birşey daha var sigorta satırını
@ DEVICE pic16F628A   
@ DEVICE pic16F628A, WDT_on
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, XT_OSC
....
bu şekilde alt alta yazdıgımda derleyemiyorum. Derleyici illegal opcode hatası veriyor. İkiside aynı sigorta ayarı değil midir.

ete

İlk yazdığın 64 bit makinada MPASM kullanılarak yapılan derlemeye ait sigorta ayarı, ikincisi alt alta olanı ise MPASM kullanmadan yapılan 32 bit makinalar için derlemeye ait sigorta ayarıdır.
Ete

Makmuh

Size sormak istedigim iki sorum var. Yaptığım devrede
1. Kullandigim lcd nın ekran aydınlatmasını kullanmak istiyorum. Yanlız bunu nasıl yapacagimi bir türlü anlayamadım. Ekran aydınlatması şu şekil çalışsın istiyorum, herhangi bir tuşa basıldığında yansın. 30 sn gibi bir süre çalışsın  tuşa basilmazsa sonsun. Bi döngü yapıp saydirdigin zaman işlemci sadece sayar diğer işleme sayma işi bitinceye kadar geçmez. Diye düşündüm. 2 bir işlemci kullanmadan bu aydınlatmayı kontrol edebilirmiyiz. Bunun gibi bir örnek çalışma paylaşırmısınız.
2. Sorum ac ma kapatma tuşu eklemek istiyorum. Tuş tasarrufu yapmak için set tuşuna 5 saniye basılı tuttuğum zaman lcd görüntünün gitmesini istiyorum bunu nasıl yapabilirim.

ete

LCD akra ışık beslemesini bir transistör ile kontrol etmen gerekiyor. Işık yaklaşık 80-100 ma akım çeker. Uygun transistör BC337 olur. Transistörün Emitterini GND ye bağla Collector ucunu ışığın GND sine bağla. Beys ucuna 1K direnç bağla ve bunu boşta olan bir pic pinine bağla.
Tuşların yazılım kısmına ISIK=1 yaz yani basıldığı zaman ISIK=1 olsun. ISIK VAR PORTX.x şeklinde önceden tanımlama yapman gerekir.

Geelim söndürme işine, işin zor kısmı burada. 30 sn lik sayacın olmalı ve programın genel akışından da etkilenmemeli.
Bunu bir kenara bırakalım önce SET tuşuna 5 sn basınca söndürme fonksiyonu ekleyelim.
IF SET=0 THEN
SURE=0
  WHILE SET=0 AND SURE<5000
     SURE=SURE+1
     PAUSE 1
   WEND
    IF SURE=5000 THEN ISIK=0
   
   Tuşun diğer işlevini buraya yazacaksın
  WHILE TUS=0:WEND
  PAUSE 100
ENDIF

Şimdi tekrar 30 sn meselesine dönelim.
Programın genel mantığı bir zaman dangüsü içerisinde çalışmaya müsait ise,
ana programı bir TMR1 sayac döngüsü içine alırsın. 4 Mhz de çalışıyor isen 500 ms lik dilimler kullanırısın.
60 adet kesme yaratırsan 30 sn edecektir. Ama sayac saymaya ışık yakılmış ise başlamalı.
Genel akış şöyle olabilir.
TMR1 sayacı 500 ms lik dilimler halinde kurulur. KES=60 yapılarak bu işe başlanır.
BASLAT diye bir etiket altına TMR1 sayacı için 500 ms lik ön yükleme değeri ve kesme bayrağı sıfırlama olan PIR1.0=0 komutu eklenir altına WHILE PIR1.0 komutu verilerek altına normal program komutları eklenir.
aşağılarda GOTO BASLA  komutunun olduğu yerin bir önüne
WEND eklenir ve altına
KES=KES-1 IF KES>0 THEN GOTO BASLAT yazılır
Program bu satıra gelmiş ise 30 sn geçmiş olacaktır. Burada;
IF ISIK=1 then ISIK=0 yazarsın
Altına KES=60 yazıp GOTO BASLAT dersin. Altta kalan GOTO BASLA komutunu silersin.

İkinci metod da ise programn genel akış süresini hesaplayıp yaklaşık kaç döngüden sonra 30 sn süre geçtiğini bulursun. Yada deneme yanılma yolu ile; programın arasına ;
SURE=SURE+1 yazım diyelimki 40000 de 30 sn geçmiş olacak ;
IF SURE=40000 then
  SURE=0:IF ISIK=1 THEN ISIK=0
ENDIF dersin olur biter.
Şayet 40000 değeri az geliyor ise araya biraz gecikme ekleyip süreyi tutturmaya çalışırsın.

Hepsi bu
Anlamadığım bir şey var hem programa AC-KAPA eklemek istiyorum demişsin ama 5sn lik basım sonucu yalnızca kapa işlemini tarif etmişsin.
Şayet o buton hem ışığı kapatacak hemde açacak ise 5sn lik basım sonucunda TOGGLE ISIK demen yeterli.

Ete

Makmuh

Hocam teşekkür ederim.
Tuşa basilmadigi zaman 30 saniye sonra lcd nın ışığının sönmesi işini ikinci degidiniz şekilde yapmak daha kolay gibi benim için,  programı tmr1 dönüşüne alıp deneme yonetemiyle 40000 sayısını artırıp azaltarak yapayım.
2. Sorunu tam anlatamadım yaptığım panel kömürlü zamanı kumanda edecek içinde ateş olan kazanın fişini çeklerseler kazan istemediğimiz sıcaklıklara yükselir pompa çalışmadığı sirkülasyon olmadığı için. Bu sebeble kapatma işlemi yapmak istiyorum. Set tuşuna 5 saniye basıldığında lcd yazı ve ışık gorunmuyecek kapanmış izlenimi vereceğiz ama arka planda pompanız kazan sıcaklığı düşene kadar çalışacak
Sizin bu yazıyı okuduktan sonra aklıma şöyle bir döngü geldi kapatma döngüsü kurayım kapama döngüsünün içine isik=0 ve lcd ekrani silme yazarsam olr zannımca açmak içinde aynı döngünün içine sizin yazdığınız 5 sn basılma komutunu tekrar eklerim 5 sn basılınca o döngüden cıkartırız galiba bu şekilde olacak hocam. Kafamda biraz canlanmaya başladı

ete

İkinci söylediğimde TMR1 döngüsü gerekmiyor. Programın BASLA etiketineden GOTO BASLA etiketine verışındaki gecikmeden yararlanarak tahmini bir süre tutarı belirliyorsun sadece.
TMR1 birinci seçenekte yer alıyor.
Ete

Powered by EzPortal