Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: XX_CİHAN_XX - 07 Aralık 2005, 22:37:05

Başlık: Degısken sayısı neden bukadar az
Gönderen: XX_CİHAN_XX - 07 Aralık 2005, 22:37:05
Arkadaşlar CCS C de unsigned int8 olarak 170 adet global degısken tanımlıyabılıyoruz.16f877 de 332 adet register tanımlayabılmemıze ragmen ccs de nerdeyse bunun yarısı kadar degısken tanımlıyabılıyoruz bunun sebebı nedır acaba?
Bunu 16f877 için asm de oldugu gıbı 332 adet regıster olmasada en azından 250 adet degısken tanımlamak mumkun mu yoksa ccs de 16f877 için degısken açma limiti 170 lemı sınırlı.
Bu arada bir kayan yazı uygulaması ıcın bu kadar çok degıskene ıhtıyacım var yoksa naapayım yuzlerce degıskenı :)
Başlık: Degısken sayısı neden bukadar az
Gönderen: piedos - 07 Aralık 2005, 22:43:58
Demo mu kullanıyorsun full mu?
Başlık: Re: Degısken sayısı neden bukadar az
Gönderen: Petek - 07 Aralık 2005, 23:28:00
Alıntı yapılan: "XX_CİHAN_XX"Arkadaşlar CCS C de unsigned int8 olarak 170 adet global degısken tanımlıyabılıyoruz.16f877 de 332 adet register tanımlayabılmemıze ragmen ccs de nerdeyse bunun yarısı kadar degısken tanımlıyabılıyoruz bunun sebebı nedır acaba?
Bunu 16f877 için asm de oldugu gıbı 332 adet regıster olmasada en azından 250 adet degısken tanımlamak mumkun mu yoksa ccs de 16f877 için degısken açma limiti 170 lemı sınırlı.
Bu arada bir kayan yazı uygulaması ıcın bu kadar çok degıskene ıhtıyacım var yoksa naapayım yuzlerce degıskenı :)
170 değil 128 tane. SPR lerden kullanmadıkların olursa onları da dahil edebilir. Ama bu her zaman geçerli değil. Diğer banklardaki değişkenleri pointer olarak tanımlayacaksın. Yada en basiti 2. 3. veya 4. banklarda indisi 80'i geçmeyecek şekilde read_bank, write_bank fonksiyonlarını kullanacaksın.

Tanımladığın değişken adresini sabit girersen (1. bank haricinde) derleyici o adresteki bilgiye ulaşıyor. Ama bunu tavsiye etmem.
Başlık: Re: Degısken sayısı neden bukadar az
Gönderen: XX_CİHAN_XX - 08 Aralık 2005, 01:31:43
Alıntı yapılan: "Petek"
170 değil 128 tane. SPR lerden kullanmadıkların olursa onları da dahil edebilir. Ama bu her zaman geçerli değil. Diğer banklardaki değişkenleri pointer olarak tanımlayacaksın. Yada en basiti 2. 3. veya 4. banklarda indisi 80'i geçmeyecek şekilde read_bank, write_bank fonksiyonlarını kullanacaksın.

Tanımladığın değişken adresini sabit girersen (1. bank haricinde) derleyici o adresteki bilgiye ulaşıyor. Ama bunu tavsiye etmem.
ilgilendiğiniz için teşekkür ederim.Ben ccs yi daha yeni yeni ögrenmeye başlıyorum.Şimdiye kadar asm kullanıyordum.
SPR ne anlama gelıyor onu bile bilmiyorum o yuzden mumkunse bir ornek ile acıklamanızı rica edicem.2. 3. veya 4. banlarda dedıgınız gıbı 79 adet degısken acılabılmesı gerekır.Yani asm dekı gıbı bank degıstırerek degıskenlerı kullanın dıyordunuz pekı degıskenlerı tanımlarkende bank degıstırecekmıyım bunula ilgili basıt bır ornek gosterırsenız cok sevınırım
Başlık: Re: Degısken sayısı neden bukadar az
Gönderen: Petek - 08 Aralık 2005, 07:56:03
Alıntı yapılan: "XX_CİHAN_XX"SPR ne anlama gelıyor onu bile bilmiyorum o yuzden mumkunse bir ornek ile acıklamanızı rica edicem.2. 3. veya 4. banlarda dedıgınız gıbı 79 adet degısken acılabılmesı gerekır.Yani asm dekı gıbı bank degıstırerek degıskenlerı kullanın dıyordunuz pekı degıskenlerı tanımlarkende bank degıstırecekmıyım bunula ilgili basıt bır ornek gosterırsenız cok sevınırım

