birden fazla değişkenle farklı 2 süre için algoritma oluşturmaya yardım !

Başlatan sinasos, 10 Eylül 2018, 21:58:08

sinasos

İyi akşamlar arkadaşlar,
bir yazılım hazırlamaya çalışırken takıldığım bir nokta oldu. Bir türlü algoritmayı oluşturamadım. yardım edebilirseniz sevinirim. ancak bu sistemde işlemci hafızası çok dolu olduğu için kesme kullanmak istemiyorum. işlemci 16F877A
3 butonumuz var, birinci butona basınca değer1 kadar çalışacak, sonra değer2 kadar bekleyecek, bu sırada işlem yapılırken 2. veya 3.butona basılınca da aynı şeyler geçerli olacak. 3 adet farklı sayıcı kullanabiliriz. gerçek zaman önemli değil örneğin deger1' i saniye deger2'yi dakika olarak düşünürsek 1.butona basınca ilgili kısım 15 saniye çalışacak 5 dakika bekleyecek. işlem bitince buton hala basılı ise yine aynı işlemi yapacak. bu işlem yaparken 2. butona basılırsa bu da aynısını yapacak, tabiki 3. butonda da. butonlar push-buton türünde !

'*************************************************
x1 var bit
x2 var bit
x3 var bit
y1 var bit
y2 var bit
y3 var bit
sn1  var byte
sn2  var byte
sn3  var byte
dk1  var byte
dk2  var byte
dk3  var byte

SYMBOL kirmiziLed =PORTE.0
SYMBOL yesilLed   =PORTE.1
SYMBOL maviLed    =PORTE.2
SYMBOL buton1     =PORTA.0
SYMBOL buton2     =PORTA.1
SYMBOL buton3     =PORTA.2

deger1=15
deger2=5
sn1=0:sn2=0:sn3=0:dk1=0:dk2=0:dk3=0

basla:
if buton1=1 then gosub calis1
if buton2=1 then gosub calis2
if buton3=1 then gosub calis3
gosub sayici
goto basla

calis1:
if x1=0 and sn1=>deger1 then
y1=1:kirmiziLed=1
else
y1=0:kirmiziLed=0:sn1=0:dk1=0:gosub bekle1
endif
return

calis2:
if x2=0 and sn2=>deger1 then
y2=1:yesilLed=1
else
y2=0:yesilLed=0:sn2=0:dk2=0:gosub bekle2
endif
return

calis3:
if x3=0 and sn3=>deger1 then
y3=1:maviLed=1
else
y3=0:maviLed=0:sn3=0:dk3=0:gosub bekle3
endif
return

bekle1:
if y1=1 and dk1=>deger2 then
x1=1
else
x1=0
endif
return

bekle2:
if y2=1 and dk2=>deger2 then
x2=1
else
x2=0
endif
return

bekle3:
if y3=1 and dk3=>deger2 then
x3=1
else
x3=0
endif
return

sayici:
sn1=sn1+1
sn2=sn2+1
sn3=sn3+1
pause 10
if sn1=200 then dk1=dk1+1
if sn2=200 then dk2=dk2+1
if sn3=200 then dk3=dk3+1
if sn1=210 then sn1=0
if sn2=210 then sn2=0
if sn3=210 then sn3=0
if dk1=6 then dk1=0
return


elektro77

Sorular:
ne yapmaya çalışıyorsunuz.kuluçka makinası falanmı
1-neden push pull cinsi buton kullanıyorsunuz.
2- yazılımda önemli olan kısın 1 . işlemi yaparken işlem bittiğinde buton hala basılı ise aynı işlemi yaptırmakmı
3-1.işlemi yaparken 2. veya 3. buton basılırsa ve 1.buton basılı değil kuralı geçerli olursamı 2. veya 3. işlemi yapacak.
yapamadığınız noktayı net şekilde açıklar ve simulasyonuda buraya koyarsan bi bakarız.
"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"

sinasos

merhaba elektro77, öncelikle ilginize teşekkür ederim. Hayır kuluçka makinası yapmıyorum! sera nem kontrol sistemi yapıyorum. bunu basitçe anlatabilmek için buton ve ledlerle örnek verdim.
buton diye bahsettiğim sensor DHT22, 3 farklı alanı kontrol edecek. buralardaki nem durumuna göre ilgili alanın  rölesini çekecek ve bırakacak. aynı anda farklı alandaki sensörlerin işlemlerini de aynı mantıkla yapabilecek. Amacım basit bir algoritma oluşturabilmektir. Sizlerden bu sebeple yardım rica ettim.
Saygılarımla. Teşekkürler.

