ccs ile pic programlama da const ve pointer sorunu lütfen bakın...

Başlatan elektro.mustaf, 21 Temmuz 2012, 19:02:20

elektro.mustaf

set_tris_b(h0x00);
  output_b(h0xff); 
  int i, led,asd;

   void pals(void){
   i=0;
   output_b(i);
   i=1;
   output_b(i); 
   }
   
   int gecikme(int g){
   int g1,g2;
   for(g1=0;g1<g;g1++){
      for(g2=0;g2<255;g2++){};
     
   }
   return g2;
   }
     const char  m[8]={0x00,0x22,0x36,0x2A,0x22,0x22,0x22,0x22};
   void karakteryaz(int dizi[]){
    int j,k,t;

//   t=gecikme(200);
   for(j=0;j<gecikme(4);j++){
   for (led=0;led<8;led++)
    { output_b(dizi[led]);
    pals();
  //  delay_ms(100);
    }
  //  delay_ms(1000);
   }}
   
   
void main()
{
//char dizi[8]={};
char  m[]={0x00,0x22,0x36,0x2A,0x22,0x22,0x22,0x22};
char  u[]={0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x1C};
char  s[]={0x00,0x1C,0x22,0x20,0x1C,0x02,0x22,0x1C};
char  t[]={0,62,42,8,8,8,8,28};
char  a[]={0x00,0x1C,0x22,0x22,0x3E,0x22,0x22,0x22};
char  f[]={0x00,0x3C,0x24,0x20,0x38,0x20,0x20,0x20};

   while(1)
   {
   karakteryaz(m);
   delay_ms(200);
   karakteryaz(u);
   karakteryaz(s);
   karakteryaz(t);
   karakteryaz(a);
   karakteryaz(f);
   karakteryaz(a);
   }}

arkadaşlar üstteki oluşturduğum fonksiyonlar ile küçük animasyon devremde herşey sorunsuz çalışyor harfleri görüyorum ama tabi ram yetmiyor.const ile tanımlamaya kalkınca da bu seferde "karakteryaz(m);"komutunda pointer olarak tanıtmamı istiyor anlamadım hata verip duruyor ya bi türlü tanıtamadım kafayı yicem :S yardımcı olabilcek arakdaşlar varsa sevinirim.. hata ile ilgili resmide koyuyorum...


mufitsozen

bu sorunun CCS C ile alakasi yok.

C dilinde diziler ve pointerlar arasindaki iliskiyi daha iyi anlamaniz lazim.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.


yamak

Hocam ram dediğiniz yer stack olmuyo mu? yerel değişkenler stack te saklanır. static ve global değikenlerde ram de saklanır. Yani benim bildiğim bi değişken ya ram de ya da stack de saklanır. const nesneler belleğin hangi bölgesinde saklanıyo.  Zaten bi pic in memory sin pogram memory,stcak ve data memory den oluşur. Daha önce de başıma böyle bişey gelmişti de ondan soruyorum. Bi 500 küsür elemanlı bi diziyi const tanımlamadığı için derleyici hata vermişti. Bu olayı biraz açıklayabilir misiniz?

elektro.mustaf

ya denedim herşeyi gene olmadı maalesef

mufitsozen hocam aynı programı normal char açarak yapabiliyorum açıkcası gayet düzgün çalışıyor ram hatası veriyordu const char açtım olmadı

gerbay hocam sizin dediğiniz gibi de açtım olmadı anlamadım bu işi kabul etmiyor maalesef
expecting an identifier hatası alıyorum
"void karakteryaz(const char *dizi)" bu kısımda dizi için söylüyor bunu

static const da kullandım olmadı maalesef...


extern void karakteryaz(const char *dizi);

