avatar_elektro77

uzun tuşta hızlı saydırma

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

elektro77

Alıntı yapılan: pro-TR - 16 Ağustos 2018, 21:18:01

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

Hocam sizin gönderdiğiniz bu kadarcık kodlarla neredeyse istediğim gibi çalışıyor.
Fakat tek basmada çok artma sizde de var.
ms yi ayarlayınca bu kezde uzun basmada yavaş ilerliyor.
Yani yine aynı sorunlar.

ben sizin gönderdiğiniz kodlarda while ile wend arasına artmayı ekranda görebilmek için Lcd komutu yerleştirdim.
IF YUKARI=1 THEN
WHILE YUKARI=1
dmx=dmx+1
pause 200
LCDOUT $FE,$94, "DMX:",# DMX,"         "
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

#16
EN İYİ ÇALIŞTIĞI HALİ OLMASINA RAĞMEN İSTEDİĞİM GİBİ DEĞİL.
IF YUKARI=1 THEN
WHILE YUKARI=1
SAY=SAY+1
IF SAY<7 THEN ART=1
IF SAY>=7 THEN ART=10
dmx=dmx+art
IF DMX>511 THEN DMX=1:SAY=0
LCDOUT $FE,$94, "DMX:",# DMX,"         "
gosub delay:gosub delay:gosub delay:gosub delay:gosub delay:gosub delay
IF YUKARI=0 THEN SAY=0
WEND
ENDIF

IF ASAGI=1 THEN
WHILE ASAGI=1
SAY=SAY+1
IF SAY<7 THEN ART=1
IF SAY>=7 THEN ART=10
DMX=DMX-ART
IF DMX<1 THEN DMX=511:SAY=0
LCDOUT $FE,$94, "DMX:",# DMX,"         "
gosub delay:gosub delay:gosub delay:gosub delay:gosub delay:gosub delay
IF ASAGI=0 THEN SAY=0
WEND
ENDIF



DELAY:

for z=0 to 7000
next
return

"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 algoritmayı yapamadığımıza inanamıyorum.
"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

O zaman istediğin gibi yapmaya çalış.Sana bu yazılan programlar yol gösterme açısından yeterli.Top sende.Hadi bakalım.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

elektro77

#19
İŞTE BU PROGRAM İSTEDİĞİMİN %95 I GİBİ ÇALIŞIYOR.
Bi deneyip eksiklerimi söylermisiniz.

'---------------------------değişkenler-----------------------------------------
    say var WORD
    EKLE VAR BYTE
    DMX VAR WORD
    dmxsyc var BYTE
    Z vAR word
    MENU     VAR   PORTA.0
    YUKARI   VAR   PORTA.1
    ASAGI    VAR   PORTA.2
    enter    var   porta.4
'----------------------------------------------------------       

LCDOut $FE,1       ' LCD de CLS yapar
PAUSE 100

BASLA:
lcdout $FE,$80, "  TUSA UZUN BASMA   "
lcdout $FE,$C0, "       iSLEMi       "
lcdout $FE,$94, "     UMiT GUNGOR    "
lcdout $FE,$D4, "DMX:",# DMX,"         "

   
DMX_ARTIRMA:
SAY=0
IF YUKARI=1 THEN
GOSUB DUR1
GOSUB EKRAN
ENDIF

DMX_ARTIRMA_HIZLI:
IF YUKARI=1 THEN
WHILE YUKARI=1
SAY=SAY+1
IF SAY<10000 THEN EKLE=1
IF SAY>=10000 THEN EKLE=1
dmx=dmx+EKLE
GOSUB DELAY
IF DMX>511 THEN DMX=1:SAY=0
GOSUB EKRAN
IF YUKARI=0 THEN SAY=0
WEND
ENDIF
'--------------------------
DMX_EKSILTME:
SAY=0
IF ASAGI=1 THEN
GOSUB DUR2
GOSUB EKRAN
ENDIF

DMX_EKSILTME_HIZLI:
IF ASAGI=1 THEN
WHILE ASAGI=1
SAY=SAY+1
IF SAY<10000 THEN EKLE=1
IF SAY>=10000 THEN EKLE=1
dmx=dmx-EKLE
GOSUB DELAY
IF DMX<1 THEN DMX=511:SAY=0
GOSUB EKRAN
IF ASAGI=0 THEN SAY=0
WEND
ENDIF

GOTO BASLA
'-----------------------------------------------------------
DUR1:
GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY
GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY
DMX=DMX+1
IF DMX>511 THEN DMX=1:SAY=0
RETURN

DUR2:
GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY
GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY:GOSUB DELAY
DMX=DMX-1
IF DMX<1 THEN DMX=511:SAY=0
RETURN

EKRAN:
IF YUKARI=0 THEN SAY=0
lcdout $FE,$D4, "DMX:",# DMX,"         "
RETURN

DELAY:
SAY=0
for z=0 to 3000   'Z DEĞİŞKEN TANIMI WORD
next
return
"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

#20
kod yazarken bir şey farkettim.Sizin gönderdiğiniz programlarda saymayı aynı anda ekranda görebilmek için
While ve wend komut satırları arasına LCD out komutu koyunca program çok yavaşlıyor. sebebi nedir acaba.
"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

#21
birde kodlarda 10ar 10 ar geri gelinirken sorun oluyor .10ar geri gelmeye örneğin 6 dan geriye doğru başlarsa 65531 e denk geliyor du. bende aşagıdaki şekilde yaptım. daha kısa bir yolu varmı.
IF DMX<1 or dmx=0 or dmx=65535 or dmx=65534 or dmx=65533 or dmx=65532 or dmx=65532 or dmx=65331 or dmx=65530 or dmx=65529 or dmx=65528 or dmx=65527 THEN DMX=511:SAY=0
"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"

