case ve if yapısının beraber kullanımı sorunları

Başlatan ibarrada, 01 Şubat 2017, 22:28:40

ibarrada

Herkese kolay gelsin bir otomasyon olayında birden çok if yapısı kullandım ve sistem çalışmaya başladıktan sonra restart çekti bende case döngüsüyle if yapısını beraber kullandım ama bu seferde de çok yavaş kaldı ve if yapılarındaki birden çok şartı and ile bağladığım yerlerdeki döngüler hiç çalışmadı böyle bir şey hiç başınıza geldi mi geldiyse ne tür çözümler kullandınız yazılım olarak proton ide kullanıyorum
If Otomatik=1 Then

Select Case Sayac1


Case Guncel *2
A=0 :B=1 :C=0 :D=0  'Z0 ın Seçilmesi için 4067 in  taraması (Binary Kod 2)
Case Guncel *3
GoSub TTT1   'Lm35 sıcaklık sensörü

Case Guncel *4
A=1 :B=1 :C=0 :D=0  'Z1 ın Seçilmesi için 4067 in  taraması (Binary Kod 3)
Case Guncel *5
GoSub TTT2  'Lm35 sıcaklık sensörü

Case Guncel *6
A=0 :B=0 :C=1 :D=0  'Z2 ın Seçilmesi için 4067 in  taraması (Binary Kod 4)
Case Guncel *7
GoSub TTT3  'Lm35 sıcaklık sensörü

Case Guncel *8
A=1 :B=0 :C=0 :D=1  'Z6 ın Seçilmesi için 4067 in  taraması (Binary Kod 9)
Case Guncel *9
Analog6 = ADIn 0
GoSub Su1'1. su seviyesi okuma yeri

Case Guncel *10
A=0 :B=0 :C=0 :D=1  'Z7 ın Seçilmesi için 4067 in  taraması (Binary Kod 8)
Case Guncel *11
Analog7 = ADIn 0
GoSub Su2'2. Su seviyesi okuma yeri

Case Guncel *12
A=1 :B=0 :C=1 :D=1  'Z8 ın Seçilmesi için 4067 in  taraması (Binary Kod 13)
Case Guncel *13
Analog8 = ADIn 0
GoSub Ldr11   '1.ldr okuma yeri

Case Guncel *14
A=0 :B=1 :C=1 :D=1  'Z9 ın Seçilmesi için 4067 in  taraması (Binary Kod 14)
Case Guncel *15
Analog9 = ADIn 0
GoSub Yagmur'yağmur sensörü

Case Guncel *16
A=1 :B=1 :C=1 :D=1  'Z10 ın Seçilmesi için 4067 in  taraması (Binary Kod 15)
Case Guncel *17
Analog10 = ADIn 0
GoSub Ldr22   '2.ldr okuma yeri

Case Guncel *18
A=0 :B=0 :C=0 :D=0  'Z11 ın Seçilmesi için 4067 in  taraması (Binary Kod 0)
Case Guncel *19
Analog11 = ADIn 0
GoSub Sht11Nem1'SHT 11 nem analog okuma

Case Guncel *20
A=1 :B=0 :C=0 :D=0  'Z12 ın Seçilmesi için 4067 in  taraması (Binary Kod 1)
Case Guncel *21
Analog12 = ADIn 0
GoSub Sht11isi1'SHT 11 ısı analog okuma

Case Guncel *22
If Ldr1=1 And Ldr2=1 Then GoSub MainLed1

Case Guncel *24
If Ldr1=1 And Ldr2=1 Then GoSub MainLed2

Case Guncel *26
If Ldr1=1 And Ldr2=1 Then GoSub MainLed3

Case Guncel *28
If Ldr1=0 And Ldr2=1 Then GoSub Mainc2

Case Guncel *30
If Ldr1=1 And Ldr2=0 Then GoSub Mainc2

Case Guncel *32
If Ldr1=0 And Ldr2=0 Then GoSub Mainc2

Case Guncel *34
If Su11=1 Then OtoHata=1
'EndIf

Case Guncel *36
If Su22=1 Then OtoHata=1
'EndIf

Case Guncel *38
If Su11=0 Then OtoHata=0
'EndIf

Case Guncel *40
If Su22=0 Then OtoHata=0
'EndIf

