bir butonla bir ledi yakıp söndürmek

Başlatan oktayc84, 11 Eylül 2004, 09:19:31

Mucit23

Merhabalar ete hocam Dediğinizde haklısınız. Saati dakika formatına çevirmek işlemleri kolaylaştır.

Hocam dediğiniz gibi oluyor fakat bazı sorunlar ortaya çıkıyor. İlk başta başla komutundan önce röleyi çalıştırmak için aşağıdaki komutu kullanmıştm
IF AS<=SAAT AND AD<=DAK THEN HIGH ROLE

Ne demişim burada ;" eğer açılış saati saatten küçükse veya eşitse ve açılış dakikası dakikadan küçükse veya eşitse röleyi çalıştır."
Burada sorun yok kod işliyor.ama atladığımız bi nokta var. Örnekle açıklayayım. Diyelimki saat 13:00 da röle çalışacak 14:00 da kapanacak saat 13:00 olduğunda röle çalışıyor. menüye girdiğimizde kapanıyor çıktığımızda tekrar çalışıyor. Aynı şekilde elektrik kesilip geldiğinde sulama saati geçmemişse yine çalışıyor. Röle çalışma saatleri arasında sorunumuz yok. Asıl sorun sulama saati dolup röle kapandıktan sonra başlıyor. Şöyle açıklayayım. sulama saati dolup röle kapanınca menüye girip çıktığımızda veya elektrik kesilip geldiğinde tekrar röle çalışıyor. Halbuki çalışmaması lazım. Nasıl oluyor dersek Başla komutundan önceki koşul sayesinde oluyor. Sulama süresi dolsa bile saat ve dakika açılış saatinden büyük olduğu için röle yine devreye giriyor. Bu yüzden başka bir yol bulmak gerekiyor. Bunu şöyle bir nezlede olsa çözdüm ama tam çözüm olmadı malesef şöyle yaptım. Rölenin kapama saatlerinin kontrol esildiği yer eskiden böyleydi
IF KS=SAAT AND KD=DAK THEN LOW ROLE

böyle olunca koşullar kapanış saatiyle açılış saati eşitlenene kadar röle açık kalacaktır.
ama aşğıdaki gibi yapılırsa sorun birazcıkda olsa çözülüyor
IF KS<=SAAT AND KD<=DAK THEN LOW ROLE

Fakat bu seferde pic ilk önce röleyi enerjileyip onra enerjiyi kestiği için rölede bir açıp kapama yine söz oluyor. Gözle görülebiliyor. Tahiminimce rölenin açılıp kapanma süresi 10 ms den fazladır. Bu çok sakıncalı
Bu durum beni yine başka yollar aramaya itiyor. Belkide yine çözüm eprooma yazmaktan geçiyor. Daha başka nasıl yapabilirim bilmiyorum. Hocam sizinde kafanızı çok  karıştırdım. İnş durumu anlatabilmişimdir.

Mucit23


Alıntı YapDiğer bir metod ise;eeprom kullanarak bu işi bir şekilde halletmek olacaktır. Tabiiki epromun hep aynı adresini kullanırsan yazboz tahtasına dönecektir. Bu nedenle haftanın gününe göre bir kayıt yöntemi geliştirirsen 7 farklı adres kullanmış olursun.
Bir sulama başladığında hangi gün ise gün eprom adresi olur. Oraya 10 değerini yazarsın. Bu sulama açıldı anlamına gelir. Sulama bitince aynı adrese 255 yazarsın buda sulamanın kapandığı anlamına gelir. Elektrik kesilip geldiğinde ilgili gün adresine bakılıp orada 100 var ise sulama açılır. Kapanmayı tabiiki bitiş zaman kontrolü yapacaktır otomatikman.

Aklıma başka bir yöntemde gelmedi maalesef.
Hocam sizin ikinci metodu zaten yapabiliyorum. normlade her günü ayrı bir değişkene yükleyip hafızaya kaydetmek yerine sadece röle durumunu (1 veya 0) hafızaya kaydedip ona bakarak sulama işlemi yapıyorum.
Benim yapmaktan sakındığım şey picin hafızasını öldürmemek yani rölenin durumu değiştiğinde sadece 1 kereliğine eprooma yazmak. Sizin dediğiniz gibi yapsam fark eden bişey olmayacaktır. Çünkü sonuçta yine röle açık veya kapalı olduğu sürece eproma bişeyler yazacaktır. Bunu önlemeye çalışıyorum. İnş çözebilirim

