eepromdan anlık verı oku-yaz

Başlatan pwm3434, 19 Ocak 2013, 17:37:20

pwm3434

programın  kısaca  görevi:
tımer0 sayacı    sayma  yapıyor saat  olarak  kullanıyorum  anlık  eepromdan  okunan bu  saat bilgisiyle mesafeyi bu ölçümü  yaptıracağım. 

ıf  sınyalgırısı=1 then
read saniye, hesap1

bu  komtla  okuyorum  ama anlık bir  okuma  olmuyor sürekli  okuyor.  pın  1 olduğu an  okuyup kaydedecek yani farzedelimki  o an  saniye  48 de sadece  48  bilgisini  okuyup  kaydedecek ve hemen  takibinde  sinyal, pinden  ne  zaman kesildi ve bu  kesilme  zamanı ile i  ikinci  kez  okuyup kaydecek  ve  hemen  matematik işlemi yapılacak.  yardımcı  olabilirmisiniz.  dediğim  gibi  okuyor  ama sürekli  okuma  yapıyor
iyi  çalışmalar  kolay  gelsin

ete

o komutu kullanırsan, Sınyalgirisi=1 olduğu müddetçe okuma yapar. Program zannettiğinden hızlı çalışır ve sinyal girişide 1us de konum değiştirmeyeceğine göre sürekli okuması normaldir. O halde bir ikinci parametreyi devreye sokman gerekir.

IF  SINYALGIRIS=1 AND POZ=0 then
read saniye, hesap1
POZ=1
ENDIF
dikkat edersen POZ=1 olduğu için artık okumayacaktır. Yada yalnızca 1 kere okuyacaktır.
Bu durumda POZ değişkenini bir yerde yeniden sıfırlaman gerekir. Nerede olduğuna sen karar vereceksin.
Mesela sinyal girişi tekrar LOW olduğunda sıfırlayabilirsin yada Okuduğun değeri bir yerde kullanıyor ve yeniden okuma için bekliyor isen kullandığın yerde POZ=0 demen lazımki yeniden sinyal girişi=1 olduğunda tek seferlik okuma yapabilesin.

Ete

pwm3434

ETE  Hocam dediğine göre  şimdi  oldu sanırım.

                    IF  SINYALGIRIS=1 AND POZ=0 then
                    read saniye, hesap1
                    POZ=1

IF  SINYALGIRIS=0 AND POZ=1  then
read saniye, hesap2
POZ=0
ENDIF
                   ENDIF

ete

İki ayrı parametresi olan if komutlarını bir if altında birleştirmen yanlış.
İkisini ayrı ayrı yazmalısın.

Yani
                    IF  SINYALGIRIS=1 AND POZ=0 then
                       read saniye, hesap1
                       POZ=1
                     endif

                   IF  SINYALGIRIS=0 AND POZ=1  then
                       read saniye, hesap2
                       POZ=0
                   ENDIF
şeklinde yazılması daha doğru olur.

Ete

pwm3434

ETE  hocam  projeyi tam  anlatmış  değilim  sanırım. metal tespit dedektörü  ile  ilgili dir.   pın  sürekli  olarak  0  da  duruyor bu 0 halinde iken hiç bir  okuma  yapmaması  gereklidir.    1  olmasını  beklemede, ne  zaman  bir  logıc  1  oldu o anki saniye  değerini kaydet  ve hemen  takibinde sinyalin kesileceği yani  sinyal  girişinin  olmadığı zamanı bekleme konumuna  geç   ve  sinyal  ne  zaman  1  den  0  sıfır  konumuna döndü  ise o  anlık ki    saniye  değeri de  kaydedilip işlem  yaptırılacak.

eğer  dediğin  gibi  yaparsam sayın  hocam program ilk sinyal  girişinden önce bılgı  kaydı  yapacak  gibi  sanıyorum  neyse  hocam  akşam  eve  dönünce deneyeyim.
kolay  gelsin  hocam

ete

#5
Birinci söylediğinble bu son söylediğin bir birini tutmuyor. Üstelik önceki komut satırında bir saniye kaydı falan da yok.
Read Saniye,Hesap1 şeklindeki komut saniye isimli değişken değerine karşılık düşen eprom adresinden Hesap1 bilgisini okur. Burada kayıt yok.  Her neyse bunu düşünmen gerekir.
Sana lazım olan aslında şöyle;
Başlangıçta Sİnyal girişi LOW da beklediği için öncelikle onun HIGH konuma geçtiği anı yakalamak lazım.
      While SINYALGIRIS=0:wend 'sinyal LOW olduğu müddetçe bekle
            READ saniye, HESAP1     'sinyal HIGH oldu o halde işlem yap
      While SINYALGIRIS=1:WEND 'sinyal HIGH olduğu müddetçe bekle
            READ Saniye,HESAP2      'sinyal yeniden LOW oldu o halde işlem yap
       endif
