avatar_elektro77

ZAMAN RÖLESİ

Başlatan elektro77, 12 Haziran 2020, 19:40:35

elektro77

Hocam dünden beri çok yoğunsunuz galiba.Pek girmediniz siteye.
Hocam aşağıdaki kodların else den önceki kısmı role açıkken geri sayan kısmı. Bu kodlar sayarken 1 veya 2 saniyede bir kalp ritmi gibi bir bip sesi çıkarmak istiyorum. Bu kısma konulabilir mi o kodlar.
'-------------------------GERİ SAYIM saati---------------------------------------
DISABLE
KESME:
IF CALIS=1 THEN
IF SNN=0 AND DAKK=0 AND SAATT=0 THEN 
SAYAC1=SAYAC1 +1  
IF SAYAC1=61 then  
SAYAC1=0
SN1=SN1-1
 IF SN1>=59 THEN 
    SN1=59
      DAK1=DAK1 -1  
        IF DAK1>=59 THEN
          DAK1=59
           SAAT1=SAAT1-1
             IF SAAT1>=23 THEN
              SAAT1=0
             DAK1=0
            SN1=0
             ENDIF
           ENDIF
         ENDIF
      ENDIF  
'--------------------------------------
ELSE 
'--------------------------------------
SAYACC=SAYACC+1  
IF SAYACC=61 then  
   SAYACC=0
    SNN=SNN-1
      IF SNN>=59 THEN 
         SNN=59
         DAKK=DAKK -1  
          IF DAKK>=59 THEN
             DAKK=59
             SAATT=SAATT-1
               IF SAATT>=23 THEN
              SAATT=0
             DAKK=0
            SNN=0
          ENDIF
         ENDIF
       ENDIF  
    ENDIF
ENDIF
ENDIF
'------------------------------------------------------------------------------- 
INTCON.2=0  
RESUME
ENABLE
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

#16
Hocam sizden haber beklerken yazılımımla çok vakit geçirdim ve son haline getirdim sonunda. Bir sürü hata buldum ve bir sürüde yeni özellik ekledim.
Fakat röle aktif iken kalp ritmi gibi, 2sn de bir bip sesi çıkaracak kodları nereye koyacağımı hala bilemedim. Yardımcı olurmusunuz.
NOT:Simülasyonda stopp tusunu röleyi manuel açma tusu olarak değiştirdim
BASLA:'*************************************************************************
 
IF CSN=0 AND CDAK=0 AND CSAAT=0 THEN
GOSUB EPROMOKU
ENDIF
'-------------------TIKANMA DURUMUNDA YAPILACAKLAR------------------------------
IF ASP=1 AND TIKALI=0 THEN 'EĞER RÖLE VE ASP 1 İSE VE TIKANMA VAR İSE 
CALIS=0 'GERİ SAYIMI DURDUR
LCDOUT $FE,$94,"ERR1        "'ERR1 YAZ
GOSUB BIP 'ALARM VER
ENDIF

IF ASP=1 AND TIKALI=1 THEN 'EĞER ASP1 VE TIKANMA GİDERİLDİ İSE 
LCDOUT $FE,$94,"            " 'ERR1 YAZISINI SİL
CALIS=1'GERİ SAYIMI KALDIĞI YERDEN BAŞLAT
ENDIF
'-----------------MANUELDE TIKANMA DURUMUNDA YAPILACAKLAR-----------------------
IF ROLE1=1 AND CALIS=0 THEN'EĞER RÖLE MANUELDE KULLANILIYOR VE AÇIK VE TIKANMA VAR İSE
IF TIKALI=0 THEN 'TIKANMA VAR İSE
LCDOUT $FE,$94,"ERR1        "
GOSUB BIP
IF TIKALI=1 THEN 'TIKANMA GİDERİLDİ İSE
LCDOUT $FE,$94,"            "'ERR1 YAZISINI SİL
ENDIF
ENDIF
ENDIF

