PIC18(L)F2X/4XK22 SFR Access Ram Sorunu ve Çözümü

Başlatan camby, 27 Şubat 2012, 18:56:41

camby

Aslında bu bir sorun değil küçük bir ayrıntı , ben bu konuda biraz vakit kaybettim o yüzden başka takılanlar olabilir diye buraya bir not düşüyorum.


Pic 18f46k22 kullanıyorum. Çok sayıda pini giriş yapmaya ihtiyacım vardı ancak giriş olarak çalıştıramamıştım.


1 - Bu seri pic'lerde Analog Modül çok sayıda pine gidiyor ( 30 Adet ). Portları digital input olarak kullanmak için de ANSELx registerını kullanmak gerekli.

2 - Şimdiye kadar kullandığım 18f piclerde tüm SFR'ler access RAM bölümünde bulunuyordu , erişimde hiçbir sorun yaşamamıştım.

Bu işlemcilerde ise RAM'de 0xF38 - 0xF5F arası SFR'ler access RAM'de değil , BANK 15'de . Sonuç olarak buradaki SFR'lara bank değiştirmeden erişilemiyor.

ANSEL'de bu bölümde bulunuyor. ANSEL'de değişiklik yapmak istiyorsanız BANK15'e geçmek gerekli..

Datasheet'in PORTC hazırlama bölümünde de gösterilmiş bu durum. Daha önceden bunu görmüştüm ancak klasik bir rutindir diye önemsememiştim.

Başka pic'lerde benzer durum var mı henüz rastlamadım ama assembly çalışan arkadaşlar dikkat etsin..

arslan74

Merhaba,
PIC18 de banklı çalışmak zorunda değilsin. PIC16 serileninde BANK kavramı var. PIC18 serisinde bank olmasını tek nedeni geriye dönük uyumlu olsun diye var. Ama banklara uğraşmadan doğrudan da registerle ulaşabilirsin.

Ayrıca PIC18 serisinde Analog hatları digitale cevirmek için ANSELA, ANSELB, ANSELC, ANSELD, ANSELE registerin hepsini ayarlanması gerek.

Selamlar

camby

Arslan74 hocam merhaba,

Yukarıda bahsettiğim gibi ben access bank dışındaki alana direk erişemedim. Erişim yapabilmek için movlb ile bank değiştirerek istediğim registera ulaştım. Yani yukarıda hem sorunu hem çözümü açıkladım.

Erişmeye çalıştım register da anselx register'ları idi. Access bölümü dışında SFR bulunmasını beklemiyordum.

Bahsettiğiniz doğrudan erişim nasıl oluyor ? Hatanız olmasın?

arslan74

Merhaba,

Kullandığınız PIC datasheetini incelediğinizde aşağıdaki örnek bir kaç komutu inceleyelim.

ADDWF  f, d, a   (Add WREG and f)
MOVF     f, d, a   ( Move f )
MOVWF  f, a       (Move WREG to f)

Acıklaması:

d =  0  for result destination to be WREG register
d =  1  for result destination to be file register (f)
a =  0  to force Access Bank
a =  1  for BSR to select bank
f  = 8-bit file register address

Yani a=0 yaparsan doğrudan banklarla uğraşmadan kullanabilirsin. PIC16 mimarisi gibi kullanmak istiyorsan a=1 yapman yeterli olur o zaman banklı erişim yapmış olursun.

MOVWF ANSELA,0 yaparsan ANSELA registerini banklara hiç uğraşmadan erişim yaparsın. zaten MOVWF ANSELA dediğinde kendisi otomatik olarak sonuna sıfır atıyor.
Doğrudan bu registere erişebiliyorsun. Normal de ANSELA ramin BANK15 adresinde gözüküyor. Ama a=0 yaparsan bu SFR registerine banklara uğraşmadanda erişebiliyorsun.

Selamlar

Tagli

arslan74 hocam, yanılmıyorsam bu konuda yanlışın var. a = 0 yazıldığında BSR'ye bakılmaksızın Access RAM'e erişilir. Diğer yerlere erişenbilmek için BSR'nin ayarlanması ve a = 1 ile komutların kullanılması şart.
Gökçe Tağlıoğlu

arslan74

Alıntı yapılan: Tagli - 28 Şubat 2012, 13:47:01
arslan74 hocam, yanılmıyorsam bu konuda yanlışın var. a = 0 yazıldığında BSR'ye bakılmaksızın Access RAM'e erişilir. Diğer yerlere erişenbilmek için BSR'nin ayarlanması ve a = 1 ile komutların kullanılması şart.

Merhaba,

Aslinda sen söylediğinde haklisın ancak, SFR registeri acces RAM da değil bank15 de. SFR erişmek için banklarla uğraşmak adına söylediğim sekilde kullanabiliyorsun.

kendi datasheetinde örnek kodları incelediğinizde görürsünüz.
MOVLB 0xF ; Set BSR for banked SFRs
CLRF PORTA ; Initialize PORTA by
; clearing output
; data latches
CLRF LATA ; Alternate method
; to clear output
; data latches
MOVLW E0h ; Configure I/O 
MOVWF ANSELA ; for digital inputs
MOVLW  0CFh ; Value used to 
; initialize data 
; direction
MOVWF  TRISA ; Set RA<3:0> as inputs
; RA<5:4> as outputs


Görüldüğü gibi ANSELA ya ulşamak için BANK15 gecilmeden veri yazılabiliyor.

Bunu DS41412D  datasheetin'in 80'inci sayfasında görebiliyorsunuz.




Selamlar

camby

MOVLB 0xF ; Set BSR for banked SFRs


bu satırda bank15'e geçiş yapılmıyor mu ?

arslan74

Merhaba,

Arkadaşlar gözden kacırdiğim bir konu oldu. Sizlerin bu konuda affını istiyorum.
Oda;
a=0 yazarsak Access RAM bilgi yaziyoruz. bu adres uzunluğu maximin 255, yani 0xff dir.
bank0 daki access ram ın uzunluğu 0x5F e kadar dır. Geri kalan 0x60 - 0xff arasındaki adrese bank15 de ki SFR registerine erişiyorsun. Ancak problem surda "camby" beyinde dediği gibi SFR adresin 0x5f den değil 0x38 adresinden başlıyor. bu durumda 0x38 ile 0x5f arasında ki bilgiye ulaşmak için BSR registerine bank li erişim yapmak zorunda kalıyoruz.

Ben kodlarımı C de yazdığım için buna hiç dikkat etmemiştim. Arka planda kendisi bunların ayarlarını yapiyordu. Şimdi arkadaş konuyu actığı için dikkatli inceleme gereği hissettim.

Selamlar