Telefon tuş takımından harf girişi nasıl olabilir

Başlatan enginkanat, 30 Eylül 2012, 10:50:30

enginkanat

Merhabalar, Tuş takımına atanan herhangi bir değeri taratıp alabiliyorum ancak telefondaki gibi bir sistemi nasıl yapabileceğim konusunda bir algoritma kuramadım. Mesela arka arkaya basışlarda harflerin değişmesi, biraz beklenildiğinde son seçimi kabul etmesi ve uzun süre basıldığında harften rakama geçmesi gibi.

ete

Telefonda bu sistemin çalışmasına dikkat etti isen zaman bazlı çalıştığını hemen anlarsın.
Bir tuşa basıp ardından hemen aynı yuşa basarsan ikinci karektere atlar. Bir daha basarsan bir sonraki karektere atlar. Arada boşluk bırakırsan yani tuşa basmaz isen en son hangi karekterde ise o karekteri ekrana basar.

Tuşa basılır basılmaz bir timer çalıştıracaksın. Diyelimki Timer değeri 100 ms den kısa ise ve yeniden aynı  tuşa basmış isen ikinci karektere geçersin. Her basışta timer sıfırlanmalıdır ve aynı süreleri saymalıdır. 100 ms yi geçerse karekter ekrana basılmalıdır.
Bu işin yapılması için bir lookup tablosu kullanabilirsin Birde index değişkeni kullanırsın.
Diyelimki 2 tuşuna bastık. yeniden tuşa basmaz isem ekrana 2 yazılacaktır. Ama ara vermeden yeniden 2 tuşuna basarsam yazılacak karekter A harfi olacaktır. Ara vermeden yeniden basarsam bu sefer karakter B bir sonraki ise C olacaktır.
Başlangıçta index=0 olacaktır. İkinci basışta index=index+1 den index=1 olacak bir daha basarsam index=2 olacak ve yeniden basarsam index=3 olacaktır.
Diyelimki 2 tuşuna 3 kez bastım ve index de 3 oldu . Bütün tuş takımı 12 karekterden oluşuyor. Her  birinin 4 ayrı karekter içerdiğini varsayarsak,
index=0 iken 1. gurup karekterler,
index=1 iken 2. gurup karekterler
index=2 iken 3. gurup karekterler
index=3 iken ise 4. gurup karekterler ekrana verilir. Nasıl mı?
Yer=index*12+TuşNo formülü ile yer belirlersin. Örneğimizde 3*12+2=36
LOOKUP yer,[0,1,2,3,4,5,6,7,8,9,10,11 ,"+","-",A,D,G,J,M,P,T,W,*,#,ÜÇÜNCÜ GURUP KAREKTER TAKIMI,DÖRDÜNCÜ GURUP KAREKTER TAKIMI],TUS
şeklinde yapabilirsin.
Tuş takımından bir tuşa basıldığı zaman tuşun bırakıldığını kontrol ettiğin kısıma
while TUS=2
  zaman=zaman+1
  IF zaman=100 then
    INDEX=INDEX+1:ZAMAN=0
  ENDIF
Wend
Yer=ındex*12+TUS:GOSUB TUS_AL   şeklinde bir kod ile tuş değerini alabilirsin.

Ete


enginkanat

Çok teşekkür ederim. Anlatımınızın sadeliği ve ilgilenerek cevapladığınız için. Ben ise ne kadar çok karışık döngülerle bu işi çözmeye çalışıyordum.

enginkanat

Bir sorum daha olacak, bir program içerisinde iki farklı kesme kullanılabilir mi? mesela portb cgange kesmesi ile birlikte tmr0 kesmesi kullanılabilirmi?
portb change kesmesi oluştuktan sonra, programın arkasında çalışmaya başlayacak tmr0 a ihtiyacım var.

aslında bir sorum daha varmış,
bir makinada hazırlama süreci ve işlem süreci var.
ürünü hazırlayıp işlem için makinaya gönderiyoruz ve işlem başlıyor ancak bu süre içinde yeni ürünün hazırlanıp sıraya girmesi gerekiyor. hazırlık süreci için 3 giriş 3 çıkış işlem süreci için 2 giriş 3 çıkış kullanıyorum. Bu anlattığım iki sürecin çalışması için bir işlemci kullanılabilir mi? yada her süreç için farklı işlemcimi kullanmalıyım. Aslında sorunun kolayı bir işlemci iki farklı iş yapabilir mi?

ete

Elbette bir programda iki veya daha fazla kesme kaynağı kullanılabilir.
Kesmelerin her biri kendi açılış registerlerinden açılır. Kesmeleri yönetmek için Kesme etiketi altında öncelikle hangi kesmenin oluştuğunu bulman ve ona göre iş yapman gerekiyor.
Senin örneğinde;
Şayet TMR0 kesme bayrağı=1 olmuş ise TMR0 kesmesi oluşmuş demektir.
O halde ona ait işleri yapar ve kesme bayrağını sıfırlayıp kesmeden çıkarsın.
Zaten iki kesme kaynağı kullanılıyor ise birincisi değil ise ikinci kaynak çalışmış demektir.
Örnek vermek gerekirse;
Disable
Kesme:
   IF INTCON.2=1 then   'Yani TMR0 kesmesi oluşmuş ise
       ...
       ....
       INTCON.2=0  'bayrağı sıfırla
       GOTO CIKIS
   ENDIF
   'Program bu satıra gelmiş ise demekki TMR0 kesmesi değilde PortB change kesmesi oluşmuş demektir.
    burada ne gerekiyorsa onları yaparsın ve sonunda
    INTCON.0=0 kesme bayrağını sıfırlarsın
CIKIS:
    resume
    enable
şeklinde de kesmeden çıkarsın.

Diğer sorunu anlamadım.  Ama tahminime göre cevap vereyim. İşlemci birim zamanda çok fazla iş yapabiliyor.
Bu nedenle bizim için normal olan bir zaman dilimi mesela yarım saniyede bir sürü noktaya bakıp oralardaki durumlara göre işlemleri yapıp bitirebilir. Bu durumda bir işlemci iki veya daha fazla işi rahatlıkla yapabilir. Yeterki programı amacına uygun yaz.

Ete




enginkanat

Teşekkür ederim.
2. soruyu biraz açayım.
kullanıcı 3 ayak pedalı ile 3 ayrı hava valfini kumanda ederek preslenmesi gereken işi presleme ünitesine göndermek için hazırlıyor. Burada kullandığı 3. pedal hazırlanan malzemeyi presin içine gönderen silindirin valfine kumanda ediyor. bu silindirin üzerinde olan sensör gördüğünde presleme işlemi başlıyor. burada zaman ayarlarına göre buhar, vakum, hava üfleme valfleri devreye giriyor. yani bir nev-i program çalışıyor. işlemci bu programı çalıştırırken kullanıcı sıradaki işleri hazırlaması gerekiyor. yani işlemci bir yandan presleme programı için çalışrken diğer yandan da kullanıcının verdiği komutları uygulamak zorunda. Bunu sormak istedim.
şimdi bunları yazarken farkettim 2 farklı işlemci kullanılmak zorunda, vaktinizi aldığım için özür dilerim.

greatgonzo

enginkanat arkadaşım eğer makinede çalışan komutların saniyede bir kaç yüz yada bir kaç bin defa sensör kontrolü yada herhangi bir valf  yada triyağı sürmüyorsa tek işlemci yeterli gelmeli. Ben bir kaç aydır uğraşıyorum ama süratlerine halen alışamadım :-) Tahmin ettiğinden çok daha hızlı çalışıyorlar. Bu tarz bir programın mesnet noktası kesmelerdir. Bu konuyu tam olarak aşmalısın. Mesela yapılması gereken işleri timer sayaçları ile kesme olusturup tetikleyebilirsin. Program normal kesmeler ile işlerken rb4-7 ve/veya rb0 kesmesi ilede tus tanımlayıp veri girişi yapabilirisin. Bu durumda sadece veri girişi noktalarında birkaç milisaniye için ara verip komutunu alabilir ve zamanı geldiğinde işler ki bu milisaniyeleri sen göremessin. Bu tarz bir mantık yürütürsen bence tahmininden çok daha fazlasını yapabilirsin.

enginkanat

Doğru söylüyorsunuz olayın bu kısmını göz ardı etmişim. dediğiniz gibi sistem çok hızlı çalışıyor.

Powered by EzPortal