18F banksel kullanımı

Başlatan Extreme, 02 Şubat 2015, 15:27:25

Extreme

Arkadaşlar merhaba,

daha önce

cblock 0x20 (Bank 0 için )
   
count1     
count2
...
count96     
endc

cblock 0xA0  (Bank 1 için)
counta_1
counta_2
endc

şeklinde pic16f887'de kullanıyordum.
18f4620'ye geçmeyi düşünüyorum bankselleri nasıl gösterebilirim. datasheetini inceledim pek mantığım oturmadı.
Yardım ederseniz çok sevinirim.

Kabil ATICI

ambar7

Extreme

#2
ambar hocam o zaman bu değişkenleri nasıl tamamlıycam . yani 18f4620 için nasıl bir düzenleme yapmam lazım anlatabilirmisin?

Değişkenleri ilk bölümde nasıl tamamlamalıyım yani.

bir türlü işin içinden cıkamadım. Biraz bilgi verirseniz sevinirim.

örnek tanımlamayı böyle mi yapıcam

count1 res 1
count2 res 1

yada böyle mi ? su tanımlamayı öğrenmem lazım

   constant   LcdCmdReadAdd   =02h
   constant   LcdCmdWriteAdd   =00h
   constant   LcdDataReadAdd   =03h
   constant   LcdDataWriteAdd        =01h
   constant   ClaAdd         =04h

Tagli

Alıntı yapılan: ambar7 - 02 Şubat 2015, 16:02:44
18f4620'de banksel yok...
Olmaması mümkün değil. PIC18'lerde de data memory, tıpkı PIC16'larda olduğu gibi banklara ayrılmıştır.

Extreme, assembly ile uğraşmayalı baya oldu ama hatırladığım kadarıyla cblock kullanımı PIC16 ve PIC18'lerde aynı şekilde oluyordu. Takıldığın yer neresi?

Bu arada, relocatable kod yazımını öneririm. Değişkenlerin adreslerini elle vermen gereksiz bir uğraş. Bırak bu işi linker yapsın.
Gökçe Tağlıoğlu

Mucit23

Pic18F4620'de Banksel yok ama aynı işi yapan BSR(Bank Select Register)var. ilk 4 biti ile 0-15 arası bank seçimi yapılır. Pic18F4620 de 15 Bank var.

Tagli

#5
Tamam işte aynı şey. Zaten PIC16'larda da banksel diye bir register yoktu ki. STATUS'un iki biti kullanılıyordu. banksel denen şey assembler'da bir direktif, yani bir çeşit yalancı komut. Bu dokümanın 80. sayfasında açıklaması var.
Gökçe Tağlıoğlu

ido2323

değişken tanımlamak istiyorsan 18f serisinde direkt tanımlarsın;

VRGL0     EQU  51H
VRGL2     EQU  52H
VRGL3     EQU  53H
VRGL4     EQU  54H

16f serisinde ise değişkenlere erişmek için banksel değiştirirsin ancak 18f serisinde değişkenlere erişmek için mesela(Trisa ve Trisb ) 16f serisindeki gibi STATUS ile oynamana hiç gerek yok sadece değer ataman yeterli

Bu arada 18f46k22 fiyatı ne

Extreme

#7
Gökçe hocam, acıkcası benim bilgim asmde baya az . 16f887'den 18f4620'ye geçirmeye çalışıyorum. Şirketde eskilerden kalma bir yazılım picini geliştirmek zorunda kaldık. Görev bana verildi. Ticari olduğu için yayınlayamıyorum.

Şimdi tamamıyla ilgili soruları sormadan takıldığım yeri sormak istedim.

16F887DE tanımlı yaklaşık 100 tane değişken var.

ornek_sayisi            EQU    0x20
sayac                  EQU    0x21
sayac1                  EQU    0x22
sayac2                  EQU    0x23

diye gidiyor.

Şimdi ben bunları nasıl tanımlıycam bu kod alanı böyle kalıcak mı yoksa değiştircekmiyim?