Case Guncel *42
If OtoHata=1 Then GoSub Hataa
'EndIf


Case Guncel *44
If OtoHata=0 And Su=0 And Sicaklik2>=Gsicaklik And Nem1<=Gnem Then GoSub Mainb1'eger sıcaklık yüksek ve nem düşük ise
'ısıtma rezistansı ve pompası kapalı, fan açık, çatı açık, fan servo açık, sulama açık


Case Guncel *46
If OtoHata=0 And Su=0 And Sicaklik2>=Gsicaklik And Nem1<Gnem And Gnem>Nem2 Then GoSub Maina1'eger sıcaklık yüksek ve nem normal ise
'ısıtma rezistansı ve pompası kapalı, fan açık, çatı açık, fan servo açık


Case Guncel *48 
If OtoHata=0 And Su=0 And Sicaklik2>=Gsicaklik And Nem2>=Gnem Then GoSub Maina1'eger sıcaklık yüksek ve nem yüksek ise
'ısıtma rezistansı ve pompası kapalı, fan açık, çatı açık, fan servo açık


Case Guncel *50
If OtoHata=0 And Su=0 And Sicaklik1<Gsicaklik And Gsicaklik<Sicaklik2 And Nem1<=Gnem Then GoSub Mainb2 'eger sıcaklık normal ve nem düşük ise
'ısıtma rezistansı ve pompası kapalı, fan kapalı, çatı kapalı, fan servo kapalı sulama açık


Case Guncel *52 
If OtoHata=0 And Su=0 And Sicaklik1<Gsicaklik And Gsicaklik<Sicaklik2 And Nem1<Gnem And Gnem>Nem2 Then GoSub Maina2 'eger sıcaklık normal ve nem de normal ise
'ısıtma rezistansı ve pompası kapalı, fan kapalı, çatı kapalı, fan servo kapalı


Case Guncel *54
If OtoHata=0 And Su=0 And Sicaklik1<Gsicaklik And Gsicaklik<Sicaklik2 And Nem2>Gnem Then GoSub Maina1' eger sıcaklık normal ve nem yüksek ise ise
'ısıtma rezistansı ve pompası kapalı, fan açık, çatı açık, fan servo açık


Case Guncel *56
If OtoHata=0 And Su=0 And Gsicaklik<=Sicaklik1 And Nem1<=Gnem Then GoSub Mainb3'eger sıcaklık düşük ve nem düşük ise
'ısıtma rezistansı ve pompası açık, fan kapalı, çatı kapalı, fan servo kapalı, sulama açık


Case Guncel *58
If OtoHata=0 And Su=0 And Gsicaklik<=Sicaklik1 And Nem1<Gnem And Gnem>Nem2 Then GoSub Maina3'eger sıcaklık düşük ve nem normal ise
'ısıtma rezistansı ve pompası açık, fan kapalı, çatı kapalı, fan servo kapalı


Case Guncel *60
If OtoHata=0 And Su=0 And Gsicaklik<=Sicaklik1 And Nem2>Gnem Then GoSub Maina4'eger sıcaklık düşük ve nem yüksek ise
'ısıtma rezistansı ve pompası açık, fan kapalı, çatı açık, fan servo kapalı


Case Guncel *62
If OtoHata=0 And Su=1 And Sicaklik2>=Gsicaklik And Nem1<=Gnem Then GoSub Mainb2'eger sıcaklık yüksek ve nem düşük ise
'ısıtma rezistansı ve pompası kapalı, fan kapalı, çatı kapalı, fan servo kapalı, sulama açık


Case Guncel *64
If OtoHata=0 And Su=1 And Sicaklik2>=Gsicaklik And Nem1<Gnem And Gnem>Nem2 Then GoSub Maina2 'eger sıcaklık yüksek ve nem normal ise
'ısıtma rezistansı ve pompası kapalı, fan kapalı, çatı kapalı, fan servo kapalı


Case Guncel *66
If OtoHata=0 And Su=1 And Sicaklik2>=Gsicaklik And Nem2>=Gnem Then GoSub Maina2 'eger sıcaklık yüksek ve nem yüksek ise
'ısıtma rezistansı ve pompası kapalı, fan kapalı, çatı kapalı, fan servo kapalı