SPR özel amaçlı registerler (microchipin terminolojisi, datasheetlerde öyle geçiyor). Örnek olarak fsr registeri. Assemblerda hiç pointer kullanmıyorsanız fsr bir baytlık ram alanı olarak kullanılabilirsiniz. Derleyici kullanılmayan donanım modüllerini tespit edip, onlara ait registerlerde kullanılabilecek alanları çıkartıp, kendi kullanımına açar. Burada sizin kullanıcı olarak bilmeniz gereken fazla bir şey yok (assembler kullanıcısı olarak aslında hepsini bilmenizde fayda var :)

Bank 2, 3 ve 4 teki (yada 1, 2 ,3) alanı dizi olarak kullanacaksanız write_bank ve read_bunk fonksiyonlarını kullanmanız yeterli (helpten kullanımını bulabilirsinia).

Değişken tanımlarsanız işiniz daha zor, zira bank1 den bir değişkeni alıp, bank 0 a taşıyıp, orada gerekli işlemi yapıp sonucu tekrar bank1'e aktarmak hem program alanı olarak, hem zaman olarak kayıp demektir. O nedenle en sık kullanacağınız değişkenlerin bank0 da olması program verimliliği açısından önemli.

Kullandığın işlemcinin header dosyasına 8örnek 16F877.h)  bakarsan orada diğer banklardaki registerlerin nasıl tanımlandığını görebilirsin. Aynen bunun gibi, belirli bir adres aralığını rezerve eder, o aralıkta değişkenlerini sabit adresleri ile tanımlayabilirsin).

Kolay gelsin
Başlık: Re: Degısken sayısı neden bukadar az
Gönderen: XX_CİHAN_XX - 08 Aralık 2005, 13:38:39
Alıntı yapılan: "Petek"
SPR özel amaçlı registerler (microchipin terminolojisi, datasheetlerde öyle geçiyor). Örnek olarak fsr registeri. Assemblerda hiç pointer kullanmıyorsanız fsr bir baytlık ram alanı olarak kullanılabilirsiniz. Derleyici kullanılmayan donanım modüllerini tespit edip, onlara ait registerlerde kullanılabilecek alanları çıkartıp, kendi kullanımına açar. Burada sizin kullanıcı olarak bilmeniz gereken fazla bir şey yok (assembler kullanıcısı olarak aslında hepsini bilmenizde fayda var :)
Bende bu yuzden zaten assemblerdan vaz gecıp ccs ye basladım ama dedıgım gıbı daha yenıyım o yuzden help dosyasından write_bank ve read_bank fonksiyonlarının nasıl kullanıldıgını ınceledım fakat bu komutların baska sayfalara degısken tanımlama konusunda bana yardımcı olacagına pek sanmıyorum.Yada ben anlıyamadım bu komutların kullanılısını soyle bir yontem denedım ama hata verıyor ve bır turlu dezeltıpte herbanka regıster acmayı basaramadım bir yol gosterırsenız çok sevınirim.

#include <16F877.h>
#BYTE    STATUS      =0X03    //status u tanımla
//---------------------------------------------------------------
bit_clear(STATUS,6);            //0. sayfaya tanımla
bit_clear(STATUS,5);            //0. sayfaya tanımla
unsigned int8 temp[7][8];     //56 adet regıster dızısı tanımla
bit_clear(STATUS,6);            //1. sayfaya tanımla
bit_set(STATUS,5);            //1. sayfaya tanımla
unsigned int8 tempa[7][8];     //56 adet regıster dızısı tanımla
bit_clear(STATUS,5);            //2. sayfaya tanımla
bit_set(STATUS,6);            //2. sayfaya tanımla
unsigned int8 tempb[7][8];     //56 adet regıster dızısı tanımla
bit_set(STATUS,6);            //3. sayfaya tanımla
bit_set(STATUS,5);            //3. sayfaya tanımla
unsigned int8 tempc[7][8];     //56 adet regıster dızısı tanımla
bit_clear(STATUS,6);            //0. sayfaya gerı don
bit_clear(STATUS,5);            //0. sayfaya gerı don
//---------------------------------------------------------------
void main(){

}

             Sevgiler&Saygılar
