Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Sayıcıya sınır koyma

Başlatan certy, 05 Ağustos 2013, 00:50:44

certy

Örneğin byte bazında 0-255 arasında bir sayımız var. 2 tane de butonumuz var arttırmak ve azaltmak için. Ama sayıcımız 255 değerine ulaştığında tekrar 0'a atlamaması için ne yapmak gerekir? Ben şöyle bir şey denedim ama olmadı.

IF SAYI=255 THEN SAYI=255


Ne yapmam gerekir?
TA1USS

Erol YILMAZ

program da artırma ve azaltma yaptığın kısmı koyarsan daha anlamlı olur.

certy

#2
Alıntı yapılan: Allegro - 05 Ağustos 2013, 00:57:14
program da artırma ve azaltma yaptığın kısmı koyarsan daha anlamlı olur.
SAYI VAR BYTE

SAYI=0

BASLA:

IF PORTA.0=0 THEN
PAUSE 200
SAYI=SAYI+1
ENDIF

IF PORTA.1=0 THEN
PAUSE 200
SAYI=SAYI-1
ENDIF

GOTO BASLA

END
TA1USS

muhittin_kaplan

#3
SAYI VAR BYTE

SAYI=0

BASLA:

IF PORTA.0=0 THEN
    if sayı<255
       PAUSE 200
       SAYI=SAYI+1
    else
       sayi=255
ENDIF

IF PORTA.1=0 THEN
    IF SAYI=0 THEN 
        sayı=0
    else
         sayı=sayı-1
ENDIF

GOTO BASLA

END


herhalde böyle olur

XX_CİHAN_XX

Aşağidaki mantığı basic olarak kodlayabilirsin.

//artirma kismi icin
if(sayi!=255)      //Eğer sayi 255 değilse
   sayi++;           //sayiyi artir


//eksiltme için şunu
if(sayi!=0)           //Eğer sayi sifir değilse
   sayi--;             //sayiyi eksilt



Edit: aynı anda göndermişiz :)
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

certy

#5
Alıntı yapılan: muhittin_kaplan - 05 Ağustos 2013, 01:25:21
SAYI VAR BYTE

SAYI=0

BASLA:

IF PORTA.0=0 THEN
    if sayı<255
       PAUSE 200
       SAYI=SAYI+1
    else
       sayi=255
ENDIF

IF PORTA.1=0 THEN
    IF SAYI=0 THEN 
        sayı=0
    else
         sayı=sayı-1
ENDIF

GOTO BASLA

END


herhalde böyle olur

IF without a matching ENDIF hatası veriyor. :)

mesaj birleştirme:: 05 Ağustos 2013, 01:58:47

Alıntı yapılan: XX_CİHAN_XX - 05 Ağustos 2013, 01:30:57
Aşağidaki mantığı basic olarak kodlayabilirsin.

//artirma kismi icin
if(sayi!=255)      //Eğer sayi 255 değilse
   sayi++;           //sayiyi artir


//eksiltme için şunu
if(sayi!=0)           //Eğer sayi sifir değilse
   sayi--;             //sayiyi eksilt



Edit: aynı anda göndermişiz :)

Dediğini yaptım ama sayı 255'e ulaşınca kendi kendine 254'e geliyor. 0'a gelip azalta basınca tekrar 255'e atlıyor, sonra 255 kendi kendine yine 254 oluyor.
TA1USS

XX_CİHAN_XX

#6
Normal şartlarda 254 e gitmez. Kodun son halini gönderir misin?
Artırma kısmın ve eksiltme kısmın arka arkaya çalışıyor. Bunlar ayrık olaylar, iki olayı da peş peşe yazmadın herhalde demi?

Basicten çok anlamam ama şöyle birşey yapman gerekirdi

SAYI VAR BYTE

SAYI=0

BASLA:

IF PORTA.0=0 THEN
   IF SAYI<255 THEN
      PAUSE 200
      SAYI=SAYI+1
   ENDIF