Case Guncel *68
If OtoHata=0 And Su=1 And Sicaklik1<Gsicaklik And Gsicaklik<Sicaklik2 And Nem1<=Gnem Then GoSub Mainb2'eger sıcaklık normal ve nem düşük ise
'ısıtma rezistansı ve pompası kapalı, fan kapalı, çatı kapalı, fan servo kapalı, sulama açık

 
Case Guncel *70
If OtoHata=0 And Su=1 And Sicaklik1<Gsicaklik And Gsicaklik<Sicaklik2 And Nem1<=Gnem And Analog13>150 Then GoSub Mainb1 'eger sıcaklık normal Nem düşük ve gaz sensörü yüksek ise
'ısıtma rezistansı ve pompası kapalı, fan açık, çatı açık, fan servo açık sulama açık


Case Guncel *72
If OtoHata=0 And Su=1 And Sicaklik1<Gsicaklik And Gsicaklik<Sicaklik2 And Nem1<Gnem And Gnem>Nem2 Then GoSub Maina2 'eger sıcaklık normal ve nem de normal ise
'ısıtma rezistansı ve pompası kapalı, fan kapalı, çatı kapalı, fan servo kapalı


Case Guncel *74
If OtoHata=0 And Su=1 And Sicaklik1<Gsicaklik And Gsicaklik<Sicaklik2 And Nem1<Gnem And Gnem>Nem2 And Analog13>150 Then GoSub Maina1 'eger sıcaklık normal Nem normal ve gaz sensörü yüksek ise
'ısıtma rezistansı ve pompası kapalı, fan açık, çatı açık, fan servo açık


Case Guncel *76
If OtoHata=0 And Su=1 And Sicaklik1<Gsicaklik And Gsicaklik<Sicaklik2 And Nem2>Gnem Then GoSub Maina2 ' eger sıcaklık normal ve nem yüksek ise
'ısıtma rezistansı ve pompası kapalı, fan kapalı, çatı kapalı, fan servo kapalı


Case Guncel *78
If OtoHata=0 And Su=1 And Gsicaklik<=Sicaklik1 And Nem1<=Gnem Then GoSub Mainb3 'eger sıcaklık düşük ve nem düşük ise
'ısıtma rezistansı ve pompası açık, fan kapalı, çatı kapalı, fan servo kapalı


Case Guncel *80
If OtoHata=0 And Su=1 And Gsicaklik<=Sicaklik1 And Nem1<=Gnem And Analog13>150 Then GoSub Mainb5'eger sıcaklık düşük, nem düşük ve Gaz sensörü Yüksek ise
'ısıtma rezistansı ve pompası açık, fan açık, çatı açık, fan servo açık, sulama açık


Case Guncel *82
If OtoHata=0 And Su=1 And Gsicaklik<=Sicaklik1 And Nem1<Gnem And Gnem>Nem2 Then GoSub Maina3 'eger sıcaklık düşük ve nem normal ise
'ısıtma rezistansı ve pompası açık, fan kapalı, çatı kapalı, fan servo kapalı

Case Guncel *84
If OtoHata=0 And Su=1 And Gsicaklik<=Sicaklik1 And Nem1<Gnem And Gnem>Nem2 And Analog13>150 Then GoSub Maina5'eger sıcaklık düşük, nem normal ve Gaz sensörü Yüksek ise
'ısıtma rezistansı ve pompası açık, fan açık, çatı açık, fan servo açık

Case Guncel *86
If OtoHata=0 And Su=1 And Gsicaklik<=Sicaklik1 And Nem2>Gnem Then GoSub Maina4 'eger sıcaklık düşük ve nem yüksek ise
'ısıtma rezistansı ve pompası açık, fan kapalı, çatı açık, fan servo kapalı

Case Guncel *88
If OtoHata=0 And Su=1 And Gsicaklik<=Sicaklik1 And Nem2>Gnem And Analog13>150 Then GoSub Maina5 'eger sıcaklık düşük, nem yüksek ise ve Gaz sensörü Yüksek ise
'ısıtma rezistansı ve pompası açık, fan açık, çatı açık, fan servo açık

Case Guncel *90
If CatiKilit=1 Then GoSub MainServo1

Case Guncel *92
If FanKilit=1 Then GoSub MainServo2


