Degısken sayısı neden bukadar az

Başlatan XX_CİHAN_XX, 07 Aralık 2005, 22:37:05

Petek

Alıntı yapılan: "XX_CİHAN_XX"
Olayı şimdi kavradım sanırım çok teşekkürler.Ancak son birsoru sormak istiyorum.
Atıyorum bank1 dekı regıster sıgasından 40. adrese adrese 0x7F datasını yukleyecegım
Şu sekılde yapabılırım degıl mı
write_bank(1, i=40, 0x7F);
write_bank(1, i=40, 0x7F);

işleminin tam karşılığı şu iki işlemdir.
i=40; 
write_bank(1, i, 0x7F);

eğer i = 40 işleminin yapılmasını istemiyorsanız  
write_bank(1, 40, 0x7F);
komutu yeterli bahsettiğiniz işlem için.


Alıntı Yap
birde,
c=read_bank(1,40);
derken bank1de bulunan adres map in 40. adresinde bulunan degeri c degıskenıne yuklemıs oluyoruz degıl mı?
adres mapin değil de general pupose registerleri 40. elemanını c değişkenine atıyoruz demektir.
Alıntı Yap
onun yerıne
c=read_bank(1,i=40);
dersekde olur mu?
Çok teşekkurler.

c=read_bank(1,i=40);

bu ilem de yine aşağıdaki iki işlemin birleşik yazılmış halidir.
i=40;
c=read_bank(1,i);

i=40 işleminin yapılmasını istemiyorsanız
c=read_bank(1,40); komutu yeterli.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

XX_CİHAN_XX

Ellerine sağlık çok teşekkürler.Artık daha onceden asm ile başladıgım ve dahada geliştirmek için ccs c ile yapacağım 2 satır 16 karakterlık kayan yazı uygulamasına başlıyabilirim.Daha sonraki gelişmeleri aktarırım.Tekrar teşekkürler....
              Saygılar&Sevgiler
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.

Petek

Kolay gelsin. Bank 0 da 70 elemanlı dizi kullanacaksan sıradan 70 baytlık alanı rezerve ettir.

Helpten:

#RESERVE
Syntax:
#reserve address
  or
#reserve address, address, address
  or
#reserve start:end

Elements:
address is a RAM address, start is the first address and end is the last address

Purpose:
This directive allows RAM locations to be reserved from use by the compiler.  #RESERVE must appear after the #DEVICE otherwise it will have no effect.

Examples:
#DEVICE PIC16C74
#RESERVE  0x60:0X6f

Example Files:
ex_cust.c

Also See:
#org
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

XX_CİHAN_XX

#include <16F877.h>
#RESERVE  0x20:0X66 //16f877 icin bank0a 70 byte lık alan ayır
unsigned int8 c;     //8 bitlik degısken tanımla
void main (){
write_bank(1, 0x20, 0x7F);  //ayrılan 70bytelık alanın ilk bolumune 0x7f yukle
c=read_bank(1,0x20);    //ve yıne aynı bolumde bulunan datayı cye yukle
}

Hatalı bir acıklama yaptıysam lutfen duzeltın.
Dogru anlamışmıyım?
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.

Petek

Alıntı yapılan: "XX_CİHAN_XX"
#include <16F877.h>
#RESERVE  0x20:0X66 //16f877 icin bank0a 70 byte lık alan ayır
unsigned int8 c;     //8 bitlik degısken tanımla
void main (){
write_bank(1, 0x20, 0x7F);  //ayrılan 70bytelık alanın ilk bolumune 0x7f yukle
c=read_bank(1,0x20);    //ve yıne aynı bolumde bulunan datayı cye yukle
}

Hatalı bir acıklama yaptıysam lutfen duzeltın.
Dogru anlamışmıyım?

Yanlış olmuş. Helpten write_bank() komutuna bakarsanız örneğiyle göreceksiniz.

