Bank 0 dışına #asm ile erişim nasıl oluyor?

Başlatan XX_CİHAN_XX, 03 Eylül 2009, 11:53:08

XX_CİHAN_XX

PIC16 serisi için HiTech C de #asm ........ #endasm bloğu arasında bank1, bank2 ve bank3 de bulunan değişkenlerle işlem yapmak istediğimde aşağıdaki uyarı ile karşılaşıyorum. Belki kodum doğru çalışıyor (henüz denemedim çalışması gerek) ama bana gelen bu uyarı hoşuma gitmiyor bunu nasıl yok edebilirim.

Warning [1352] C:\HiTechC\xxxx\shifter.c; 288. truncation of operand value (0x1ef) to 7 bits

Uyarıdada görüldüğü 7 bitten büyük adreslerde bulunan değişkenlere bu şekilde (asm ile) kestirme işlemler yapıyorsun gibi bişiler diyor anladığım kadarıyla. 7 bitten büyük adres demek bank0 dan sonrası demek oluyor.
Bunuda teyit etmek için denedim. bank0 daki değişkenler ile aynı işlemleri asm de yaptım ve bu uyarı ile karşılaşmadım. Sadece diğer banklarda bu uyarıyı veriyor. Uyarıdan kaçış yoksa bunu çıkartmamak için birşeyler ekleyelim asm işlemim fazla olduğu için her bir satır için bu gıcık uyarıyı her derlemede görmek istemiyorum. Mesela;
Assembly de bu tür görmek istemediğin mesajları
ERRORLEVEL -302

Gibi bişiler yapıp 302 kodlu mesajları görmeyebiliyorduk.
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.

XX_CİHAN_XX

Sorunu buldum arkadaşlar.
Gerçektende asm bloğu arasına bank1 ,bank2 yada bank3 te bulunan bir değişkeni doğrudan değişkenin adını yada adresini yazarak kullanamıyoruz. Ancak Adreslemeyi 7 bit olarak (0x20....0x7F) ve status un bank değiştirme bitlerini kontrol ederek bank0 dışındaki değişkenlere ulaşabiliyoruz.
Bu şekilde sorunumu çözdüm.
İyi çalışmalar.
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.

arslan74

Merhaba,
Yapmak istediğini bir örnekle anlatırsan daha anlaşılır olur. Zira yapmam istediklerinden ve kendi çözümünden net birşey anlamadım.

Selamlar

XX_CİHAN_XX

Hemen anlatayım hocam.

#asm
		BCF		_STATUS,5
		BCF		_STATUS,6
		BCF		_STATUS,0
		RLF		0x20,F
		RLF		0x21,F
		RLF		0x22,F
		RLF		0x23,F
		RLF		0x24,F
#endasm

Yukarıdaki kodlarda bank0 daki 5 değişken sola kaydırılmaktadır.
Bunda hiç bir sorun yok. Ben bu şekilde bank1 deki 5 değişkeni kaydırmaya kalktığımda. (aşağıdaki gibi)

#asm
		BCF		_STATUS,5
		BCF		_STATUS,6
		BCF		_STATUS,0
		RLF		0xA0,F
		RLF		0xA1,F
		RLF		0xA2,F
		RLF		0xA3,F
		RLF		0xA4,F
#endasm

Hata oluşuyordu.
Yani bu şekilde 0x00 dan 0x7F e kadar (7 bitlik) olan adres aralığında işlem yapabiliyorum 0x7F den sonraki hiç bir adres aralığına yukarıdaki şekilde erişemiyordum. Bu sorunu şu şekilde çözdüm.

#asm
		BSF		_STATUS,5
		BCF		_STATUS,6
		BCF		_STATUS,0
		RLF		0x20,F
		RLF		0x21,F
		RLF		0x22,F
		RLF		0x23,F
		RLF		0x24,F
#endasm