Case Guncel *94
If Sukilit=0 Then GoSub MainSaat1

Case Guncel *96
If Sukilit=1 Then GoSub MainSaat2

Case Guncel *98
If OtoSuKilit1=1 Then GoSub MainSaat3


Case Guncel *100
If OtoSuKilit=1 Then GoSub MainSaat4

'Case Guncel *102
'GoSub Saatbas

Sayac1=0
End Select
EndIf 'otomatik seçimin endifi

ete

Restart çekilmesi stack taşmasından yada WDT açık ise ondan kaynaklanır. Genelde GOSUB ile gidilen yerden bir şekilde GOTO ile dönüldüğü durumlarda stack taşması kaçınılmaz oluyor.
Sende stack taşması bu sebepten oluyor ise Select Case komutunu kullansanda stack taşması yine olacaktır.
Program parçasına baktım. Tabiiki programın tamamını vermediğin için taşma oluşturabilecek sebep varmı yokmu bakamıyorum. Ona sen bakacaksın bu durumda. Ama senin bahsettiğin sorun  Case seçimlerinin bir hesap sonucunda bulunuyor olmasıdır.
Bu mantıkla Case komutu sağlıklı çalışamaz. Çünki doğru işlem yapmak için bütün o hesapları yapmak zorunda buda anlamsız şekilde programın yavaşlamasına sebep olur. Bunu önlemenin tek yolu, case güncel * x  komutunu case 123 gibi sabit bir rakama dönüştürmektir. Şayet Güncel değişkeni sürekli değişiyor ise bunu yapmak mümkün olmayacaktır.
Bu durumda tavsiyem yeniden IF sistemine dönmeniz.

Aklıma geldi , kullandığınız işlemcide stack için ardışık gosub adedi yaklaşık bellidir. Genel kaide ardışık gosub adedinin 5-6 adetten fazla olmaması şeklindedir ama bu stack kapasitesi ile yakından alakalıdır.
İşlemciniz ne ise ona ait data sheete bakarak aşağı yukarı oradan anlayabilirsiniz.
Demekki stack taşması ve ona bağlı reset yaşamamak için bir kaç şeye deikkat etmek gerekiyormuş diyebiliriz.
Birincisi Gosub ile gidilen yerden kesinlikle RETURN ile dönmeniz gerekir. Herhangi bir şekilde GOTO ile bir başka yere geçip oradan başka bir goto ile geldiğiniz yere dönerseniz taşma olur.
Ard arda GOSUB komutunu kullanmamaya dikkat edin. Bunu sayısı an fazla 5 adet olsun. Fazlası taşma yaratabilir.

Belki sebebi nedir acaba diye düşünebilirsiniz. Stack kullanıcının ulaşamadığı bir ara hafıza birimidir. Sayısı diyelimki 10 birimlik bir hafıza bu. İlk Gosub komutunu verdiğinizde programın ayrıldığı adres Stack-1 nolu hafızaya kayıt edilir. Birinciden dönmeden ikinci bir Gosub komutu daha verilirse ikinci adres Stack-2 ye kayıt edilir. Bu durumda il Return komutu görüldüğünde Stack-2 den adres alınıp program 2ci gosub un olduğu yere dönüş yapar ve stack gösterici yeniden 2 yi gösterir.
Ama diyelimki ilk defa bir GOSUB kullandınız Stack-1 de ilk adres yer alır. Stack gösterici 2 yi gösteriyor olur. Diyelimki oradan Goto ile döndünüz ve program dönüp dolaşıp yeniden ilk Gosub komutunun olduğu yere geldi ve yeniden bir Gosub gördüğü için Bu sefer aynı adres Stack-2 ye kayıt edilir. Hep Goto ile geri dönerseniz sonunda bütün stack adresleri dolar ve kayıt edilecek yer kalmayınca işlemci taşma bitini set eder ve sistemde hemen reset rutinine gider. Olay budur.
Stack'e bir adres kayıt edildiği zaman onu silecek işlem RETURN komutunun görülmesidir. Buna dikkat edilirse taşma olmaz.

Ete



ibarrada

