zamanlama ile ilgili yardım istiyorum

Başlatan izci, 13 Haziran 2015, 02:44:25

izci

merhaba sitede yeniyim kendi çapımda birşeyler yapmaya ve öğrenmeye çalışıyorum fakat bir noktada tıkandım.

say:
if sayici=0 then
while  sayici=0
wend
sayma=sayma+1
PAUSE 100
endif

if sayma=35 then  sayitamam
goto say


şeklinde kod kullanıyorum optik  sensörden pals alarak saydırma yapıyorum buraya kadar sorun yok  fakat istiyorum ki  10 saniye içinde optik sensör yeterli  sayıda  pals gönderemezse farklı bir etikete dallanabileyim bunun için timer kullanmam gerektiğini düşündüm ama düşünceden ötesine geçemedim anladığım kadarı ile  timer donanımsal olarak tetiklenmesi gerekiyor yada konuya bir anda dalınca anlayamadım. sizlerden bu konuda fikir ve yardım bekliyorum

ete

BU iş iki türlü yapılabiilir. Birinde sayıcı kullanmadan;

say:
zaman=0
While zaman<10000
  if sayici=0 then
     while  sayici=0:wend
    sayma=sayma+1
  endif
  zaman=zaman+1
  Pause 1
wend
IF SAYMA<YETERLI THEN FARKLI_ETIKET
if sayma=35 then  sayitamam
goto say


İkinci şekilde TMR1 kullanılarak zaman tutulabilir. 4Mhz Kristal ile TMR1 sayacı her 500 ms de bir kesme yaratacak şekilde kurulabilir. Bunun için , T1CON=%00110001 verilip Kesme bayrağı olan PIR1.0=0 şeklinde sıfırlanmalı
Daha sonra 10 sn için bu zaman döngüsü 20 defa çalıştırılmalıdır.
Şöyle;

SAY:
T1CON=%00110001:SAYMA=0:ZAMAN=0
SAY_BIR:
PIR1.0=0:TMR1H=$0B:TMR1L=$DC
WHILE PIR1.0=0
  IF SAYICI=0 THEN
    WHILE SAYICI=0:WEND
    SAYMA=SAYMA+1
  ENDIF
WEND
ZAMAN=ZAMAN+1:IF ZAMAN<20 THEN SAY_BIR
IF SAYMA<YETERLI THEN FARKLI_ETIKET
if sayma=35 then  sayitamam
goto say


Ete

izci

hocam YETERLI etiket mi değişken mi anlayamadım?

BİDİL

Alıntı Yapyeterli  sayıda  pals gönderemezse farklı bir etikete dallanabileyim

YETERLİ değişken, FARKLI_ETIKET etiket.

izci

tamam değişkende nerde neye göre değer ataması yapacağımı anlamadım

BİDİL