ete

Bana kalırsa saat hesaplarında saniyeyi dikkate almadığından kaynaklanıyordur bunlar.
Bir dakika usun bir süre yani 60 saniye işlemci bu süre zarfında epeyce iş yapıyor.
Karşılaştırma komutlarının başına IF Saniye <5 de bakalım yani bu karşılaştırma lk 5sn çinde yapılsın.

Kapan komutundan sonra yeniden çalışması enteresan. Simulasyonda yakalanabiliyormu bu an?.
Yakalanıyor ise mutlaka gözden kaçan bir husus vardır. Programı görmek isterim şayet böyle ise.
Bana yollarsan bakarım.

Ama sanki daha öncede benzer bir sorunla karşılaşmış ve sorunu saniye hesabınıda saat hesabına dahil ederek aşmıştımdiye hatırlıyorum.
Çünki  saat 18:22 de kapanış 18:22 olsun ;
IF AS<=SAAT AND AD<=DAK THEN HIGH ROLE .........komutu çalışacak ve ROLE HIGH yapılacaktır.
Aynı şekilde;
IF KS<=SAAT AND KD<=DAK THEN LOW ROLE .... komutuda aynı zaman diliminde çalışacak ve role LOW yapılacaktır. O halde röle bir HIGH bir lOW olacaktır.
Bu nedenle ya işin içine saniyeyi sokacak ve komutları;
IF AS<SAAT AND AD<DAK and SN<5 THEN HIGH ROLE
şeklinde ve kapanış içinde;
IF KS>=SAAT AND KD>=DAK and SN<5 THEN LOW ROLE  (büyüktür işaretine dikkat sen bunun yerine küçüktür kullanmışsın)
şeklinde değiştirirsen istediğin olacak sanırım.
İşi birazda fiziksel olarak düşün  18:22 senin kapanma saatin. Bu saat 18:22:00 - 18:22:01  -.. 18:22:05 şeklinde yürüyor.
18:22:05 i tam ortaya alırsan bunun altı role HIGH olacak üzerinde röle LOW olacaktır. İşte bunu çok iyi ayırd edebilmelisin.
Bu nedenle büyüktür , küçüktür komutlarını çok dikkatli kullan.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Mucit23

Hocam akşam gidince bi deniyeyim.
Kapan komutundan sonra tekrar açılma şöyle gerçekleşiyor. Röle kapandıktan sonra menüye girilip çıkılırsa yada elektrk gidip gelirse röle tekrardan çalışıyor. Normalde röle kapandıktan sonra daha çalışmıyor. Başla komutundan önceki  "IF AS<=SAAT AND AD<=DAK THEN HIGH ROLE"  komutunu işleme alınca röle çalışıyor.
Ama hocam bana kalırsa sn yeyi işleme katmamız bişey değiştirmeyecektir. Şöyle açıklayayım. Başla komutundan önceki röle çalıştırma komutunda ne demiştik. Saat açılış saatinden büyük veya eşitse röleyi çalıştır. Mesela saat 14:00 da röle kapanacak. yani kapanış saatimiz 14:00 Saat 14:00 olduğu zaman röle kapanacak tamam normal çalışmada sorun yok. Diyelim saat 14:30 oldu elektrik kesilip yeniden geldi. işlemci bakıyor kapanış saati 14:00, sistem saati 14:30 sistem saati kapanış saatinden büyük ohalde şart doğrulandı deyip röleyi çalıştırıyor. İşe saniyeyi eklersek ne olacak.Yine aynı şekilde kapanış saatimiz 14:00 olsun.  kapanma saati geldi ve röle kapandı. Aynı şekilde saat 14:30 da elektrik gidip geldi. bu sefer birde saniyeye bakıcak ne demiştik. sn<5 yani saniye 5 ten küçükse ve diğer koşullar doğrulanıyorsa röleyi çalıştır. Elektrik gidip geldiğinde sn yenin kaç olduğunu bilmiyoruz sn 5 ten büyükse röle çalışmayacaktır. Çalışması gereken zamanlardada yine sn 5ten büyük olduğu zaman çalışmayacaktır. Bunların hepsi menüye girip çıktığımızdada gerçelidir.