#2
işlemci olarak 18F4520 kullanıyorum alt yapılarda da if döngüsünü kullandım ama bundan dolayı galiba program şişmiş olabilir ben makine mühendisliğinde yüksek lisans yapıyorum ve bu yazılımıda tezim için yazıyorum alt yapım olmadığı için stack olayını ilk defa duyuyorum ve görmeden de öğrenilmiyor bazı şeyler programın tamanını buradan atıyorum mantığım ile doğrular bu sefer çakışmıyor galiba güncel kelimesi bir sayı olup onu bir rakamla çarparak case döngüsü oluşturmak istedim case aralığı 1 ile başlayıp 2 3 diye devam edersem sistemde donmalar oluyor diye birazda deneme yanılma yöntemiyle güncek kelimesini 250 yaparak bu kelime sayısıyla oynama olanağı buldum


EDIT(ete) : program çok uzun file olarak eklemek daha uygun olacak.

ete

Prograda fazla bir GOSUB bırakmamışsın şu hali ile sorun gözükmüyor. Ama asıl sorun Kesme içinde,
If ZZ=101 And V=2 And T=15 And H=0 And PP=255 And SS=255 And CC=255 Then
EWrite 1, [Gsicaklik]
EWrite 3, [Gnem]
EWrite 5, [Gdakika]
EWrite 7, [Gsutur]
EWrite 9, [Gsaat]
EWrite 11, [Ggunsutur]
EWrite 13, [Gsaniye]
EWrite 15, [Gsudongu]
Gsicaklik= ERead 1
Gnem= ERead 3
Gdakika= ERead 5
Gsutur= ERead 7
Gsaat= ERead 9
Ggunsutur= ERead 11
Gsaniye= ERead 13
Gsudongu= ERead 15
'HSerOut  [0xff, 0xff, 0xff,"page2.n0.val=",Dec Gsicaklik]
'HSerOut  [0xff, 0xff, 0xff,"page2.n1.val=",Dec Gnem]
'HSerOut  [0xff, 0xff, 0xff,"page2.n2.val=",Dec Gdakika]
'HSerOut  [0xff, 0xff, 0xff,"page2.n3.val=",Dec Gsutur]
'HSerOut  [0xff, 0xff, 0xff,"page2.n10.val=",Dec Gsaat]
'HSerOut  [0xff, 0xff, 0xff,"page2.n11.val=",Dec Ggunsutur]
'HSerOut  [0xff, 0xff, 0xff,"page2.n12.val=",Dec Gsaniye]
'HSerOut  [0xff, 0xff, 0xff,"page2.n13.val=",Dec Gsudongu]

Manuel=0
Parametre=0
Ssaat=0
DelayMS 50
Otomatik=1
Role8 = 1
GoTo Main'*****************burası sorunlu yer****************************
EndIf

Kesmeye girmiş bir programı GOTO MAIN diyerek oradan çıkaramazsın. Bu da stack taşması yaratabilir.
Ayrıca ,
yine kesme içinde,
GoSub Saatbas
şeklinde bir komut var ki buda kesme dışında bir alt programa GOSUB ile gitmeye çalışıyorsun ki buda büyük hata.
Bu  komutuda oradan silmen gerekir.

Ayrıca Kesme alt programı çok özel bir yerdir. Program buraya girerken bütün registerlerini bir yere kayıt eder (Context SAVE)
Bu bölümde iken kesme dışına goto ile giderseniz o registerler geri okunmadan gitmiş olursunuz buda programın kilitlenme yada donma sebebidir. Yine benzer şekilde kesme dışına Gosub ile giderseniz registerlerin değerleri değişmiş olur ki buda programda donma yaratabilir.
Bu bölümden en kısa zamanda çıkılması esastır. Bütün gecikmelerin o kısımdan kaldırılması gerekir. Zaten çok yüklü (çok satırlı) bir kesme alt programınız var bu da sorunlara sebep olabilir.

Bana kalırsa asıl sorunlarınız yukarıda açıkladığım iki olumsuz komut satırıdır.

Ete

ibarrada

gosub ve goto main leri kaldırıp deneyeceğim kesmede çok satır olması sistemi kastırmadı dokunmatik bir ekran kullandığımdan girdi olarak girdiğim seyler yada buton bilgilerini interrupt ile sağlamaya çalıştım ve kesme sorunsuz bir şekilde geri dönüş verdi go to main satırını sabah eklemiştim otomatik döngüsü çalışmıyor diye onu koyunda if otomatik=1 then ve devamında case ve if döngülerinin olduğu satırda analog okumalar gerçekleştirebildim ama sonra sistem yine dondu