furkan41

eğer değer 0 a eşit veya kücük ise 0 a eşitle diyerek 0 da kalmasını sağlayabilirsin lcd out komutunu koyunca orada ekrana yazma işlemi yapacağı icin o komutunda bir cevrim süresi var onuda hesaba katarak programı tasarlamak gerekir.

F®T

Bana kalırsa proteuse dosyası ve kodu konuya ekle.Fırsat bulunca bakalım.
Sizin vaktiniz var ama burda çoğu kişi yoğun çalışıyor.Zaten istediğinizin aynısını burda insanların yapmasındansa yolu gösterip sizin tamamlamanız sizin açınızdan daha faydalı.Yoksa yapılmayacak bir durum değil.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Yalnızca şu satırların anlamlarına hiç dikkat ettinmi diye sormak istiyorum,
      IF SAY<10000 THEN EKLE=1
      IF SAY>=10000 THEN EKLE=1
      dmx=dmx+EKLE

Ekle değeri başından sonuna kadar hiç değişmiyor o halde neden böyle satırlara gerek duyuluyor. ? bunu merak ediyorum. Önceden ekle değeri farklı uygulanıyor olabilir ama madem değer değişmiyor o halde kaldır o satırları ve While döngüsü başına EKLE=1 yaz olsun bitsin.  Bir işe yaramadıkları gibi boşuna işi yavaşlatıyor bu satırlarr.

Ferit'in dediği gibi tam olarak ne beklediğini açıkça yazıp simulasyon dosyalarınıda buraya koyarsan üzerinde kafa yorabiliriz.
Her zaman söylerim ne veriyorsan onu alırsın. Burada vermekten kastım sorundaki bilgi detayı dır. Bizde sonuçta anladığımız kadarına cevap verebiliyoruz. Yada vermeye çalışıyoruz.

Ete

elektro77

DOSYALAR EKTEDİR.
Birde programda stack taşması oluyor. bi kontrol edermisiniz.
"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"

ete

İlişikteki programı bir dene istersen.
Bu tür değişik hızlı artırma eksiltme gerektiğinde benim kullandığım yöntem şöyledir.
Ilk 10 sayı için birer birer artırım yaptırırp sayac değeri 10'u aşınca artırmayı 10 lar hanesinden yaptırırım. Hızlıca yapılan bu saydırma işleminde gerekirse tuşu bırakıp tekrar basarak yeniden bir 10 luk birer birer saydırma yaptırıp hassas bir şekilde istediğim sayıya ulaşırım.
Burada da bu mantığı kullandım. Hem artırmada hem eksiltme kısmında. Uygulamam sadece DMX Artırma ve Eksiltme kısmında oldu.

Programda stack taşması yaratabilecek bir kusur buldum.  SELECT CASE SYC bölümünde  Case 0 seçeneğinde altta ,
GOSUB DMXADRES 
komut satırı GOTO DMXADRES şeklinde değiştirilmelidir. Zira DMX adres kısmından dönüş RETURN ile olamıyor. GOTO le dönüş yapıldığı için bu değişikliğin yapılması gerekir.
Yaptığım saydırma uygulamasını eksiltme kısmında da çalıştırabilmek amacı ile  DMX_EKRAN: alt programındaki ,
'IF YUKARI=0 THEN SAY=0  satırını sildim (a-kapatıp asif hale getirdim) Açık olursa eksiltme kısmında iş görmüyor aynı alt program.
İlişiktedir.
Sigorta satırlarını kendime göre değiştirdim. (PBP3.1 versiyon) gerekirse eklediğimi kapatıp kapalı olanları açabilirsin.

Ete

ete

Hala stack taşması mevcut. Ancak iz takip edilerek bulunabiliyor.
Şu andaki taşmaya REDLED bölümü sebep oluyor. Benzer durum henüz yazılmamış diğer led kontrollerinde de çıkabilir diye detay vereyim istedim.
Ayar Menüsünden Led kontrole GOSUB LEDKONTROL komutu ile gidiliyor.  (dönüş RETURN ile olmalı)
LEDKONTROL bölümünden GOSUB LEDDURUM  komutu ile Led Durum bölümüne gidiliyor.  (dönüş RETURN ile olmalı)
LEDDURUM bölümünden  GOSUB REDLED komutu ile Redled bölümüne gidiliyor (Dönüş Return ile olmalı)
REDLED bölümünden dönüş ise GOTO AYARLANDI komutu ile çıkılıyor.
AYARLANDI kısmında ise GOTO BASLA komutu ile Başlangıç kısmına yönlendiriliyor program.
Bakın kaç tane return eksik programda. Madem en sonda dönüş GOTO BASLA ile yapılıyor o halde yukarıdakilerden hiç birisi GOSUB ile gönderilmemesi gerekir. Hepsi Goto yapılmalı.
Düzeltilmiş son hali ilişiktedir.

Ete

elektro77

Evet hocam herzamanki gibi mükemmel olmuş.
Bu tip uygulamaların kronolojisi nedir hocam. Denediğim algoritmalar doğrumudur.
Menü uzadıkça kafam allak bullak olmaya başlıyor.
Kağıt üzerinde yazılım akış diyagramını nasıl bir yöntem ve teknikle çizmeliyim.
"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

birde ayarları hazfızada tutmak için eprom kullanılması gerektiğini biliyorum.
Bu yazılım için bir eprom örneği iliştirirmisiniz.
Yada epromsuz 3.7 volt bir pil kullansam (ayarların her elektrik kesintisinde kaybolmaması için) picin hangi pinine bu pili bağlamalıyım.
"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