Burada görüldüğü gibi adres aralığım yine 7 bit ancak status un BANK değiştirme bitleri ile oynayarak diğer banklara ulaşabildim.
Ben direk 0xA0 yada 0x120 gibi doğrudan adresleme vererek ulaşmaya çalışıyordum hatanın sebebi buymuş.

Bu arada az önce ilginç bir durumla karşılaştım sizi yakalamışken onuda sormak istiyorum. Yardımcı olursanız sevinirim.

Programımda readVal isimli unsigned int türünde bir değişkenim var.
Bu değişkenin üst byte ının 0 olup olmadığını şu şekilde sorduğumda programın hatalı kod ürettiğini farkttim
if(!readVal>>8)
		shQuantity = 8;
	else
		shQuantity = 6;

Bu şekilde üst byte 0 olsa bile program shQuantity = 6; komut satırına geliyordu.
Kodu aşağıdaki şekilde yapınca normale döndü.
if((readVal>>8)==0)
		shQuantity = 8;
	else
		shQuantity = 6;


Bu iki yazım şekli arasında fark yok diye biliyordum ?  :roll:
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.

arslan74

Alıntı yapılan: "XX_CİHAN_XX"
Bu arada az önce ilginç bir durumla karşılaştım sizi yakalamışken onuda sormak istiyorum. Yardımcı olursanız sevinirim.

Programımda readVal isimli unsigned int türünde bir değişkenim var.
Bu değişkenin üst byte ının 0 olup olmadığını şu şekilde sorduğumda programın hatalı kod ürettiğini farkttim
if(!readVal>>8)
		shQuantity = 8;
	else
		shQuantity = 6;

Bu şekilde üst byte 0 olsa bile program shQuantity = 6; komut satırına geliyordu.
Kodu aşağıdaki şekilde yapınca normale döndü.
if((readVal>>8)==0)
		shQuantity = 8;
	else
		shQuantity = 6;


Bu iki yazım şekli arasında fark yok diye biliyordum ?  :roll:

C de öncelik sırası denen bir olay var. Bu öncelik sırasını belirtmez isen o kendi varsayılan önceliğine göre operatörleri işler.

! 2. öncelikte >> ise 5. öncelik sırasında dolaysıyla ilk önce ! işlemi sonra >> işlemi yapılır. Bunun en basid çözümü paranteze almak dir.

Selamlar

hasangurlek

Alıntı yapılan: "XX_CİHAN_XX"PIC16 serisi için HiTech C de #asm ........ #endasm bloğu arasında bank1, bank2 ve bank3 de bulunan değişkenlerle işlem yapmak istediğimde aşağıdaki uyarı ile karşılaşıyorum. Belki kodum doğru çalışıyor (henüz denemedim çalışması gerek) ama bana gelen bu uyarı hoşuma gitmiyor bunu nasıl yok edebilirim.

Sanırım siz assembly kullanmadığınız için farkedememişsiniz. 16 serisinde hem program alanı hem data alanı banklara ayrılmıştır. Status bitleri ile data alanlarının, pclath registeri ile program alanının adresleri atanır. 18 serisinde ise program kodları tek sayfa gibi işlenebilir fakat data alanı için BSR registeri kullanılarak data için ayrılmış byte adresi tanımlanmalıdır. Ortak kullanım alanları müstesnadır. Tüm bunlar Datasheet lerde memory map/organization bölümlerinde detaylı olarak gösterilmektedir.
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

arslan74

Merhaba,
Yapmak istediğini bir örnekle anlatırsan daha anlaşılır olur. Zira yapmam istediklerinden ve kendi çözümünden net birşey anlamadım.

Selamlar

XX_CİHAN_XX

