Bank1'deki Değişkenleri Kullanma sorunu

Başlatan mesmert, 26 Eylül 2007, 12:14:03

mesmert

Selam Arkadaşlar Bank0 kullandığım değişkehn tanımlamaları yetmediğinden dolayı BANK1 dekilerini kullanmak istiyorum bu değişkenleri nasıl kullanabilirim kullanmak için yoksa bankmı değiştirmem lazım ben bank0 gibi kullanmaya çalıştım sorun çıktı.

CLR

@mesmert

Programın başında Ram block'unu aşağıdaki gibi tanımla sonra, program içinde bank1'e geç ve işlemini yap.

  CBLOCK   0xA0    ; Buraya Bank1 başlangıç adresini yaz (Örnek F877 için)
    REGISTER_1
    REGISTER_2
    ....
    ....
    REGISTER_X
    ENDC
  
    Program içinde bank1'e geçtikten sonra registerlere okuyup yazabilirsin
Knowledge and Experience are Power

mesmert

Program içerisinde bank değiştirip okuyunca sorun çıkmıyor acaba bunun başka bir kısayolu varmıdır diye sordum.

sigmoid

kullandığın değişkenin hangi bankta olduğunu hatırlamakta zorluk çakiyorsan

BANKSEL değişkenadı

şeklinde bank değiştirebilirsin.  örneğin BANKSEL TRISA gibi
bu durumda mplab derlerken onu bsf status,rp0 olarak kendini çevirecektir.

XX_CİHAN_XX

Basit bir örnekle göstermek gerekirse.
  BANKSEL   TRISB   ;TRISB registerinin olduğu banka geç
   CLRF   TRISB         ;TRISB yi clear et
   BANKSEL   PORTB  ;PORTB nin olduğu banka geri dön.

Burada BANKSEL fonksiyonunun yaptığı iş ulaşmak istediğin registerin bulunduğu banka geçmektir.Sen BANKSEL kullanmadan direk STATUS un rp0 ve rp1 pinleri ile istediğin registere ulaşabilirsin.
Farklı banklardaki registerlere ulaşmanın bir yolu daha vardır.Oda indirect adresleme yöntemidir.FSR ile INDF kullanılarak yapılır.FSR ye ulaşmak istediğin registerin adresi yüklenir INDF ilede register işlemleri yapılır.FSR fiziksel bir registedir.Fakat INDF sanaldır.Bir çeşit köprü görevi görür.Her FSR adresi değiştiğinde FSR nin gösterdiği registerin değiri INDF e yerleşir.Aynı şekilde INDF e yüklediğin sayıda FSR ile seçtiğin registere yüklenmiş olur.Buda farklı sayfalardaki (yada bank0 daki) registerlere banksel demeden yada status ın rp0, rp1 bitleri ile oynamadan ulaşmanın başka bir yoludur.Örnek vermek gerekirse,
  MOVLW   0xB0
   MOVWF   FSR
   MOVF   INDF,W
   MOVWF   REG20

Bu programın bank0 da olduğunu düşünün.REG20 nin ise 0x20 nolu adreste yani bank0 da kayıtlı bir register olduğunu düşünün.Bu kod sayesinde bank0daki bir registere bank1 e geçmeden 0xB0daki(bank1 deki) bir regsiteri taşımış olduk.
C deki dizi mantığıda bu fsr , indf kombinasyonları ile yapılmaktadır. ;)
Kolay gelsin.
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.