'--------------------------CİHAZI-ÇALIŞTIRMA------------------------------------
IF RUN=0 THEN 
CALIS=1
      GOSUB BIP
      CALIS=1
      LCDOUT $FE,$94,"RUN          "
ENDIF

IF ASN>0 OR ADAK>0 OR ASAAT>0 THEN 'eğer açılma zamanı daha dolmadı ise 
IF RUN=0 THEN                      'VE RUN TUŞUNA BASILMIŞŞSA
IF ROLE1=1 THEN                    'O SIRADA RÖLE MANUEL OLARAK AÇILIP ÖYLE KALMIŞŞSA
ROLE1=0                            'önce roleyi kapat
      GOSUB BIP
      CALIS=1
      LCDOUT $FE,$94,"RUN          "

ENDIF
ENDIF
ENDIF

'------------------------AYARLARI EPROMA YAZMA----------------------------------
IF CALIS=0 THEN'Eğer cihaz run durumunda değilse
   IF SEC=0 THEN
   GOSUB BIPBIP 
WRITE 0,ASN,ADAK,ASAAT,CSN,CDAK,CSAAT:pause 10   
LCDOUT $FE,$94,"KAYDEDILDI"
PAUSE 200'KAYDEDİLDİ YAZISINI 200ms EKRANDA TUT
LCDOUT $FE,1 'EKRANI TEMİZLE
PAUSE 100
      ENDIF
   ENDIF

'-----------------------------ANA_EKRAN-----------------------------------------
IF ASN=0 AND ADAK=0 AND ASAAT=0 THEN 
LCDOUT $FE,$80,"CLS: ",1," ", DEC2 CSAAT,":",DEC2 CDAK,":",DEC2 CSN," ",0
LCDOUT $FE,$C0,"AC :   ", DEC2 ASAAT,":",DEC2 ADAK,":",DEC2 ASN,"    "

ELSE

LCDOUT $FE,$80,"CLS:   ", DEC2 CSAAT,":",DEC2 CDAK,":",DEC2 CSN,"   " 
LCDOUT $FE,$C0,"AC : ",1," ",DEC2 ASAAT,":",DEC2 ADAK,":",DEC2 ASN," ",0
endIF

'---------------ROLE AKTİF İSE AKTİF SESİ ÇIKAR---------------------------------
'IF ROLE1=1 THEN 
'FOR I=0 TO 10000
'PAUSEUS 5
'NEXT
'GOSUB AKTIFSES
'ENDIF


'-------------------------AÇMA ZAMANI AYARLAMA----------------------------------
IF CALIS=0 THEN 'Eğer cihaz run durumunda değilse
         IF AARTIR=0 THEN
         ADAK=ADAK+1         
         ASN=0         
         gosub DELAY  
             IF ADAK>=59 THEN
                ADAK =59
                
             ENDIF
         ENDIF
ENDIF  
'-------------------------------
IF CALIS=0 THEN 'Eğer cihaz run durumunda değilse
         IF AAZALT=0 THEN
         ASN=0
         ADAK=ADAK-1
         gosub DELAY  
             IF ADAK=0 THEN
                ADAK =1
            ENDIF
         ENDIF
ENDIF   
'-----------------------ÇALIŞMA ZAMANI AYARLAMA---------------------------------
IF CALIS=0 THEN  'Eğer cihaz run durumunda değilse
         IF CARTIR=0 then         
         CSN=0
         CDAK=CDAK+1
             gosub DELAY
             IF CDAK>=59 THEN
                CDAK =59
             ENDIF
         ENDIF
ENDIF                     
'------------------------------
IF CALIS=0 THEN   'Eğer cihaz run durumunda değilse
        IF CAZALT=0 then
        CSN=0 
        CDAK=CDAK-1
        gosub DELAY  
            IF CDAK=0 THEN
               CDAK =1
            ENDIF
        ENDIF
 ENDIF 

'--------------ALT EKRAN SAATİNİ AYARLAMAK İÇİN KOMUTLAR------------------------
IF SAATAYAR=0 THEN GOSUB ZAMAN_AYAR
gosub zamanoku 
gosub EKRAN_STANDBY