Başlık: Re: Degısken sayısı neden bukadar az
Gönderen: Petek - 08 Aralık 2005, 14:12:34
Alıntı yapılan: "XX_CİHAN_XX"...o yuzden help dosyasından write_bank ve read_bank fonksiyonlarının nasıl kullanıldıgını ınceledım fakat bu komutların baska sayfalara degısken tanımlama konusunda bana yardımcı olacagına pek sanmıyorum. Yada ben anlıyamadım bu komutların kullanılısını....

Kayan yazı uygulaması yapacağım dediniz. Ben de size read_bank ve write_bank fonksiyonlarını dizi gibi kullanabileceğinizi söyledim.

3 adet bank ve her bankta 80 bayt var. Bu da 3x80 lik bir dizi demektir.

write_bank(1, index, c);
write_bank(2, index, c);
write_bank(3, index, c);
c=read_bank(1, index);

Bu şekilde 240 bayta ulaşabilirsiniz. Amacınız kayan yazıdaki verileri saklamak değil mi?

Alıntı Yap
soyle bir yontem denedım ama hata verıyor ve bır turlu dezeltıpte herbanka regıster acmayı basaramadım bir yol gosterırsenız çok sevınirim.

#include <16F877.h>
#BYTE    STATUS      =0X03    //status u tanımla
//---------------------------------------------------------------
bit_clear(STATUS,6);            //0. sayfaya tanımla
bit_clear(STATUS,5);            //0. sayfaya tanımla
unsigned int8 temp[7][8];     //56 adet regıster dızısı tanımla
bit_clear(STATUS,6);            //1. sayfaya tanımla
bit_set(STATUS,5);            //1. sayfaya tanımla
unsigned int8 tempa[7][8];     //56 adet regıster dızısı tanımla
bit_clear(STATUS,5);            //2. sayfaya tanımla
bit_set(STATUS,6);            //2. sayfaya tanımla
unsigned int8 tempb[7][8];     //56 adet regıster dızısı tanımla
bit_set(STATUS,6);            //3. sayfaya tanımla
bit_set(STATUS,5);            //3. sayfaya tanımla
unsigned int8 tempc[7][8];     //56 adet regıster dızısı tanımla
bit_clear(STATUS,6);            //0. sayfaya gerı don
bit_clear(STATUS,5);            //0. sayfaya gerı don
//---------------------------------------------------------------
void main(){

}
             Sevgiler&Saygılar
16F877.h dosyasına baktınız mı? Bank 1 deki değişkenleri nasıl tanımladığına bakın. Örnekler orada var. Diğer banklarda dizi nasıl tanımlanır bir bakmam lazım. Ama mantık olarak diğer banklara pointer ile ulaşmak gerekir (fsr ve indf registerleri bu amaçla tasarıma eklenmiştir, hatta 18 serisinde bunlardan 3 tane var)

Kolay gelsin
Başlık: Degısken sayısı neden bukadar az
Gönderen: XX_CİHAN_XX - 08 Aralık 2005, 14:29:36
İlginizzden ve yardımlarınızdan dolayı çok teşkkür ederim ancak verdiğiniz örneği uyguladıgımda yıne hata mesajı aldım.Yanlıs yaptıgım noktayı gosterırsenız sevınırım.
Aşagıdakır kodlarda yapmak istedıgım sey bank 1 e 3 tane degısken tanımlamak ve ana programda bu degıskenlerı okuyabılmek.