Ben yine READ satırlarını aynen yazdım çünki ne olması gerektiğini bilemiyorum. Senin sözlerinden bir anlam çıkartamadım. Sen gerekirse oraya doğru komutu yazarsın.
Bu satırların anlamlarını yanına yazdım. Bu satırların bir kusuru vardır. Oda programı oraya bağlar. Arada başka işlerde yapacaksan başka tedbirler almak gerekir. Örneğin kesme kullanmak en mantıklısıdır. PortB.0 kesmesi kullanır ve başlangıçta kesmeyi yükselen kenar içina ktif edersen sinyal girişi HIGH olunca kesme oluşur ve sende orada gerkeni yaparsın. Kesmeden çıkmadan önce bu seferde kesmeyi düşen kenar için ayarlarsın. Yeniden kesme oluştuğunda bu seferde diğer işi yaparsın. İkisini bir birinden ayırt etmek için yine Poz değişkenini kullanabilirsin. Böylece program oraya bağlanmamış olur sende başını beklemezsin.

Ete

pwm3434

IF (SINYALVAR=0) AND (POZ=0) THEN
WRITE YAZ1,SN
READ YAZ1,OKU1
POZ=1
ENDIF     
      IF (SINYALVAR=1) AND (POZ=1) THEN         
       WRITE YAZ2,SN
       READ YAZ2,OKU2
       POZ=0
       OLC=OKU2-OKU1
       ENDIF


Teşekkür  ederim ete hocam proteusda bu yukarı satırdaki  komutlar çalıştı. Bu komutlar parogramın sadece okuma ve yazma ile ilgili kısımıdır. Kalabalık etmesin  diye  programın  hepsini buraya yazmak istemedim.

Ete hocam ıf komutunu iç içe kullanınca  bu yapmak  istediğimi yapamadım  ne acayip mantık  olarak olması lazım gibi  göründü  bana  ama uygulamada aşağı satırladaki iç içe ıf komutu dediğiniz gibi işe  yaramadı.
IF (SINYALVAR=0) AND (POZ=0) THEN
WRITE YAZ1,SN
READ YAZ1,OKU1
POZ=1
         IF (SINYALVAR=1) AND (POZ=1) THEN         
       WRITE YAZ2,SN
       READ YAZ2,OKU2
       POZ=0
       OLC=OKU2-OKU1
         ENDIF   
ENDIF
hocam şimdilik okuma  yazma için yardımınız  için  çok  teşekkür ederim.
başka bir  konu olarak
Acizane sizin  için elimden  gelebilecek birşeyler olsa destek olmayı isterdim.
Sanıyorum hocam diğer  amötörlerden olan bir kısım insanlarda böyle  düşünüyorlardır şüphesiz.

ete

Önce kodların neden çalışmayacağını bir kez daha açıklayayım.
IF komutu içine girilebilmesi için;
IF (SINYALVAR=0) AND (POZ=0) THEN   satırında belirtilen;
- SINYALVAR=0 olmalı
- POZ=0 olmalıdır.
Ancak bu iki şart yerine gelirse altındaki komutlar icra edilirler.
Şart yerine gelince şu satırlar işlenecek ve
WRITE YAZ1,SN
READ YAZ1,OKU1
POZ=1
işlemleri yapılacaktır. Bir sonraki if satırı birincinin içinde yer alıyor. O halde aynı şartlar onun iinde geçerli olacak,
IF (SINYALVAR=1) AND (POZ=1) THEN 
Şimdi birinci IF satırına SINYALVAR=0 ve POZ=0 olduğu için girdin. Dolayısıyla aynı yerde
SINYALVAR=1 ve POZ=1 olamaz yada POZ=1 zaten sen bir önceki satırlarda yaptığına göre SINYALVAR=0 iken aynı zamanda SINYALVAR=1 olamayacağına göre program önce bu if satırlarından çıkacak. Yada ilk if satırından sonraki komutlar işlenirken SINYALVAR=1 olur ise o zaman ikincisi değerlendirilecektir. AKsi halde program if satırlarından çaıkacak ve bir sonraki döngüde oraya yeniden geldiğinde  POZ=1 olarak bekliyor olacağı için if satırlarının içine girmeden atlayacaktır. Zira,
SINYALVAR=1 olsa bile , POZ=1 olduğu için şart yerine gelmemiş olacaktır. Programın oraya girmesi için POZ=0 olması gerekiyor.
Bu nedenle Ikinci IF satırını ayrı bir komut olarak değerlendirmek lazım. Bir birinin içine sokmamak gerekiyor.
İkincinin çalışması için mutlaka birinci çalışacak ise zaten bunu yapıyorsun POZ=1 diyerek. İKinci ancak POZ=1 iken çalışacak ise yapılan doğrudur ve ikinci if satırları birincinin dışına yazılmalı ve ayrı değerlendirilmelidir.

Destek sözü için teşekkür ederim. Şimdilik bir şey gerekmiyor.

Ete

Powered by EzPortal