Optik sensörden 10sn içinde ne kadar puls almayı hedefliyorsun? örneğin 100, öyle ise YETERLİ adında byte cinsinden bir değişken tanımlarsın( YETERLİ VAR  BYTE).Daha sonra SAYMA adındaki byte değişkeni ile karşılaştırırsın.
IF SAYMA<YETERLI THEN FARKLI_ETIKET (sayma değişkeni küçükse yeterli değişkenşinden FARKLI_ETIKET'e git)

BİDİL

Umarım ETE hocanın verdiği kodlarla başlangıç yapmadın zira kendisi programında çözüm olacak yerleri paylaşmış. Yani pic'in giriş çıkış ayarlarını değişken tanımlamalarını vs. yapılmış varsayarak fikir vermek için yukarıdaki kodları yazmıştır. Yazılımında ne durumdasın? paylaşırsan daha sıhhatli olur kanaatindeyim.

izci

kardeşim sayma adında bir değişken zaten gelen palsleri sayıyor hemen alt satırdaki if sorgusunda,  kafamı kurcalayan o kısım oldu .
ete hocamın dersleri ile başladım benim yazdığım kısım zaten çalışır durumda sadece güvenlik önlemi bazında optik okuyucun kaçırması yada arıza yapması durumuna karşılık önlem almaya çalışıyorum

ete

Soru sorarken detay vermezseniz cevap da detaylı olmaz. Ancak biraz dikkatli olan bir kimse mantığını çalıştırır ise,
IF SAYMA<YETERLI THEN FARKLI_ETIKET komutundaki YETERLI kelimesinin değişken olduğunu kolaylıkla anlardı. Ama sen anlayamamışsın neden bilemem. SAYMA<YETERLI ifadesinde bir karşılaştırma yapılıyor. SAYMA değeri ,YETERLI değerinden küçük ise anlamına geliyor. Burada Yeterli nin bir etiket olması mümkünmü? değil elbette. Ne söylemişsin, "yeterlis sayıda pals gelmez ise farklı bir etikete dallanabileyim" demişsin. Peki yeterli sayı kaçtır bunu belirtmemişsin. O yüzden bende Yeterli isminde bir değişken adı kullandım anlayasın diye. Senin Yeterli Miktarda Pals değerini tutan değişken adıdır bu!!!!.

Then ifadesinden sonra kullanılan isimde daima bir etikettir. çünki gidilecek yeri göstermesi gerekiyor. O halde FARKLI_ETIKET , program içindeki bir etiket den başka bir şey olamaz değilmi?.
Bu adı kullanırken yine kendi ifadendeki kelimeye yakın bir şey kullanayım dedim. Zira farklı etikete dallanayım ifadesindeki bahsi geçen ve dallanılacak olan Farklı_Etiket'in ismidir bu.

Ete

izci

hocam  hatalı üslubumdan dolayı özür dilerim dikkat ettim de kabaca yazmışım elbette etiketle değişkeni ayırabiliyorum birbirinden.
Yazdığınız kodda kafam karışınca durum buralara geldi.
Mesela bu kodda" ZAMAN<20 THEN SAY_BIR"  20 tekrardan sonra ancak "IF SAYMA<YETERLI THEN FARKLI_ETIKET" bu sorgu satırına geçecek yani on saniye dolmadan optik sensörden gelen sinyallerin yeterliliği varsa bile sorgu sırasının kendine gelmesi için bekleyecek
bu sorun if sorgularının yeri değiştirildiğinde düzelir.benim asıl sorunum optik okuyucu sifır konumunda iken arıza durumunda kalırsa 
"while  sayici=0:wend" bu  döngüden çıkamayacak buna önlem olarak arkaplanda koddan bağımsız timer çalıştırılabilirmi merak etmiştim ki
çalıştırılamıyor anlattığınızdan anladığıma göre. bu durumda optikten gelen palslerde donanımasal olarak iyileştirmeler yapıp ark- kaçırma olayını engelleyip gelen palsleri döngüsüz saymam lazım sonrasında ilk verdiğiniz örnekteki gibi pause1 i döngüye alıp saydırmam lazım

say:
zaman=0
While zaman<10000
  if sayici=0 then
  sayma=sayma+1
  if sayma=35 then  sayitamam
  endif
  zaman=zaman+1
  Pause 1
wend
GOTO FARKLI_ETIKET

bu şekilde  kodlar çalışıyor  fakat mantık doğrumudur hocam?

ete

Amacını tam olarak anlayamadım ama bu kullandığın mantık amaca uygun olarak doğru.
Ancak içimden bir ses senin sensör palslerini alırken sensör çıkışı konum değiştirmeden iki ve daha fazla sayma yapmaması için eklenmiş olan WHILE SAYICI=0:WEND komutundan her hangi bir sebeple sensörün sıfırda kalması durumunda çıkmak istediğini söylüyor.
Şayet durum öyle ise,
while sayıcı=0 and zaman<10000
Zaman=zaman+1
Pause 1
Wend
şeklinde bir komut dizisi ile o döngüden çıkabilirsin.
Ancak unutma sensör sıfırda kalmış ise ve sende döngüden çıkarsan puls sayacın geçersiz bir sayma yapacaktır.
Yazdığın kodlara bakılırsa sanki 10sn lik süre içinde gelecek sensör puls ları senin için önemli oluyor.
ama bu yazdığın şekilde de sensör pulsları bir yerde sıfırlanmadığı için sürekli üzerine eklemiş oluyor.
Kısacası ne yapmak istediğini çok iyi anlamış değilim o yüzden somut bir öneride bulunamıyorum.

Ete

izci

hocam sistem basit bir elyaf kumaş kesme makinası, iki silindirin arasından gecen elyafı cny70 kontras sensörünü encoder mantığında kullanarak cm de bir puls alıyor 35 cm olunca rezistansla kestiriyorum.
Sistemin işleyişi şöyle ;
butona basıldığı anda  motorun bağlı olduğu pin high a çekilip cy70ten gelen pulsler sayılıyor 35cm için 35 pals geldiğinde motor durdurulup kesici rezistans devreye girip kumaş parçasını kesiyor ve en başa dönüyor
buraya kadar herşey normal, elyaf kumaştan oluşan toz  cny70e bulaştığında cny70 sayma yapamıyor, hali ile 35pulsi sayamayan pic motoru durduramıyor.
birde silindir kumaşı kendi üzerine dolarsa silindir sıkışıyor ve cny70ten yine pulse gelmiyor, tozdan korumak adına kapalı tip enkoder takılabilir ama alan çok dar cny70 bile nerdeyse sıfır giriyor.
uzun lafın kısası  kumaşın akma süresi ortalama 6 saniye optik okuyucuda arıza oluşma durumunu anlamak için 10saniyeye kadar yeterli puls gelip gelmediğini  algılamak istiyorum şayet gelmemiş ise makine arıza etiketine dallanıp  beklesin istiyorum diğer türlü metrelerce kumaşı akıtabiliyor arıza durumunda. Daha iyi anlayabilmeniz için örnek vermem gerekirse,
sistem tuvaletlerde  kullanılan otomatik  kağit havlu  veren makinelerle aynı mantıkta işliyor

İlyas KAYA

CNY 70 değil de fotosel kullan ve aşağıdan yukarı değil yukarıdan aşağı baksın böylece tozlanmaz.

Eğer mümkün değil ise de aşağıda benim de kullandığım fotosel önü tamamen kapanmadan çalışmaya devam ediyor.

schneider XUB4APANL2 (400 hz okuma hızı var 0-1 mt ayarlı okuma mesafesi var.)
Çok pahalı birşey değil 65 TL fiyatı var.

Hatta çok önceleri bir video çekmiştim.

https://www.youtube.com/watch?v=ohyMi0y4mYw
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

izci

bu fotoselin karşısına yansıtıcı reflektör koymak gerekiyormu ilyas bey?

İlyas KAYA

Hayır gerekmiyor.Cisimden yansımalı çalışıyor.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Powered by EzPortal