ete

Anlattıklarından olaya tam olarak konsantre olabilmiş değilim. Yeniden çalışma olayı menü ye girip çıkıştamı oluyor yolsa elektrik kesilme olduktan sonramı oluyor. ?
Ancak yinede sorunun zaman sınıurlarının çok iyi belirlenmemiş olmasından kaynaklandığı konusunda ısrarlıyım. Bu noktaya yoğunlaş sorunu en kolay kendin bulursun.
Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Mucit23

Hocambu yeniden çalışma olayı hem menüden çıkışta hemde yeniden çalışmada gerçekleşiyor. Dikkat ederseniz yeniden çalıştırma komutu başla komutundan önce menüden çıkışta program başlangıçtan itibaren devam ediyor ondan sonra başla ile döngü arasına giriyor.
Çok araştırdım başka yol bulamıyorum.Yine en sağlıklı yöntem eproma kaydetmek olacak.
Bunun için aklıma bir yol geldi.
KP adında bir değişkenimiz olsun. Bu değişkene rölenin açık veya kapalı olduğunu kaydedelim. yani röle 1 ise KP=1 0 ise kp=0 gibi. Rölenin durumu değiştiğinde yani 1 den 0 olunca veya 0 dan 1 olunca eprooma kaydedecek. Tekrar röle durumu değişinceye kadar tekrardan röle durumunu eprooma yazmayacak. Yapmak istediğim şey budur. Şimdilik işteyim. Akşam eve gelince bunu üzerine çalışacam. Dediğim gibi asıl yapmak istediğim şey eprooma rölenin durumunu çalışma esnasında üst üste yazmamak.

ete

Üst üste yazmamak için çare şöyle olabilir,
Epromdaki değer 100 ise >Röle aktif, 255 ise röle kapalı anlamına kullanırsan;
Rölenin aktif olduğu anda eprom değeri 100 yapılır ve sonunda program olarak yazma komutu verirse ve röle-eprom değeri 100 ise yazmaz. 255 ise yazar. Aynı şekilde röle kapalı iken bir kere 255 yazar ama tekrar yaz emri geldi ise ve değer 255 ise yeniden yazmaz.

Ben yinede programın karar kısmını görmek isterim. Neden yaptığını merak ediyorum ve bulmakda çok zor değil. Simulasyon dosyası ile bana yollayabilirsen bakarım.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Mucit23

#22
Tamam hocam akşama tüm dosyalarımı yollayayım şimdi işteyim.

Birde hocam epproma yazma il ilgili şöyle bir kod yazdım

    IF ROLE<>KP THEN 
    ROLE=KP
    WRITE $12,KP:PAUSE 1
    ENDIF

Hocam başla döngüsü içerisine bu şekilde bir kod yazarsak çözmüş olamazmıyız.
Başla komutundan önce röle ile kp yi eşitliyoruz.
bundan sonra role ile kp eşitliği bozulana kadar eprooma bişey yazılmaz ne zamanki eşitlik bozulursa ozaman röleyi kp ye eşitler ve eprooma değeri yazar. Olurmu acaba

Mucit23

Hocam buyrun dosyaları ekliyorum.
http://hotfile.com/dl/93271995/49dbb87/oto_sulama.rar.html
Program bu haliyle menüden sorunsuz bir şekilde çalışıyor. Sadece elektrik gidip gelmesinde rölenin kontrolünün yapılması gerekiyor.

ete