Size kullanımı kolaylaştırmak için bu komut derleyiciye eklenmiş. Siz adresin nereden başladığını araştırmak zorunda kalmayın diye. Bankta yazılacak ilk yer 0 dan başlıyor. Gerçekte tabi ki 0x20 den. Zaten write_bank komutu sizin girdiğiniz 0 nolu konumu içerisinde 0x20 ile toplayıp gerçek adrese dönüştürüyor. CCS nin help menüsünde son derece açıklayıcı bilgiler ve örnekler var. Takıldığınızda oraya bakabilirsiniz.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

XX_CİHAN_XX

Ya kusura  bakmayın sizinde epeybi başınızı agrıttım.
Zaten kafama birşey takıldıgında ilk olarak help e bakarım ondan sonra buraya başvururum.Ama yetersiz ingilizcem yüzünden ordaki birçok tatminkar bilgiden mahrum kalıyorum ve bu yüzden sizlerin başını istemedende olsa ağrıtmak zorunda kalıyorum mazur gorun lütfen.
Bu konudakı tek tesellım belkı benım gıbı aynı konudan muzdarip arkadaşlar varsa benim sorularımdan sizin cevaplarınızdan bir fayda bulabılecek olmalarıdır.Bunca soruya cevap verıp ılgılendıgınız ıcın cok teşekkürler.Son olarak sunu ogrenmek ıstıyorum
write_bank komutunu anladım ama reserve araya gırınce ufak bir karışıklık oldu.Daha dogrusu rezerve komutunu tam olarak dogru kullanabıldım mı bunu merak edıyorum.
#include <16F877.h> 
#RESERVE  0x20:0X66 
unsigned int8 c;
void main (){ 
write_bank(1, 0, 0x7F);  
c=read_bank(1,0);    
}

Yukarıdakı kodlarda reserve olsada olmasada ana programda yapmak ıstedıgım seyı yapıyorum sanırım.Reserve komutunun tam olarak işlevi nedir?
Birde son bir soru help ten bakarak bu sekılde yazdım reserve komutunu acaba dogru yazmısmıyım?
Bunları ogrenırsem tatmın olucam sanırım.Şimdiden çok teşekkür ederim.
Dediğim gibi helpi inceliyorum ama ingilizcem zayıf oldugu için pek faydalanamıyorum.
                           Saygılar&Sevgiler
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

Sanırım sonunda başardım çok basit birşey olsada ccs c ye yeni başlayan biri için zor geliyor.Neyse @Petek sayesinde baya birşey öğrendim bu konuyla ilgili beni aydınlattığı için teşekkürler.Bu kadar konusma yaptık bari sonucunu getireyim diye bu konuyla ilgili en son yaptığım ve sanırım doğru yazdığım :) kodları vermek istedim belki başkalarına bir faydası olur
#include <16F877.H>     
#reserve 0xA0:0xE6      //bank1de 70 bytelık ram alanını ayır
#reserve 0x120:0x166    //bank2de 70 bytelık ram alanını ayır
#reserve 0x1A0:0x1BC    //bank3de 28 bytelık ram alanını ayır
#fuses HS,NOWDT,NOPROTECT  //toplam ayrılan ram alan 168 byte 
#use delay(clock=20000000)
unsigned int8 c,i;
void main (){
for(i=0;i<70;i++)write_bank(1, i, 0);
for(i=0;i<70;i++)write_bank(2, i, 0);
for(i=0;i<28;i++)write_bank(3, i, 0);
//kayan yazı degıskenlerını saklamak için
//reserve edılen alana 0 yukle
}


Umarım yanlış birşey yazmamışımdır ama doğru olması gerekir.Emin olmasam zaten burda yayınlamam.
                            Saygılar&Sevgiler
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.

Petek