ete

Bu şekilde programlar 3 bölümden oluşur.
1. Tuşlardan birine basılmanın beklendiği standby bölümü ki burada yalnızca tuşa basılıp basılmadığı kontrol edilir.
2. Bu bölümde senin 15 sn dediğin birinci süre kadar bekleme rutini, yer alır.  15 sn de az bir azam değildir aslında bu esnada diğer butonlara basılırsa ne olacağını belirtmemişsin.
3. Son bölüm ise uzun bekleme bölümüdür. Bu bölümde hem zaman tutulacak hemde butonlara basılıyormu ona bakılacak.

Aslında zor değil ama işin akışını elbette en iyi sen biliyorsun ve burada bazı kritik noktaları belirtmemiş olabilirsin.

Zaman daima saniye bazında TMR1 sayacı kullanılarak tutulabilir. Her bir dilim 500 ms olabilir ve bekleme süresi saniyeye çevrilerek bunun 2 katı alınıp bu sayaç kısmında zaman sayılabilir.
Örnek vermek gerekirse 15 sn için 30 kesme sayılarak 15 sn lik sürenin dolduğu anlaşılacaktır. Kesme sayılacak derken gerçek anlamda kesme kullanmayacağız. Sadece TMR1 sayacını 500 ms lik bir süre iin kuracağız ve süre bitiminde TMR1 sayacı kesme bayrağının 1 olması bize 500 ms nin geçtiğini belirleyecek. Bunun için örnek vereyim,
 KES=30 '15 snlik süre için KES değerini 30 aldık
       T1CON=%00110001      'bölme oranı 1/8 ve timer1 aktif edildi
             
DELAY_BIR:
             PIR1.0=0 :TMR1H=$0B:TMR1L=$DC     'timer'a ön yükleme değeri verdik  'her kesme 500ms süre alıyor. 
           while PIR1.0=0
'bu araya diğer butonlara basılmışmı onun kontrol edecek kod yazılabilir.
           WEND 'KESME OLUŞUNCAYA KADAR BEKLE
           PIR1.0=0       
           KES=KES+1:IF KES>0 THEN DELAY_BIR
' Program bu satıra geldiğinde 15 sn geçmiş olacaktır.
           RETURN
         

Dikkat edilirse global kesmeleri aktif etmedim ama kesme bayrağını kontrol ederek işimi halledebildim.
İkinci ve uzun bekleme kısmında KES değişkenine yine 500 ms lik dilimlerden kaçtane sayılacağı yerleştirilmelidir.
5 dakika=5 x60=300 sn eder. BUnun 2 kati ise 600 edecektir O halde KES=600 değeri verilerek 5 dakikalık süre benzer şekilde sayılabilir. Tabiiki KES değişkeni WORD tipinde olmalıdır.

Ete

sinasos

Ete hocam çok teşekkür ederim. Bu arada size kesme hakkında bir soru yöneltmek istiyorum. örneğin 16f877A'nın 8 kb hafızası var. ben gerçek anlamda kesme oluşturduğumda 1,5-2 kb civarında bir alan kullandığını fark ettim. bunun sebebini öğrenmek istiyorum. acaba ben mi hatalı bir şeyler yapıyorum yoksa gerçek anlamda bu şekilde midir? Sizin yaptığınız kesme ile gerçek anlamda kesme arasında ne fark vardır ?
Şimdiden çok teşekkür ederim.
Saygılarımla.

ete

Kesme işlemci için ekstra biz özellik. Aktif edince ne kadar hafıza harcıyor doğrusu hiç ölçmedim.
Programa bir kaç komut ilave etmek yada çıkarmakla aynı şeydir.
Kesmelerden iki şekilde yararlanıyoruz.
Birisinde Global kesmeleri ve kullanacağımız kesme kaynağını aktive ederek oluşan kesmede programın KESME alt programına yönlendirilmesini sağlayarak kontrol sağlıyoruz.
Benim kullandığımda ise kesme alt programı yok. Sadece zaman tutmak açısından kesme bayrağını kontrol ederek zamanı kontrol ediyorum. Şunu unutmayın, kesmeler aktif olsun yada olmasın kesme kaynakları uygun ortam oluştuğunda daima kesme bayrağını set der. Bende bu özelliği kullanıyorum sadece.

Ete

Powered by EzPortal