ENDIF

IF PORTA.1=0 THEN
   IF SAYI>0 THEN
      PAUSE 200
      SAYI=SAYI-1
   ENDIF
ENDIF

GOTO BASLA

END
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

XX_CİHAN_XX

#7
Yanlış işte iki olayı peş peşe aynı case içine koyarsan önce artırır sonra azaltır ben sana butonlu haline göre kodu düzenledim olayı anladın mı?
Artırma gerektiği noktaya bunu
IF BALANS!=255 THEN
BALANS=BALANS+1 
ENDIF


Azaltman gerek yere de bunu yazacaksın
IF BALANS!=0 THEN
BALANS=BALANS-1
ENDIF

Sen ikisini arka arkaya yazarsan bir artar bir azalır bu nedenlede 255 olamadan 254 e döner.
Butonlu verdiğin örneğe göre kodu düzenledim burada ki gibi kullanman gerek
SAYI VAR BYTE

SAYI=0

BASLA:

IF PORTA.0=0 THEN
   IF SAYI<255 THEN
      PAUSE 200
      SAYI=SAYI+1
   ENDIF
ENDIF

IF PORTA.1=0 THEN
   IF SAYI>0 THEN
      PAUSE 200
      SAYI=SAYI-1
   ENDIF
ENDIF

GOTO BASLA

END
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

certy

#8
Alıntı yapılan: XX_CİHAN_XX - 05 Ağustos 2013, 02:23:34


case 4

IF ARTTIR=0 THEN
PAUSE 200
BALANS=BALANS+1
ENDIF

IF BALANS!=255 THEN
BALANS=BALANS+1 
ENDIF

IF AZALT=0 THEN
PAUSE 200
BALANS=BALANS-1
ENDIF

IF BALANS!=0 THEN
BALANS=BALANS-1
ENDIF

LCDOUT $FE,$80,"                    "
LCDOUT $FE,$C0,"                    "
LCDOUT $FE,$94,"                    "
LCDOUT $FE,$D4,"BAL= ",DEC3 BALANS

end select


Şöyle yapınca oldu Fakat 0-254 arası sayıyor. Ama sorun değil. İşimi görür. Sağolasın.
TA1USS

XX_CİHAN_XX

Case dışına çıkarmak önemli değil :)
Programın çok karışık ve bende basic ten anlamıyorum. Bu nedenle Yapmaya çalıştığın case yapısını çözemedim.
Hangi durumda artırma yapman gerekiyor, hangi durumda azaltma yapman gerekiyor bunu netleştir melisin.
İkisi aynı anda olmaz! Artırma gereken durumda yukarıda verdiğim artırma şeklini uyguladıysan program bunun arkasından azaltma kısmına direk gitmemeli. Sadece azaltma yapman gereken koşul oluştuğu zaman gitmeli. Programının bu şekilde olduğundan emin olmalısın. Bahsettiğin hata bundan ileri geliyor.

Bunların her biri ayrı case dir. Atıyorum artırma yapma koşulu case 4 ise, azaltma durumuna baska bir case vermelisin misal case 5 gibi.
Onun case in dışına çıkarmak demek programın her seferinde oraya uğraması demektir. Artırma ve azaltma işlemleri ilgili koşul oluştuğu zaman çalışmalı onun dışında asla!
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

certy

Alıntı yapılan: XX_CİHAN_XX - 05 Ağustos 2013, 02:36:10
Case dışına çıkarmak önemli değil :)
Programın çok karışık ve bende basic ten anlamıyorum. Bu nedenle Yapmaya çalıştığın case yapısını çözemedim.
Hangi durumda artırma yapman gerekiyor, hangi durumda azaltma yapman gerekiyor bunu netleştir melisin.
İkisi aynı anda olmaz! Artırma gereken durumda yukarıda verdiğim artırma şeklini uyguladıysan program bunun arkasından azaltma kısmına direk gitmemeli. Sadece azaltma yapman gereken koşul oluştuğu zaman gitmeli. Programının bu şekilde olduğundan emin olmalısın. Bahsettiğin hata bundan ileri geliyor.