Önceki mesajını görmemiştim. Bu mesajını okurken farkettim. Öncekinde yaptığın doğru. Ama bank 0 da rezerve ettiğin yeri kullanmak yerine bank 1 de yazma okuma yapmışsın.
Bu mesajında ise yapman gerekenin tam tersini yapmışsın. Yani sen sadece bank 0 da rezervasyon yapman gerekiyor. Diğer banklarda yapmış olman da doğru bir mantık ama zaten derleyici orada sen istemedikçe değişken tanımlamadığı için zaten sana rezerv edilmiş.
Bank 0 da rezervasyon yapmazsan, derleyici bu banktaki bütün registerleri bildiği şekilde kullanır. Rezervasyon yaparsan, bank 0 da geriye kalan kullanılabilecek alanları senin tanımladığın diğer değişkenler için kullanır (örneğin i ve c değişkenlerin için)
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

XX_CİHAN_XX

Yani bu şekildemi yapmam gerekiyor.
#include <16F877.H>
#reserve 0x20:0x76      //bank0da 70 bytelık ram alanını ayır
#fuses HS,NOWDT,NOPROTECT  //toplam ayrılan ram alan 168 byte
#use delay(clock=20000000)
unsigned int8 c,i;
void main (){
for(i=0;i<70;i++)write_bank(0, i, 0);
for(i=0;i<70;i++)write_bank(1, i, 0);
for(i=0;i<28;i++)write_bank(2, i, 0);
//kayan yazı degıskenlerını saklamak için
//reserve edılen alana 0 yukle
}

Bank0 kapasite olarak bana yetmiyor.168 byte lık ekran verısı depolamam gerekıyor.o yuzden bı oncekı mesajımda dıger banklarada rezervasyon yamıstım ama sanırım sadece bank0 a yapmak yetıyor.
Bu seferki kodlar dogrumu peki?
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.

Petek

Diğer banklarda da rezerv yapman programa herhangi bir olumsuz etki yapmaz. İstersen diğer banklarda da rezerv yap. Sonuçta # işaretiyle başlayan komutlar sadece derleme sırasında dikkate alınan komutlardır. Üretilen program kodunda yeralmazlar.

Eğer 168 bayt kullanacaksan ve programda çok fazla değişken tanımın yoksa birinci bankta 80 baytı aynen yukarıdakiler gibi, 0. bankta 88 baytlık alanı da normal bildiğimiz gibi dizi tanımlayarak kullanabilirsin. Bunun nedeni bank 2 ve 3 e erişimde fazladan status irp flagi set ve reset edilecek ki bu en az 2 instruction cycle (komut zamanı) kaybettiriyor. Gerçi kayan yazıda zaten ledleri yaktıktan sonra göze net görünebilmesi için yaklaşık 1 ms gibi bir süre yanık kalmasını sağlaman gerekir. Bu durumda bir kaç komut zamanının lafı olmaz :)

#reserve 0x20:0x76      //bank0da 70 bytelık ram alanını ayır

70 bayt ayıracaksan 0x20:0x66 olması gerekiyor sanırım.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

XX_CİHAN_XX

Alıntı yapılan: "Petek"Bunun nedeni bank 2 ve 3 e erişimde fazladan status irp flagi set ve reset edilecek ki bu en az 2 instruction cycle (komut zamanı) kaybettiriyor. Gerçi kayan yazıda zaten ledleri yaktıktan sonra göze net görünebilmesi için yaklaşık 1 ms gibi bir süre yanık kalmasını sağlaman gerekir. Bu durumda bir kaç komut zamanının lafı olmaz :)

#reserve 0x20:0x76      //bank0da 70 bytelık ram alanını ayır

70 bayt ayıracaksan 0x20:0x66 olması gerekiyor sanırım.

Evet dediğin gibi oluyor ben yanlış yazmışım.Ayrıca yine dediğin gibi status değişimleri beni pek olumsuz etkılemez sanırım.Zaten bank0 da 88 byte lik bir olan reserve edemem cunku bu alanın dısında acmam gereken yaklasık 25 bbyetelık degısken dahah var.Bu nedenle bank0 da 70 bank1 de 70 bank2de 28 olması bence daha dogru olucaktır.Bütün bunları göz önunde tutarak aşağıdaki kodlarda bir anormallik yoktur değilmi?
#include <16F877.H>      
#reserve 0x20:0x66      //bank0da 70 bytelık ram alanını ayır 
#reserve 0xA0:0xE6      //bank1de 70 bytelık ram alanını ayır 
#reserve 0x120:0x13C    //bank2de 28 bytelık ram alanını ayır 
#fuses HS,NOWDT,NOPROTECT  //toplam ayrılan ram alan 168 byte 
#use delay(clock=20000000) 
unsigned int8 c,i; 
void main (){ 
for(i=0;i<70;i++)write_bank(0, i, 0); 
for(i=0;i<70;i++)write_bank(1, i, 0); 
for(i=0;i<28;i++)write_bank(2, i, 0); 
//kayan yazı degıskenlerını saklamak için 
//reserve edılen alana 0 yukle 
}

               Saygılar&Sevgiler
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.

