avatar_mc_no_fear

programlı kombi termostatı yardım

Başlatan mc_no_fear, 04 Ocak 2015, 22:23:33

ete

Bu program tamamen benim kriterlerime ters bir şekilde yazılmış.
Söyleyeyim neler olduğunu;
1. GSMCHK: isimli etiketten önce USART kesmesini aktive ediyorsun. Ama hemen aynı etiketin altında;
HSERIN,1000,NGSM,[WAIT("OK")] şeklinde bir alış gerçekleştiriyorsun. Sence USART kesmesi açık iken bu komut orada çalışabilirmi? Kim alacak gelen bilgiyi kesme bölümü mü yoksa bu komut mu? Bence program kesme etiketine gider ve senin komuta kesmeden dönünce yeniden bakar ve bekler orada. Bu durumda kesmeyi bu komutu işledikten sonra aktive etmen daha doğru olurdu.

2. HSERIN,1000,NGSM,[WAIT("OK")] şeklindeki bir komutta 1000 ms lik alış beklemesi vermek de yanlış bence. Bu kadar uzun süre program orada beklememeli bence.

3. IF ESIT=1 THEN GOTO KMBZMN  , Kesme konusunda genel kaide şudur. Her şeyi kesme içinde halletmelisin. Kesme içinden GOSUB ile Kesme alanının dıiına çıkamazsın. Kesme özel bir alandır. İşlemci bu alana girince kafasınd aolan her şeyi bir yerlere kayıt eder ve öyle girer. Çıkarkende kayıt ettiği şeyleri geri alır ve öyle çıkar. Gosub veya goto ile onu başka bir yere yönlendirirseniz her şey çorba olur ve stack düzenide bozulur. Bu kesinlikle yanlış bir uygulamadır.
Bu nedenle her şey kesme içinde halledilmelidir. Halledilemiyor ise FLAG (bayrak) denilen sistem kullanılır. Bir bayrak set edilir ve kesmeden  normal şekilde çıkılır. Programın kesme öncesi çalıştığı yere geri dönülür ve orada şayet bu bayrak set edilmiş ise önce bayrak sıfırlanır ve ardından GOTO ile yapmak istediğiniz şey yapılır. Örnek vermek gerekir ise;
IF ESIT=1 THEN GOTO KMBZMN yerine IF ESIT=1 THEN  KOM_ZMN=1 demek KOM_ZMN barağını set etmeye yeterli olacaktır.
BASLA etiketi altında (program bu etiket altından KESMEYE gidecektir).
IF KOM_ZMN=1 then
  KOM_SMN=0
  GOTO KMBZMN
ENDIF demek programın doğru çalışması için yeterli olacaktır.
Gelelim asıl istediğine;
Programda bu isteğinle ilgili en ufak bir iz göremedim. Görsem belki düzenleyerek sana yardımcı olabilirdim.
Ama programın geneline hakim değil iken ve ortada bir sürü yanlışlık var iken bunu yapmam hiçde doğru olmazdı bende yapmadım.
Program (Kesme) içinde gelen bilgiyi test eden bölümler var neden benzer bir şey yapmıyorsun.
    ESIT=1 
    For I=0 to 5
    Lookup I,["GN26.5"],KYSL   
    If KYSL!=SORU[I] then
        ESIT=0
        EXIT
    Endif
    Next

Ancak her sıcaklık için bir lookup tablosu hazırlayamayacağına göre bu işin kolayını bulmak gerekir.
Bence şöyle olmalı gelen bilginin başında "GN" veya "GC" olabilecek. Önce bunu test etmelisin.
Diyelimki GN var (Yani gündüz sıcaklığı). Bu aşamdan sonra 26.5 değerini bir şekilde gelen bilgiden çekmen gerekiyor.
Burada unutulmayacak bir şey var SORU değişkeni içinde yer alan 26.5 rakamları birer karekter olarak alınır. Yani 2 rakamı 2 şeklinde değil "50" şeklinde yani 2 rakamının ASCII karşılığı olarak, ve 6 rakamı ise "54"olarak alınır. SORU değişkeni içinde 0 ve 1 nolu karekterler G ve N (veya C) ye aşt olduğundan yalnızca rakamı çekebilmek için
;

    ISI_GELEN=0
    INDEX=2: GOSUB LOOKBAK
    INDEX=3: GOSUB LOOKBAK
    INDEX=5: GOSUB LOOKBAK
    Program buraya geldiğinde ISI_GELEN=265 olarak alınmış olacaktır.
    RETURN
