Butona kaç defa basıldığını saymak "PBP ile"

Başlatan solidus, 16 Mart 2008, 19:15:50

solidus

Merhaba arkadaşlar, Senaryo şu:
16f84 ile 4 adet istasyonu kontrol edeceğiz. Tek butonumuz var. Butona ilk basıldığında 1 nolu led 2. basışta 2 nolu led ışık verecek ve sırasıyla 3 ve 4 gibi. FOR... NEXT işini beceremedim. Ama gerçekten uğraştım. Nasıl yapılır ?
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..

rercan

select case döngü şeklini  incelersen sonuca ulaşırsın

canbulut

ipucu:
for next döngüsünü kullanarak yapmak isterseniz
for next döngüsü içinde if deyimini kullanabilirsiniz.
yine yolunda gitmesse işler birlikte yapalım ;)

Maxim

bu kod işe yarar heralde .

AAA var Byte
AAA = 0

LOOP:
If PORTA.0 =1 Then 'BUTONA BASINCA
AAA = AAA +1
EndIf

If AAA >4 Then
AAA = 1
EndIf

If AAA =1 Then
PORTB.0 =1
Else
PORTB.0 =0 
EndIf

If AAA =2 Then
PORTB.1 =1
Else
PORTB.1 =0
EndIf

If AAA =3 Then 
PORTB.2 =1
Else
PORTB.2 =0
EndIf

If AAA =4 Then
PORTB.3 =1
Else
PORTB.3 =0
EndIf

GoTo LOOP

sitenindelisi

         durum=1
          portb=durum
          if buton =1 then
bekle:           if buton=1 then bekle
                    durum=durum <<1
                    if durum > %00001000 then durum=%00000001
                    portb=durum
          endif

solidus

@maxiboost,
MCU 16f84 yukarıdaki kodları yazarak denedim ama her basışta bir led şeklinde değil karışık bir şekilde ve sürekli yanıyorlar. Birde CPU load neredeyse % 100 oluyor.. FOR..NEXT kullanmak bu kadar yorarmı CPU'yu ?
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..

Maxim

Alıntı yapılan: "solidus"@maxiboost,
MCU 16f84 yukarıdaki kodları yazarak denedim ama her basışta bir led şeklinde değil karışık bir şekilde ve sürekli yanıyorlar. Birde CPU load neredeyse % 100 oluyor.. FOR..NEXT kullanmak bu kadar yorarmı CPU'yu ?

tabi kod üzerinde biraz çalışmak lazım ,
bir kere hiç bekleme koymadım , cpu o yüzden %100

aynı şekilde butona bastıktan sonrada bekleme yok ,
o yüzden butona basıldığı anda sayma işlemi sürekli devam ediyordur ,
mesela buton için while - wend komutu kullanılsa daha iyi olurdu .

bu şekli ile butona basmada belkide program 50 tur atıyordur ,
led ler o yüzden karışık yanıyordur .
kısacası biraz üzerinde çalış bence .

bu arada sitenindelisi nin verdiği kodu da incele .

ete

Ledelri bir portun sıfırncı btinden itibaren dizersen işin daha kolay olur.
Örneğin ;
Led-1=PortB.0 da
Led-2=PortB.1 de
Led-3=portB.2 de
Led-4=PortB.3 de
olduğunu farz edelim. Buton da PortA.0 da olsun.
BASLA:
      IF PORTA.0=0 THEN
        IF SAYI=0 THEN 
           SAYI=1
        ELSE
           SAYI=SAYI*2
           IF SAYI=8 THEN SAYI=0
        ENDIF
      ENDIF
      PORTB=SAYI
      PAUSE 100
      GOTO BASLA

4 adet den daha fazla led kullanmak istersen ;
  If Sayi=8 Then Sayi=0 satırını değiştirmen gerekecek.
  if sayı=16
  if sayı=32
  if sayı=64
şeklinde bu satırları düzenleyebilirsin.

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

solidus

Minicik bi bekleme koydum herşey yoluna girdi. Daha iyisi FOR.. NEXT kullanmının mantığınıda anladım. maxiboost ve sitenin delisi çok sağolun..
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..

sitenindelisi

Alıntı yapılan: "ete"...
BASLA:
      IF PORTA.0=0 THEN
        IF SAYI=0 THEN 
           SAYI=1
        ELSE
           SAYI=SAYI*2
           IF SAYI=8 THEN SAYI=0
        ENDIF
      ENDIF
      PORTB=SAYI
      PAUSE 100
      GOTO BASLA

4 adet den daha fazla led kullanmak istersen ;
  If Sayi=8 Then Sayi=0 satırını değiştirmen gerekecek.
  if sayı=16
  ...

sanirim Ete` nin gozunden kactı, kucuk bir duzeltme yapmam gerekli.
IF SAYI=8 THEN SAYI=0

4 farkli cikisi kontrol etmek icin  8 i 16 ile degistirmeniz gerekli.

bahri

DEGER VAR BYTE
TRISA=%00000001
TRISB=0
PORTB=0
BUTON VAR PORTA.0
DEGER = 0
BASLA:
        IF BUTON =1 THEN
        PAUSE 150
           DEGER = DEGER + 1
           ENDIF
        IF DEGER =9 THEN DEGER = 1  
       
        GOSUB EKRAN  
       
        PAUSE 100
           PORTB=0
        GOTO BASLA
EKRAN:
        LOOKUP DEGER,[$0,$1,$2,$4,$8,$10,$20,$40,$80],PORTB
        RETURN
       
               END

YUKARDAKİ PROGRAM İŞİNİ GÖRÜR UMARIM. AMA TAVSİYEM 16F84 DEĞİL 16F628 KULLAN 628 İN FİYATI 3 YTL 84 ÜNKİ 4-4.5 YTL CİVARI HEM PARAYA YAZIK HEMDE 628 İN ÖZELLİKLERİ DAHA GÜZEL ARTIK 84 KULLANMANIN ZAMANI GEÇTİ DİYE DÜŞÜNÜYORUM.

solidus

Bu kodla da lambalar sürekli yürüyor..Benmi hata yapıyorum acaba ?
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..

sitenindelisi

@Bahri,
verdiğiniz kod  binary sayici olarak calisir. Tek pinden cikis vermez.
@Solidus,
verdiğim kod ile ayni anda 2 pin cikis vermez.
Yazdiginiz kodu paylasirsaniz daha verimli olur...

bahri

"sitenindelisi demişsinki verdiğin kod binary sayıcı olarak çalışır tek pinden çıkış vermez."
lookuptaki hex sayılara bakarsan binary sayıcı olarak çalışmadığını görebilirsin.
solidus senin amacın  tuşa bir kere basınca 1. ledin yanıp belli bir süre sonra sönmesi mi. tam açıklayabilirsen daha iyi yardımcı olabiliriz

Veli B.

Haklisiniz, gosubdan sonrasini farketmemisim.
Neden boyle bir yontem kullandiginizi merak ettim. Avantajlari nedir?