avatar_elektro77

uzun tuşta hızlı saydırma

Başlatan elektro77, 16 Ağustos 2018, 20:18:23

elektro77

Aşagıdaki kodlarda tusa her basılıp bırakıldığında 511 e kadar teker sayıyor.
fakat tusa uzun basınca hızla saymasını istiyorum. Ne yapmalıyım.

DMXADRES:
WHILE ENTER=1:WEND
GOSUB TEMIZLE
DMX_AYAR:
LCDOUT $FE,$94, "DMX:",# DMX,"           "

IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
DMX=DMX+1
    IF DMX=512 THEN DMX=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
DMX=DMX-1
    IF DMX=0 THEN DMX=511
ENDIF
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Hattuşa


IF YUKARI=1 THEN
WHILE YUKARI=1
DMX=DMX+1
    IF DMX=512 THEN DMX=1
delayms 100

WEND

ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1
DMX=DMX-1
    IF DMX=0 THEN DMX=511
delayms 100
WEND

ENDIF


while döngüsünün içinde sayac değerini artırma işlemi yaparsanız. tuşa basılı tutulduğu sürece hızlı bir şekilde sayaç değeri artacaktır. buton bırakıldığında ise zaten while döngüsünden çıkıldığı için sayac değerinde bir işlem yapılmayacaktır. burada kritik olan delayms 100 değeri yani sayac değerinin değişim hızını bu bekletme ile ayarlayabilirsiniz

elektro77

"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

F®T

#3
Sanırım önce 1 artarak  sayacak bir süre sonra örneğin 5 'erli olarak sayacak devam edecek.Yanlış anlamadım ise Aşağıdaki kodu denermisin.


ART VAR BYTE   'BU DEĞİŞKENLER TANIMLANACAK
SAY VAR BYTE
ART=0
SAY=0

BASLA:

IF YUKARI=1 THEN   'EĞER YUKARI BUTONU BASILI İSE
SAY=SAY+1          'BU HIZLANMA İÇİN KULLANDIĞIMIZ SAYAÇ
IF SAY<20 THEN ART=1  'EĞER SAY SAYACI 20 DEN KÜÇÜKSE ART DEĞİŞKENİ 1 OLACAK VE 1 ARTARAK SAYACAK
IF SAY>=20 THEN ART=5 'EĞER SAY 20 YE EŞİT VE BÜYÜK OLURSA ART 5 OLACAK VE SAYAC 5 TOPLAYARAK SAYMAYA BAŞLICAK
DMX=DMX+ART           'ART DEĞİŞKENİ NE İSE DMX ONUNLA TOPLANARAK GİDİCEK
IF DMX=512 THEN DMX=1:SAY=0
PAUSE 50
IF YUKARI=0 THEN SAY=0 'BUTON BIRAKILIRSA SAY DEĞİŞKENİ 0 LANACAK.TEKRAR BASILIRSA TEKRAR 1 ARTACAK SONRA 5 ER ARTACAK
ENDIF

IF ASAGI=1 THEN
SAY=SAY-1
IF SAY<20 THEN ART=1
IF SAY>=20 THEN ART=5
DMX=DMX-ART
IF DMX=0 THEN DMX=511:SAY=0
PAUSE 50
IF ASAGI=0 THEN SAY=0
ENDIF

GOTO BASLA


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

ete

Ana konuya geçmeden dikkatimi çeken Kod yazım tekniğin konusunu tartışmak isterim.
DMXADRES:
WHILE ENTER=1:WEND
GOSUB TEMIZLE
DMX_AYAR:
LCDOUT $FE,$94, "DMX:",# DMX,"           "

IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
DMX=DMX+1
    IF DMX=512 THEN DMX=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
DMX=DMX-1

Kodun baş tarafında yer alan satır nedeni ile ENTER tuşuna basılmadan koda aşağı bölümlere geçmeyecektir.
Amacın ENTER+YUKARI yada ENTER+AŞAĞI kombinasyonlarını yakalamak ise sözüm yok ama zaten ENTER+AŞAGI kombinasyonu bile YUKARI tuşuna bağlı gözüküyor. Amacın nedir acaba?
Bu gibi kodlarda tuşa basıldığı anda işlem yapacak şekilde kod yazılır. Grünüşe göre Tuşa basıldığında Port Pini LOW oluyor.
O halde
IF TUS=0 THEN
SAYAC=0
WHILE TUS=0
   SAYAC=SAYAC+1
...
..
şeklinde kod yazılır.
Bu şekilde bir tuşa ulaşmak için diğer tuşa basılması beklenmemiş olur.

Gelelim asıl konuya, Uzun tuşa basılması durumunda değerin hızlı değişmesi için iki yol mevcut.
- Ya tuş artırım gecimesini değiştireceksin
- Yada birim artırım miktarını değiştireceksiniz.
İkisinde de örnek vereyim.
Tuş Artırım Gecikmesini değiştirmek,
IF TUS=0 THEN
  GECIKME=100:SAYAC=0
  WHILE TUS=0
    SAYAC=SAYAC+1
    IF SAYAC=1000 THEN GECIKME=50
   DEGER=DEGER+1
   PAUSE GECIKME  'sayac değeri 1000 oluncaya kadar gecikme 100 ms sonrasında ise 50 ms olacak ve sayma hızlanacaktır.
WEND
ENDIF


Tuş Artırım birim değerini değiştirme:
IF TUS=0 THEN
   EKLE=1:SAYAC=0
   WHILE TUS=0
      SAYAC=SAYAC+1
      IF SAYAC=1000 THEN EKLE=10
      DEGER=DEGER+EKLE
      PAUSE 100
   WEND
ENDIF


Ete

elektro77