ibarrada

hocam ilgilendiğiniz için teşekkür ediyorum aşağıdaki yazılımda go to main olayını ve gosub saatbas olaylarını kaldırdım saatbas olayında bir takılma bi gariplik oluyordu evet ama ben bu olayı düzelince anlamış oldum

'HAFIZAYA ALMA GİRDİSİ PAGE 2 KAYDET BUTONU
If ZZ=101 And V=2 And T=15 And H=0 And PP=255 And SS=255 And CC=255 Then
EWrite 1, [Gsicaklik]
EWrite 3, [Gnem]
EWrite 5, [Gdakika]
EWrite 7, [Gsutur]
EWrite 9, [Gsaat]
EWrite 11, [Ggunsutur]
EWrite 13, [Gsaniye]
EWrite 15, [Gsudongu]
Gsicaklik= ERead 1
Gnem= ERead 3
Gdakika= ERead 5
Gsutur= ERead 7
Gsaat= ERead 9
Ggunsutur= ERead 11
Gsaniye= ERead 13
Gsudongu= ERead 15

Manuel=0
Parametre=0
Ssaat=0
DelayMS 50
Otomatik=1
Role8 = 1
EndIF

burada go to main komutunu kaldırdım ve sistem çalışıyor mu diye röle8 komutundan led yaktırdım bu buton konbinasyonu ledi yakarak çalışıyor olduğunu gösterdi bu butonda okumaları ve yazmaları yapım kaydet butonuna bastığım zaman otomatik=1 olup otomatik döngüsüne girmesi gerekiyor ama sistemi çalıştıramadım. main ve go to main aralığında benim 4 adet if değerim var manuel=1 ise saat=1 ise parametre=1 ise ve otomatik=1 ise diye devam eden yazılımlar burada diğer 3 sorunsuz ve hızlı çalışıyor ama otomatik=1 then ve devamından gelen case ve if yapıları sıkıntılı aklıma 2 soru takılıyor 1.si benim yazım düşüncem doğru mu ben sisteme bu kadar isi yaptırabilirmiyim. 2. si yaptırabilirsen if ve case döngülerini nasıl azaltabilirim yada bu iş için başka bir yolu varmı

ete

İyi programda Kesme kısmında yalnızca kesmeyi ilgilendiren işler yapılır . Bir takım gelen veriye göre işlem yapman gerektiğinde Flag (Bayrak) kullanılır ve bir bayrak set edilerek ana programda o bayrak set edilmiş ise o yapacağın işleri ana programda yaptırırsın.
Senin kesme rutinindeki işlerin %90'ı flag kullanarak halledilebilir böylece programında daha randımanlı çalışır buna eminim.

Sorularına cevap verebilmem için Programın senaryosunu bilmem gerekir. Başka türlü cevap verebilmem mümkün değil. Ama bukadar çok şarta ve konuma göre değişik işlerin yapıldığı bir program ilk defa görüyorum. Böyle olmamalı diyede düşünüyorum. Sonuçta bu bir sera kontrolu anladığım kadarı ile . Nedir önemli olan ısı, nem ve bir iki parametre daha . Gerisi fantazi dir. Elbette bir sürü farklı işler yaptırabilirsin ama bu kadar şart komutuna gerek olmadığı kanaatindeyim. Kesin fikir dediğim gibi işin senaryosunu bilirsem ortaya koyabilirim.
Senaryoyu da vermek istersen verirsin gerekirse özel mesaj at. Vermek istemez sen de kısmi sorular sorarak zorlandığın yerleri aşmaya çalış. Bizde elimizden geldiğince yardımcı olalım.

Ete

ibarrada