Birşeyler yaptım. Hemen belirteyim.
Açılışta GOSUB ZAMAN_OKU komutunu iki defa vermez isen zamanı ilk seferde okuyamıyor.
Sorun büyük ölçüde buradan kaynaklanıyordu. Ancak yinede elektrik kesilmesinde röle kapanması gerekiyorsa bunu sağlama almakta yarar gördüm ve basit bir alt program yazdım. Oraya bakarsın. Adı Elektrik_Kontrol .
Programda bazı lüzümsuz fazlalıkları kısalttım. Kısaltma büyük ölçüde GUNEBAK isimli etikette yapıldı. Görünce anlayacaksın.
Bu sayede diğer ilaveleri yapabildim . Aksi halde program dolu idi.

Geriye yalnızca gece yarısı sulama sorunlarının tesbiti kalmış oluyor. Ancak kimsenin gece yarısı sulama başlatım gece yarısından sonrasında sonlandıracağını sanmıyorum. Buda mümkün diyorsan işin epeyce zor olacak. Haftanın gününü hesaba katman gerekecek bunu unutma.

Son olarak yazmış olduğum alt pograma menüden çıkışta bir gidip gelirsen menü çalışması esnasında başlamış olan sulamalara ati röleyide harekete geçirebilrisin. O kısım çalışıyor dedğin için hiç bakmadım. Ama sorun var ise çözümü söylemiş oldum.

Programda kesme kullanmışsın  ama büyük değerli pause lar görüyorum. Bunlar sakıncalı. Bunların yerine döngü tipi kısa fasılalı gecikmeler kullanman gerekir.
Son olarak programı aşağıdaki linkden yükleyebilirisin.

http://hotfile.com/dl/93289663/f22bef0/sulama_Ete.rar.html

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Mucit23

Hocam çok teşekkürler. Yaptığınız değişikler çok iyi olmuş. Çok güzel çalışıyor. Özellikle Günebak kısmında yapılan düzenlemeler programı çok hafifletmiş. Zaten en çok bu lcd ye veri gönderme komutları hafızayı kaplıyor.

Siz bunları yaparken bende boş durmadım bişeyler yaptım. Başarılıda oldum. hafızaya alma işini hallettim artık üst üste yazmıyor. Çokda güzel oldu. İşte programın başından başla döngüsünün sonuna kadar vereyim. Nasıl yaptığımı açıklayayım
DEFINE OSC 4
@ DEVICE pic16F876
@ DEVICE pic16F876, WDT_ON
@ DEVICE pic16F876, PWRT_ON
@ DEVICE pic16F876, PROTECT_OFF
@ DEVICE pic16F876, XT_OSC

TRISA=%00010111
TRISB=%00000000
TRISC=%00000111
PORTA=0
PORTB=0
PORTC=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
ADCON1 = 7
ON INTERRUPT GoTo KESME  
OPTION_REG=%10000101   	 
INTCON=%10100000  		 
TMR0=0
    X       VAR     WORD
    E       VAR     BYTE
    AY      var     byte
    YIL     var     byte
    SN      VAR     BYTE
    DAK     VAR     BYTE
    SAAT    VAR     BYTE
    GUN     VAR     BYTE
    MEM     VAR     BYTE
    ONLAR   VAR     BYTE
    BIRLER  VAR     BYTE
    SAYAC   VAR     BYTE
    HAFTA   VAR     BYTE
    SAYI    VAR     BYTE
    SYC     VAR     BYTE
    AYR     VAR     BYTE
    ZYM     VAR     BYTE
    ZMN     VAR     BYTE
    SNY     VAR     BYTE
    SNS     VAR     BYTE
    KDS     VAR     BYTE
    AS      var     byte
    AD      var     byte
    KS      VAR     BYTE
    KD      VAR     BYTE
    KP      VAR     BIT
    RYM     VAR     BIT
    RAM     VAR     BIT
    GRS     VAR     BIT
    POZ     VAR     BIT
    PTESI   VAR     BIT
    SALI    VAR     BIT
    CARS    VAR     BIT
    PERS    VAR     BIT
    CUMA    VAR     BIT
    CTESI   VAR     BIT
    PAZAR   VAR     BIT
    
    MENU        VAR     PORTA.0
    YUKARI      VAR     PORTA.1
    ASAGI       VAR     PORTA.2
    SET         VAR     PORTA.4
    RTC_RST     var     PORTC.0
    RTC_CLK     var     PORTC.1
    RTC_DTA     var     PORTC.2
    
    SYMBOL ROLE=PORTA.3
    SYMBOL BUZER=PORTA.5
    SYMBOL LED=PORTB.1
    
    PAUSE 300
    HIGH LED    
    LCDOUT $FE,$40,0,1,2,18,10,4,0,0     'LCD 0. KARAKTER HAFIZASI ONAY İŞARETİ
    LCDOUT $FE,$48,0,17,10,4,10,17,0,0   'LCD 1. KARAKTER HAFIZASI ÇARPI İŞARETİ
    LCDOUT $FE,$50,16,8,4,2,4,8,16,0     'LCD 2. KARAKTER HAFIZASI YÖN İŞARETİ
    LCDOUT $FE,$58,14,17,16,16,17,14,4,0 'LCD 3. KARAKTER HAFIZASI Ç HARFİ
    LCDOUT $FE,$60,4,0,14,4,4,4,14,0     'LCD 4. KARAKTER HAFIZASI İ HARFİ
    LCDOUT $FE,$68,10,0,14,17,17,17,14,0 'LCD 5. KARAKTER HAFIZASI Ö HARFİ
    LCDOUT $FE,$70,14,0,15,16,19,17,15,0 'LCD 6. KARAKTER HAFIZASI Ğ HARFİ 
    LCDOUT $FE,$78,10,0,17,17,17,17,14,0 'LCD 7. KARAKTER HAFIZASI Ü HARFİ
    LCDOUT $FE,1