#include <16F877.h>
//---------------------------------------------------------------
write_bank(1,index1,c);
write_bank(1,index2,c);
write_bank(1,index3,c);
//---------------------------------------------------------------
void main(){
c=read_bank(1, index);
}

Bunu derledıgımde hata verıyor.Acaba yine nerde yanlış yaptım.Yardım ederseniz cok sevınırım.Teşekkurler,
Başlık: Degısken sayısı neden bukadar az
Gönderen: Petek - 08 Aralık 2005, 15:49:03
Alıntı yapılan: "XX_CİHAN_XX"...
Aşagıdakır kodlarda yapmak istedıgım sey bank 1 e 3 tane degısken tanımlamak ve ana programda bu degıskenlerı okuyabılmek.
Öncelikle terminolojide anlaşmak lazım. Eğer kullanımınıza açık dizi şeklinde bir alanınız varsa ve bu alana veri yükleyecekseniz artık bireysel değişken kavramını unutmanız lazım.

Şunu diyebilirsiniz: bank1 de ilk üç baytı şu amaçla kullanacağım. Diyelim ki bank 1'in ilk üç baytına 'A', 'B', 'C' harflerini saklayacaksınız.

#include <16f877.h>
#device ADC=10
#fuses HS,NOPROTECT, NOWDT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=19200, xmit=PIN_c6, rcv=PIN_c7)

//---------------------------------------------------------------
unsigned char c, index=0;

//---------------------------------------------------------------

void main(){

write_bank(1,index++, 'A');
write_bank(1,index++, 'B');
write_bank(1,index++, 'C');

// bunları tersten okutup seri porta göndereceğinizi varsayalım

c=read_bank(1, --index);
printf("%c", c);
c=read_bank(1, --index);
printf("%c", c);
c=read_bank(1, --index);
printf("%c", c);
}
Başlık: Degısken sayısı neden bukadar az
Gönderen: XX_CİHAN_XX - 08 Aralık 2005, 16:37:38
Alıntı yapılan: "Petek"
Alıntı yapılan: "XX_CİHAN_XX"...
Aşagıdakır kodlarda yapmak istedıgım sey bank 1 e 3 tane degısken tanımlamak ve ana programda bu degıskenlerı okuyabılmek.
Öncelikle terminolojide anlaşmak lazım. Eğer kullanımınıza açık dizi şeklinde bir alanınız varsa ve bu alana veri yükleyecekseniz artık bireysel değişken kavramını unutmanız lazım.

Şunu diyebilirsiniz: bank1 de ilk üç baytı şu amaçla kullanacağım. Diyelim ki bank 1'in ilk üç baytına 'A', 'B', 'C' harflerini saklayacaksınız.

#include <16f877.h>
#device ADC=10
#fuses HS,NOPROTECT, NOWDT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=19200, xmit=PIN_c6, rcv=PIN_c7)

//---------------------------------------------------------------
unsigned char c, index=0;

//---------------------------------------------------------------

void main(){

write_bank(1,index++, 'A');
write_bank(1,index++, 'B');
write_bank(1,index++, 'C');

// bunları tersten okutup seri porta göndereceğinizi varsayalım

c=read_bank(1, --index);
printf("%c", c);
c=read_bank(1, --index);
printf("%c", c);
c=read_bank(1, --index);
printf("%c", c);
}

Cok teşekkur ederım simdi daha iyi anladım.
Başlık: Degısken sayısı neden bukadar az
Gönderen: XX_CİHAN_XX - 11 Aralık 2005, 18:34:39
Ya bu konu ile ilgili bişey daha sorma ihtiyacı duydum.Yukarıdakı ornekte  bank1 e tek tek degısşken tanımlamışsınız.
*Peki bir dizi degısken tanımlamak gerekırse bunu nasıl yapıcagız?
*Birde yukarıdakı ornekte bank1e acılan ve kullanılan 3 adet index degıskenı glabal mıdır yoksa yerek degıskenmıdır?
Ben daha oncede soledıgım gıbı kayan yazı uygulaması ıcın ekran datalarını saklamam gereken bir degısken grubu olusturmam gerekkıyor.
Dolayısıyla cok fazla degıskene ihtiyacım var.Daha dogrusu ekranda kullanacagım led sayısı/8 kadar 8 bitlik degısken tanımlama gerek dolayısıyla bank0 dakı degısken sığası bana yetmıyor.
Ayrıca bu degıskenlerı dızı seklınde tanımlamak sanırım benım ıcın daha iyi olucak dolayısıyla sorum şu,
*Bank0 ve/veya diğer banklarda global olarak ve/veya dizi şeklinde 192 adet degısken tanımlamam gerekıyor.
*Bunu nasıl yaparım bir tavsiye bir yol gösterirseniz çok sevinirim.
                Saygılar&Sevgiler