LOOKBAK:
      For I=0 to 9
         LOOKDOWN I,["0123456789"],SAYI
         temp=soru[INDEX]:TEMP=TEMP-48
         IF SAYI=TEMP THEN
            ISI_GELEN=ISI_GELEN*10+SAYI
         NEXT
         RETURN
    Next

şeklinde örnek kod kullanabilirsin. Böylece gelen mesaj içindeki sıcaklık bilgisini ISI_GELEN isimli değişkene aktarmış oluruz.
Bundan sonrası ise kolay olsa gerek. Bu sıcaklık değerini kombinin ulaşması gereken sıcaklık olarak verip o sıcaklığa ulaşmasını sağlaman gerekiyor.

Ete

mc_no_fear

Hocam öncelikle cevaplarınız için teşekkür ederüm.
Dediğiniz hataları düzelttim. Verdiğiniz örnek kodu yazıyorum. ancak ne yazarsam yazayım "@" cevabını alıyorum. yani ISI_GELEN içeriği @ oluyor. 265 rakamını bir türlü alamadım.
    
    ISI_GELEN=0
    INDEX=2: GOSUB LOOKBAK
    INDEX=3: GOSUB LOOKBAK
    INDEX=5: GOSUB LOOKBAK  ; Program buraya geldiğinde ISI_GELEN=265 olarak alınmış olacaktır.
    HSEROUT [ISI_GELEN] ;terminalde alınan değeri görebilmek için bu komutu ekledim. normalde kullanılmayacak.
    RETURN
LOOKBAK:
      For I=0 to 9
         LOOKDOWN I,["0123456789"],SAYI
         temp=soru[INDEX]:TEMP=TEMP-48
         IF SAYI=TEMP THEN
            ISI_GELEN=ISI_GELEN*10+SAYI
         NEXT
         RETURN
    Next

ete

Bana kalırsa gelen bilginin GN26.5 yani toplam 6 karekterden ibaret olup olmadığını test etmen gerek.
Önce gelen bilgiyi ekrana yazdırmaya çalış sonra karekterlerin yerlerini ındex olarak tespit et.
GN26.5 gibi bir bilgide;
INDEX=0 ise SORU[0]="G" dir
INDEX=1 ise SORU[1]="N" dir
INDEX=2 ise SORU[2]="2" dir
INDEX=3 ise SORU[3]="6" dır
INDEX=4 ise SORU[4]="." dır
INDEX=5 ise SORU[5]="5" dir
Bu şekilde bir uygulamada bu değerlerin pozisyonlarından emin olmak gerekir.
Şayet gelen bilgi dediğim formatta ise verdiğim kod mutlaka geen sıcaklık bilgisini rakama çevirecektir. Ayrı bir programla denemesinide yaptım sorunsuz çalışıyor bu sistem.

Ete

mc_no_fear

#63
Hocam dediğiniz şekilde yaptım. GN26.5 formatında gönderiyorum veriyi. ISI_GELEN içi boş
HSEROUT [ISI_GELEN,10,13] yazdığımda boş şekilde bir satır atlıyor. 265 değerini alamıyorum. :'(
Denemesini yaptığınız programı alabilirmiyim hocam inceleyebilmek maksadı ile

ete