GIRIS: 
    LCDOUT $FE,$81,"OTOMAT",4,"K ",3,4,3,"EK "
    LCDOUT $FE,$C4,"SULAYICI"
    PAUSE 1500
    LCDOUT $FE,1
ZMN=0:SNY=0:KP=0
GOSUB BIPBIP

BASLANGIC:
READ $0,RYM
READ $1,PTESI
READ $2,SALI
READ $3,CARS
READ $4,PERS
READ $5,CUMA
READ $6,CTESI 
READ $7,PAZAR
READ $8,AS:IF AS>23 THEN AS=0
READ $9,AD:IF AD>59 THEN AD=0
READ $10,KS:IF KS>23 THEN KS=0
READ $11,KD:IF KD>59 THEN KD=0
read $12,KP:IF KP>1 THEN KP=0
IF SAAT>23 THEN SAAT=0
IF DAK>59 THEN DAK=0
IF SN>59 THEN SN=0
IF GUN>31 THEN GUN=1
IF AY>12 THEN AY=1
IF YIL>50 THEN YIL=1
IF HAFTA>7 THEN HAFTA=1
GOSUB ZAMAN_OKU
POZ=0               
IF AS<=SAAT AND AD<=DAK AND KP=1 THEN HIGH ROLE
ROLE=KP
BASLA:
    GOSUB EKRANAYAZ
    GOSUB ZAMAN_OKU
    GOSUB AYABAK
    
    IF RYM=1 THEN GOSUB ZAMANA_BAK
    
    IF ZMN>100 THEN
    ZMN=0:POZ=1:low ROLE
    GOSUB BIP
    GOTO AYAR_MENUSU
    ENDIF
    
    IF MENU=1 OR YUKARI=1 OR ASAGI=1 OR SET=1 THEN
    SNS=0:SNY=0
    HIGH LED
    ENDIF
    
    IF SET=0 THEN ZMN=0
    IF SNY>15 THEN LOW LED
    
     IF ROLE<>KP THEN
        IF ROLE=1 THEN KP=1
        IF ROLE=0 THEN KP=0
     WRITE $12,KP:PAUSE 1
     ENDIF
        
    IF KS=SAAT and KD=DAK THEN low ROLE
GOTO BASLA


hocam anahtar kod burası
     IF ROLE<>KP THEN
        IF ROLE=1 THEN KP=1
        IF ROLE=0 THEN KP=0
     WRITE $12,KP:PAUSE 1
     ENDIF
       