Net bir cevap alırsam çok işime yarar . teşekkürler

ido2323

eğer assembly ile derleme varsa bir kesme noktası da vardır, mesela  "org 20H" gibi siz bu kesmeden sonra sırası ile ;

ornek_sayisi            EQU    0x21
sayac                  EQU    0x22
sayac1                  EQU    0x23
sayac2                  EQU    0x24

tanımlarsanız bir sıkıntı çıkmaz.

Tagli

Alıntı yapılan: ido2323 - 03 Şubat 2015, 11:27:18
18f serisinde değişkenlere erişmek için mesela(Trisa ve Trisb ) 16f serisindeki gibi STATUS ile oynamana hiç gerek yok sadece değer ataman yeterli
SFR'lere erişimde bank değiştirmeye gerek olmamasının nedeni, bu özel register'ların Access RAM denilen ve her banktan erişilebilen özel bir alanda olmalarından kaynaklanıyor. PIC16'larda da buna benzer bir alan var aslında, genelde bank alanının sonunda oluyor. Yoksa Access RAM haricindeki değişkenlere erişirken bank değişimi yapılmak zorunda.

Alıntı yapılan: ido2323 - 03 Şubat 2015, 11:36:08
eğer assembly ile derleme varsa bir kesme noktası da vardır, mesela  "org 20H" gibi siz bu kesmeden sonra sırası ile ;

ornek_sayisi            EQU    0x21
sayac                  EQU    0x22
sayac1                  EQU    0x23
sayac2                  EQU    0x24

tanımlarsanız bir sıkıntı çıkmaz.
Burada sanırım Data Memory ile Program Memory kavramları birbirine karışımış. Data Memory'ye değişken yerleştirmek ile kesmelerin bir ilgisi yok.

Extreme, bu mantıkla tanımlama yapabilirsin ama adresler o şekilde olmayacak. Bu PDF'te, sayfa 62'deki Şekil 5-5'e bak. Değişkenlerini 0x080 ve 0x0FF arasında bulunan Access RAM'e yerleştirirsen bunlara bank değiştirmeden ulaşabilirsin.

Ancak tekrar vurgulayayım, bu adresleri elle atamak saçma. Bu işi linker'a yaptırın.
Gökçe Tağlıoğlu

Extreme

#10
Gökçe Hocam, bu alan da 128 değişken tanımlanabiliyor.

16f887de değişkenler yaklaşık 150 tane 0x20den 0xD7 'ye kadar banksel 0 ve banksel 1 kullanılmıştı.

16f887den sonra 18f4620 değişkenlerin data memory organization ı yapamadım.

Şimdi ben burda verdiğiniz pdfi inceledim ama inanın işin içinden çıkamadım. ufak bir noktayı kaçırdığımı düşünüyorum. çok ufak 150 örnek için (tamamını yazmanıza gerek yok ... gösterebilirsiniz) örnek verebilirmisiniz?


Tagli

O zaman değişken atamalarına 0x100'den başla, 0x1FF'e kadar 256 tane değişken atayabilirsin ve hepsi de bank1'de olur.
Gökçe Tağlıoğlu

Extreme

peki,, tamam hocam gördüm bank1,

ama bu status,pclath v.s bu sfr (Special Function Register) da işlem yapıcakken bank seçmek gerekir mi ?

Örnek veriyorum hocam

register1   0x100
register 2  0x111

MOVLW     D'25'
MOVWF     register1

MOVF      register1,w
MOVWF      TXREG

Bu kodlar çalışır mı ?

Tagli

Evet, bank1'de isen çalışır. Yani register1 ve register2'ye ulaşmak için bank1'de olman gerekiyor. SFR'lere bank seçmeden de (bir başka deyişle, hangi bankta olursan ol) ulaşabilirsin.
Gökçe Tağlıoğlu

Extreme

Gökçe hocam o zaman değişkenlerimi bank1e atıyorum başlarda bank1e geçerim direkt. sonra hiç değiştirmem bank1de tüm işlemimi bitiririm o zaman