Petek

Bank0 için read_bank yada write_bank tanımlamana gerek yok. Kafadan char aaa[70]; tanımlaman yeterli. Ama bank 0 daki değişkenler kıymetli değişkenler olduğu için (yani erişimi hızlı değişkenler) mümkün olduğunca verimli kullanmak gerekir. Senin yerinde olsaydım bank 1, 2 ve 3 te 168 baytlık alan kullanırdım.

Programında bir anormallik yok. Ayırdığın alanları sıfırlatıyorsun. Kolay gelsin...
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

XX_CİHAN_XX

Alıntı yapılan: "Petek"Bank0 için read_bank yada write_bank tanımlamana gerek yok. Kafadan char aaa[70]; tanımlaman yeterli. Ama bank 0 daki değişkenler kıymetli değişkenler olduğu için (yani erişimi hızlı değişkenler) mümkün olduğunca verimli kullanmak gerekir. Senin yerinde olsaydım bank 1, 2 ve 3 te 168 baytlık alan kullanırdım.

Programında bir anormallik yok. Ayırdığın alanları sıfırlatıyorsun. Kolay gelsin...
Teşekkür ederim.Programa başladım fakat kafamda bu konuyla ilgili bir soru işareti daha belirdi.
Diyelim ki bank1 de 70 byte lık alan reserve ettım.ben bu reserve ettıgım alanda ilk adreste bulunan kısma bir data yukledım write_bank komutuyla.
daha sonra bu aynı adrestekı data yı yukledıgım bolumu <<1(birkez sola kaydırmak istiyorum kaydırma komutunu kullanarak nasıl yapmalıyım??
Şu şekılde yapmayı denedım ama hata verdı
write_bank(1, 0, <<1);
yanı bank1de reserve ettıgım alandakı sıfırıncı bolume yukledıgım datayı 1 kez sola kaydırmak ıcın ne yazmam gerekır?
                  Saygılar&Sevgiler
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.

Petek

Alıntı yapılan: "XX_CİHAN_XX".... daha sonra bu aynı adrestekı data yı yukledıgım bolumu <<1(birkez sola kaydırmak istiyorum kaydırma komutunu kullanarak nasıl yapmalıyım??...

write_bank(1,0, read_bank(1,0)<<1);

bu oldukça uzun bir işlem. Onun yerine:

#byte indf    = 0x00
#byte status = 0x03
#byte fsr      = 0x04
#bit irp = 0x03.7

üstteki global tanımları yap. Aşağıdaki işini görür.

irp=0;        // bit_clear(3, 7) veya bit_clear(status,7)
fsr=0xa0;  // irp = 0 için bank 1 genel amaçlı yazmaçların ilk adresi
indf<<=1;  // indf = indf <<1;

bank 1 deki bütün bilgileri kaydırmak istiyorsan
...
irp=0;
fsr=0xa0;
for(i=0;i<70; i++) {   indf<<=1;    fsr++;   }
...


bank 2 ve 3 için irp=1 yapacaksın, taban adresleri 0x20 ve 0xa0 olacak yine aynı bank 0 ve 1 deki gibi. status,irp 1 olduğu için bank2 ve 3 teki   gpr adreslerine 0x120 ve 0x1a0 olarak erişiliyor.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

kalman

@XX_CİHAN_XX

kayan yazı ile bir ilerleme varmı ?