Hocam burada sadece eprooma 1 kereliğine yazma yapıyor. Röle değeri birden den sıfıra yada sıfırdan bir konumuna yükseldiği zaman  komutlar işleniyor ve kp değeri hafızaya yazlıyor. Bunun için birde başla komutundan önce röle ile kpyi eşitlemek gerekiyor. Artık röle çalışırken devrenin enerjisini kesip verdiğimde çalışmaya devam ediyor. Emin olmak için Birde buraya sayaç ekleyip baktım. Hakkattende öyle röle açıldığı zaman sayac 1 artıyor. Aynı şekilde kapandığı zaman yine 1 artıyor. Sizin yaptığınız düzenlemeleride programa ekleyince çok dah iyi olacak program.

Gece yarısı sulama işini düşünmüştüm. Ama gözümü korkutuyor. Bu yüzden hiç bulaşmak istemiyorum. En önemli olasılıkları çözdüm. okadarınıda gerek yok diye düşünüyorum. Yinede bir bakayım belki kolay bir yolu vardır.

Mucit23

hocam şu dikkatimi çekti bişey sormak istiyorum.Sizin düzenlediğiniz programda elektrik_kontrol alt programı altında "READ HAFTA,TEMP" diye bir kod var.
İlk defa böyle bir makroya rastlıyorum. Bu kodun tam olarak görevi nedir. Read komutu sadece eprromdan bilgi okumak için kullanılmıyormuydu. Yada başka bir görevimi var

ete

Hafta bir degisken ve haftanın gun numarasını tutuyor.
1.gun 1 nolu adrese kayıt edilmis. Bu komut ile icinde
bulundugun günde sulama aktif (1) mi yoksa değilmi (0)
diye bakıyorum. Bir suru if kullanacagıma o gune ait
kaydı okuyorum yalnızca. Okunan degeride Temp isimli
degiskene atıyorum.  Hepsi bu.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ete

Bu sabah programına şöyle bir bakayım dedim. Sulama başlattım ama bir türlü başlamadı.
Sonra araştırınca önemli bir hata gördüm. Hatayı detaylı anlatacağım.
DS1302 de haftanın günü aşağıdaki formatta tutulur.
1. Gün Pazar dır., 2. gün Pazartesi, 3.gün Salı , 4. Gün Çarşamba ,5.Gün Perşembe, 6 gün Cuma ve 7. Gün ise Cumartesidir.
Sen programında bazı yerlerde bu formatı esas almışsın ama bazı yerlerde ise haftanın 1. gününü Pazartesi kabul etmişsin.
Hal böyle olunca ister istemez karışıklıklar ortaya çıkıyor. Hemen gerekli düzeltmeleri yaptım va sonuçta şimdi düzgün çalışıyor.

ZAMANA_BAK isimli etiket altında sulama zamanının gelip gelmediği bir sürü if satırı ile kontrol ediliyor idi.
Hemen altına yazmış olduğum ve aslında elektrik kesilmesinde röle açık mı değilmi kontrol etsin diye yazdığımız kısm aynı amacı taşıyor ve daha az kod ile çalışıyor. Bu nedenle senin satırları iptal edip bütün işi benim yazdığım koda yükledim. Böylece program biraz daha kısalmış oldu.