Alıntı yapılan: "hasangurlek"
Sanırım siz assembly kullanmadığınız için farkedememişsiniz. 16 serisinde hem program alanı hem data alanı banklara ayrılmıştır. Status bitleri ile data alanlarının, pclath registeri ile program alanının adresleri atanır. 18 serisinde ise program kodları tek sayfa gibi işlenebilir fakat data alanı için BSR registeri kullanılarak data için ayrılmış byte adresi tanımlanmalıdır. Ortak kullanım alanları müstesnadır. Tüm bunlar Datasheet lerde memory map/organization bölümlerinde detaylı olarak gösterilmektedir.
Selam,
6 sene assembly kullanmış birisi olarak bahsettiğiniz bank işlemlerini çok iyi biliyorum. Zira yazımımda bellirttiğim sorun nasıl bank değiştirebilirim şeklinde değil. Ben asm de 0xA0 daki bir değişkene yukarıda bahsettiğim şekilde adresleme yaparak ulaşabiliyordum. (aslında derlenince arka planda yine yukarıda yazdığım gibi işlem yapılıyordu). Burada ise derleyici buna izin vermiyor direk yukarıda yapılan işlemi bana yapıcan diyor, ben asm değil C derleyicisiyim diyor. Ben bunu ilk başta farkedemedim. Aslında bildiğim bir olaydı ama asm de kabul edilen bir yazım şekli burada kabul edilmeyince hata zannettim ama sonradan kısa sürede jeton düştü :)

Arslan hocam yukarıda detaylı (örnekle) anlattığımı sanıyordum ama anaşılmayan yer tam olarak neresi ?
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.

arslan74

Merhaba,

En son masjım yanlışlık la eski masjımının aynısı geldi.

Senin ASM işlemine gelince Hi-Tech manuelinde şöyle bir örnek var.
unsigned int var;
void main(void)
{
var = 1;
#asm // like this...
bcf 0,3
rlf _var
rlf _var+1
#endasm


Bu şekilde denedinizmi?

Selamlar

XX_CİHAN_XX

Hocam merhabalar,
Evet manueldeki o kısmı okumuştum. O şekilde bir kaydırma
unsigned int var; şeklinde tanımladığımız değişkenlerde problemsiz oluyor.
Ama benim kaydırmaya çalıştığım değişkenleri ben şu şekilde tanımlıyorum program içinde:
volatile static unsigned char REG1 @ 0xA0;
volatile static unsigned char REG2 @ 0xA1;
volatile static unsigned char REG3 @ 0xA2;
volatile static unsigned char REG4 @ 0xA3;
volatile static unsigned char REG5 @ 0xA4;
                    ..
                    ..
                    ..
Tanımlamalar BANK1, BANK2 ve BANK3 boyunca bu şekilde devam ediyor

Şimdi burada bank1 ve sonrasında bulunan bu değişkenleri asmde
#asm 
bcf _STATUS,6
bsf _STATUS,5 
rlf _REG1,F 
rlf _REG2,F 
#endasm

şeklinde kaydıramıyoruz benim ilk sorum buydu neden kaydıramıyoruz, assembly de bu şekilde kaydırabiliyorduk diye sormuştum daha sonra derleyicinin verdiği uyarıdan yola çıkarak olayı çözdüm derleyici bana 7 bitilik adres vererek kaydırma yapabilirsin diyordu. Oysa ben 0xA0 ve üstündeki adresleri vererek al bu adrestekini kaydır diyordum (çünkü assembly de diyebiliyorduk demekki C de izin yok) :)
Sonra çözümü şu şekilde tespit ettim. Madem öyle dedim bende 0x00 ile 0x7F arasında (7 bitlik adres) veririm ancak bank0 değil statustan hangi banka ulaşacaksam o bankı ayaralıyarak o bölgeye ulaşırım diye düşündüm. Nitekim o şekilde olması gerekiiği gibi oldu örneğin 0xA0 daki reg1i kaydırmak için şunu yaptım:
bcf    _STATUS,6
bsf    _STATUS,5   //BANK1 E GEÇ
rlf    0x20,F      //GEÇİLEN BANKIN İLK DEĞİŞKENİ (0xA0) KAYDIR
rlf    0x21,F      //GEÇİLEN BANKIN İKİNCİ DEĞİŞKENİ (0xA1) KAYDIR