'-------------------------ROLE AÇMA KOMUTLARI-----------------------------------
IF ASN=0 AND ADAK=0 AND ASAAT=0 THEN
ROLE1=1
ASP=1
ENDIF
IF CSN=0 AND CDAK=0 AND CSAAT=0 THEN
ROLE1=0
ASP=0
ENDIF

'---------------------ROLEYİ MANUEL ÇALIŞTIRMA----------------------------------
IF MANUEL=0 THEN 
WHILE MANUEL=0:WEND
GOSUB MANUELAC
ENDIF

GOTO BASLA

'***************************ALT_PROGRAMLAR**************************************
MANUELAC:
IF ASN>0 OR ADAK>0 OR ASAAT>0 THEN
CALIS=0
TOGGLE ROLE1
      GOSUB BIP
IF ROLE1=1 THEN LCDOUT $FE,$94,"ROLE ON "
IF ROLE1=0 THEN LCDOUT $FE,$94,"ROLE OFF"
ENDIF
RETURN

'----------------------------EPROM OKUMA----------------------------------------
EPROMOKU:
'IF CSN=0 AND CDAK=0 AND CSAAT=0 THEN 
READ 0,ASN,ADAK,ASAAT,CSN,CDAK,CSAAT
'ENDIF
RETURN
'-------------------------------------------------------------------------------
DELAY:
FOR I=0 TO 3000'yaklaşık 50ms gecikme yaratır
PAUSEUS 5
PAUSEUS 5
NEXT
RETURN
'----------------------------------BIP------------------------------------------
BIP:
    HIGH buzer   
FOR I=0 TO 2000
PAUSEUS 5
PAUSEUS 5
NEXT
     LOW buzer  
  RETURN
'-------------------------------BIP_BIP-----------------------------------------
BIPBIP:
     HIGH buzer   
FOR I=0 TO 500'yaklaşık 10ms gecikme yaratır
PAUSEUS 5
PAUSEUS 5
NEXT
      LOW buzer 
FOR I=0 TO 300
PAUSEUS 5
PAUSEUS 5
NEXT
     HIGH BUZER
FOR I=0 TO 500
PAUSEUS 5
PAUSEUS 5
NEXT
      LOW BUZER 
RETURN
'----------------------------AKTIF_SESİ-----------------------------------------
AKTIFSES:
HIGH buzer   
FOR I=0 TO 250
PAUSEUS 5
PAUSEUS 5
NEXT
LOW buzer 
RETURN


'-------------------------GERİ SAYIM saati---------------------------------------
DISABLE
KESME:
IF CALIS=1 THEN
'ROLE1=1
IF ASN=0 AND ADAK=0 AND ASAAT=0 THEN 
CSAYAC=CSAYAC +1  
IF CSAYAC=61 then  
CSAYAC=0
CSN=CSN-1
 IF CSN>=59 THEN 
    CSN=59
      CDAK=CDAK -1  
        IF CDAK>=59 THEN
          CDAK=59
           CSAAT=CSAAT-1
             IF CSAAT>=23 THEN
              CSAAT=0
             CDAK=0
            CSN=0
             ENDIF
           ENDIF
         ENDIF
      ENDIF  
'--------------------------------------
ELSE 
'--------------------------------------
'ROLE1=0
ASAYAC=ASAYAC+1  
IF ASAYAC=61 then  
   ASAYAC=0
    ASN=ASN-1
      IF ASN>=59 THEN 
         ASN=59
         ADAK=ADAK -1  
          IF ADAK>=59 THEN
             ADAK=59
             ASAAT=ASAAT-1
               IF ASAAT>=23 THEN
              ASAAT=0
             ADAK=0
            ASN=0
          ENDIF
         ENDIF
       ENDIF  
    ENDIF