Hocam amacım: menüsü olan bir program yazmayı öğrenmek. İlk aklıma gelen şey ise bizim ses ışıkta kullandığımız moving head olarak tabir ettiğimiz disko robotlarının menüsünü oluşturabilmek oldu. Çünkü en çok uğraştığımız şey onlar.
Size ekte menüsünde 3 alt başlıklı olan uygulamaya çalıştığım yazılımı ve proteus simülasyonunu ekte göderdim. Bu programda daha önce internetten indirdiğim pbp de yazılmış bir kuluçka makinesi örneğinden faydalandım. Sizin haftalık timer yazılımına da bakıyorum ara sıra. eksiğim case değişkenini daha önce çok fazla tecrübe etmemiş olmam.
Değerlendirip gidişatım hakkında yorum yapar yanlışlarımı da aktarırısanız sevinirim.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

Yukarıda gönderilen tüm kodları uyguladım ama sonuca ulaşamadım.
while wend komutu uygulanınca olmuyor. çünkü tusa tek bastıgımda tek tek yukseliyor tamam. Ama while wend içinde, uzun basma yapınca tusu bırakmadan saymıyor ve bırakınca yine 1 artıyor.
While wend kullanmadan ise en fazla gecikme değerinde bile tek basmada bile 3 er 5 er artıyor.(frekans 20 Mhz)
en son uyguladığım kodlar bunlar.
IF YUKARI=1 THEN   'EĞER YUKARI BUTONU BASILI İSE
DMXSYC=DMXSYC+1          'BU HIZLANMA İÇİN KULLANDIĞIMIZ SAYAÇ
IF DMXSYC<65535 THEN ART=1  'EĞER SAY SAYACI 20 DEN KÜÇÜKSE ART DEĞİŞKENİ 1 OLACAK VE 1 ARTARAK SAYACAK
IF DMXSYC>=65535 THEN ART=5 'EĞER SAY 20 YE EŞİT VE BÜYÜK OLURSA ART 5 OLACAK VE SAYAC 5 TOPLAYARAK SAYMAYA BAŞLICAK
DMX=DMX+ART           'ART DEĞİŞKENİ NE İSE DMX ONUNLA TOPLANARAK GİDİCEK
IF DMX=512 THEN DMX=1:DMXSYC=0
PAUSE 50
IF YUKARI=0 THEN DMXSYC=0 'BUTON BIRAKILIRSA SAY DEĞİŞKENİ 0 LANACAK.TEKRAR BASILIRSA TEKRAR 1 ARTACAK SONRA 5 ER ARTACAK
ENDIF

IF ASAGI=1 THEN
DMXSYC=DMXSYC-1
IF DMXSYC<20 THEN ART=1
IF DMXSYC>=20 THEN ART=5
DMX=DMX-ART
IF DMX=0 THEN DMX=511:DMXSYC=0
PAUSE 50
IF ASAGI=0 THEN DMXSYC=0
ENDIF

"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

Bu algoritmada da olmadı.
Ne istediğimi tekrar açıklamamda fayda var sanırım.
tusa her bastığımda 1 artacak. Amam aynı tuşa uzun bastığımda yine birer birer artacak ama tus basılı olduğu sürece hızlı bir şekilde artmaya devam edecek. Ta ki 511 e kadar.
IF YUKARI=1 THEN
   EKLE=1:dmxsyc=0
'   WHILE YUKARI=1
      dmxsyc=dmxsyc+1
      IF dmxsyc=65530 THEN EKLE=10
      dmx=dmx+EKLE
      PAUSE 100
'   WEND
ENDIF
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

#8
Bu şey bu kadar zor olmamalı. Neden cevap yok. Ben mi. bir şeyi yanlış yapıyorum.
EKLE değişken tanımını
EKLE VAR WORD olarak atadım.
dmxsyc değişkenini ise
dmxsyc VAR WORD olarak atadım.
burda mı bir yanlış var
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

F®T

Benim yazdığım kodları denedinmi?
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

elektro77

#10
Alıntı yapılan: F®T - 17 Ağustos 2018, 12:17:41
Benim yazdığım kodları denedinmi?
evet denedim olmadı. sizinm verdiğinizde tek basmada bile çok artıyor.
Ne istediğimi tekrar açıklamamda fayda var sanırım.
tusa her bastığımda 1 artacak. Amam aynı tuşa uzun bastığımda yine birer birer artacak ama tus basılı olduğu sürece hızlı bir şekilde artmaya devam edecek. Ta ki 511 e kadar.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

F®T

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

elektro77

Alıntı yapılan: F®T - 17 Ağustos 2018, 12:28:57
Pause 50 degerini 500 yap dene

tek basmada tek artma düzeldi ama bu kezde basılı tutunca çok yavaş ilerliyor.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

F®T

Degeri oynayarak istedigin hızı ayarlarsın.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

elektro77

Mesajı gönderdiğinizden beri oynamadığım ne puse değeri nede say değeri kaldı. Fakat ya tek basmada çok artıyor. Ya da uzun basmada çok yavaş ilerliyor. Frekansım 20 mhz olmasına rağmen.
pause 500 yapınca tek basma da tek tek artması tamam.
uzun basınca 10 ar yükselecek şekilde ayarlayınca da tamam.
Fakat benim istgediğim uzun basınca 10 ar değil 1 er olacak şekilde hızlıca veya logaritmik hızlanarak sayması.
Ama en yakın çalışma şekli sizin yazdığınız kodlarda gerçekleşti.
While wend komutları içinde kesinlikle olmuyor.
Çünkü sayma hareketini aynı zamanda ekranda görmek istiyorum.
while wend komutunda araya lcd komutu koymama rağmen olmadı.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Powered by EzPortal