Kuramadığım bir algoritma

Başlatan picpicpic, 26 Haziran 2012, 21:45:51

picpicpic

Merhaba, sorunum şu mesela portb.0'da bir anahtarımız var lojik 1 durumunda, anahtar 1 konumundayken portb.1'deki led yanıyor ve anahtara bastığımızda yani anahtar lojik 0 olduğunda ledi söndür diyeceğim, bu kısmı kolay, yapmak istediğim şu, program başladıktan sonra pic saymaya başlayacak ve butona bastığım anda butona basana kadar geçen süreyi saniye cinsinden eeproma kaydedecek, sizin böyle bir probleminiz olsaydı çözümünüz ne olurdu? teşekkürler.

burak ozturk

hassas olmayacaksa tmr kesmesiyle sayım yapar bolme oranına gore saniye cinsinden hesaplardım.
happy coding.

OG

Süre hassas olacaksa timer, olmayacaksa basit pause komutu.

buton var portb.0
led var portb.1

saniye var byte '' veya word

led = 1
saniye = 0

Basla:
pause 1000
saniye = saniye + 1


if buton = 0 then kaydet
goto basla

kaydet:
led = 0
''' burada saniyeyi eepromun istediğin yerine kaydet




end
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

CLR

Alıntı yapılan: picpicpic - 26 Haziran 2012, 21:45:51
Merhaba, sorunum şu mesela portb.0'da bir anahtarımız var lojik 1 durumunda, anahtar 1 konumundayken portb.1'deki led yanıyor ve anahtara bastığımızda yani anahtar lojik 0 olduğunda ledi söndür diyeceğim, bu kısmı kolay, yapmak istediğim şu, program başladıktan sonra pic saymaya başlayacak ve butona bastığım anda butona basana kadar geçen süreyi saniye cinsinden eeproma kaydedecek, sizin böyle bir probleminiz olsaydı çözümünüz ne olurdu? teşekkürler.

@picpicpic

PIC işlemcileri çok seviyorsun galiba, nickine bakılınca.

Bu işlemde en iyi ve en az işlemciyi kasan program tekniği capture ile yapabilirsin. Tuş pinini capture pinine bağla düşen kenarda interrupt'a girsin interrupta gidince capture'ı yükselen kenar yap ve timer'ı sıfırla diğer capture int geldiğinde timer'ı oku ve sn'ye çevirip eeproma yaz.

Normal intterupt ilede papabilirsin ama timerları sen başalatıp sen durdurman ve senin okuman gerekir vs.
Knowledge and Experience are Power

ete

Her kes bir fikir üretmiş. Hepsi de doğru aslında ama bana göre en pratik olanını bende açıklayayım dedim.
Bir TMR0 kesmesi oluşturarak sn pulsleri elde edersin. Kesme içinde sn sürekli sayar. Tuşa basıldığı anda sn değerini kayda alırsın ve ardından saniyeyi sıfırlarsın. Böylece her tusa basıldığında geçen süreyi kayda alabilirsin. Ancak kayıt mekanizması konusunda bilgi vermemişsin. Her kayıt başka bir eprom adresinemi kayıt edilecek yoksa hep aynı adrese mi kayıt edilecek. ? Bu belli değil.
Her iki alternatif için düşündüklerimi söyleyeyim.
Önce sabit kayıt adresi olarak konuyu ele alalım. Sürenin 255 değerini aşabileceğini düşünerek epromun 0 ve 1 nolu adreslerini bu işe ayıralım.
Saniye değişkeni ise word tipinden olmalı.
Tuşa basıldığı zaman ;
Write 0,sn.byte1
write 1,sn.byte0
pause 10
şeklinde kayıt yapabilirsin. Sonra bu değeri okuman gerekiyorsa direk yazıldığı adresleri okuyarak SN değerini elde edebilirsin.

Her seferinde farklı adres kullanılanılacak ise, bir adres işaretçisi kullanman gerekecek. Buna YER adını verelim. İlk kaydını yine 2 adres olarak yaparsın.
Write 0,sn.byte1
write 1,sn.byte0
pause 10
Yer=Yer+2 'her seferinde 2 adres artırıyoruz.
Bu şekilde bir sonraki kayıdı 2 nolu adresten başlayarak kayıt edeceğini anlarsın.

Gelelim SN için kesme oluşturmaya?
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0
satırları ile TMR0 kesmesini 1/64 bölme oranı ile açarsın.
Bu sana her 256 x 64=16384 us de bir kesme yaratır. Bu kesmeleri sayarak 61 kesme sonunda 1 sn lik puls süresini elde etmiş olursun.
Bu yaklaşık 16384 x 61=999424 us lik bir süredir ancak komut gecikmeleri ile birlikte süre yaklaşık olarak 1.000.000us civarında bir değer alır.
Bu ise 1 sn anlamına gelir.

Kesme etiketinde;
DISABLE
KESME:
      SAYAC=SAYAC+1  'kesme sayacı  1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme)
      IF SAYAC=61 then  '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
         SAYAC=0        'sayaç sıfırlanıyor
          SN=SN+1        
       ENDIF
CIK:     INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
         RESUME
         ENABLE
         
END

Şeklinde sn pulslarını saydırırsın.
Unutma SN değeri her tuşa basıldığında SN=0 şeklinde sıfırlanmalıdır.
SN değişknei word cinsinden olmalıdır.

Hepsi bu kadar.

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

picpicpic

Teşekkürler herkese, en çok OG arkadaşımızın fikri kafama yattı çünkü hassas süre gerekmiyor, çok basit bir yöntemmiş açıkçası hiç aklıma gelmemişti dalgınım buaralar

trgtylcnky

Arduino'da millis() fonksiyonuyla programın en başından beri geçen zamanı alabiliyoruz. Buna benzer bir şey yok mu?