Buton basılmalarını takip edip kaydetme?

Başlatan F®T, 21 Şubat 2016, 22:20:59

F®T

Arkadaşlar devremde 5 adet giriş butonum var.
Bu butonlara  basıldığı zaman basılış sırası ile yapılan tüm hareketleri hafızaya kaydetmeliyim.
Daha sonra basılma sırasına göre görmek için nasıl bir mantık kullanılmalı.
Toplamda 1000 adet buton hareketini hafızaya kaydetmek için ne kadar hafıza alanı ihtiyacımız olur.

"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

İlyas KAYA

Her hareketi tek tek kayıt ederseniz çok fazla hafıza gerekir.
Ama 5 erli guruplar halinde kayıt edersek daha az hafıza gerekli olur.

Onu da şöyle yapabiliriz;

5 buton için her butona numara verir isek; 12345

Her tuşu 5haneli olarak bir değişkene alırsak , en büyük rakam öyle ise ; 55555 dir.
buda word tipi bir değişken için yeterli. Hafıza da 2 byte 1 word ettiğine göre 1000 hareket / 5 = 200 word lazım. buda 400 byte lık hafıza demek.

Hafızadan alırken word değişkeni olarak alır birler onlar yüzler binler ..vs.. olarak rakamları çekerek 5 hareketi tek bir word 'e sığdırmış oluruz.

Benim aklıma böyle bir algoritma kurmak geldi. Başka fikri olan elbet vardır.

Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

ete

Bu işi düşünmek için bile biraz örnek vermek gerekir.
Elimizde 5 adet giriş butonu mevcut. Bunların ardışık pinlere bağlanması kayıt işini kolaylaştıracaktır.
Diyelimki PORTB.0-PORTB.1-PORTB.2-PORTB.3 ve PORTB.4 pinlerine bağlı olsunlar.
Bu pinlerin konumu bir seferde okunabilir. Pinler Pulldown bağlı ise,
DURUM=PORTB & %00011111 şeklinde,
Pinler pullup bağlı ise DURUM=31-(PORTB & %00011111) şeklinde okunmalılar.
Programa başlarken önce bir okuyup mevcut konumu saklamak ve bu konumda bir değişiklik olmuş ise kayıt yapmak gerekir.
Birde kayıt isimli adres değişkeni (Word) kullanmak kayıt alma açısından yararlı olacaktır. Başlangıçta Kayıt=0. olacak ve ilk değişiklik olduğunda WRITE kayıt,DURUM:Kayıt=kayıt+1 şeklinde konum artırılacaktır. Ben dahili eproma kayıt edilmiş gibi gösterdim ama gerçekte harici bir eproma kayıt edilmesi gerekecektir. Bunu unutmayın.
Bu şekilde 1000 konum için 1000 adet byte gerekecektir.  1K lık bir hafızası olan bir eprom yeterli olacaktır.
İlk kayıt yapıldıktan sonra Eskidurum=Durum olmalı ve yeniden fark oluşacakmu ona bakılmalı oluşunca yine benzer şekilde kayıt edilmelidir. Tabiiki butonların bırakılma konumu kayıt edilmeyecek ise ve butonlar hemen bırakılıyor ise sürekli olarak buton eski konumu butonların basılmamış hali olacaktır. Böylece yalnızca basıldığı durum kayıt edilir ve yeniden basılmamış konuma geçilerek basılmış konum takip edilir.
Ete




F®T

Hocam selamlar,
İlyas hocam dediğiniz gibi olur.Fakat toplam 1000 adet hareketin hepsi bir butondada olabilir veya karışık olarak 5 butondada olabllir.Neticede her butona bir rakam verirsek en küçük hafıza olarak byte kullanmamız gerekiyor.Buda 1000 byte yapıyor.Sizin dediğiniz gibi olursa  5 buton durumunu farklı sayılara eşleştirirsek bir sayı elde ederiz.Sayıda word olmak zorunda fakat bu sefer 1000 word olmazmı?Çünkü her harekette bir buton durumu kaydedilcek.Sizin hesabınızı anlayamadım.400 byte nasıl olacak.
Ete hocam dahili hafıza ile olmazmı?Harici hafıza demişsiniz.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

İlyas KAYA

Her butona bir tane numara verdik; 12345

rasgele şimdi 5 buton için tuşlara basıyorum.