ENDIF
ENDIF
'------------------------------------------------------------------------------- 
INTCON.2=0  
RESUME
ENABLE
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Başım kalabalık ve siteye pek giremiyorum. Zamanım yok. Ancak telefonla bir kaç dakika bakabiliyorum mesajlara. Bu biraz sürecek gibi.

2 sn de bir bip sesi için programın bütünlüğünü bozmamak adına basla==>Goto basla arasını bir timer-1 döngüsü içinde çalıştırmak gerekir. BU bir öneri sadece. Her bir timer-1 dilimi en azından 100 ms (4Mhz osc frekanslarında 500 ms ye ye kadar çıkabilir) gerekirse dilim sayarak uygun sürede beep=1 yada beep=1-BEEP diyerek otomatik şekilde beep yaptırabilirsin.

Daha kolay bir yöntem ise zaten saniye sayan bir sistemin var. AKTIF diye bir bit değişken tanımlarsın. programın arasına şu kodu eklersin.
IF AKTIF=1 and SN//2=0 then BEEP=1-BEEP
bu komut beep aktif ise (çalacak ise) saniye değerinin 2 ye bölünebilen değerlerinde beep aç kapa yapar. Bu daha kolay bunu kullan derim.

Ete

elektro77

#18
Alıntı yapılan: ete - 19 Haziran 2020, 10:22:25Daha kolay bir yöntem ise zaten saniye sayan bir sistemin var. AKTIF diye bir bit değişken tanımlarsın. programın arasına şu kodu eklersin.
IF AKTIF=1 and SN//2=0 then BEEP=1-BEEP
bu komut beep aktif ise (çalacak ise) saniye değerinin 2 ye bölünebilen değerlerinde beep aç kapa yapar. Bu daha kolay bunu kullan derim.

Ete

Hocam tam anlayamadım. BEEP de bir değişkenmidir. Yoksa alt program mı? Aşağıdaki gibi birşeyler yaptım ama çalıştıramadım. Yani çalışıyor ama 500 ms de bir bip yapıyor .Biraz daha yardımcı olabilirmisiniz?
Basla:
IF ROLE1=1 THEN
AKTIF =1
ELSE 
AKTIF=0
ENDIF
IF AKTIF=1 and SN//2=0 then BEEP=1-BEEP
IF beep=1 then gosub BIP
GOTO BASLA


BIP:
BUZER=1  
FOR I=0 TO 1000
PAUSEUS 5
NEXT
BUZER=0 
  RETURN
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Basla:
IF ROLE1=1 THEN
AKTIF =1
ELSE 
AKTIF=0
ENDIF
Burada röle=1 yaptığın yere AKTIF=1 desen kod bu kadar uzamamış olacak. Sen zincirleme reaksiyon gibi birini set ediyorsun sonra o biri set ise diğerini set ediyorsun sonra o diğeri set ise ücüncüyü set ediyorsun gibi halbuki ana şart röleninin 1 olması ise nerede röle 1 yapılıyor ise aktif de orada 1 yapılmalı.

Ben demiştimki saniye sayan bir saat sistemin var. O sistem saati sayarken saniye değerinde sürekli her sn de bir aratacak. Aktif=1 ise saniye değerinin çift olduğu durumlarda beep 1 olsun yani buzzere HIGH versin demek istedim.
Ama yazdığın koda bakıyorum zaman okuma diy ebir şey yok ortada. Bu durumda saniye nasıl değişecek?
Devrende bir buzzer var ise ve buzzer pinine HIGH vererek çaldırıyor isen BUZZER=1-BUZZER komutu onu  beep - beep şeklinde flash yapar gibi çaldıracaktır.
Beep=1-Beep de de aynı durumu kast etmiştim. Bu kısımları mantık yürüterek anlamak zorundasın her şeyin detayını veremem buraları mantıken anlaman gerekirdi.

Mesela şu yazdığına bir bak.
IF AKTIF=1 and SN//10=0 then BEEP=1-BEEP
IF beep=1 then gosub BIP
bunu şöyle yazman gerekirdi Bunu ben bir bakışta anlayabiliyorum seninde anlamanı beklerdim.
IF AKTIF=1 and SN//10=0 then gosub beep