Başlık: Degısken sayısı neden bukadar az
Gönderen: Petek - 11 Aralık 2005, 20:12:23
Alıntı yapılan: "XX_CİHAN_XX"Ya bu konu ile ilgili bişey daha sorma ihtiyacı duydum.Yukarıdakı ornekte  bank1 e tek tek degısşken tanımlamışsınız.
*Peki bir dizi degısken tanımlamak gerekırse bunu nasıl yapıcagız?

Bank 1 e tek tek değişken falan tanımlamadım. Bank 1 80 baytlık bir dizi olduğunuz düşün. Bu dizinin ilk elemanına (index=0) bir değer atadım. Bunu seri porttan okuduğun bilgi olarak ta kabul edebilirsin. Dizinin ikinci elemanına (index=1) başka bir değer atadım.

Aynı şeyi seri porttan okuduğum verileri saklamak için yapsaydım şöyle de olabilirdi:
for (i=0;i<80;i++) write_bank(1, i, getch());

Alıntı Yap
*Birde yukarıdakı ornekte bank1e acılan ve kullanılan 3 adet index degıskenı glabal mıdır yoksa yerek degıskenmıdır?
Örneğe bakarsan mainden önce tanımlanmış. Dolayısıyla global değişken. Üç adet index değişkeni tanımlanmadı. Sadece bir tane var. ilk değeri index=0. kullanıldıkça index++ ile (yani index=index+1) 1, 2 değerlerini alıyor.

Alıntı YapBen daha oncede soledıgım gıbı kayan yazı uygulaması ıcın ekran datalarını saklamam gereken bir degısken grubu olusturmam gerekkıyor.
Dolayısıyla cok fazla degıskene ihtiyacım var.Daha dogrusu ekranda kullanacagım led sayısı/8 kadar 8 bitlik degısken tanımlama gerek dolayısıyla bank0 dakı degısken sığası bana yetmıyor.
O zaman bank2 ve bank3 ü de kullanacaksın.

for (i=0;i<80;i++) write_bank(2, i, getch());
for (i=0;i<80;i++) write_bank(3, i, getch());
gibi

Alıntı Yap
Ayrıca bu degıskenlerı dızı seklınde tanımlamak sanırım benım ıcın daha iyi olucak dolayısıyla sorum şu,
*Bank0 ve/veya diğer banklarda global olarak ve/veya dizi şeklinde 192 adet degısken tanımlamam gerekıyor.
daha önce de dediğim gibi bank1,2,3 ü 3 adet 80 elemanlı (her elemanı 1 bayt) olan dizi olarak kullanabilirsin.

Alıntı Yap
*Bunu nasıl yaparım bir tavsiye bir yol gösterirseniz çok sevinirim.
                Saygılar&Sevgiler
yukarıda anlattığım gibi :)

Yapmak istediğin şeyi kodla, gerisini beraber geliştiririz. Elinde aaa(3,80) şeklinde bir dizi olduğunu varsay ve ona göre ne yapmak istiyorsan yap, en sonunda onu CCS'nin anlayacağı şekle dönüştürürüz beraber.
Başlık: Degısken sayısı neden bukadar az
Gönderen: XX_CİHAN_XX - 12 Aralık 2005, 12:34:53
@Petek
Yaptığınız ve yapacagınız yardımlr için şimdiden teşekkürler.

#include <16F877.h>
unsigned int8 temp[14][5];    //70 adet degişken tanımlandı
unsigned int8 c;

