keypad+74hc595+display up-down sayıcı yardım...

Başlatan mustafa_cmbz, 25 Temmuz 2008, 20:19:45

mustafa_cmbz

arkadaşlar nezamandan beri böyle bir şey tasarlamaya uğraşıyorum keypad kullanma olayını çözdüm display sürmeyide öğrendim (74hc595 ile) fakat bu 2 malzemeyi bir projede buluşturup anlaştırıp istediğim şeyi yaptıramıyorum...

yapmak istediğim şey 116f877,1 adet keypad ve 6 adet display ve 74hc595 sürücüleriyle ayarlanabilir up-down counter yapmak istiyorum...takıldığım nokta ise keypad'ten girilen rakamların bir değişkenlere aktarılmasından sonra bu değişkenlerin rezistere yazılması sorununu yaşıyorum...çünki displayleri sürerken saat değişkenine 2 haneli bir değer veriyoruz ve ondan sonra bu 2 haneli değişkeni dıg0 ve dıg 1 diye displaylere gönderiyoruz fakat biz keypad'i tek tek tuşladığımız için ben bu 2 değişkeni birleştirip daha sonra değeri displaylre aktarırken dıg0 ve dıg 1 diye bölemiyorum...bu konuda herkesin yardımlarını bekliyorum...

not: kod konusunda ete hocanın 8. dersindeki 74hc595 ile yapılmış ısı+sat projesinden faydalandım ama belirtiğim yerde tıkandım.....kolay gelsin

ete

Bu ve buna benzer sorulara pek çok defa cevap verdim. Yine veriyorum.

Tuş takımından her defasında bir rakam alırsınız (0-9). Ancak oluşturacağınız sayı 3 veya 4 haneli bir sayı olabilir. Çok haneli sayı için on tabanına göre olan sayı sisteminin kadesini bir formülle uygulamanız yeterli olacaktır. Nasılmı aşağıdaki örnekte gösterildiği şekilde tabiiki. Örnek olarak 3248 sayısını oluşturacağmızı varsayalım. Şimdi etaplar halinde olayları inceleyelim;
Değişken olarak, oluşturulacak sayı için word tipinde SAYI isimli değişkeni, her defasında tuş takımından girilen değeride BYTE cinsinden RAKAM isimli değişkeni kullanalım.
- Tuş takımından önce 3 rakamını gireriz yani ;
  RAKAM=3
  SAYI=SAYI*10+RAKAM =SAYI=0*10+3=3
- Tuş takımından bu sefer 2 rakamını gireriz;
  RAKAM=2
  SAYI=3*10+2 = 32
- Tuş takımından 4 rakamını gireriz;
  RAKAM=4
  SAYI=32*10+4=324
- Tuş takımından 8 rakamını gireriz;
  RAKAM=8
  SAYI=324*10+8=3248
böylece 3248 değeri  SAYI isimli değişkenimize aktarılmış oldu.
Bu değişkendeki değeri displaylere vermek için;
SAYI DIG 0 = 8
SAYI DIG 1 = 4
SAYI DIG 2 = 2
SAYI DIG 3 = 3
olarak teker teker ilgili displaylerde gösterilir.

Anladığım sorunun bu idi sanırım . Başka bir şey ise daha detaylı açıklarsan cevaplarım.

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

mustafa_cmbz

işte bu hocam işte bu bende bunu nasıl yapacam diye düşünüyordum...kendim her girilecek rakamı and işlemine sokmayı planlıyordum ama imdadıma yetiştin hocam çok teşekkür ederim...birde şu saat devresinde timer işlemi var ya diyelim biz keypad'ten istediğimiz rakamı girdik yukarı seçeneğini seçtik burası zaten sizin yayınladığınız koddan alıntı yaparak işlenebilir..fakat geri saydırma işlemini gerçekleştirirken kesme oluştuktan sonra sayac=sayac+1 yerıne saya=sayac-1 yapınca sanıye kısmı  neden ise 49a kadar sayıp duruyor...bırde bu verdığınız matematiksel işlemleri vs. protonda kullanma imkanımız varmıdır acaba protonda tımerleri daha rahat kullanırız diye düşünüyorum çünki basic te daha öncede anlattığınız gibi sıkı bir hesap istiyor pause komutu fazla olunca da kitleniyor işlem yapmıyor...

yardımlarınız için çok sag olun hocam ....

ete

Mustafa,

Werdiği matematiksel formül yada örnek her dilde kullanılabilir.Basic ve tabiiki Proton içinde son derece uygun.

Timer işine gelince bana kod vermezsen yalnızca düz mantık yürütebilirm.
Düz manığa görede sistem şöyle olması gerek;

KESME:
Sayac=Sayac+1 
if sayac=60 then        'yani 1 sn oldu ise
  timer=timer-1          'timer değerini bir eksilt