bsf    _STATUS,6
bsf    _STATUS,5   //BANK3 E GEÇ
rlf    0x20,F      //GEÇİLEN BANKIN İLK DEĞİŞKENİ (0x1A0) KAYDIR
rlf    0x21,F      //GEÇİLEN BANKIN İKİNCİ DEĞİŞKENİ (0x1A1) KAYDIR

Bu şekilde oldu. Görüldüğü gibi verilen değişken adresi 7 bit ama istediğin banktaki değişkeni asm de kaydırabildik.
Elbette C de olan kaydırmalarda böyle birşeye gerek yok kendisi değişkenin bulunduğu banka geçiyor. Ama asm de ve üst banklardaki bir değişkeni kaydıracaksak bu şekilde yaparak sonuca ulaşabildim.
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.

arslan74

Merhaba,

Sizin demek istediğiniz anladım. Ancak anlamadığım nokta şu, neden aşağıdaki gibi bir tanımlama yaptığın konusunda dır.

volatile static unsigned char REG1 @ 0xA0; 
volatile static unsigned char REG2 @ 0xA1; 
volatile static unsigned char REG3 @ 0xA2; 
volatile static unsigned char REG4 @ 0xA3; 
volatile static unsigned char REG5 @ 0xA4;


Bu değişenin başına doğrudan BANK0 veya BANK1 yazarak istediğin banklarda tanımlama yapmış olurdun. Neden ASM gibi kendin ram adreslerini organize ediyorsun. Özel bir amacın yok ise, kendini boş yere zorlaştırmadan başka bir şey değil.

Selamlar

XX_CİHAN_XX

Aslında ilk başta öyle denemiştim ama bir türlü beceremedim örnekse;
#include	<pic.h>
static volatile bank3 unsigned char fred;
void main (void)
{
	fred++;
}

Fakat görüldüğü gibi değişkenin bank3 ile alakası yok.
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.

hasangurlek

Alıntı YapBen bu şekilde bank1 deki 5 değişkeni kaydırmaya kalktığımda. (aşağıdaki gibi)

Kod:

#asm
     BCF      _STATUS,5
     BCF      _STATUS,6
     BCF      _STATUS,0
     RLF      0xA0,F
     RLF      0xA1,F
     RLF      0xA2,F
     RLF      0xA3,F
     RLF      0xA4,F
#endasm

Hata oluşuyordu.
Yani bu şekilde 0x00 dan 0x7F e kadar (7 bitlik) olan adres aralığında işlem yapabiliyorum 0x7F den sonraki hiç bir adres aralığına yukarıdaki şekilde erişemiyordum. Bu sorunu şu şekilde çözdüm.

Kod:

#asm
     BSF      _STATUS,5
     BCF      _STATUS,6
     BCF      _STATUS,0
     RLF      0x20,F
     RLF      0x21,F
     RLF      0x22,F
     RLF      0x23,F
     RLF      0x24,F
#endasm


Burada görüldüğü gibi adres aralığım yine 7 bit ancak status un BANK değiştirme bitleri ile oynayarak diğer banklara ulaşabildim.
Ben direk 0xA0 yada 0x120 gibi doğrudan adresleme vererek ulaşmaya çalışıyordum hatanın sebebi buymuş.

Bu açıklamanız nedeniyle yukarıdakileri yazmıştım.

Sizin probleminiz "static volatile bank3 unsigned char fred;" ifadenize karşı değişkenin 0x70 adresinde oluşturulması. Buda derleyici hatası, başka bir versiyonla denedinizmi ? Yalnız verdiğiniz resimdeki çıktı kaydırma değil, byte içeriği artırma üzerine.
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

XX_CİHAN_XX

Başka bir versiyonda denemedim. Kullandığım versiyon 9.65 pl1 - PRO
Şimdiye kadar bir yamuğunu görmemiştim  :)
Başka versiyon kullanan birisi denerse sevinirim.
Örnekte artırma yaptığımın farkındayım bank işlevini deneme amaçlı yazdığım birşeydi :)
Hayırlı akşamlar.
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.