Bunların her biri ayrı case dir. Atıyorum artırma yapma koşulu case 4 ise, azaltma durumuna baska bir case vermelisin misal case 5 gibi.
Onun case in dışına çıkarmak demek programın her seferinde oraya uğraması demektir. Artırma ve azaltma işlemleri ilgili koşul oluştuğu zaman çalışmalı onun dışında asla!

case 4

IF ARTTIR=0 THEN
PAUSE 200
BALANS=BALANS+1
ENDIF

IF BALANS!=255 THEN
BALANS=BALANS+1 
ENDIF

IF AZALT=0 THEN
PAUSE 200
BALANS=BALANS-1
ENDIF

IF BALANS!=0 THEN
BALANS=BALANS-1
ENDIF

LCDOUT $FE,$80,"                    "
LCDOUT $FE,$C0,"                    "
LCDOUT $FE,$94,"                    "
LCDOUT $FE,$D4,"BAL= ",DEC3 BALANS

end select


Şöyle yapınca oldu Fakat 0-254 arası sayıyor. Ama sorun değil. İşimi görür. Sağolasın.  :)

Şimdi 4 tane pinimiz var. Bu pinlerden ayrı ayrı duty cycle'ları ayalanabilen 4 tane PWM çıkıyor. Her case'de bir pinin duty cycle'ı kontrol ediliyor. Ve lcd'ye yazılıyor. Basit olarak böyle açıklayabiliriz.
TA1USS

XX_CİHAN_XX

Şöyle yapsan sanki daha güzel olabilir

IF ARTTIR=0 THEN
   IF BALANS!=255 THEN
      PAUSE 200
      BALANS=BALANS+1 
   ENDIF
ENDIF

IF AZALT=0 THEN
   IF BALANS!=0 THEN
      PAUSE 200
      BALANS=BALANS-1
   ENDIF
ENDIF
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

certy

Alıntı yapılan: XX_CİHAN_XX - 05 Ağustos 2013, 03:11:08
Şöyle yapsan sanki daha güzel olabilir

IF ARTTIR=0 THEN
   IF BALANS!=255 THEN
      PAUSE 200
      BALANS=BALANS+1 
   ENDIF
ENDIF

IF AZALT=0 THEN
   IF BALANS!=0 THEN
      PAUSE 200
      BALANS=BALANS-1
   ENDIF
ENDIF


IF without a matching ENDIF hatası alıyorum böyle yapınca.
TA1USS

XX_CİHAN_XX

C gibi düşündüğüm için hata vermiş baktım basic te yapmaya çalıştığım şey şöyle oluyoruş;

IF ARTTIR=0 AND BALANS!=255 THEN
   PAUSE 200
   BALANS=BALANS+1 
ENDIF

IF AZALT=0 AND BALANS!=0 THEN
   PAUSE 200
   BALANS=BALANS-1
ENDIF


Birde böyle deneyin olması gerekir.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

muhittin_kaplan

1. ders
Programlamada açtığın herşeyi geri kapat.

SAYI VAR BYTE

SAYI=0

BASLA:

IF PORTA.0=0 THEN
    if sayı<255
       PAUSE 200
       SAYI=SAYI+1
    else
       sayi=255
    endif
ENDIF

IF PORTA.1=0 THEN
    if SAYI=0 THEN 
        sayı=0
    else
         sayı=sayı-1
    endif
ENDIF

GOTO BASLA

END


2.ders
Yazdığın kodlar OKUNABİLİR olsun, hepsini sola yanaşık yazarsan bir müddet sonra hangi komut nereyi etkiliyor karıştırırsın.