endif
...
...
..
resume
..
  

Bu şekilde olması gerekir. Kısaca açıklamak gerekir ise,
her 60-61 adet kesme oluştuğunda 1 sn lik bir süre geçecektir.
O halde sayac değeri 60 yada 61 olunca timer değeri bir eksiltilecektir.
bu şekilde yaparsan olacaktır sanırım.
Sen sayac değerini 1 eksiltiyorsunki bu yanlış bence. Sayac değeri kesmeleri sayan bir değişken ve pic in osilatör değerine bağlı olarak 60 yada 61 adet kesme oluşunca 1 sn lik süre dolmaktadır. O halde sayac değeri 60 olunca timer bir eksiltilecektir.
Bu ve buna benzer kesme kullanılan programlarda , program içinde PAUSE
komutu kullanılacak ise PAUSEUS kullanılmlaı verilecek değer de 5 us yi geçmemelidir. Zira Basic de işlenen basic komutu bitmeden kesme oluşturulmaz. Siz Pause 100 demiş iseniz 100 ms lik komut süresi bitmeden kesme oluşmayacaktır. Halbuki aynı komutu;
For I=1 to 20 000
pauseus 5
next
şeklinde kullanırsanız yine yaklaşık 100 ms lik bir komut gecikmesi elde edersiniz ancak kesme oluştuğu anda en fazla 5 us sonra kesme alt programına gidersiniz.
Bu arada yeri gelmişken hemen belirteyim. Her ne kadar aynı süre geçer dersemde iki komut şekli arasında bariz bir zaman farkı olacaktır. Zira, FORI=1 to 20 000
pauseus 5
next
şeklindeki komut dizisideki komutlarında birer işlenme zamanları vardır ve bunların gecikmesi 20000x5=100000 us yerine yaklaşık 120000 us lik bir süre geçebilir. Bu sizin için önemli ise gerekirse 20000 yerine 18000 hatta 15000 gibi değerler alarak farkı tolere edebilirsiniz.

Ete

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

mustafa_cmbz

ete hocam timer işlevini şimdi bir kenara bırakalım ona sonra geçeceğim ama gördüğüm kadarı ile benim oradada yanlışlarım varmış belkide o yüzden kitleniyordu...

şimdi ise kafama takılna sorun şu ilk verdiğiniz 10 tabanındaki sayıların birleştirilmesi ile ilgili...ben bu kodu keypad'i okurken nasıl degerlendireceğim yani programın neresine yerleştirmem lazım?

mesela sizin derslerinizdeki keypad kodu şöyle:

BASLA:
PORTB =254
YATAY_A=0
If DIKEY_1=0THEN
Tus=1:GOSUB EKRAN
While DIKEY_1=0
Wend
Endif
If DIKEY_2=0 Then
Tus=2:GOSUB EKRAN
While DIKEY_2=0
Wend
Endif
If DIKEY_3=0 Then
Tus=3:GOSUB EKRAN
While DIKEY_3=0
Wend
Endif
High YATAY_A
YATAY_B=0
If DIKEY_1=0 Then
Tus=4:GOSUB EKRAN
While DIKEY_1=0
Wend
Endif
If DIKEY_2=0 Then
Tus=5:GOSUB EKRAN
While DIKEY_2=0
Wend
Endif
If DIKEY_3=0 Then
Tus=6:GOSUB EKRAN
While DIKEY_3=0
Wend
Endif
High YATAY_B
YATAY_C=0
If DIKEY_1=0 Then
Tus=7:GOSUB EKRAN
While DIKEY_1=0
Wend
Endif
If DIKEY_2=0 Then
Tus=8:GOSUB EKRAN
While DIKEY_2=0
Wend
Endif
If DIKEY_3=0 Then
Tus=9:GOSUB EKRAN
While DIKEY_3=0
Wend
Endif
High YATAY_C
YATAY_D=0
If DIKEY_1=0 Then
Tus=11:GOSUB EKRAN
While DIKEY_1=0
Wend
Endif
If DIKEY_2=0 Then
Tus=0:GOSUB EKRAN
While DIKEY_2=0
Wend
Endif
If DIKEY_3=0 Then
Tus=12:GOSUB EKRAN
While DIKEY_3=0
Wend
Endif
High YATAY_D
pause 100
Goto BASLA


ben sizin verdiğiniz değişken değerlerini hesaplayan birleştiren artık her neyse ilk verdiğiniz komutları bu keypad okuma rutını içinde nasıl degerlendireceğim?

edit: yani verdiğiniz hesap komutlarını key-pad tarama yaparken nasıl işleyeceğim?

mustafa_cmbz

ete hocam kaç günden beri senin vereceiğin cvp'ı bekliyorum sorduğum şeye cvp vermiyecekmisin? sende her konuya 1kez cvp verip birdaha yazmıyorsun....