IF..THEN, BRANCH yada BRANCHL komutları

Başlatan Kaldirim_Teknikeri, 12 Aralık 2009, 03:50:39

Kaldirim_Teknikeri

Bir döngü içinde aşağıdaki kod parçasını kullanmaktayım.

IF X=0 THEN GOSUB A 
IF X=1 THEN GOSUB B
IF X=2 THEN GOSUB B 
IF X=3 THEN GOSUB D
IF X=4 THEN GOSUB E 
IF X=5 THEN GOSUB F
IF X=6 THEN GOSUB G 
IF X=7 THEN GOSUB H
IF X=8 THEN GOSUB I
IF X=9 THEN GOSUB J


Yukarıdaki kod parçası hafızada çok yer harcadığı için yukarıdaki kodun aynısını aşağıdaki gibi yazıyorum.

BRANCH X,[A,B,C,D,E,F,G,H,I,J]


Fakat kod düzgün çalışmıyor. BRANCHL komutunuda denedim yine olmadı. Ben J etiketinin 1. kod sayfasında(2048. adresten önce) olduğunu nasıl anlarım?

16F877 kullanıyorum ve 3160Words

Maxim

Alıntı yapılan: "Kaldirim_Teknikeri"Bir döngü içinde aşağıdaki kod parçasını kullanmaktayım.

IF X=0 THEN GOSUB A 
IF X=1 THEN GOSUB B
IF X=2 THEN GOSUB B 
IF X=3 THEN GOSUB D
IF X=4 THEN GOSUB E 
IF X=5 THEN GOSUB F
IF X=6 THEN GOSUB G 
IF X=7 THEN GOSUB H
IF X=8 THEN GOSUB I
IF X=9 THEN GOSUB J


Yukarıdaki kod parçası hafızada çok yer harcadığı için yukarıdaki kodun aynısını aşağıdaki gibi yazıyorum.

BRANCH X,[A,B,C,D,E,F,G,H,I,J]


Fakat kod düzgün çalışmıyor. BRANCHL komutunuda denedim yine olmadı. Ben J etiketinin 1. kod sayfasında(2048. adresten önce) olduğunu nasıl anlarım?

16F877 kullanıyorum ve 3160Words

baktımda, if yerine branch komutu öyle değilmiş sanırım ,
gidilen yerlerinde sıralı bir isme sahip olması lazım diye düşünüyorum.

yani bunu denermisin ?
BRANCH X,[A_0, B_1, C_2, D_3, E_4, F_5, G_6, H_7, I_8, J_9]

ete

Branch komutu BRANCH ve BRANCHL olarak iki çeşittir.
Kullandığınız pic 2K ve daha küçük rom'a sahip ise BRANCH komutunu daha büyük hafızaya sahip ise BRANCHL komutunu kullanmanız gerekir.

BRANCH komutu baştaki index değişkeninin aldığı değere bağlı olarak köşeli parantez içinde verilen etiketlere programın dallanmasını sağlar. Bütün etiketler ayno kod parçası içinde olmalıdır. İndex sıra takip etmeli ama etiketlerde sıra söz konusu değildir.

BRANCHL komutu ise aynı şekilde çalışır ancak kod parçası sınırlaması yoktur. Etiketler programın herhangi bir yerinde olabilirler. Tabiiki derleme esnasında BRANCHL diğerine oranla 2 kat fazla kod üretir.

Index değişkeni byte cisninden olmalıdır.  Branch komutunda 255 ayrı  etikete dallanma yapılabilir. 18F serisinde bu 256 adettir.

BranchL komutunda ise 16F serisi 127 ayrı adrese dallanabilir ve 18F serisinde bu değer 256 dır.

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

Kaldirim_Teknikeri

maxiboost, zaten gittiğim yerlerdeki dizilim sizin verdiğiniz örnekteki gibi. Ama etiketle alakalı bir problem olmadığını düşünüyorum. 2k lık kod bloğunu aşmadığım için Branch komutu kullanıyorum. Yanlız Branch komutu main program içinde, Branch ile dallandığım yerlerden Return ile dönüyorum. Yani main program dışına dallanıyorum.

Müsait olduğum zaman inceleme yapıp buraya tekrar döneceğim yakın bir zamanda.

Ete Bey, elinize sağlık verdiğiniz bilgiler için yine detaylara inmişsiniz. Kitap bu kadar bilgi vermemiş. :lol:

Yazılarınız için tekrar teşekkür ederim. İyi günler dilerim.

Kaldirim_Teknikeri

Alıntı YapBRANCH indeks,[Etiket{,Etiket...}]


BRANCH: Programın indeks değerine göre farklı yerlere gitmesini sağlar. İndeks 0 ise program ilk etikete dallanır, 1 ise 2 nci etikete gibi. Branch komutu ile en fazla 255 etiket kullanılabilir.
   İndeks değerinin etiket sayısından büyük olduğu durumlarda hiçbir şekilde etiketlere dallanma yapılmayacak ve program bir sonraki satırdan devam edecektir.
   Etiketlerle belirtilen kodların Branch fonksiyonu ile aynı kod sayfasında olması gerekir. Eğer bundan emin değilsek BRANCHL komutunu kullanmalıyız.


BRANCHL indeks,[Etiket{,Etiket...}]
BRANCHL: (Branch Long)  Branch komutu ile farklı kod sayfalarındaki etiketlere dallanmak gerektiğinde BRANCHL kullanılır. PIC16F84, 16F628 gibi tek kod sayfası olan işlemcilerde Branch komutunu kullanmak yeterli olacaktır. Branchl fonksiyonu ile en fazla 127 etiket kullanılabilir.

TRISB = $0F        'portb üst 4 bit led çıkışı, alt 4 bit buton girişi olarak ayarla
PORTB = 0
option_reg.7 = 0 'pull-up aktif


Butonbilgi var byte
butonbilgi = 0


Basla:
    if portb & $0F = $0F then  butonbilgi = 0 'butonlar bırakıldıysa buton bilgisini sıfırla
    if portb.0 = 0 then butonbilgi = 1
    if portb.1 = 0 then butonbilgi = 2
    if portb.2 = 0 then butonbilgi = 3
    if portb.3 = 0 then butonbilgi = 4
    
    BRANCH butonbilgi,[sondur,yak1,yak2,yak3,yak4]
goto basla


sondur: 
    portb = 0
goto basla
    
yak1:
    portb.4 = 1
goto basla


yak2:
    portb.5 = 1
goto basla


yak3:
    portb.6 = 1
goto basla


yak4:
    portb.7 = 1
goto basla


end