void main (){
write_bank(0,temp[0][0],0);
write_bank(1,temp[0][0],0);
write_bank(2,temp[0][0],0);
write_bank(3,temp[0][0],0);
//----------------------------
write_bank(0,temp[0][1],0);
write_bank(1,temp[0][1],0);
write_bank(2,temp[0][1],0);
write_bank(3,temp[0][1],0);
//----------------------------
write_bank(0,temp[0][2],0);
write_bank(1,temp[0][2],0);
write_bank(2,temp[0][2],0);
write_bank(3,temp[0][2],0);
//----------------------------
//           *
//           *
//           *
//           *
//           *
//----------------------------
write_bank(0,temp[13][4],0);
write_bank(1,temp[13][4],0);
write_bank(2,temp[13][4],0);
write_bank(3,temp[13][4],0);
//----------------------------

c=read_bank(1,temp[7][4]);

}

Yukarıda yazdıgım kodlar sorunsuz derlenıyor ancak yapmak istediğim şeyi dogru yapabilmişmiyim sormak istedim.
Yukarıda yapmak istediğim şey:
Bank0/1/2/3 te 70 adet ayrı degısken dızısı kullanabılmek.
Bank0/1/2/3 te birbirinden farklı 70 er adet GLOBAL degısken dızısı oluturdugumu düşünürsek bunların herbırıne "0" degerı yuklemeye calıstım ve butun degıskenlere (70*4 kadar degıskene) "0" datasını yukledıkten sonra içlerinden herhangi birini(temp[7][4] isimli değişkeni) okuyup c degişkenine yüklemeye çalıştım.
Sizce dogru mu yapmışım veya daha dogru bır yolu var mı bilgilendirirsenız sevınırım. Teşekkürler.
Başlık: Degısken sayısı neden bukadar az
Gönderen: Petek - 12 Aralık 2005, 14:06:38
Alıntı yapılan: "XX_CİHAN_XX"@Petek
Yaptığınız ve yapacagınız yardımlr için şimdiden teşekkürler.

#include <16F877.h>
unsigned int8 temp[14][5];    //70 adet degişken tanımlandı
unsigned int8 c;

void main (){
write_bank(0,temp[0][0],0);
write_bank(1,temp[0][0],0);
write_bank(2,temp[0][0],0);
write_bank(3,temp[0][0],0);
//----------------------------
write_bank(0,temp[0][1],0);
write_bank(1,temp[0][1],0);
write_bank(2,temp[0][1],0);
write_bank(3,temp[0][1],0);
//----------------------------
write_bank(0,temp[0][2],0);
write_bank(1,temp[0][2],0);
write_bank(2,temp[0][2],0);
write_bank(3,temp[0][2],0);
//----------------------------
//           *
//           *
//           *
//           *
//           *
//----------------------------
write_bank(0,temp[13][4],0);
write_bank(1,temp[13][4],0);
write_bank(2,temp[13][4],0);
write_bank(3,temp[13][4],0);
//----------------------------

c=read_bank(1,temp[7][4]);

}

Yukarıda yazdıgım kodlar sorunsuz derlenıyor ancak yapmak istediğim şeyi dogru yapabilmişmiyim sormak istedim.
Yukarıda yapmak istediğim şey:
Bank0/1/2/3 te 70 adet ayrı degısken dızısı kullanabılmek.

write_bank(0,temp[13][4],0); bu satırdaki temp[13][4] nün işi ne orada? Yoksa şunu mu düşündünüz:  "write_bank komutu, bank 0 da tanımlı değişkenimizin temp[13][4] nolu elemanına 0 değeri atıyor". Böyle düşünmüş iseniz yanlış. Sizin temp[13][4] boyutlu bir dizi tanımlamanıza gerek yok. elinizde bütün banklarda 80 baytlık bir alan var. Bunu bir dizi düşünün fakat isim vermeyin buna. Hayali dizi. Bu dizinin elemanlarına write_bank yada read_bank komutları ile erişiyorsunuz. Hepsi bu. Aslında write_bank ve read_bank fonksiyonlarında yapılan işlem aynen şu: her bir banktaki ram alanına (yada hayali dizilerimizin) her bir baytına o baytın "memory map"teki adresini fsr registerine yazıp, değerini indf registerinden okuma veya yazma işlemi yapar. Bank2 ve 3 için ilave olara irp flağini set eder.

