ISI FARKI ALMA

Başlatan bozoklu01, 09 Aralık 2016, 18:41:49

bozoklu01

Merhaba arkadaşlar. Aşağıda verdiğim kodda iki farklı sensörden okuduğum değer arasındaki fark - yada + yönde 1'den fazla olursa ısıyı dengelemek için bir fan çalışsın istiyorum. Örnekleyecek olursak sensör 1'den ısı1'i okuyorum sensör 2'den ısı2'yi okuyorum fark 1 derecen fazla ve ortamda bulunan fan devreye girecek ortam havasını sirküle ederek sıcaklığı  eşitleyecek. Sensörler arası sıcaklık farkı 1 derecenin altına düştüğünde fan devreden çıkacak. Ancak kodu bir türlü çalıştıramadım. Yardımcı olabilirseniz sevinirim.
FANKONTROL:
FARK=ISI1-ISI
IF FARK=1 then FARK=~FARK
IF FARK>1 then
   ROLE4=1
ELSE
   ROLE4=0
ENDIF
RETURN

ta3usl

Merhaba,

FARK=ISI1-ISI  satırını

FARK = abs(ISI1-ISI) olarak değiştirip dener misin?  Burada işlem sonucunu mutlak değer olarak alıyoruz. Yani işlem sonucu devamlı pozitif sayı oluyor.

FARK=~FARK  Bu komutun anlamını bilmediğim için bu satırı silip denemeni önereceğim.

bozoklu01

Teşekkürler. Sonucu 1 saat sonra paylaşırım.

bozoklu01

Malesef bi değişiklik olmadı. Aşağıdaki kodu kullandım. IF FARK=1then satırı orijinalinde IF FARK.Bit15=1'di buradaki bit15 program içinde biryerdenmi bahsediyor bilemedim. gerçi her şekildede çıkış high olmuyor.

FANKONTROL:
FARK = abs(ISI1-ISI)
IF FARK=1 then 
IF FARK>1 then
   ROLE4=1
ELSE
   ROLE4=0
ENDIF
RETURN

ta3usl

#4
Şu şekilde dener misin ? 

FANKONTROL:
FARK = abs(ISI1-ISI)
IF FARK>1 then 
   ROLE4=1
ELSE
   ROLE4=0
ENDIF
RETURN

ISI1 ve ISI değerlerini bir yerlerde görebiliyor musun?

bozoklu01

 Son kodu denerken programda ısı hesabıyla ilgili kısmıda ekleyeyim belki eksik ifade  ettim durumu.