SORU[0]-SORU[5] arasını ekrana yazdır,
FOR I=0 to 5
LCDOUT $fe,$C0+I,SORU[I]
NEXT
Şeklinde bir kod kullanabilirsin. Yollanan bilgiyi ekranda görebiliyormusun önce onu test et.
Yada gelen bilgiyi eproma kayıt et,
FOR I = 0 to 5
  TEMP=SORU[I]
   WRITE I,TEMP
NEXT
PAUSE 10
şeklinde bir kod ilede yazdırabilirsin. Sonra işlemciyi yerinden söküp programlayıcıya tak ve epromdaki ilk 6 adrese bak bakalım ne kayıtlı.

Bana kalırsa seninbilgi alıcıya ulaşmıyor ben öyle anlıyorum.

Ete

mc_no_fear

#65
hocam denemelerimi suan için isis programında virtual terminal kullanarak yapıyorum. Gerçeğe henüz yüklemedim.
virtual terminalden GN26.5 yazdığımda HSEROUT [STR SORU\6,10,13] komutunu kullanarak yazdığım datayı geri bana gönderiyor. ancak HSEROUT [ISI_GELEN,10,13] komutunda boş bir satır atlıyor. Ekte ekran görüntüsünü koydum hocam.

ete

programları (isis dahil) yolla bakayım
Ete

mc_no_fear

Ekte sundum hocam
??GN26.5
?? öneki ile yazmanız gerekiyor

ete

#68
Çalışan program ilişiktedir.Nasıl oldu ise LOOKUP yerine LOOKDOWN yazılmış programa.
Bu yüzden karşılaştırma yapamıyormuş. Ayrıca Lookup tablosundan alınan sayı rakam olarak değil ASCII olarak değerlendiriliyormuş onuda öğrenmiş olduk. Zaten bizim gelen sıcaklık digitleride ASCII geldiği için sorun olmadı.
Ufak bir taktik değişikliği ile gelen sıcaklığı mesajın içinden çekip ekrana verdirdim. 3. satır sağ tarafta açılışta 000 görülecek. Sıcaklık bilgisi gelince çekilen sıcaklık değeri orada gözükecek.

Ete

mc_no_fear

 ::) Ete hocam şükranlarımı sunmak isterim. Allah razı olsun sayende bu problemide atlattım. Emeğine sağlık hocam. ;) ;)

insect-yol

Merhaba arkadaşlar sizlere bir sorum olacak ben bu devreyi isis'de kurup Proğramı kendim derleyince Ds18b20 den değer 153 değerini sabit okuyorum be neden olabilir win 10 proteus 8 kullanıyorum

F®T

proteuse simülasyonu ile alakalı bir durum olmalı.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

insect-yol

Ama buradan yüklediğim hex'i kullanıca sorun yok çalışıyor

ete

Programın sensör okuma kısmını buraya koyda bakalım
Ete

insect-yol

#74
Erol hocam kodlar burda buyrun.
'****************************************************************
'*  Name    : UNTITLED.BAS                               *
'*  Author  : insect                                            *
'*  Notice  : Copyright (c) 2015 insect                         *
'*          : All Rights Reserved                               *
'*  Date    : 29.11.2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
#CONFIG
   __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF
#ENDCONFIG

Include "MODEDEFS.BAS"
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_RSREG PORTB 'LCD RS Bacaðý PortB de baðlý
DEFINE LCD_RSBIT 2 'LCD RS bacaðý 2. Bite baðlý
DEFINE LCD_BITS 4 'LCD 4 bit  olarak baðlý
DEFINE LCD_LINES 2 'LCD 2 sýra olarak çalýþýyor.

CMCON = 7 ; PORTA.6ve7 yi kullanmak icin komparatör pinleri iptal hepsi giriþ çýkýþ

TRISA=%00011111
TRISB=%00000001
PORTA = 0
PORTB = 0

LCDOUT $FE,$40,6,9,9,6,0,0,0,0      ;DERECE
LCDOUT $FE,$48,3,6,12,24,12,6,3,0   ;OK
LCDOUT $FE,$50,10,0,17,17,17,17,14,0;Ü
LCDOUT $FE,$58,14,17,16,16,17,14,4,0;Ç
LCDOUT $FE,$60,4,14,31,4,4,4,4,0    ;YUKARI OK