Programda haftanın günlerinde sulama açıkmı değilmi şeklinde epromun 1 nolu adresi ile 7 nolu adresi arasında bir kayıt tutuluyor.
Sonuçta bu kayıtlara ait değişkenler bit bazında ve sen epromda bunları 8 bitlik değişkenmiş gibi saklayıp okuyorsun. Bu kısım hata yapmıyor ama sakıncalı. Yani Bit değişkeni bit bazında saklanmalı değilse değişken tipi byte olmalıdır.
Şimdi bit değişkenlerini nasıl bit bazında saklayacağım diyeceksin. Haftada 7 gün var. bu 7 bitlik bir sayı gibi düşünülebilir.
SULA  isimli değişkenin 1.biti Pazar, 2. biti Pazartesi , 3.biti Salı ... 7.biti ise Cumartesi bilgisini 1 yada sıfır olarak tutabilir.
Şimdi bu işin organizasyonu nasıl yapılır birazda ona değinelim.
Başlangıçta SULA isimli değişken sıfır değerine sahip olacaktır.
Pazar günü sulamayı açarsam SULA=%00000010  değerini alacaktır. Bunu yapmak için SULA.Bit0[Hafta]=1 demen yeterli.
Pazartesi Sulamayı açarsam  SULA=%00000100 değerini alacaktır (yalnızca pazartesini açtığımızı farz ediyorum). Bunu yapmanın yoluda ,
SULA.Bit0[Hafta]=1 şeklinde olacaktır. Dikkat edersen komut şeklinde bir farklılık olmadı. Kilit faktör hafta isimli değişkenin haftanın gün sayısını taşıması olacaktır.
Aynı işi SULA=SULA DCD HAFTA  komutuda yerine getirebilir.
Şimdi Bu şekilde sula isimli değişkende bu bilgileri sakladığımızı düşünelim. Epromun bir adresine SULA değişkenini yazdım ve açılışta SULA değerini aynı adresten okudum. Peki sulama açıkmı değilmi nasıl bakacağım. 
IF SULA.bit0[Hafta]=1 then Sulama açık demektir.
Ancak başka bir yolu da şöyle olabilir. Açılışta SULA isimli değişken değerini epromdan okuduktan sonra,
Sula.Bit0[1]=Pazar
Sula.Bit0[2]=PErtesi
Sula.Bit0[3]=Salı
Sula.Bit0[4]=Cars
Sula.Bit0[5]=Pers
Sula.Bit0[6]=Suma
Sula.Bit0[7]=Certesi
şeklinde eski değişkenlerine eşitleyebilirsin.

Programda bir kaç kısaltma daha yapılabilir. Bir birinin aynısı olan 2şerli 2 adet bölüm var. Bunlardan birisi Ekrana yaz etiketinde yer alan haftanın günlerine göre gün isimlerini ekrana yazan kısım ile Select Case Hafta kısmında aynı amaca yönelik kısım. Aralarındaki tek fark ekran adresi. Şayet adreslemeişini bir şekilde halledebilirsen bunları tek bir alt programa düşürebilirsin.  Aynı şekilde Ayların ekrana yazılmasıda benzer şekilde 2 alt programda yer almakta.
Adresleme şu şekilde halledilebilir.
Birinde  LCDOUT $FE,$8B,"PAZAR"  şeklinde yazan kısım diğerinde , LCDOUT $FE,$C1,"PAZAR    " . Hemen görüleceği gibi birinde $8B olan ekran adresi diğerinde $C1 şeklinde yer almaktadır.
O halde ekran adresini bir değişkene verirsem ve Ekrana yaz adresine gidince Adres=$8B  , diğerine gidince ADres=$C1 dersem sorun çözülmüş olur. Böylece her iki bölüm için tek alt program kullanımış olurum.
Benzer mantıkla Ayabak ve ayabak2 alt program altındaki kısımlarda teke düşürülebilir.

Bir diğer kısaltma da özel olarak tanımladığın check işareti ile X işaretinin adreslerini yer değiştirmek olurdu. Böylece 0 ile çalışan işaret 1 ile çalışır ve 1 ile çalışanda 0 ile çalışır duruma gelirdi. Buda sana ;
CDOUT $FE,$C0,"PAZARTESi=",(1-PTESI)," "   komutlarında  (1-PTESI) yerine direk PTESI yazma imkanı verir ve ordaki çıkarma işleminden kurtulmuş olurdun.

Hepsi Bu kadar.
Düzeltilmiş doyaları bir yere koymamı istersen koyabilirim.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Mucit23

Hocam çok teşekkürler. Ben hiç bu kadarını düşünmemiştim.Aslında ben picin eproomna veri yazarken mesela 1 btilik bir değer yazarken epromda sadece 1 bitlik yer kaplayacağını düşünmüştüm. Ama galiba kullanıcı için ayrılan eprom adresleri 1 er byte lık.
Hocam dediklerinizi dikkate alarak. ben kendim programı düzeltmeye çalışacağım. Siz bilirsiniz isterseniz verebilirsiniz. Programı incelemem hatarımı görmek için daha iyi olur. Ben program üzerinde biraz çalışayım