if döngüsü hakkında yardım

Başlatan pisiarzu, 20 Nisan 2007, 20:28:13

pisiarzu

Selam arkadaşlar ben foruma yeni katıldım.
Hobi olarak MCU Piclerle ilgileniyorum.

Basit bir program yaptım. Fakat bu programda çok fazla if döngüsü kullandığım için çok fazla hafızayı kaplıyor.

Bu döngüyü başka nasıl yazabilirim ?

Şimdiden yardımcı olan arkadaşlara teşekkürler.


IF mesaj[0]="K" AND mesaj[1]="A" AND mesaj[2]="P" AND mesaj[3]="A" AND mesaj[4]="L" AND mesaj[5]="I" THEN
	portb.4=0
ENDIF

SpeedyX

if bir döngü değil.

Başka türlüde yazamazsın sanırım, asm ile dene belki daha az yer kaplar.

mech

for a=1 to 5
if mesaj[a]=x then c=c+1
next
if c=5 then high portb.5

gibi yazabilirsin ama, x düzenli değişen bir şeyler olsaydı.

Ya da herbir stringi yanyana toplayarak yazdırabilirsen
mesaj=mesaj+mesaj_gelen
if mesaj="kapalı" then high portb.5
pbp+'da olduğunu zannediyorum.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

sitenindelisi

Haberleşme sonrası gelen mesaja göre bazı işlemleri yaptırmak istiyorsunuz sanırım. Eğer doğru anladı isem, bu sol kulağınızı sağ linizle göstermek gibi.
Bir bitlik  işlemi yaptırmak için 5-6 byte data göndermek müsrifliktir bu tip basit işlemlerde.
Şöyle düşünün;

A portunun 5. bitini H veya Low yapmak istiyorsunuz. fazla detaya girmeden ve pininizde yeterli ise direkt olarak 0b00100000 göndermeniz yeterli.
örnek:
' seri data 0b00100000
temp_1 = seri data 
PortA= temp_1

Derseniz bilgi gönderen kaynağım sadece ascii gönderiyor, göndermeniz gereken bilgi;
A51
3 byte bilgi gönderiyoruz.
A=port seçme
5=bit seçme
1= H  / 0=L

Basic tabanlı çalıştığınıza göre, alma tarafında ise;
Temp var byte[3]
mask var byte
3 byte data alınmış durumda(serin vb...: Serin (str temp\3  )

select case temp[0]
    CASE "A"
        goto a
    CASE "B"
        goto b
end select
goto main
a:
if temp[2]=0 then
mask=1
goto maske_0
else
mask=1
goto maske_1
b:
.
.
.
maske_0:
mask=mask<< temp[1]-1
mask=255-mask
porta=porta& mask
goto main
mask_1:
mask=mask<< temp[1]-1
porta=porta | mask
goto main


Fikir vermesi açısından yazdım. Yazım kurallarına riayet etmemiş olabilirim. Uzun süredir kullanmadığım için sanırım bazı komut ve dizilimi unutmuşum. Siz isterseniz, helpi incelersiniz.

pisiarzu

Yardımcı olan arkadaşlara teşekkür ederim.

Seri olarak veri alıyorum. Arka arkaya 60 bytelık veri alıyorum.
bunu HSERIN komutu ile alıyorum.

daha sonrada komuta göre açma yada kapatma işlemi yapıyorum.

Sanırım if komutundan başka bir şey kullanamayacağım.


Çok teşekkür ederim.

forsa1975

Alıntı Yap
IF mesaj[0]="K" AND mesaj[1]="A" AND mesaj[2]="P" AND mesaj[3]="A" AND mesaj[4]="L" AND mesaj[5]="I" THEN 
   portb.4=0 
ENDIF

122 Word kullanılıyor


mesaj var byte
basla:
IF mesaj[0]="K" then
    if mesaj[1]="A" then
        if mesaj[2]="P" then
            if mesaj[3]="A" then
                if mesaj[4]="L" then
                    if mesaj[5]="I" THEN 
                       portb.4=0 
                    ENDIF
                ENDIF
            ENDIF
        ENDIF
    ENDIF
ENDIF



goto basla
end


49 word kullanılıyor

Aynı işi yapıyorlar fakat daha az bellek harcıyor.  Genelde if koşulllarında and  kullanmak yerine iç içe if kullanıyorum.

 Sitenindelisi  çok akıllıca fikir vermiş ! Eğer girişi değiştirme şansın var ise , gelen bilgiyi daha kısa mümkünse tek harf "k" kapalı "a" açık gibi gönder.

pisiarzu

Yardımın için teşekkürler.

Gelen veriyi değiştirme şansım yok ne yazıkki :(

Tekrar teşekkürler

Alıntı yapılan: "forsa1975"
Alıntı Yap
IF mesaj[0]="K" AND mesaj[1]="A" AND mesaj[2]="P" AND mesaj[3]="A" AND mesaj[4]="L" AND mesaj[5]="I" THEN 
   portb.4=0 
ENDIF

122 Word kullanılıyor


mesaj var byte
basla:
IF mesaj[0]="K" then
    if mesaj[1]="A" then
        if mesaj[2]="P" then
            if mesaj[3]="A" then
                if mesaj[4]="L" then
                    if mesaj[5]="I" THEN 
                       portb.4=0 
                    ENDIF
                ENDIF
            ENDIF
        ENDIF
    ENDIF
ENDIF



goto basla
end


49 word kullanılıyor

Aynı işi yapıyorlar fakat daha az bellek harcıyor.  Genelde if koşulllarında and  kullanmak yerine iç içe if kullanıyorum.

 Sitenindelisi  çok akıllıca fikir vermiş ! Eğer girişi değiştirme şansın var ise , gelen bilgiyi daha kısa mümkünse tek harf "k" kapalı "a" açık gibi gönder.