Ama beep alt programında ne yapılıyor bunu bilemiyorum. Sen ayarlayacaksın orasını.
Ben daima buzzer pinini HIGH yaparak ses çıkartırım low yaparak sustururum.
BEEP=1-BEEP (beep burada buzzer pini oluyor) komutu bu işi otomatikman yapmış oalcak işte.

Ete

elektro77

#20
"-Burada röle=1 yaptığın yere AKTIF=1 desen kod bu kadar uzamamış olacak. Sen zincirleme reaksiyon gibi birini set ediyorsun sonra o biri set ise diğerini set ediyorsun sonra o diğeri set ise ücüncüyü set ediyorsun...

Hocam bu yazdığızına o kadar çok güldüm ki .Allah ta sizi güldürsün inşAllah. Size değil tabiki kendimin anla mayışına.

Hocam sizi kızdırıp ta bir daha yardım alamamak korkusu ile inanın kılı kırk yarıyor kelimelerimi özenle seçip cümlelerimi özenle yazıyorum.
Ne olur kusuruma bakmayın. Kalın kafama verin kabahati.
Sizi hiç görmeden seviyorum. Hakkınızı nasıl öderim bilmem. Sayenizde 5-10 kuruş kazanmaya ve bu kadarcık anlayışımla bile bizim buradaki elektronik camiasında bir itibar sahibi olmaya başladım.
Ölür isem falan lütfen hakkınızı helal edin.....
Saygılarımla.
Bu arada kodu son anlatışınızla çalıştırdım. Teşekkür ederim. Fakat bilmediğim bir nedenden veya isis simülasyonundan ötürü, buzzerin çıkardığı ses süreleri düzensiz aralıklarla çalışıyor.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Gerçek devrede denedikten sonra karar ver. Aslında zaman kesme ile tutulduğu için sn değerine bağlı olarak zaman artırımı farklı sürelerde olur. Simulsyonda bu belirgin hale gelir. Gerçeğinde çok daha hızlı yürür işler.

Ete

elektro77

#22
Hocam bir hatam daha çıktı!
Aşağıdaki kod parçası ana kodlarımdan alıntıdır.
'-------------------------AÇMA ZAMANI AYARLAMA----------------------------------
IF CALIS=0 AND ROLE1=0 THEN 'Eğer cihaz run durumunda değilse
        IF AARTIR=0 THEN'ARTIRMA
        ASN=0
        gosub DELAY 
        ADAK=ADAK+1        
        IF ADAK>59 THEN
        ADAK=1
        ENDIF
    ENDIF
ENDIF  
'-------------------------------
IF CALIS=0 AND ROLE1=0 THEN 'Eğer cihaz run durumunda değilse
        IF AAZALT=0 THEN'AZALTMA
        ASN=0
        gosub DELAY
        ADAK=ADAK-1
        IF ADAK<1 THEN
        ADAK=59
        ENDIF
    ENDIF
ENDIF  
'-----------------------ÇALIŞMA ZAMANI AYARLAMA---------------------------------
IF CALIS=0 AND ROLE1=0 THEN  'Eğer cihaz run durumunda değilse
        IF CARTIR=0 then'ARTIRMA
        CSN=0
        gosub DELAY        
        CDAK=CDAK+1
        IF CDAK>20 THEN
        CDAK=1
        ENDIF
    ENDIF
ENDIF                    
'------------------------------
IF CALIS=0 AND ROLE1=0 THEN  'Eğer cihaz run durumunda değilse
        IF CAZALT=0 then'AZALTMA
        CSN=0
        gosub DELAY
        CDAK=CDAK-1
        IF CDAK<1 THEN
        CDAK=20
        ENDIF
    ENDIF
ENDIF