135241323541425443 Sıramız bu şekilde gidiyor diyelim. Yani önce 1 sonra 3 sonra 5 sonra 2 diye.
Ben bu sırayı 65535 'i geçmediği için 5 haneli gruplara ayırarak tek rakam elde ettim. İsterseniz 3 lü gruplara da ayırabilirsiniz ama 1000/3 word lazım olur o zaman.
Word gruplara ayırdığımızda üstteki rakamlar şöyle olacak.

13524 - 13235- 41425- 443

gibi . Böylece hafızada yer kazanmış oldum.

Yani basılan her 5 hareketi bir word değişkenine aktarıp onu da hafızaya yazacaksınız.
Formül filan uğraşamam derseniz I2C kullanıp her buton hareketini direk hafızaya atarak 1000byte yani 1K lık eeprom kullanabilirsiniz.
Bunun içinde her buton basışında 1 değişken artar ve bu değişken eeprom hafızasındaki sıraya tekabül eder. Böylece sıra ile tüm butonları kayıt etmiş olursunuz.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

umitco


Eğer 1kb epromda sıkıntın varsa

1-5 arası bilgiyi kaydedeceksen her tuş bilgisi için 3 bite ihtiyacın var. Bir byteye yaklaşık 3.6 adet tuş bilgisi kaydedilebilir ama uğraştırır seni biraz.

1.tuş bilgisi A değişkeninin 0,1,2.bitlerine
2.tuş bilgisi A değişkeninin 3,4,5.bitlere
3.tuş bilgisi B değişkenin 0,1,2.bitlerine
4.tuş bilgisi B değişkenin 3,4,5.bitlerine

Artan 2 bitlde kullanılabilir istenirse.Tabi değişken olarak dizi değişkeni işini kolaylaştırır.
Harici eprom iyi bir seçenek.

M.A.A

#6
Sorunu doğru mu anladım bilmiyorum. Sadece tuşların basılış sırası ve 1000 adet kayıt istiyorsun değil mi ?

Toplam 5 tuş varsa bunlar 3 bit ile tanımlayabiliriz.
1.tuş = 001
2.tuş = 010
3.tuş = 011
4.tuş = 100
5.tuş = 101

1000 adet hafıza için 3000 bit (325 byte)
1 byte 8 bit, 3 e tam bölünmediği için artık bit oluşur, bu yüzden 3 byte 1 blok gibi düşünürsek işimiz daha da kolaylaşır.
Son kayıt ettiğimiz blokun adresi ile, blok içinde son kaybettiğimiz biti de birer hafızaya kayır edersek. 327 byte ile kaydetmiş oluruz.


iki tuşa aynı anda basılma ihtimali var ve bunu da kayıt gerekir ise , 5000 bit (625 byte)

F®T

M.A.A ve umitco hocam dediğiniz gibi olabilir güzel fikir ama bit bazında gerçekten çok işlem yapmak gerekiyor.eeprom kapasitesinde bir sıkıntı olmadığı için bu şekil kullanım düşünmüyorum açıkçası ayrıca program hafızasındada bu şekil kullanımda baya bir kullanıma sebep olur diye düşünüyorum. Teşekkür ediyorum.

İlyas hocam çok farklı algoritma üretiyorsunuz inanın çok pratik çözümler ama hala şu olayı tam algılayamadım.Bir buton hareketi oluyor.Bu buton durumu kaydedilince bu kayıt işlemi bitmiş oluyor.Burda 1 word luk hafıza kullanılmış oluyor.Şimdi aynı word ile 2.3.4.5. buton hareketini nasıl kaydederiz.Hareket sırasını nasıl anlarız?
1.buton=10000
2.buton=2000
3.buton=300
4.buton=40
5.buton=5

=12345 sayısı oluşuyor.Bu sayıyıda 1 word olarak kaydettik.Bu şekilde ise 5 hareketin bitmesini bekleyip sonraki word hafızasınamı geçmemiz gerekiyor.Sanırım anlayamadım bu kullanımı?Sıralamayı nasıl anlıyacaz.
Kayıt işleminde sıralama önemli çünkü hangi sıra ile kayıt oldu ise o sıralama ilede lcd de butonların gösterimini yapıcam ve ilk kayıt 1000 kayıt dolunca ilk silinir olacak.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

İlyas KAYA