SYMBOL    SET=PORTA.2
SYMBOL YUKARI=PORTA.1
SYMBOL  ASAGI=PORTA.0
symbol    SCL=PORTA.3
SYMBOL    SDA=PORTA.4
SYMBOL     DQ=PORTB.0
SYMBOL  CIKIS=PORTA.7
symbol    LED=PORTA.6

Busy    VAR BYTE
HAM     VAR WORD
FLOAT   VAR WORD 
ISI     VAR BYTE
TEMP    VAR BYTE
I       VAR WORD
SN      VAR BYTE
DAK     VAR BYTE
SAAT    VAR BYTE
HAFGUN  VAR BYTE 
GUN     VAR BYTE
AY      VAR BYTE
YIL     VAR BYTE
MEM     VAR BYTE
ONLAR   VAR BYTE
BIRLER  VAR BYTE 
ONDA    VAR BYTE
GUNDUZ  VAR WORD
GECE    VAR WORD
SURE    VAR BYTE
SAYI    VAR BYTE
VERI    VAR BYTE
HAS     VAR BYTE 

CLEAR
I = "-"
GOSUB SENSORYAZ
GOSUB SENSOROKU

BASLA:
    GOSUB SENSOROKU
    GOSUB ZAMANOKU
    GOSUB EKRAN
    GOSUB TUSKON
GOTO BASLA

EKRAN:
    LCDOUT $FE,2,DEC2 SAAT,":",DEC2 DAK," ",dec2 ISI,">",I
    LCDOUT $FE,$C0,DEC2 GUN,"/",DEC2 AY,"/",DEC2 YIL,">",DEC2 ONDA
RETURN

ZAMANOKU:
         I2CRead SDA,SCL,$D0,$00,[SN,DAK,SAAT,HAFGUN,GUN,AY,YIL,MEM]
         MEM=SN:GOSUB CEVIR:SN=SAYI
         MEM=DAK:GOSUB CEVIR:DAK=SAYI
         MEM=SAAT:GOSUB CEVIR:SAAT=SAYI
         MEM=HAFGUN:GOSUB CEVIR:HAFGUN=SAYI
         MEM=GUN:GOSUB CEVIR:GUN=SAYI
         MEM=AY:GOSUB CEVIR:AY=SAYI
         MEM=YIL:GOSUB CEVIR:YIL=SAYI
RETURN

CEVIR:
    ONLAR=MEM & %01110000
    ONLAR=ONLAR>>4
    BIRLER=MEM & %00001111
    SAYI=ONLAR*10+BIRLER
RETURN

ZAMANYAZ:

RETURN

TUSKON:
    IF SET = 1 THEN I = "S"
    IF YUKARI = 1 THEN I = "Y"
    IF ASAGI = 1 THEN I= "A"
RETURN

SENSORYAZ: 'okumaya hazýrlan..         
    OWOUT   DQ, 1, [$CC,$4E, $FF, $FF, $7F] 
    OWOUT   DQ, 1, [$CC,$48]         
    OWOUT   DQ, 1, [$CC,$B8]         
    OWOUT   DQ, 1, [$CC,$BE]         
return

SENSOROKU:
    OWOUT   DQ, 1, [$CC, $44]      ' ISI deðerini oku
BEKLE:
    OWIN    DQ, 4, [Busy]          ' Busy deðerini oku
    IF      Busy = 0 THEN I= "H": GOTO Bekle    ' hala meþgulmü? , evet ise goto Bekle..!
    OWOUT   DQ, 1, [$CC, $BE]      ' scratchpad memory oku
    OWIN    DQ, 2, [HAM.Lowbyte, HAM.Highbyte]' Ýki byte oku ve okumayý bitir
    float = (HAM*10)/16
    ISI=FLOAT/10
    ONDA=(FLOAT //10)
RETURN


Powered by EzPortal