Sorun şu:
açma zamanı geriye doğru sayarken ve henüz sıfır olmamışken roleyi manuel aç tuşuna bastığımda geri sayım duruyor ve orada iken sec tusuna bastığımda saniyeyi o şekilde hafızaya alıyor.( Aslında almaması gerek, şartları yazılımsal olarak oluşturamadım), bu da bir sorun ama anlatmak istediğim asıl sorun şu; saniye hafızaya alınmışken, açma  azalt tuşuna basarsam ekranda dakika 55 oluyor.Bazende açma zamanı 0 oluveriyor ve açma zamanının 0 olma şartına bağlı sistem çalışıveriyor. Bu sorunu çözemedim. tüm programı çalıştırıp bakabilirmisiniz lütfen.

Rar dosyalarının ilki halihazırda uğraştığım devrenin son hali, diğeri ise aynı devrenin zaman ayarlarının pot ile yapılmış halidir. Onuda mantık hatam olup olmadığı konusunda inceleyebilirmisiniz hocam lütfen?
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

#23
İnceden hata ayıklamaişine girişemiyeceğim maalesef. BU tür hataları giderebilmek için programa hakim olmak gerek. Şu anda hakim değilim ve hakim olmak için bütün programı satır satır tarayıp kim ne yapıyor anlamam gerek. Buda nerdeyse bir günümü alır. Şu anda 10 dakika bile PC yi açıp bakamıyorum.
Programa sen hakimsin ve hatayı sen bulup tamir etmen gerek.

Yinede baktım programa kolayca halledebilirsem halledeyim diye. Ama artık öyle seviyeye gelmişsinki bunu benim halletmem zor. Nedenlerini açıklayayım.
Manuel tuşuna basınca sayma duruyor demişsin. Manuel tuşuna basınca program manuelac etiketine gidiyor. Orada CALIS=0 yapıldığı içinde sayma duruyor. Bu normal
Sayma duruyorken yani CALIS=0 iken SEC tuşına basıldığında ise Ayarları Eproma Yazma bölümüne gidip yazıyor. Buda normal çünki programı öyle kurmuşsun. Eproma yazmaması gerek demişsin ama tam tersi yazması gerek program öyle ayarlanmış. Bunlara ben ne yapayım?. Neye göre karar vereyimde değişiklik yapayım. Hiç bilemiyorum.
Programın mantığını bile bilmiyorum. Algortimayı bilmiyorum. Sen bana programın bütünü ile ilgili düzeltme yap diyorsun ama bu mümkün değil hakim değilim.
Ekranda değerin 55 olması aslında o değerin 255 olduğunu gösteriyor. Kısıtlama koymamışsın demekki.
Azala azala önce sıfıra geliyor ardından değer 255 oluyor ama ekrana 2 hane yazdırdığın için sen 55 ini görüyorsun. O halde nerede azalma yapılıyor se oraya if xxxx=255 then xxx=0 demen gerekir. xxx burada o değişkenin adını ifade ediyor.

Umarım anlatabilmişimdir bende derdimi.
Ete

ete

Anlamadığım bir şey var. Bu devrede hem RTC kullanılmış hemde kesme ile saat elde edilmesi uygulaması yapılmış. İkisinden birisi ve özellikle RTC bu iş için yeterli idi.
Boşuna kesme saati programı uzatıyorda uzatıyor.

"IF CALIS=0 AND ROLE1=0 THEN " şartına bağlı 4 farklı IF satırı mevcut. Bu satırların hepsinin başına bu şartı eklemişsin. Bu ekstradan orada program gecikmesi yaratacaktır.
Hepsini aşağıdaki gibi bir araya toplamak mümkün.
IF CALIS=0 AND ROLE1=0 THEN 'Eğer cihaz run durumunda değilse
   IF AARTIR=0 THEN'ARTIRMA
      ASN=0
      gosub DELAY 
      ADAK=ADAK+1         
      IF ADAK>59 THEN ADAK=1
    ENDIF
    IF AAZALT=0 THEN'AZALTMA
       ASN=0
       gosub DELAY
       ADAK=ADAK-1
       IF ADAK<1 THEN ADAK=59
    ENDIF 
    IF CARTIR=0 then'ARTIRMA
       CSN=0
       gosub DELAY         
       CDAK=CDAK+1
       IF CDAK>20 THEN CDAK=1
    ENDIF    
    IF CAZALT=0 then'AZALTMA
       CSN=0
       gosub DELAY
       CDAK=CDAK-1
       IF CDAK<1 THEN CDAK=20
    ENDIF           