#8
Alıntı yapılan: F.T - 23 Şubat 2016, 19:30:41
M.A.A ve umitco hocam dediğiniz gibi olabilir güzel fikir ama bit bazında gerçekten çok işlem yapmak gerekiyor.eeprom kapasitesinde bir sıkıntı olmadığı için bu şekil kullanım düşünmüyorum açıkçası ayrıca program hafızasındada bu şekil kullanımda baya bir kullanıma sebep olur diye düşünüyorum. Teşekkür ediyorum.

İlyas hocam çok farklı algoritma üretiyorsunuz inanın çok pratik çözümler ama hala şu olayı tam algılayamadım.Bir buton hareketi oluyor.Bu buton durumu kaydedilince bu kayıt işlemi bitmiş oluyor.Burda 1 word luk hafıza kullanılmış oluyor.Şimdi aynı word ile 2.3.4.5. buton hareketini nasıl kaydederiz.Hareket sırasını nasıl anlarız?
1.buton=10000
2.buton=2000
3.buton=300
4.buton=40
5.buton=5

=12345 sayısı oluşuyor.Bu sayıyıda 1 word olarak kaydettik.Bu şekilde ise 5 hareketin bitmesini bekleyip sonraki word hafızasınamı geçmemiz gerekiyor.Sanırım anlayamadım bu kullanımı?Sıralamayı nasıl anlıyacaz.
Kayıt işleminde sıralama önemli çünkü hangi sıra ile kayıt oldu ise o sıralama ilede lcd de butonların gösterimini yapıcam ve ilk kayıt 1000 kayıt dolunca ilk silinir olacak.

Aynen her 5 harekette bir kayıt yapmamız gerekiyor. Bunu da bir değişken ile sayabiliriz. Her 5 tanede bir 1 tane word elde edip bunu kayıt ediyoruz. Hafızadan alırken word olarak aldığımızda zaten sırada otomatik çıkmış oluyor.
Bütün işi bir tane for döngüsü ile yapabiliyorsunuz. Örnek bir uygulama da yapardım ancak şu saat oldu halen çalışıyorum (01:50)
Biraz yoğun bir hafta geçiriyorum.


Bundan önemlisi ;
Asıl mesele şu ki 256 byte dan fazla PIC pek yok. 18F serisinde var ama 15-16 TL den aşağı da fiyat olarak yok. Sanırım en makul çözüm yine harici EEPROM kullanmak olacak.

Her ne kadar istenilen kadar kayıt etmese de  olayın mantığını anlamanız için kod ve isis şeması ekledim.
Bunda olmasa bile başka projelerde algoritma olarak işinizi görebilir.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

F®T

#9
İlyas hocam Allah razı olsun.Emek verdin.
Herşey tamam fakat şu nasıl olacak ,tamam 5 adet hareketi bir word değişkenine kayıt ettik.Hangi butonun ilk kayıt ettiğini anlama şansımız sanırım olmuyacak.Sıralama önemli olmasaydı çok güzel bir yer kazanımı söz konusu olacaktı.Fakat sıralamayı bilme sorunu oluşucak.Yada benmi eksik düşündüm acaba.Bu konu hakkında fikriniz nedir?

Hocam programı denedim sıralama sorunuda yok.Cevabı denemeden yazmıştım.Kusura bakmayın.Mükemmel oldu.Bu kadar olur.Allah razı olsun. :D
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

umitco

#10
     İlyas hocanın yöntemini başta anlamamışım , bu yüzden üçerli gruplar yapmanızı önermiştim ama hocamın yöntemi çok daha pratik ve kullanışlı , benim önerim yanlış olmuş.

    5 byte bilgiyi kaydederken zaten sıralamayıda kayıt etmiş oluyorsunuz.

İlyas KAYA

Rica ederim hocam. Cumlemizden .
Evet test tuşuna basınca sıra ile ve sıra numarası ile Size gösteriyor. Ben biraz kaçamak yapıp buton girişlerini direk 1 2 3 4 5 olarak okumak adına diyotlar kullandım   gece gece O kolayıma geldi :) . Siz isterseniz tek tek girer her buton için yine 1 2 3 4 5 numaralarını manuel verebilirsiniz.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

F®T

Hocam onuda biz yapalım.Zaten yapacağınızı yaptınız yine .Daha ne olsun.  :D
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Powered by EzPortal