Kesme olaylarını flag kullanarak kesme rutinini boşalttım ve ana rutin üzetinden işimi hallettim ete hocamın dediği gibi sistemde bir hızlanma oldu. Sistemimde otomatik bölümünde 3 adet lm35 ısı sensörü bu 3ünu toplayım 3 e bölerek ortak bir ortam sıcaklığı çıkarıyorum. sht11 den gelen bir nem bilgisi var mq135 hava kalite gaz sensöründen gelen bir değer var yağmur sensörüm var bunların beraberinde okunması ve çalışmasıyla otomatik bölümdeki case li if döngüsünü oluşturdum ve bunların haricinde ldr ile ışıkları yakıp sondürüyorum. şu anda sorunun sistemim bütün döngüleri yapıyor olması ama otomatik döngüsüne girdiğim zaman sistemin ilk döngüyü yapmaya başladıktan sonra donması ve hiç bir geri dönüş alamamam stack taşması olabilir mi?  İf yapılarında en fazla 3 gosub kullandım ve gittiğim her bir yerdende return ile bitirdim.

If Sicaklik-2<Gsicaklik And Gsicaklik<Sicaklik+2 Then SicakBak=2

If Nem-5<Gnem And Gnem<Nem+5 Then NemBak=2

diye 2 if yapısı kullandım. Burada sıcaklık ve ya nem belli bir aralıkta ise sistemin o yönde çalıştırılmasını istedim ama bu tabir sistemi yavaşlatıyor yada yoruyor gibi geldi bana ama sorun başka bir yerde de olabilir.

bu 2 if yapısını inaktif yaptım ve sistem hızlandı ama case döngüsü daha uzun bir süre sonunda tekrardan dondu.

ete

Bana hala çorba gibi geliyor bu program kim ne yapıyor anlamak çok güç. Takip ise imkansız.
biraz bakayım dedim ama işin içinden çıkmak gerekten zor bence.

SHT sensörlerin analog olarak okunduğunu ilk defa burada görüyorum. Başka bir sensörmüdür bu?. SHT digital sensördür ve yarı I2C mantığı ile haberleşilir.

Bence bu program yeniden yazılmalı yada mevcut halini yapabildiğin kadar iyileştirmelisin.
Ben olsam programı bölümlere ayırırdım.
Aynı rutin içinde hem otomatik çalışma hem manuel çalışmayı koymazdım. En azından incelemeyi kolay hale getirmek gerekir. Projeyi ne kadar parçaya bölersen o kadar hakim olursun. Programa şu anda hakim olabildiğini sanmıyorum. Olsan zaten hatalar ortaya çıkmazdı. Bu hali ile hakim olmakda zor zaten.
Yine Kesme içinde bir sürü iş yapılıyor. Kesme oluştuğu zaman ALDIM=1 diye bir bit değişkenini set etsen sonra ana program içinde IF ALDIM=1  then deyip orada yapılanları uygulasan daha iyi olurdu.
Otomatik manuel seçim mutlaka fiziki anahtarla yapılmalı ve programınbaşında program bu anahtara bakarak en azında yapacağı işleri yarıya düşürmelidir. Senin programda her döngüde bütün alternatifler işleniyor maalesef.
Daha başka bölünme mümkünse onlarıda en azından alt program olarak ayırmak en doğrusu olur.

Dikkatimi çeken bir önemli kusur var. Değişken adları ile etiket adları aynı olan bir sürü yer var. Normalde derleyici buna itiraz etmesi gerekir. Yani hata vermesi gerekir. Mesela Ggsaniye1 diye bir değişkenin var aynı şekilde GgSaniye1 diy ebirde altprogram etiketin var. Bu şekilde olmaz. En azında birinden birine bir fark eklemen gerekirdi. Bence onları düzelt.

Ete


ibarrada

Program biraz karışık daha doğrusu ben baya bir karıştırdım. düzenleyeceğim. sht11 de okumayı ayrı bir pic üzerinden yapıyorum oradan çıkış olarak analog bir değer alıp 18f4520de okuyorum. sht kablo uzaklığı 3 metre civarı olduğu için böyle bir çözüm buldum.
Bir programda bölümlere ayırmak demişsiniz ana rutinde birden çok main goto main kullanabilirmiyim yani Main Goto Main ve Main2 Goto Main2 diye. Fiziki anahtarı dokunmatik ekrandan kesme rutiniyle yapıyorum kesmenin en başındaki ilk 3 tane olan if yapıları benim buton gereksinimi karşılıyor. buralarda manuel=1 ise otomatik=0 ve parametre=0 diye yada diğeri 1 olunda diğerlerini sıfırlamak için kullandım.

Powered by EzPortal