ENDIF                   
Iç içe geçmiş if komutlarını tek hizada yazmayınız. Kim kimin içinde belli olmaz yoksa.
Yukarıdaki örnekteki gibi yazmaya çalışın Böylece program daha kolay anlaşılır ve if-Then ELse takibi daha kolay olur.
Programda bir CALIS=0 birde CALIS=1 konumu mevcut. CALIS=0 iken hemen hemen hiç bir şey yapılmıyor. Belki tuş kontrolü yapılıyordur sadece. Bu durumda programı iki bölüme ayırmak daha akıllıca olurdu. CALIS=0 olan konum ve CALIS=1 olan konum.
Böylece daha az komut ile programı daha hızlı koşturabilirdin. Bence bu önerime odaklan.

Ete



elektro77

#25
Alıntı yapılan: ete - 21 Haziran 2020, 15:12:19Manuel tuşuna basınca sayma duruyor demişsin. Manuel tuşuna basınca program manuelac etiketine gidiyor. Orada CALIS=0 yapıldığı içinde sayma duruyor. Bu normal
Sayma duruyorken yani CALIS=0 iken SEC tuşına basıldığında ise Ayarları Eproma Yazma bölümüne gidip yazıyor. Buda normal çünki programı öyle kurmuşsun. Eproma yazmaması gerek demişsin ama tam tersi yazması gerek program öyle ayarlanmış.

Ete

Hocam öncelikle zaman ayırıp cevapladığınız için çok teşekkür derim. (bu arada sizi artık tanıyorum. Çünkü bu gece rüyamda gördüm. Rüyamda gençtiniz ve nerdeyse bir zenci kadar esmerdiniz. Hatta dükkanınız benim memleketimde idi.yani burada. Tatile falan gelmeyi mi düşünüyorsunuz Antalya ya?:)
Ben sizi nur yüzlü, beyaz tenli orta yaşlı, bıyıksız-sakalsız biri gibi hayal etmiştim herzaman. Baya bi muhabbet ettik. Hatta sürekli internetten haberleşip birbirimizi gerçekte ilk defa gördüğümüz için bunu konuşup gülüştük. Neyse sabah sabah gözlerinizi yormayayım yazdıklarımla.

Hocam
Manuele basınca saymanın durması ve CALIS=0 olması dediğiniz gibi istenilen şey. Ama manuel kontrol esnasında CALIS=0 olursa sec tuşunun çalışmaması gerek. Bunun mantık şartlarını bir türlü oluşturamadım. Eğer bu durumda sec tuşu çalışırsa ayarlar değiştiği için cihaz resetlenip yeniden ayarlanması gerekiyor. Bu istemediğim bir durum. Mesela bakın; CALIS=1 olursa artırma ve azaltma tuşları ve sec tusu hiç bir şekilde çalışmıyor, bunu sağladım. Hatta CALIS bıt değişkenini eğer 1 olursa  artır ve azalt ve sec tuşşlarının calışmasını engellemek  için atadım. Çünkü cihaz çalışırken ayarlarda değişiklik yapılabilmesi istenmeyen bir durum.
Aynı şeyi manuel kullanımda da farklı şekilde yapmak istedim ama mantığını güdemedim.
Hatta bazen size soru sormak için, sorunumu yazarken bazı şeyleri çözüyorum. Fakat bu konu ile ilgili bir çözüme ulaşamadım.