Alıntı Yap
Bank0/1/2/3 te birbirinden farklı 70 er adet GLOBAL degısken dızısı oluturdugumu düşünürsek bunların herbırıne "0" degerı yuklemeye calıstım ve butun degıskenlere (70*4 kadar degıskene) "0" datasını yukledıkten sonra içlerinden herhangi birini(temp[7][4] isimli değişkeni) okuyup c degişkenine yüklemeye çalıştım.
Sizce dogru mu yapmışım veya daha dogru bır yolu var mı bilgilendirirsenız sevınırım. Teşekkürler.

yapmanız gereken aynen şu beş satırdaki gib.
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<70;i++) write_bank(2, i, 0);
for (i=0;i<70;i++) write_bank(3, i, 0);
c=read_bank(1,40);

Yalnız bank 0 da öyle istediğiniz gibi 70 bayt size tahsis edilmiş değil, derleyiciye bu alanı sen kullanma bana rezerve et diyeceksiniz. Helpten CCS nin adres rezervleme komutuna bakın.

daha derli toplu kullanılabilen read_bank ve write_bank komutlarının yerine fsr ve indf registerlerini kullanarak aynı işlemleri yaptırabilirsiniz.
Başlık: Degısken sayısı neden bukadar az
Gönderen: XX_CİHAN_XX - 12 Aralık 2005, 14:39:47
Alıntı Yap
yapmanız gereken aynen şu beş satırdaki gib.
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<70;i++) write_bank(2, i, 0);
for (i=0;i<70;i++) write_bank(3, i, 0);
c=read_bank(1,40);
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);
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ı?
onun yerıne
c=read_bank(1,i=40);
dersekde olur mu?
Çok teşekkurler.
Başlık: Degısken sayısı neden bukadar az
Gönderen: Petek - 12 Aralık 2005, 14:57:28
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.
Başlık: Degısken sayısı neden bukadar az
Gönderen: XX_CİHAN_XX - 12 Aralık 2005, 15:19:50
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
Başlık: Degısken sayısı neden bukadar az
Gönderen: Petek - 12 Aralık 2005, 15:44:41
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
Başlık: Degısken sayısı neden bukadar az
Gönderen: XX_CİHAN_XX - 12 Aralık 2005, 17:08:33

#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?
Başlık: Degısken sayısı neden bukadar az
Gönderen: Petek - 12 Aralık 2005, 17:32:34
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.
Başlık: Degısken sayısı neden bukadar az
Gönderen: XX_CİHAN_XX - 12 Aralık 2005, 18:02:42
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
Başlık: Degısken sayısı neden bukadar az
Gönderen: XX_CİHAN_XX - 14 Aralık 2005, 00:32:32
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
Başlık: Degısken sayısı neden bukadar az
Gönderen: Petek - 14 Aralık 2005, 01:06:40
Ö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)
Başlık: Degısken sayısı neden bukadar az
Gönderen: XX_CİHAN_XX - 14 Aralık 2005, 01:36:24
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?
Başlık: Degısken sayısı neden bukadar az
Gönderen: Petek - 14 Aralık 2005, 02:08:01
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.
Başlık: Degısken sayısı neden bukadar az
Gönderen: XX_CİHAN_XX - 14 Aralık 2005, 12:42:22
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
Başlık: Degısken sayısı neden bukadar az
Gönderen: Petek - 14 Aralık 2005, 15:07:14
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...
Başlık: Degısken sayısı neden bukadar az
Gönderen: XX_CİHAN_XX - 17 Aralık 2005, 22:31:53
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
Başlık: Degısken sayısı neden bukadar az
Gönderen: Petek - 17 Aralık 2005, 23:08:35
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.
Başlık: Degısken sayısı neden bukadar az
Gönderen: kalman - 06 Ocak 2006, 16:22:14
@XX_CİHAN_XX

kayan yazı ile bir ilerleme varmı ?