int main()
{
    const char  m[]={0x00,0x22,0x36,0x2A,0x22,0x22,0x22,0x22};
    const char  u[]={0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x1C};
    const char  s[]={0x00,0x1C,0x22,0x20,0x1C,0x02,0x22,0x1C};
    const char  t[]={0,62,42,8,8,8,8,28};
    const char  a[]={0x00,0x1C,0x22,0x22,0x3E,0x22,0x22,0x22};
    const char  f[]={0x00,0x3C,0x24,0x20,0x38,0x20,0x20,0x20};	
  
  for (;;) 
  {
      karakteryaz(m);
      delay(200);
      karakteryaz(u);
      delay(200);
      karakteryaz(s);
      delay(200);
      karakteryaz(t);
      delay(200);
      karakteryaz(a);
      delay(200);
      karakteryaz(f);
      delay(200);
  }
  return 0;
}

yukarıdaki
extern void karakteryaz(const char *dizi); olan kısımda char dizisinin içinden teker teker çekmem lazım burada sizin verdiğinizde nasıl çekicem yoksa örnek olsun diye mi yazdınız?

bu arada normal const tanımlamasını gayet rahat kullanabiliyorum normalde burada 2 tane void fonksiyonunda iç içe geçince olmuyor hata veriyor başka bi led küp tarama programına baktım kimse benim gibi iç içe 2 fonksiyonda çağırmamış mesela const ı sorunsuz kullandığım bi kod vereyim aşağıda ki sorunsuz çalışıyor


int led,i,a,sec,b;


int led2=60;


//ledleri sırayla yakma 2 tane fonksiyon oluşturdum
const char secme[4]={0x07,0x0b,0x0d,0x0e};
const char secme2[4]={0x17,0x1b,0x1d,0x1e};

void ledyakma(void){
   
   for(i=0;i<8;i++){ // RD0'dan RD7'ye
      led=1<<i; 
      output_b(led); 
      delay_ms(led2);
   }


}

void ledyakmasira(void){
   
   for(a=0;a<4;a++){
//   led2=; // duzlemi sec
   output_a(secme[a]); 
   ledyakma();
}

for(a=0;a<4;a++){
   output_a(secme2[a]); 
   ledyakma();
}
   
}
///ledleri sırayla yakma fonksiyon bitişi

void main(void)
{
set_tris_b(0x00) ; // port b yi çıkış yap
set_tris_a(0x00) ;
output_b(0x00);
output_a(0x10);
led=1;  
led2=0;
i=1;


//edb7
while(true)
{
ledyakmasira();

}}


bi de son olarak const un fonksiyon içinde kullanımı örneklerini çok bulamadım benim kullandığım gibi..örnek varsa fazladan verebilirmisiniz?
cevaplayan herkese çok teşekkürler..

LukeSkywalker

MikroC'de const olarak tanımlanan değişkenler rom'a atılıyor. Peki hocam const tanımlanan değişkenler üzerinde değişiklik  yapılamadığına göreneden ramde saklanıyor?

yamak


Tagli

C18'de const yazmadan da program hafızasına veri yerleştirilebiliyordu yanlış hatırlamıyorsam. Başa rom ifadesini yazıyorduk. Tabi bu durumda değişkenin değiştirilebilir olması için PIC'in kendi program hafızasına yazabilme yeteneği olması lazım. Gerçi bu şekilde bir kullanım pek mantıklı değil ama belki uç durumlarda lazım olabilir.
Gökçe Tağlıoğlu

riggs

const olarak tanımlanan değişkenlerin Flash(program memory) ta tutlacağına dair bir döküman mevcut mu? Çünkü AVR GCC'de bu iş için progmem isimli niteleyici kullanılmış. Eğer const olarak tanımlanan değişkenler flash'tan RAM bölgesine kopyalanmıyorsa, bu işlemi doğrulamak için nasıl bir yöntem olabilir...

Tagli

Durum derleyiciye göre değişebilir. const ifadesinin garanti edeceği tek şey sabit oluşu. Ondan ötesi için derleyici dokümantasyonuna bakılmalı.
Gökçe Tağlıoğlu