'----------------------ISI HESAP ALT PROGRAMI-----------------------------------     
ISIHESAP: 
           If HAMISI<4000 then
              ISARETSHT=1 'sıcaklık eksi değerde demek
              ISI1=(4000-HAMISI)/100
              ISI2=((4000-HAMISI)//100)/10   
         goto ISISON
        endif
              ISI1=(HAMISI-4000)/100
              ISI2=((HAMISI-4000)//100)/10
ISISON:   
           
           ISI1=(HAMISI-4000)/100
           ISI2=((HAMISI-4000)//100)/10
RETURN       
'-------------------------RUTUBET HESAP ALT PROGRAMI----------------------------
RUTHESAP:
              'ISI=ISI1*10+ISI2
              p1=(26542-(54722**HAMISI+hamISI))**HAMISI-40     
              P2=655+(HAMISI*5)+(HAMISI**15917)      
              P3=(P2**(ISISHT/10+2480))-(P2**2730)+P1   
              U1=p3/10:U2=p3//10
           IF HAMISI>3710 THEN
              U1=0:U2=0
        ENDIF 
return

ORTISI:
ORTAISI=((ISI1*10+ISI2)+FLOAT)/20
CNY=((ISI1*10+ISI2)+FLOAT)/2
RETURN
'----------------------------ISI KONTROL----------------------------------------
ISIKONTROL:

         if TERM<ORTAISI-0 then   
          LOW Role1
        ENDIF
        if ORTAISI+0<TERM+0 then         
         HIGH ROLE1               
       Endif
      IF MENU=1 THEN  GOTO AYAR_MENUSU
RETURN
'----------------------------RUTKONTROL-----------------------------------------         
RUTKONTROL:
           if NEM>U1 then   
         HIGH Role2
         ELSE               
          LOW ROLE2
        ENDIF
        IF MENU=1 THEN  GOTO AYAR_MENUSU
RETURN

FANKONTROL:
FARK=ISI1-ISI
IF FARK.Bit15=1 then FARK=~FARK
IF FARK>1 then
   ROLE4=1
ELSE
   ROLE4=0
ENDIF
RETURN

bozoklu01

Yine olmadı hocam sizede sıkıntı olduk akşam akşam kafam durdu içinde kayboldum kodun valla.

karacan451


FANKONTROL:
FARK=ISI1-ISI
IF FARK<0 THEN FARK=-1*FARK
IF FARK=1 then
   ROLE4=1
ELSE
   ROLE4=0
ENDIF
RETURN

ta3usl

#8
Estağfirullah , beyin cimnastiği her zaman iyidir ;)

Kullandığın modülü ve programın tamamını görmediğim için kesin yorum yapamayacağım, fakat benim başıma gelse aşağıdaki sorulara cevap arardım ,

iki ayrı modülden okuduğum ısı değerleri ISI ve ISI1 değişkenine doğru atanabiliyor mu?  Bu iki değeri ekran üzerinde ya da başka bir yolla görebiliyor musun? ISI ve ISI1 arasındaki fark gerçekten 1 den büyük mü ?

Aslında program rutininde sorun çıkartan sadece FANKONTROL subrutini mi ? yoksa sorun farklı yerde ve sen buraya mı odaklandın acaba ?

Benim şüphem ,  fark değişkeni negatif değerde olduğu için if fark > 1 then  şartını uygulamıyor olmasıydı. bir şekilde fark değişkenini pozitif değere taşıdığında düzelecektir diye umut etmiştim.

if fark < 0 then fark = fark * -1 'gibi bir şart koyarak dene istersen ki anladığım kadarıyla
IF FARK.Bit15=1 then FARK=~FARK  bu satır zaten bu işi yapıyor :) (sadece kodların gidişinden çıkardığım yorumdur. Emin değilim)


FANKONTROL:
FARK=ISI1-ISI
if fark < 0 then fark = fark * -1
IF FARK>1 then
   ROLE4=1
ELSE
   ROLE4=0
ENDIF
RETURN

karacan451

FARK.Bit15=1 peki bu kod nedir? Ben Basic dilli pek fazla bilgim yok. Ama fark pozitif çıksa bile bu kod bu sefer eksi değerini alır.

bozoklu01

Ben bit15'i çıkardım programdan. Bende anlamadım ama sanırım 15.bitten bir veri çekmek için kullanılıyor diye düşümdüm oda mantıksız geldi. Zaten çıkarınca yada ekleyince de birşey değişmiyor. Kodu sıfırdan yazmadım Ferhat Yol arkadaşın kodu üzerinden gittim hesaplama rutininde hatalı yerler vardı ete hocanın kodlarını kullandım düzeldi, motor kontrol de sıkıntı vardı düzelttim nem kontrolünü kendi istediğim şekle göre revize ettim bi burda takıldım kaldım.

bozoklu01

Yok ta3usl kardeşim yine olmadı. kodu full ekliyeyimde belki gözümden kaçan biryer vardır.
'****************************************************************
'*  Name    : KULUÇKA.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2010 [Desıgn by Ferhat YOL]         *
'*          : All Rights Reserved                               *
'*  Date    : 07.12.2016                                        *
'*  Version : 2.0                                               *
'*  Notes   :Bu program Kuluçka makinesi için Ferhat YOL        *
'*           Tarafından yazılmıştır                           *                                 
'****************************************************************
TRISA=%111111
TRISB=%00000001
TRISC=%01110000
TRISD=%00000000
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=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 4
ADCON1 = 7     
'---------------------------değişkenler-----------------------------------------
    A        VAR    BYTE
    D        VAR    BYTE
    E        var    byte
    SYC      VAR    BYTE
    AY       var    byte
    YIL      var    byte
    SN       VAR    BYTE
    DAK      VAR    BYTE
    SAAT     VAR    BYTE
    HAFTA    VAR    BYTE
    GUN      VAR    BYTE
    MEM      var    byte
    ONLAR    VAR    BYTE
    BIRLER   VAR    BYTE
    GN       VAR    BYTE
    ZAMAN    VAR    BYTE
    Y        VAR    BIT
    UPC      VAR    BIT
    AYR      VAR    BIT
    SAYI     VAR    BYTE
    SAYAC    VAR    BYTE
    AYAR     VAR    BYTE
    TERM     VAR    BYTE
    NEM      VAR    BYTE
    KONTROL  VAR    BYTE
    ORTAK    VAR    BYTE
    CNY      VAR    BYTE    
    ISI1     VAR    BYTE       
    ISI2     VAR    BYTE       
    U1       VAR    BYTE         
    U2       VAR    BYTE
    C0       VAR    BYTE
    Z        VAR    BYTE
    K        VAR    BYTE
    SAY      VAR    BYTE
    ZAM      VAR    BYTE
    DX       VAR    BYTE
    H0       VAR    HAMISI.BYTE0
    H1       VAR    HAMISI.BYTE1
    HAMISI VAR    WORD
    RAW      var    word
    ISISHT   VAR    WORD
    RUT      VAR    WORD
    P1       VAR    WORD
    P2       VAR    WORD
    P3       VAR    WORD             
    C        VAR    WORD
    B        VAR    WORD
    W        VAR    WORD
    ORTAISI  VAR    WORD
    FARK     VAR    WORD
    DUR      VAR    BYTE
    CLK     VAR     PORTA.5
    DTA     VAR     PORTA.3 
    ISARETSHT  VAR     BIT   'sensor değeri 0 ise artı, 1 ise eksi
    SIGN    VAR     BIT      'ısı isareti 0 ise artı 1 ise eksi
    HATA    var     BIT
    MENU    VAR     PORTA.0
    YUKARI  VAR     PORTA.1
    ASAGI   VAR     PORTA.2
   
        'ISI
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 BYTE       ' Div32 bit hesap için geçici değişken
SYMBOL COMM_PIN=PORTB.1   ' One-wire Data-Pin "DQ" PortB.0 da

   
    symbol ROLE1=PORTC.0
    symbol ROLE2=PORTC.1
    symbol ROLE3=PORTC.2
    SYMBOL ROLE4=PORTC.3
    SYMBOL BUZER=PORTE.0
   
    RTC_RST     var PORTC.5
    RTC_CLK     var PORTC.6
    RTC_DTA     var PORTC.4
'-----------------------------B A Ş L A N G I Ç ------------------------------   
          LOW ROLE1
          LOW ROLE2
          LOW ROLE3
          LOW ROLE4
        PAUSE 20
    ' CLEAR: 'TRISA=%00111111:TRISB=0
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
         PAUSE 500:ISARET=0
        LCDOUT $FE,$40,$6,$9,$9,$6,$0,$0,$0,$0        'derece işareti dataları   
        LCDOUT $FE,$48,$04,$0e,$0e,$0e,$1f,$04,$04,$0
        LCDOUT $FE,$50,10,0,17,17,17,17,14,0 'LCD 2. KARAKTER HAFIZASI Ü HARFİ
        LCDOUT $FE,$58,16,8,4,2,4,8,16,0     'LCD 3. KARAKTER HAFIZASI YON İŞARETİ   
GIRIS:
         LCDOUT $FE,$82, "OTOMATIK KULUCKA"           
         lcdout $FE,$C5,     "MAKINESI"
         lcdout $FE,$95,"ISI VE NEM KONTROL"
         lcdout $FE,$D9,   "FERHAT YOL"
         PAUSE 2000
         LCDOUT $FE,1
         
'-------------------------------------------------------------------------------
BASLANGIC:
SYC=0
AYAR=1
READ $07,GN:IF GN=255 THEN GN=1
READ $01,TERM:IF TERM=255 THEN TERM=0
READ $02,NEM:IF NEM=255 THEN NEM=0
READ $09,DUR:IF DUR=255 THEN DUR=0
READ $10,ZAM:IF ZAM=255 THEN ZAM=0
READ $11,A:IF A=255 THEN A=1
READ $06,UPC
READ $13,AYR
gosub ZAMAN_OKU
                   
BASLA: 
              KONTROL=%00000011:HAMISI=0   'SICAKLIK ÖLÇME
        GOSUB OLCUMAL
        Gosub ISIHESAP
              KONTROL=%00000101:HAMISI=0   'RUTUBET ÖLÇME
        GOSUB OLCUMAL
        GOSUB RUTHESAP:GOSUB SENSOROKU
        GOSUB ORTISI
        GOSUB ZAMAN_OKU
        GOSUB GUNEBAK
        GOSUB EKRAN1
        GOSUB ISIKONTROL
        GOSUB RUTKONTROL
        IF AYR=0 THEN
        GOSUB HAVAKONTROL
        ELSE
        LOW ROLE4
        ENDIF
        IF UPC=1 THEN
        GOSUB DONUSEBAK
        ENDIF
        IF MENU=1 THEN  GOTO AYAR_MENUSU

goto BASLA       
'---------------------------------------EKRANA YAZ -----------------------------
EKRAN1:
        lcdout $FE,$80,2,"=",DEC2 ISI1,",",DEC1 ISI2," A=",DEC2 ISI,",",DEC1 (FLOAT)," S=",DEC2 TERM,",",DEC1 A
        lcdout $FE,$C0,"ORTISI=",DEC2 ORTAISI,",",DEC1 CNY,0,"C NEM%",DEC2 U1
        LCDOUT $FE,$94,"SAAT ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN," ",DEC2 GN,".GUN"
        LCDOUT $FE,$D4,"TARIH ",DEC2 GUN,"/",DEC2 AY,"/",DEC2 YIL
            IF SN=DUR THEN LOW ROLE3
        IF SAAT=0 AND DAK=0 AND SN=0 THEN
               GN=GN+1
            IF GN=31 THEN GN=1
            WRITE $07,GN
         ENDIF
        RETURN
'''''''''''''''''MOTOR ÇALIŞ '''''''''''''''''
DONUSEBAK:
                 IF ZAM=2 THEN 'İKİ SAATTE BİR ÇEVİR
                                                         
                 IF SAAT=00 AND DAK=0 AND sn=0 THEN
                 HIGH ROLE3
                 ENDIF               
                 
                 IF SAAT=2 AND DAK=0 AND sn=0 THEN
                 HIGH ROLE3
                 ENDIf                 
                 
                 IF SAAT=4 AND DAK=0 AND sn=0 THEN
                 HIGH ROLE3
                 ENDIF               
                 
                 IF SAAT=6 AND DAK=0 AND sn=0 THEN
                 HIGH ROLE3
                 ENDIF                 

                 IF SAAT=8 AND DAK=0 AND sn=0 THEN 
                 HIGH ROLE3
                 ENDIF

                 IF SAAT=10 AND DAK=0 AND sn=0 THEN 
                 HIGH ROLE3
                 ENDIF               

                 IF SAAT=12 AND DAK=0 AND sn=0 THEN 
                 HIGH ROLE3
                 ENDIF               

                 IF SAAT=14 AND DAK=0 AND sn=0 THEN 
                 HIGH ROLE3
                 ENDIF           

                 IF SAAT=16 AND DAK=0 AND sn=0 THEN 
                 HIGH ROLE3
                 ENDIF                 

                 IF SAAT=18 AND DAK=0 AND sn=0 THEN 
                 HIGH ROLE3
                 ENDIF             

                 IF SAAT=20 AND DAK=0 AND sn=0 THEN 
                 HIGH ROLE3
                 ENDIF

                 IF SAAT=22 AND DAK=0 AND sn=0 THEN 
                 HIGH ROLE3
                 ENDIF
        ENDIF
       
        IF ZAM=3 THEN  '3 SAATTE BİR ÇEVİR
                 IF SAAT=0 AND DAK=0 AND sn=0 THEN
                 HIGH ROLE3
                 ENDIF               
                 
                 IF SAAT=3 AND DAK=0 AND sn=0 THEN
                 HIGH ROLE3
                 ENDIf                 
                 
                 IF SAAT=6 AND DAK=0 AND sn=0 THEN
                 HIGH ROLE3
                 ENDIF               
                 
                 IF SAAT=9 AND DAK=0 AND sn=0 THEN
                 HIGH ROLE3
                 ENDIF                 
                 
                 IF SAAT=12 AND DAK=0 AND sn=0 THEN 
                 HIGH ROLE3
                 ENDIF
                   
                 IF SAAT=15 AND DAK=0 AND sn=0 THEN 
                 HIGH ROLE3
                 ENDIF               
                 
                 IF SAAT=18 AND DAK=0 AND sn=0 THEN 
                 HIGH ROLE3
                 ENDIF               
                 
                 IF SAAT=21 AND DAK=0 AND sn=0 THEN 
                 HIGH ROLE3
                 ENDIF
        ENDIF
                           
        IF ZAM=4 THEN '4 SAATTE BİR ÇEVİR
                 IF SAAT=0 AND DAK=0 AND sn=0 THEN
                 HIGH ROLE3
                 ENDIF               
                 
                 IF SAAT=4 AND DAK=0 AND sn=0 THEN
                 HIGH ROLE3
                 ENDIf                 
                 
                 IF SAAT=8 AND DAK=0 AND sn=0 THEN
                 HIGH ROLE3
                 ENDIF               
                 
                 IF SAAT=12 AND DAK=0 AND sn=0 THEN
                 HIGH ROLE3
                 ENDIF                 
                 
                 IF SAAT=16 AND DAK=0 AND sn=0 THEN 
                 HIGH ROLE3
                 ENDIF
                 
                 IF SAAT=20 AND DAK=0 AND sn=0 THEN 
                 HIGH ROLE3
                 ENDIF           
        ENDIF
   
RETURN           

GUNEBAK:
SELECT CASE HAFTA
CASE 1
LCDOUT $FE,$E3,"PTESI"
CASE 2
LCDOUT $FE,$E3," SALI"
CASE 3
LCDOUT $FE,$E3," CARS"
CASE 4
LCDOUT $FE,$E3," PERS"
CASE 5
LCDOUT $FE,$E3," CUMA"
CASE 6
LCDOUT $FE,$E3,"CTESI"
CASE 7
LCDOUT $FE,$E3," PAZR"
END SELECT
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 
    RETURN 
'------------------------------- İŞLEM START -----------------------------------
T_START:
      OUTPUT DTA:OUTPUT CLK
        HIGH DTA
         LOW CLK
       PAUSE 1
        HIGH CLK
         LOW DTA
       PAUSE 1
         LOW CLK
       PAUSE 1
        HIGH CLK
       PAUSE 1
        HIGH DTA
         LOW CLK
RETURN
'-----------------------SENSORE KOMUT GÖNDER -----------------------------------
OLCUMAL:
           GOSUB T_Start
        SHIFTOUT DTA,CLK,1,[KONTROL]
           INPUT DTA
         PULSOUT CLK,10
                 HATA=0
             FOR W=0 to 65500
              IF DTA=0 then GIT
            NEXT W
                 HATA=1
GIT:         
              IF HATA=1 then
           endif
         SHIFTIN DTA,CLK,0,[H1]
          OUTPUT DTA
             LOW DTA
         PULSOUT CLK,10
           INPUT DTA
         SHIFTIN DTA,CLK,0,[H0]
         PULSOUT CLK,10
RETURN
'----------------------ISI HESAP ALT PROGRAMI-----------------------------------     
ISIHESAP: 
           If HAMISI<4000 then
              ISARETSHT=1 'sıcaklık eksi değerde demek
              ISI1=(4000-HAMISI)/100
              ISI2=((4000-HAMISI)//100)/10   
         goto ISISON
        endif
              ISI1=(HAMISI-4000)/100
              ISI2=((HAMISI-4000)//100)/10
ISISON:   
           
           ISI1=(HAMISI-4000)/100
           ISI2=((HAMISI-4000)//100)/10
RETURN       
'-------------------------RUTUBET HESAP ALT PROGRAMI----------------------------
RUTHESAP:
              'ISI=ISI1*10+ISI2
              p1=(26542-(54722**HAMISI+hamISI))**HAMISI-40     
              P2=655+(HAMISI*5)+(HAMISI**15917)      
              P3=(P2**(ISISHT/10+2480))-(P2**2730)+P1   
              U1=p3/10:U2=p3//10
           IF HAMISI>3710 THEN
              U1=0:U2=0
        ENDIF 
return

ORTISI:
ORTAISI=((ISI1*10+ISI2)+FLOAT)/20
CNY=((ISI1*10+ISI2)+FLOAT)/2
RETURN
'----------------------------ISI KONTROL----------------------------------------
ISIKONTROL:

         if TERM<ORTAISI-0 then   
          LOW Role1
        ENDIF
        if ORTAISI+0<TERM+0 then         
         HIGH ROLE1               
       Endif
      IF MENU=1 THEN  GOTO AYAR_MENUSU
RETURN
'----------------------------RUTKONTROL-----------------------------------------         
RUTKONTROL:
           if NEM>U1 then   
         HIGH Role2
         ELSE               
          LOW ROLE2
        ENDIF
        IF MENU=1 THEN  GOTO AYAR_MENUSU
RETURN

HAVAKONTROL:
FARK=ISI1-ISI
if fark < 0 then fark = fark * -1
IF FARK>1 then
   ROLE4=1
ELSE
   ROLE4=0
ENDIF
RETURN
BIP:
    HIGH buzer   
pause 50
     LOW buzer 
  RETURN
BIPBIP:
     HIGH buzer   
    PAUSE 50
      LOW buzer
    PAUSE 100
     HIGH BUZER
    PAUSE 50
      LOW BUZER
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=8 THEN SYC=0
ENDIF

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

DURUM:
SELECT CASE SYC
CASE 0
lcdout $fe,$c0,"  ISITICI AYARLARI  "
LCDOUT $FE,$94,"                    "
IF MENU=1 then
WHILE MENU=1:WEND
GOSUB BIP
GOTO TERM_KONTROL
ENDIF
CASE 1
lcdout $fe,$c0,"    NEM AYALARI     "
LCDOUT $FE,$94,"                    "
IF MENU=1 then
WHILE MENU=1:WEND
GOSUB BIP
GOTO NEM_KONTROL
ENDIF
CASE 2
lcdout $fe,$c0,"   CEViRiCi MOTOR   "
LCDOUT $FE,$94,"       AYARI       "
IF MENU=1 then
WHILE MENU=1:WEND
GOSUB BIP
GOTO MOT_AYAR
ENDIF
CASE 3
lcdout $fe,$c0,"   SAAT-TARiH-GUN   "
LCDOUT $FE,$94,"        AYARI       "   
IF MENU=1 then
GOSUB BIP
WHILE MENU=1:WEND
GOTO ZAMANAYARI
ENDIF
CASE 4
lcdout $fe,$C0,"   MANUEL OLARAK    "
lcdout $fe,$94,"   MOTORU CEVIRME   "
IF MENU=1 theN
GOSUB BIP
WHILE MENU=1:WEND
GOTO MANUEL
ENDIF
CASE 5
lcdout $fe,$c0,"     GUN AYARI      "
LCDOUT $FE,$94,"                    "     
IF MENU=1 then
GOSUB BIP
WHILE MENU=1:WEND
GOTO GUNAYARI
ENDIF
CASE 6
lcdout $fe,$c0,"SICAKLIK DENGELEYiCi"
LCDOUT $FE,$94,"     FAN AYARI      "
IF MENU=1 then
WHILE MENU=1:WEND
GOSUB BIP
GOTO FANKONTROL
ENDIF
CASE 7
lcdout $fe,$c0,"    MENUDEN CIKIS   "
LCDOUT $FE,$94,"                    "   
IF MENU=1 THEN AYARLANDI
END SELECT
RETURN

MANUEL:
GOSUB TEMIZLE
MANU:
lcdout $fe,$80,"MOTORU CALISTIRMAK "
LCDOUT $FE,$C0,"iCiN YUKLARIYA     "
LCDOUT $FE,$94,"BASINIZ...          "
       IF MENU=1 then
      GOTO AYAR_MENUSU 
       ENDIF         
       
        IF YUKARI=1 THEN
         lcdout $fe,$D4,"MOTOR CALISIYOR  "
        HIGH ROLE3
        ELSE
        lcdout $fe,$D4,"MOTOR KAPALI    "
        LOW ROLE3
        ENDIF
       
GOTO MANU

GUNAYARI:
       WHILE MENU=1:WEND
       GOSUB TEMIZLE
       READ $07,GN
GUNA:     
     LCDOUT $FE,$80,"GUNU AYARLA" 
     lcdout $FE,$C0,"GUN:",DEC2 GN
     IF MENU=1 THEN
      WRITE $07,GN:PAUSE 2
      GOTO AYAR_MENUSU
      ENDIF
     
        IF YUKARI=1 THEN
        GN=GN+1
        IF GN=31 THEN GN=1
        WHILE YUKARI=1:WEND
        ENDIF
       
        IF ASAGI=1 THEN
        GN=GN-1
        IF GN=0 THEN GN=30
        WHILE ASAGI=1:WEND
        ENDIF
             
     GOTO GUNA
     
FANKONTROL:
GOSUB TEMIZLE:
FANKONT:
       lcdout $fe,$80,"FAN DURUMUNU"
       LCDOUT $FE,$C0,"SECINIZ..."
       lcdout $FE,$94,"  ACIK"
       LCDOUT $FE,$D4,"  KAPALI"
       IF MENU=1 THEN
           WRITE $13,AYR:PAUSE 2
           GOTO AYAR_MENUSU
       ENDIF
           IF YUKARI=1 THEN AYR=1
           IF ASAGI=1 THEN AYR=0
           
           SELECT CASE AYR
           CASE 0
           LCDOUT $FE,$D4,3
           CASE 1
           LCDOUT $FE,$94,3
       END SELECT   
GOTO FANKONT
     
             
''''''''''''''''''''''''''''''''''''''''         
MOT_AYAR:
        WHILE MENU=1:WEND
        GOSUB TEMIZLE
        READ $06,UPC
MOTOR_AYAR:
       lcdout $fe,$80,"MOTOR DURUMUNU"
       LCDOUT $FE,$C0,"SECINIZ..."
       lcdout $FE,$94,"  ACIK"
       LCDOUT $FE,$D4,"  KAPALI"
           IF MENU=1 THEN
           WRITE $06,UPC:PAUSE 2
           GOTO M_ZAMANI
           ENDIF
           IF YUKARI=1 THEN UPC=1
           IF ASAGI=1 THEN UPC=0
           
           SELECT CASE UPC
           CASE 0
           LCDOUT $FE,$D4,3
           CASE 1
           LCDOUT $FE,$94,3
           END SELECT         
        GOTO MOTOR_AYAR         
M_CALISMA:
        GOSUB TEMIZLE
        WHILE MENU=1:WEND
        READ $09,DUR
MOTO_CALISMA:
           IF MENU=1 THEN
           WRITE $09,DUR:PAUSE 2
           GOTO AYAR_MENUSU 
           ENDIF
       lcdout $fe,$C0,"MOTOR CALISMA SURESi "
       lcdout $FE,$94,"SURE :",DEC2 DUR," SANIYE"
       
           IF YUKARI=1 THEN
           DUR=DUR+1
           WHILE YUKARI=1:WEND
           ENDIF   
           IF DUR=60 THEN DUR=0
           IF ASAGI=1 THEN
           DUR=DUR-1
           WHILE ASAGI=1:WEND
           ENDIF
           IF DUR=255 THEN DUR=59
         GOTO MOTO_CALISMA                         
M_ZAMANI:
        GOSUB TEMIZLE
        WHILE MENU=1:WEND
        READ $10,ZAM
MOTO_ZAMANI:
        IF ZAM=255 THEN ZAM=1
        IF YUKARI=1 THEN
        ZAM=ZAM+1
        WHILE YUKARI=1:WEND
        ENDIF
        IF ZAM=5 THEN ZAM=4
        IF ASAGI=1 THEN
        ZAM=ZAM-1
        WHILE ASAGI=1:WEND
        ENDIF
        IF ZAM=0 THEN ZAM=1       
        IF MENU=1 THEN
        WRITE $10,ZAM:PAUSE 2
        GOTO M_CALISMA
        ENDIF

        lcdout $fe,$C0,"MOTORU ",DEC1 ZAM," SAATTE BiR"
        lcdout $FE,$94,"CEVRiLSiN.."
GOTO MOTO_ZAMANI
                                                                               
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''   
AYARLANDI:
           IF MENU=1 then AYARLANDI
       lcdout $fe,1
       LCDOUT $FE,$C0,"AYARLAR KAYDEDiLDi.."
       GOSUB BIPBIP
       AYAR=1
       SYC=0
       PAUSE 800
       
        GOSUB TEMIZLE
        goto BASLANGIC       
TEMIZLE:
        lcdout $fe,1
RETURN       
'-------------------------------------------------------------------------------
TERM_KONTROL:
       GOSUB TEMIZLE
       READ $01,TERM:READ $11,A       
SET_AYAR: 
LCDOUT $FE,$C0,"ISI LiMiTiNi SECIN"
LCDOUT $FE,$94,"AYAR:",DEC2 TERM,",",DEC1 A         
           IF YUKARI=1 then
              A=A+1
                IF A=10 THEN
                A=0:TERM=TERM+1
                ENDIF
              IF TERM=100 THEN TERM=0
              PAUSE 150
           ENDIF
           IF ASAGI=1 then
              A=A-1
                IF A=255 then
                A=9:TERM=TERM-1
                ENDIF
              IF TERM=255 THEN TERM=99
              PAUSE 150
           ENDIF
               
         IF MENU=1 THEN
         WRITE $01,TERM:PAUSE 2
         WRITE $11,A:PAUSE 2
         GOTO AYAR_MENUSU
         ENDIF
                     
GOTO SET_AYAR 
'-------------------------------------------------------------------------------
NEM_KONTROL:
       GOSUB TEMIZLE
       READ $02,NEM
NEM_KONT: 
       lcdout $fe,$C0,"NEM LiMiT"
       lcdout $FE,$94,"AYARI: %",DEC2 NEM
       
           IF YUKARI=1 then NEM=NEM+1
        WHILE YUKARI=1:WEND
           IF NEM=01 then NEM=121
           
           IF ASAGI=1 then NEM=NEM-1
        WHILE ASAGI=1:WEND
           IF NEM=121 then NEM=01       
            IF MENU=1 THEN
            WRITE $02,NEM:PAUSE 2
            GOTO AYAR_MENUSU 
            ENDIF                 
         GOTO NEM_KONT
       RETURN
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''       
ZAMANAYARI:
WHILE MENU=1:WEND
GOSUB TEMIZLE
AYAR=1
ZAMANAYAR:
IF MENU=1 THEN
AYAR=AYAR+1
WHILE MENU=1:WEND
ENDIF
GOSUB BUTONOKU
        LCDOUT $FE,$80,"    ZAMAN AYARI     "       
        LCDOUT $FE,$94,"SAAT ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN
        LCDOUT $FE,$D4,"TARIH ",DEC2 GUN,"/",DEC2 AY,"/",DEC2 YIL
GOSUB GUNYAZ
IF AYAR=7 THEN ZAMAN_B
GOTO ZAMANAYAR

GUNYAZ:
SELECT CASE HAFTA
CASE 1
LCDOUT $FE,$E3,"PTESI"
CASE 2
LCDOUT $FE,$E3," SALI"
CASE 3
LCDOUT $FE,$E3," CARS"
CASE 4
LCDOUT $FE,$E3," PERS"
CASE 5
LCDOUT $FE,$E3," CUMA"
CASE 6
LCDOUT $FE,$E3,"CTESI"
CASE 7
LCDOUT $FE,$E3," PAZR"
END SELECT
RETURN

BUTONOKU:
SELECT CASE AYAR
CASE 1
LCDOUT $FE,$C0,"SAAT    "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
SAAT=SAAT+1
IF SAAT=24 THEN SAAT=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
SAAT=SAAT-1
IF SAAT=255 THEN SAAT=23
ENDIF

CASE 2
LCDOUT $FE,$C0,"DAKIKA"
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
DAK=DAK+1
IF DAK=60 THEN DAK=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
DAK=DAK-1
IF DAK=255 THEN DAK=59
ENDIF

CASE 3
LCDOUT $FE,$C0,"GUN    "   
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
GUN=GUN+1
IF GUN=31 THEN GUN=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
GUN=GUN-1
IF GUN=0 THEN GUN=30
ENDIF

CASE 4
LCDOUT $FE,$C0,"AY    "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
AY=AY+1
IF AY=13 THEN AY=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
AY=AY-1
IF AY=0 THEN AY=12
ENDIF

CASE 5
LCDOUT $FE,$C0,"YIL      "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
YIL=YIL+1
IF YIL=51 THEN YIL=5
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
YIL=YIL-1
IF YIL=4 THEN YIL=50
ENDIF

CASE 6
LCDOUT $FE,$C0,"HAFTA     "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
HAFTA=HAFTA+1
IF HAFTA=8 THEN HAFTA=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
HAFTA=HAFTA-1
IF HAFTA=0 THEN HAFTA=7
ENDIF
END SELECT
RETURN


ZAMAN_B:
        IF MENU=1 then ZAMAN_B
        gosub ZAMAN_YAZ
goto AYAR_MENUSU       
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ZAMAN_OKU:
    high RTC_RST:OUTPUT RTC_DTA
shiftout RTC_DTA, RTC_CLK, 0, [$BF]:INPUT RTC_DTA
SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, HAFTA, YIL, MEM]  'OKU
         MEM=SN:GOSUB CEVIR:SN=SAYI
         MEM=DAK:GOSUB CEVIR:DAK=SAYI
         MEM=SAAT:GOSUB CEVIR:SAAT=SAYI
         MEM=GUN:GOSUB CEVIR:GUN=SAYI
         MEM=AY:GOSUB CEVIR:AY=SAYI
         MEM=YIL:GOSUB CEVIR:YIL=SAYI
         MEM=HAFTA:GOSUB CEVIR:HAFTA=SAYI
     low RTC_RST
  return

ZAMAN_YAZ:
         MEM=sn:gosub TERSCEVIR:sn=SAYI
         MEM=DAK:gosub TERSCEVIR:DAK=SAYI
         MEM=SAAT:gosub TERSCEVIR:SAAT=SAYI
         MEM=GUN:gosub TERSCEVIR:GUN=SAYI
         MEM=AY:gosub TERSCEVIR:AY=SAYI
         MEM=YIL:gosub TERSCEVIR:YIL=SAYI
         MEM=HAFTA:GOSUB TERSCEVIR:HAFTA=SAYI

    high  RTC_RST
SHIFTOUT RTC_DTA, RTC_CLK, 0, [$8E, 0]    'WRT Protek açıldı
     low RTC_RST:PAUSEUS 10
    high RTC_RST         
SHIFTOUT RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, HAFTA, YIL, 128]  'YAZ
     low RTC_RST
PAUSEUS 10
  return

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

TERSCEVIR:
         ONLAR=MEM DIG 1
         ONLAR=ONLAR<<4
         BIRLER=MEM DIG 0
         SAYI=ONLAR+BIRLER
  return
 

END
   
     

ta3usl

Programın diğer yerlerinin sağlıklı çalıştığını varsayarak konuşuyorum;

açılışta ;

READ $13,AYR  diyerek epromdan veriyi AYR değişkenine atıyorsun. ilk aklıma gelen , programı ilk yazdığın zaman buradaki değer 0 olmayacak.

basla: rutinine girdiğinde aşağıdaki şekilde şart koşulmuş. AYR = 0 ise kontrol et demişsin.

        IF AYR=0 THEN
            GOSUB HAVAKONTROL
        ELSE
             LOW ROLE4
        ENDIF

AYR değişkeni , menü içerisinden değiştiriliyor. pic'e ilk kez programı yazdığında bu değer sıfır olmayacağı için sıkıntı buradan olabilir. Menüye girerek bu kısmı değiştirdin mi?

ya da IF AYR=0 THEN  satırının üzerine AYR = 0 diyerek HAVAKONTROL  rutinine gidip gitmediğini kontrol et bence.

Eğer, sorunun buysa pic ilk programlamadan sonra default değerleri eproma yazacak bir rutinle iş çözülür. Fakat , öncelikle sorun AYR değişkeni mi ? bulmak lazım...

bozoklu01

IF AYR=1 THEN
            GOSUB HAVAKONTROL
        ELSE
             LOW ROLE4
        ENDIF
olarak düzeltildi, sonuç: iki sensör arası fark 1 derece olunca fan çalışıyor :) fark 0'a düşünce fan duruyor. Ömrünüz uzun düğününüz güzün olsun Allah razı olsun  :)

ete

#14
Konu hızlı gelişmiş yetişemeden de çözüme ulaşmış. Dikkatimi çeken bir konuda açıklama eklemek ihtiyacını duydum.
İki sayının farkını alırken bu basic de önce hangisinin büyük olduğuna bakmak gerekir. Zira küçük sayıdan büyük sayıyı çıkartırsanız ortaya büyük bir sayı çıkar bu aslında eksi sayı demektir ama basic matematiği ve kullandığımız değişkenler tamamen işaretsiz matematik sistemine ait olduğu için bazı tedbirler almak gerekir.
Örnek vermek gerekir ise 1-2 gibi bir işlemde değişkenler 8 bitlik (Byte) ise çıkarma sonucu şöyle bulunur ;
1-2=-1+256=255 olarak hesaplanır. Sonuç eksi ise 256 dan çıkartılarak size verilir)
1-3=-2+256=254 olarak sonuç bulunur.
Değişkenler word tipinde ise
1-2= -1 + 65536=65535 olarak sonuç bulunur. (Sonuç eksi ise 65636 dan çıkartılarak size verilir)
1-3= -2 +65536=65534 olarak sonuç bulunur.

Bu durumda şu şekilde bir mantık yürütmek yanlış olmaz.
Fark=ISI - ISI1
IF Fark.bit15=1 ise  ISI1>ISI demektir.
Mesajların birinde  "FARK.Bit15=1 peki bu kod nedir?" diye bir soru vardı işte bu odur. Yani fark değerinin 15. biti 1 ise o sayı aslında negatif bir sayıdır anlamına gelir. Dolayısıyla farkın ters alınması nı gerektirir.
Bu tür sorunları aşmanın diğer bir yolu ABS komutunu kullanmaktır. Bu komut sayıların hangisinin büyük olduğuna bakmaksızın size kesin farkı verir.
FARK=ABS(1-2)=1 olarak sonuçlanır. Belkide aradığınız budur.  Umarım anlaşılmıştır.

Ete

Powered by EzPortal