Alıntı yapılan: ete - 22 Haziran 2020, 08:09:38Iç içe geçmiş if komutlarını tek hizada yazmayınız. Kim kimin içinde belli olmaz yoksa.
Yukarıdaki örnekteki gibi yazmaya çalışın Böylece program daha kolay anlaşılır ve if-Then ELse takibi daha kolay olur.

Ete

Bundan sonra bu dediğinizede azami dikkat etmeye çalışacağım hocam.Teşekkür ederim uyardığınız için...

Alıntı yapılan: ete - 21 Haziran 2020, 15:12:19Ekranda değerin 55 olması aslında o değerin 255 olduğunu gösteriyor. Kısıtlama koymamışsın demekki.
Azala azala önce sıfıra geliyor ardından değer 255 oluyor ama ekrana 2 hane yazdırdığın için sen 55 ini görüyorsun. O halde nerede azalma yapılıyor se oraya if xxxx=255 then xxx=0 demen gerekir. xxx burada o değişkenin adını ifade ediyor.
Ete

Bu dediğinizi ise zaten şartlandırdım hocam.Ama azaltmada if xxxx=255 then xxx=0  diye yazsamda 255 i atlayıp 254 e hatta 253 e atlayabiliyor. Bunu neden yaptığını anlayamadım. Bende şöyle yaptım düzeldi.
IF AAZALT=0 THEN'ACAZALTMA
       ASN=0
       pause 300
       ADAK=ADAK-1
       IF ADAK=0 or ADAK=255 OR ADAK=254 THEN ADAK=59 
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

Alıntı yapılan: ete - 22 Haziran 2020, 08:09:38Anlamadığım bir şey var. Bu devrede hem RTC kullanılmış hemde kesme ile saat elde edilmesi uygulaması yapılmış. İkisinden birisi ve özellikle RTC bu iş için yeterli idi.
Boşuna kesme saati programı uzatıyorda uzatıyor.

Ete
Hocam run tusuna basılıp CALIS=1 olduğunda kesme saati çalışıyor. RTC de bunu nasıl yapacağımı bilmiyorum.
Temel Mantığı nedir?
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

CALIS=0 iken sec tuşu çalışmayacak ise önceden de söylediğim gibi programı iki konuma ayırsan bu da kolaylıkla mümkün olurdu. SEC=0 konumunda yanlızca RUN tuşunu kontrol ederdin calıs=1 oluncada SEC dahil her şeyi kontrol ederdin.
Karışık kullanımda nerede sec tuşu kontrol ediliyor ise oraya CALIS=1 and SEC=0 ise dersin olur biter.

Bir sayac azaltma işleminde sayı sıralı azalır. Sayı atlaması kesinlikle olmaz.
Bu oluyor ise başka bir komutta oluyordur. Aşağıdaki satır,
IF ADAK=0 or ADAK=255 OR ADAK=254 THEN ADAK=59 
Şöyle olmalı
IF ADAK=255 THEN ADAK=59

Bir saniye ve dak. sayacı 0-59 arasında sayar. Sende 59 dan sonra 1 e atlıyor bunları da düzeltmen gerek.
      ADAK=ADAK+1         
      IF ADAK>59 THEN ADAK=1
burada IF ADAK=60 then ADAK=0 şeklinde yazılmalı.

Sayac olarak RTC yi kullanmanın türlü yolu var.
Ben bu işi bir kaç şekilde yapıyorum.
Mesela,
IF CALIS=1 THEN ASN=ASN+1
Şayet hem dakika hem saniye birlikte kullanılacak ise
Tüm süreyi SANİYE ye çeviririm. Mesela diyelimki 3 dak lık bir süre sayılacak. Bunun saniy ekarşılığı 3*60=180 sn dir. Ya bunu direk bir değişkene veririm ve her zaman okumada şayet saniye değişmiş ise IF CALIS=1 then ASAYAC=ASAYAC-1 , IF ASAYAC=0 then zaman bitti derim.
Aslında bunları bilmen yeterli diğer metodlar sana karmaşık ve daha zor gelecektir.

Ete




Powered by EzPortal