CCS C ve yine bir pointer Sorunu.

Başlatan Mucit23, 19 Haziran 2016, 13:18:59

Mucit23

Selamlar,

P6 Paneller için kütüphane hazırlıyorum. Kütüphanede %90lık kısmı hallettim. Text basma fonksiyonu üzerinde çalışıyorum. Şimdiye kadar çok hızlı ilerliyordum ama bir yerde pointer problemine takıldım.

Şöyle açıklayayım.

Karakter Basma için Aşağıdaki gibi bir fonksiyon hazırladım.

/*******************************************************************************
*   P6DisplayChar                                                              *
*   Parameter:    Xpos, Ypos, *saddress                                        *
*   Return:                                                                    *
*******************************************************************************/
void P6_DrawChar(unsigned int Xpos, Unsigned int Ypos, unsigned int8 *saddress)
{
   unsigned int16 index = 0, i = 0;
   unsigned int8 add=P6_Currentfonts.Height/8;
   unsigned int8 xbit;

   xbit=*saddress;

   for(index=0;index<P6_CurrentFonts.Height*add;index++)
   {
      for(i=0;i<P6_CurrentFonts.Width;i++)
      {
        if(((xbit<<i) & 0x80)==0x00)
        {
           PutPixel(Xpos+i,Ypos+index/add,0);
        }
        else
        {
           PutPixel(Xpos+i,Ypos+index/add,1);
        }
      }
   }
}

Yukarıdaki fonksiyon tam olarak bitmiş değil. Bu yüzden çalışmasına takılmayın. Eğer Ben yukarıdaki fonksiyonda xbit değişkenine saddress in gösterdiği değeri kopyalayabilirsem sorun çözülecek.

Karakter Dataları aşağıdaki gibi bir dizi ile rom'da tutuluyor.
rom unsigned int8 Font8_Table[] = 
{
   // @0 ' ' (5 pixels wide)
   0x00, //      
   0x00, //      
   0x00, //      
   0x00, //      
   0x00, //      
   0x00, //      
   0x00, //      
   0x00, //  
.
.
.


Bunun dışında 2 adet daha font dosyası ve aynı şekilde tanımlanmış.

Şöyle bir sıkıntı var. P6_DrawChar fonksiyonuna saddress pointeri ile basılacak karakterin hafızadaki başlangıç adresini yolluyorum. Program P6_DrawChar fonksiyonuna geldiğinde saddress pointeri basılmak istenen karakterin başlangıç adresini ve değerini tutuyor. Bunu proteusda debug yaparak görebiliyorum. Yani program P6_DrawChar içerisine geldiğinde gerçektende saddress pointerinin içeriği benim basmak istediğim karakterin başlangıç datasını içeriyor.  Ama bu saddress değerinin içeriğini hiçbir şekilde kullanamıyorum.

Örneğin yukarıdaki fonksiyonda xbit şeklinde bir değişken tanımladım ve xbit=*saddress; kodu ile saddress pointerinin içeriğini xbit değişkenine almaya çalışıyorum. Fakat işlem sonucunda xbit'in içeriği sıfır oluyor her zaman. Pointer konusunu biliyorum ama nedense burada böyle bir problem yaşanıyor.
Aynı fonksiyon içerisinde farklı pointerlar tanımlayıp bu pointerlar içerisinde her türlü aktarma yapabiliyorum. Pointer kullanımında sıkıntı yok gibi. Fakat fonksiyona gönderdiğim saddress in içeriğini alamıyorum.

Bu arada saddresin sadece içeriğini kopyalayamıyorum. Örneği aşağıdaki gibi bir işlemle saddress pointerinin adresini alabiliyorum

unsigned int16 address=sadress;


Bu sorunu çözersem eğer devam edip programı bitireceğim.

Benim aklıma gelen tek olası problem Karakter dataları hafızada tutulurken const unsigned int8 Font8_Table[] = {.... } yerine rom unsigned int8 Font8_Table[] ={..} şeklinde tanımlanmlı olması. Const olarak tanımlanan diziler hiçbir şekilde pointerda kullanılamıyor.  Rom oluncada program hafızasında tutulduğundan sonradan ram'e alınamıyor. Yani eğer öyleyse eğer Program hafızasından Ram'e veri kopyalamak gerekiyor ama pic mimarisi buna müsade etmiyor.

Yada başka bir sorun var.

Kullandığım MCU Pic18F252. Belki Pointer adres uzunluğu yetmiyordur diye #device *=16 tanımlamasını yaptım ama sorun çözülebilmiş değil.

Sonuç olarak bu sorunu nasıl aşacağımı bilmiyorum. Yardım ederseniz sevinirim.


Mucit23

Sorunu cozdum arkadaşlar. Fonksiyona gönderdiğim printer da rom unsigned int8 türünden olmalıymış.

sadogan

2 boyutlu font tablosu hazırlayıp, basılacak olan karakterin fontunu
rem e memcopy ile alıp, burdan basmak nasıl olur.