Rom'daki bir Diziyi Ram'deki Pointer'a kopyalama

Başlatan Mucit23, 01 Temmuz 2014, 12:40:45

Mucit23

Konunun daha çok ilgi çekmesini umut ediyorum. Çünkü yaşadığım problemin bendenmi Yoksa CCS ilemi ilgili olduğu gerçekten öğrenmek istiyorum. 2-3 gündür bu problemle uğraşıyorum.

Bu konuda bu başlıktaki konunun devamıdır.
https://www.picproje.org/index.php/topic,37748.210.html

Kullandığım işlemci 18F4620, CCS nin versiyonu ise 4.140

Konuyu kısaca açıklayayım. 1024 Elemanlı const unsigned char türünden bir dizim var. Bu diziyi yine unsigned char türünde olan bir pointere kopyalamak istiyorum. Yapmaya çalıştığım şey budur.

Ufak bir program yazıp birkaç test yaptım. Elde ettiğim sonuçlar ı yazayım.
Tanımladığım 1024 elemanlı resim dizisi budur
const unsigned char Resim[1024]={
      0XFF,0XFF,0X7F,0XBF,0X5F,0XAF,0X57,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,
      0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,
      0X55,................................

Birde pointer tanımlıyorum.
  unsigned char *p;

Şimdi bundan sonra resim dizisinin adresini P pointerine yüklüyorum. Kullanımda problem olmamalı.
   p = (char *) & Resim;

Resim dizisinin ilk iki elemanı 0xFF. Ben sırayla p pointerinin içeriğine bakıyorum.
p[0]=0x00;
p[1]=0x00;
p[2]=0x00;
      .
      .
İçerik hep sıfır. Derleyici hiçbir uyarı veya hata vermiyor ama kopyalama işlemide başarısız oluyor.

Aynı işlemi Resim dizisiyle değilde unsigned char türünde 3 elemanlı bir dizi ile yapıyorum.
  unsigned char i[3]={0x15,0x25,0x35};
Aynı şekilde i dizisini P pointerine kopyalıyorum.
   p = (char *) & i;
Tekrardan P pointerinin içeriğine bakıyorum.
p[0]=0x15;
p[1]=0x25;
p[2]=0x35;

Bu şekilde işlem başarılı oluyor. Resim dizisini const türünden tanımlamadığım zamanda işlem başarılı oluyor. Buradan anlıyorumki sorun rom'daki bir diziyi ram'deki pointere kopyalamak.

Bu iş için yazdığım program aşağıdaki gibi. 
#include <18F4620.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(clock=20000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

#include <lcd_driver.c>
#include <image.c>

  unsigned char *p;
  unsigned char i[3]={0x15,0x25,0x35};

void main()
{
   setup_timer_3(T3_DISABLED | T3_DIV_BY_1);

   set_tris_a(0x00);
   set_tris_b(0x00);
   set_tris_c(0x00);
   set_tris_d(0x00);
   set_tris_e(0x00);
   
   output_a(0x00);
   output_b(0x00);
   output_c(0x00);
   output_d(0x00);
   output_e(0x00);
   delay_ms(200);

   lcd_init();
   printf(lcd_putc,"\f");
  
   p=(char *)&i;
   
   while(TRUE)
   {
     lcd_gotoxy(1,1);
     printf(lcd_putc,"Value=0x%02X",p[0]);
   }

}


Bu kodun assembly çıktısı aşağıdaki gibi.
CCS PCH C Compiler, Version 4.140, 17317               01-Tem-14 12:27

               Filename:   C:\Users\My_PC\Desktop\Pointer Test\main.lst

               ROM used:   590 bytes (1%)
                           Largest free fragment is 64946
               RAM used:   7 (0%) at main() level
                           19 (0%) worst case
               Stack:     5 locations

*
00000:  GOTO   01D0
.................... #include <18F4620.h> 
.................... //////// Standard Header file for the PIC18F4620 device //////////////// 
.................... #device PIC18F4620 
.................... #list 
....................  
.................... #device adc=16 
....................  
.................... #FUSES NOWDT                    //No Watch Dog Timer 
.................... #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale 
.................... #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD) 
.................... #FUSES NOBROWNOUT               //No brownout reset 
.................... #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O 
.................... #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode) 
....................  
.................... #use delay(clock=20000000) 
*
0002A:  CLRF   FEA
0002C:  MOVLW  0B
0002E:  MOVWF  FE9
00030:  MOVF   FEF,W
00032:  BZ    004E
00034:  MOVLW  06
00036:  MOVWF  01
00038:  CLRF   00
0003A:  DECFSZ 00,F
0003C:  BRA    003A
0003E:  DECFSZ 01,F
00040:  BRA    0038
00042:  MOVLW  7B
00044:  MOVWF  00
00046:  DECFSZ 00,F
00048:  BRA    0046
0004A:  DECFSZ FEF,F
0004C:  BRA    0034
0004E:  RETURN 0
....................  
.................... #use fast_io(a) 
.................... #use fast_io(b) 
.................... #use fast_io(c) 
.................... #use fast_io(d) 
.................... #use fast_io(e) 
....................  
.................... #include <lcd_driver.c> 
.................... //Buradaki ayar bendeki Deneme Kartina göredir, istenilirse baska Pinlere cevrilebilinir. 
.................... #define LCD_DB4   PIN_C4 
.................... #define LCD_DB5   PIN_C5 
.................... #define LCD_DB6   PIN_C6 
.................... #define LCD_DB7   PIN_C7 
....................  
.................... #define LCD_E     PIN_C3 
.................... #define LCD_RS    PIN_C2 
....................  
.................... //#define LCD_RW    PIN_B6 //Bendeki Deneme Kartinda LC_RW PIC'in GND Pinine bagli.Bu nedenle bu satiri iptal ediyoruz... 
.................... //#define USE_LCD_RW   1   // Ayni sebepden bu satirida iptal ediyoruz !!     
....................  
.................... //========================================  
....................  
.................... #define lcd_type 2        // 0=5x7, 1=5x10, 2=2 lines  
.................... #define lcd_line_two 0x40 // LCD RAM address for the 2nd line  
....................  
.................... int8 const LCD_INIT_STRING[4] =  
.................... {  
....................  0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots  
....................  0xc,                    // Display on  
....................  1,                      // Clear display  
....................  6                       // Increment cursor  
....................  };  
....................                                
....................  
.................... //-------------------------------------  
.................... void lcd_send_nibble(int8 nibble)  
.................... {  
.................... // Note:  !! converts an integer expression  
.................... // to a boolean (1 or 0)  
....................  output_bit(LCD_DB4, !!(nibble & 1));  
00050:  BTFSC  12.0
00052:  BRA    0058
00054:  BCF    F8B.4
00056:  BRA    005A
00058:  BSF    F8B.4
....................  output_bit(LCD_DB5, !!(nibble & 2));   
0005A:  BTFSC  12.1
0005C:  BRA    0062
0005E:  BCF    F8B.5
00060:  BRA    0064
00062:  BSF    F8B.5
....................  output_bit(LCD_DB6, !!(nibble & 4));     
00064:  BTFSC  12.2
00066:  BRA    006C
00068:  BCF    F8B.6
0006A:  BRA    006E
0006C:  BSF    F8B.6
....................  output_bit(LCD_DB7, !!(nibble & 8));    
0006E:  BTFSC  12.3
00070:  BRA    0076
00072:  BCF    F8B.7
00074:  BRA    0078
00076:  BSF    F8B.7
....................  
....................  delay_cycles(1);  
00078:  NOP   
....................  output_high(LCD_E);  
0007A:  BSF    F8B.3
....................  delay_us(2);  
0007C:  MOVLW  02
0007E:  MOVWF  00
00080:  DECFSZ 00,F
00082:  BRA    0080
00084:  BRA    0086
00086:  NOP   
....................  output_low(LCD_E);  
00088:  BCF    F8B.3
.................... }  
0008A:  RETURN 0
....................  
.................... //-----------------------------------  
.................... // This sub-routine is only called by lcd_read_byte().  
.................... // It's not a stand-alone routine.  For example, the  
.................... // R/W signal is set high by lcd_read_byte() before  
.................... // this routine is called.       
....................  
.................... #ifdef USE_LCD_RW  
.................... int8 lcd_read_nibble(void)  
.................... {  
.................... int8 retval;  
.................... // Create bit variables so that we can easily set  
.................... // individual bits in the retval variable.  
.................... #bit retval_0 = retval.0  
.................... #bit retval_1 = retval.1  
.................... #bit retval_2 = retval.2  
.................... #bit retval_3 = retval.3  
....................  
.................... retval = 0;  
....................      
.................... output_high(LCD_E);  
.................... delay_cycles(1);  
....................  
.................... retval_0 = input(LCD_DB4);  
.................... retval_1 = input(LCD_DB5);  
.................... retval_2 = input(LCD_DB6);  
.................... retval_3 = input(LCD_DB7);  
....................    
.................... output_low(LCD_E);  
....................      
.................... return(retval);     
.................... }     
.................... #endif  
....................  
.................... //---------------------------------------  
.................... // Read a byte from the LCD and return it.  
....................  
.................... #ifdef USE_LCD_RW  
.................... int8 lcd_read_byte(void)  
.................... {  
.................... int8 low;  
.................... int8 high;  
....................  
.................... output_high(LCD_RW);  
.................... delay_cycles(1);  
....................  
.................... high = lcd_read_nibble();  
....................  
.................... low = lcd_read_nibble();  
....................  
.................... return( (high<<4) | low);  
.................... }  
.................... #endif  
....................  
.................... //----------------------------------------  
.................... // Send a byte to the LCD.  
.................... void lcd_send_byte(int8 address, int8 n)  
.................... {  
.................... output_low(LCD_RS);  
0008C:  BCF    F8B.2
....................  
.................... #ifdef USE_LCD_RW  
.................... while(bit_test(lcd_read_byte(),7)) ;  
.................... #else  
.................... delay_us(60);   
0008E:  MOVLW  63
00090:  MOVWF  00
00092:  DECFSZ 00,F
00094:  BRA    0092
00096:  BRA    0098
.................... #endif  
....................  
.................... if(address)  
00098:  MOVF   0F,F
0009A:  BZ    00A0
....................    output_high(LCD_RS);  
0009C:  BSF    F8B.2
.................... else  
0009E:  BRA    00A2
....................    output_low(LCD_RS);  
000A0:  BCF    F8B.2
....................        
....................  delay_cycles(1);  
000A2:  NOP   
....................  
.................... #ifdef USE_LCD_RW  
.................... output_low(LCD_RW);  
.................... delay_cycles(1);  
.................... #endif  
....................  
.................... output_low(LCD_E);  
000A4:  BCF    F8B.3
....................  
.................... lcd_send_nibble(n >> 4);  
000A6:  SWAPF  10,W
000A8:  MOVWF  11
000AA:  MOVLW  0F
000AC:  ANDWF  11,F
000AE:  MOVFF  11,12
000B2:  RCALL  0050
.................... lcd_send_nibble(n & 0xf);  
000B4:  MOVF   10,W
000B6:  ANDLW  0F
000B8:  MOVWF  11
000BA:  MOVWF  12
000BC:  RCALL  0050
.................... }  
000BE:  RETURN 0
....................  
.................... //----------------------------  
.................... void lcd_init(void)  
.................... {  
.................... int8 i;  
....................  
.................... output_low(LCD_RS);  
000C0:  BCF    F8B.2
....................  
.................... #ifdef USE_LCD_RW  
.................... output_low(LCD_RW);  
.................... #endif  
....................  
.................... output_low(LCD_E);  
000C2:  BCF    F8B.3
....................  
.................... delay_ms(15);  
000C4:  MOVLW  0F
000C6:  MOVWF  0B
000C8:  RCALL  002A
....................  
.................... for(i=0 ;i < 3; i++)  
000CA:  CLRF   06
000CC:  MOVF   06,W
000CE:  SUBLW  02
000D0:  BNC   00E2
....................    {  
....................     lcd_send_nibble(0x03);  
000D2:  MOVLW  03
000D4:  MOVWF  12
000D6:  RCALL  0050
....................     delay_ms(5);  
000D8:  MOVLW  05
000DA:  MOVWF  0B
000DC:  RCALL  002A
....................    }  
000DE:  INCF   06,F
000E0:  BRA    00CC
....................  
.................... lcd_send_nibble(0x02);  
000E2:  MOVLW  02
000E4:  MOVWF  12
000E6:  RCALL  0050
....................  
.................... for(i=0; i < sizeof(LCD_INIT_STRING); i++)  
000E8:  CLRF   06
000EA:  MOVF   06,W
000EC:  SUBLW  03
000EE:  BNC   0108
....................    {  
....................     lcd_send_byte(0, LCD_INIT_STRING[i]);  
000F0:  CLRF   03
000F2:  MOVF   06,W
000F4:  RCALL  0004
000F6:  MOVWF  07
000F8:  CLRF   0F
000FA:  MOVWF  10
000FC:  RCALL  008C
....................      
....................     // If the R/W signal is not used, then  
....................     // the busy bit can't be polled.  One of  
....................     // the init commands takes longer than  
....................     // the hard-coded delay of 60 us, so in  
....................     // that case, lets just do a 5 ms delay  
....................     // after all four of them.  
....................     #ifndef USE_LCD_RW  
....................     delay_ms(5);  
000FE:  MOVLW  05
00100:  MOVWF  0B
00102:  RCALL  002A
....................     #endif  
....................    }  
00104:  INCF   06,F
00106:  BRA    00EA
....................  
.................... }  
00108:  GOTO   020A (RETURN)
....................  
.................... //----------------------------  
....................  
.................... void lcd_gotoxy(int8 x, int8 y)  
.................... {  
.................... int8 address;  
....................  
.................... if(y != 1)  
0010C:  DECFSZ 0C,W
0010E:  BRA    0112
00110:  BRA    0118
....................    address = lcd_line_two;  
00112:  MOVLW  40
00114:  MOVWF  0D
.................... else  
00116:  BRA    011A
....................    address=0;  
00118:  CLRF   0D
....................  
.................... address += x-1;  
0011A:  MOVLW  01
0011C:  SUBWF  0B,W
0011E:  ADDWF  0D,F
.................... lcd_send_byte(0, 0x80 | address);  
00120:  MOVF   0D,W
00122:  IORLW  80
00124:  MOVWF  0E
00126:  CLRF   0F
00128:  MOVWF  10
0012A:  RCALL  008C
.................... }  
0012C:  RETURN 0
....................  
.................... //-----------------------------  
.................... void lcd_putc(char c)  
.................... {  
....................  switch(c)  
....................    {  
0012E:  MOVF   0A,W
00130:  XORLW  0C
00132:  BZ    013E
00134:  XORLW  06
00136:  BZ    014E
00138:  XORLW  02
0013A:  BZ    015A
0013C:  BRA    0164
....................     case '\f':  
....................       lcd_send_byte(0,1);  
0013E:  CLRF   0F
00140:  MOVLW  01
00142:  MOVWF  10
00144:  RCALL  008C
....................       delay_ms(2);  
00146:  MOVLW  02
00148:  MOVWF  0B
0014A:  RCALL  002A
....................       break;  
0014C:  BRA    016E
....................      
....................     case '\n':  
....................        lcd_gotoxy(1,2);  
0014E:  MOVLW  01
00150:  MOVWF  0B
00152:  MOVLW  02
00154:  MOVWF  0C
00156:  RCALL  010C
....................        break;  
00158:  BRA    016E
....................      
....................     case '\b':  
....................        lcd_send_byte(0,0x10);  
0015A:  CLRF   0F
0015C:  MOVLW  10
0015E:  MOVWF  10
00160:  RCALL  008C
....................        break;  
00162:  BRA    016E
....................      
....................     default:  
....................        lcd_send_byte(1,c);  
00164:  MOVLW  01
00166:  MOVWF  0F
00168:  MOVFF  0A,10
0016C:  RCALL  008C
....................        break;  
....................    }  
.................... }  
0016E:  RETURN 0
....................  
.................... //------------------------------  
.................... #ifdef USE_LCD_RW  
.................... char lcd_getc(int8 x, int8 y)  
.................... {  
.................... char value;  
....................  
.................... lcd_gotoxy(x,y);  
....................  
.................... // Wait until busy flag is low.  
.................... while(bit_test(lcd_read_byte(),7));   
....................  
.................... output_high(LCD_RS);  
.................... value = lcd_read_byte();  
.................... output_low(lcd_RS);  
....................  
.................... return(value);  
.................... }  
.................... #endif 
....................  
.................... #include <image.c> 
.................... const unsigned char Resim[1024]={ 
....................       0XFF,0XFF,0X7F,0XBF,0X5F,0XAF,0X57,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB, 
....................       0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB, 
....................       0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB, 
....................       0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB, 
....................       0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB, 
....................       0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB, 
....................       0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB, 
....................       0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X55,0XAB,0X57,0XAF,0X5F,0XBF,0X7F,0XFF, 
....................       0XFF,0XFF,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA, 
....................       0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA, 
....................       0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA, 
....................       0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA, 
....................       0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA, 
....................       0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA, 
....................       0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA, 
....................       0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XFF, 
....................       0XFF,0XFF,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X05,0X02,0X01,0X00,0X00,0X00, 
....................       0X80,0XC0,0X60,0X60,0X20,0X20,0X20,0XA0,0XE0,0XE0,0XE0,0X00,0X00,0X00,0X00,0X00, 
....................       0X00,0X00,0X00,0X00,0X00,0X80,0XC0,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 
....................       0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 
....................       0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X30,0X38,0X38,0X00,0X00, 
....................       0X00,0X00,0X00,0X80,0XC0,0X40,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0XC0,0X60, 
....................       0X60,0X60,0XE0,0XE0,0XC0,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0X40,0X60,0X60, 
....................       0X60,0XE0,0XE0,0XC0,0X01,0X02,0X05,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XFF, 
....................       0XFF,0XFF,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X00,0X00,0X00,0X00,0X7E,0XE3, 
....................       0XC1,0X00,0X00,0X00,0X00,0X00,0XE0,0X3F,0X03,0XFF,0XFF,0X00,0X00,0X00,0X80,0XC0, 
....................       0X60,0X38,0X0C,0XE6,0XFF,0X7F,0X07,0X00,0X00,0X00,0X00,0X20,0X10,0X98,0XF8,0X78, 
....................       0X00,0X00,0X00,0X00,0X80,0XF8,0X78,0X08,0X00,0X00,0X00,0X80,0XC0,0XE0,0X30,0X18, 
....................       0X18,0X18,0X38,0X38,0X30,0X00,0X60,0X30,0X30,0XF8,0XF8,0X38,0X00,0X00,0X08,0X08, 
....................       0X88,0XF8,0XFE,0X3F,0X09,0X08,0X08,0X00,0X00,0X00,0X00,0X00,0X02,0X01,0X00,0X00, 
....................       0X00,0X80,0XC0,0X71,0X3F,0X1F,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X40,0X60,0X60, 
....................       0XF0,0XEC,0XC7,0X83,0X00,0X00,0X00,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XFF, 
....................       0XFF,0XFF,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X00,0X00,0X80,0X80,0X80,0X80, 
....................       0X80,0XC0,0XC0,0X70,0X38,0X0F,0X03,0X00,0X00,0X1F,0XFF,0X7E,0X18,0X0E,0X03,0X00, 
....................       0X00,0XF0,0XFE,0X3F,0X03,0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0XFC,0XFF,0XC7,0XC0, 
....................       0X60,0X20,0XF0,0XFC,0XFF,0X87,0XC0,0X40,0X00,0X00,0X7C,0XFF,0XFF,0X80,0X80,0X80, 
....................       0X80,0XC0,0X60,0X20,0X00,0X00,0X00,0XF0,0XFF,0X9F,0X81,0X40,0X00,0X00,0X00,0XF8, 
....................       0XFF,0XFF,0XC0,0XC0,0X40,0X60,0X30,0X00,0X00,0X80,0XC0,0XE0,0XD0,0XC8,0XC4,0XC2, 
....................       0XC3,0XC1,0XC0,0X60,0X30,0X00,0X00,0X00,0XC0,0X80,0X00,0X00,0X00,0X80,0X80,0XC0, 
....................       0X70,0X3F,0X1F,0X07,0X00,0X00,0X00,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XFF, 
....................       0XFF,0XFF,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X54,0XA8,0X51,0XA3,0X43,0XA3, 
....................       0X43,0XA1,0X40,0XA0,0X40,0XA0,0X40,0XA0,0X40,0XA0,0X41,0XA0,0X40,0XA0,0X40,0XA0, 
....................       0X41,0XA1,0X41,0XA1,0X41,0XA1,0X41,0XA0,0X40,0XA0,0X40,0XA1,0X41,0XA1,0X40,0XA0, 
....................       0X40,0XA0,0X40,0XA1,0X41,0XA1,0X40,0XA0,0X40,0XA0,0X40,0XA1,0X41,0XA1,0X41,0XA1, 
....................       0X40,0XA0,0X40,0XA0,0X40,0XA0,0X40,0XA1,0X41,0XA1,0X40,0XA0,0X40,0XA0,0X40,0XA1, 
....................       0X41,0XA1,0X41,0XA0,0X40,0XA0,0X40,0XA0,0X40,0XA1,0X41,0XA1,0X41,0XA1,0X41,0XA1, 
....................       0X41,0XA1,0X41,0XA0,0X40,0XA0,0X40,0XA0,0X40,0XA1,0X41,0XA1,0X41,0XA1,0X41,0XA0, 
....................       0X40,0XA0,0X40,0XA0,0X50,0XA8,0X54,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XFF, 
....................       0XFF,0XFF,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA, 
....................       0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA, 
....................       0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA, 
....................       0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA, 
....................       0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA, 
....................       0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA, 
....................       0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA, 
....................       0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XAA,0X55,0XFF, 
....................       0XFF,0XFF,0XFF,0XFE,0XFD,0XFA,0XF5,0XEA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA, 
....................       0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA, 
....................       0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA, 
....................       0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA, 
....................       0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA, 
....................       0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA, 
....................       0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA, 
....................       0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XAA,0XD5,0XEA,0XF5,0XFA,0XFD,0XFE,0XFF,0XFF 
.................... }; 
....................  
....................  
....................  
....................   unsigned char *p; 
....................   const unsigned char i[3]={0x15,0x25,0x35}; 
....................  
.................... void main() 
.................... { 
*
001D0:  CLRF   FF8
001D2:  BCF    FD0.7
001D4:  CLRF   FEA
001D6:  CLRF   FE9
001D8:  MOVF   FC1,W
001DA:  ANDLW  C0
001DC:  IORLW  0F
001DE:  MOVWF  FC1
001E0:  MOVLW  07
001E2:  MOVWF  FB4
....................    setup_timer_3(T3_DISABLED | T3_DIV_BY_1); 
001E4:  CLRF   FB1
....................  
....................    set_tris_a(0x00); 
001E6:  MOVLW  00
001E8:  MOVWF  F92
....................    set_tris_b(0x00); 
001EA:  MOVWF  F93
....................    set_tris_c(0x00); 
001EC:  MOVWF  F94
....................    set_tris_d(0x00); 
001EE:  MOVWF  F95
....................    set_tris_e(0x00); 
001F0:  BCF    F96.0
001F2:  BCF    F96.1
001F4:  BCF    F96.2
001F6:  BCF    F96.3
....................     
....................    output_a(0x00); 
001F8:  CLRF   F89
....................    output_b(0x00); 
001FA:  CLRF   F8A
....................    output_c(0x00); 
001FC:  CLRF   F8B
....................    output_d(0x00); 
001FE:  CLRF   F8C
....................    output_e(0x00); 
00200:  CLRF   F8D
....................    delay_ms(200); 
00202:  MOVLW  C8
00204:  MOVWF  0B
00206:  RCALL  002A
....................    lcd_init(); 
00208:  BRA    00C0
....................    printf(lcd_putc,"\f"); 
0020A:  MOVLW  0C
0020C:  MOVWF  0A
0020E:  RCALL  012E
....................    
....................    p=(char *)&i; 
00218:  CLRF   05
0021A:  MOVLW  06
0021C:  MOVWF  04
....................     
....................    while(TRUE) 
....................    { 
....................      lcd_gotoxy(1,1); 
0021E:  MOVLW  01
00220:  MOVWF  0B
00222:  MOVWF  0C
00224:  RCALL  010C
....................      printf(lcd_putc,"Value=0x%02X",p[0]); 
00226:  MOVFF  04,FE9
0022A:  MOVFF  05,FEA
0022E:  MOVFF  FEF,06
00232:  MOVLW  1C
00234:  MOVWF  FF6
00236:  MOVLW  00
00238:  MOVWF  FF7
0023A:  MOVLW  08
0023C:  MOVWF  07
0023E:  BRA    0170
00240:  MOVFF  06,07
00244:  MOVLW  37
00246:  MOVWF  08
00248:  BRA    0190
....................    } 
0024A:  BRA    021E
....................  
.................... } 
0024C:  SLEEP 

Configuration Fuses:
   Word  1: C200   HS FCMEN IESO
   Word  2: 0E18   PUT NOBROWNOUT BORV21 NOWDT WDT128
   Word  3: 8700   CCP2C1 PBADEN LPT1OSC MCLR
   Word  4: 0081   STVREN NOLVP NOXINST NODEBUG
   Word  5: C00F   NOPROTECT NOCPB NOCPD
   Word  6: E00F   NOWRT NOWRTC NOWRTB NOWRTD
   Word  7: 400F   NOEBTR NOEBTRB


Yukarıdaki örnekte ram'deki i dizisini P pointerine kopyalıyorum. Sonuç başarılı. Assembly çıktısı içerisinden kopyalama işleminin yapıldığı yeri buldum.

....................    p=(char *)&i;
00218:  CLRF   05
0021A:  MOVLW  06
0021C:  MOVWF  04


i dizisini const türünden tanımlayınca yukarıdaki kodlar aşağıdaki gibi oluyor.
....................    p=(char *)&i;
00210:  MOVLW  00
00212:  MOVLW  00
00214:  MOVWF  01
00216:  MOVLW  18
00218:  MOVFF  01,05
0021C:  MOVWF  04


Bundan sonra tıkanıp kalıyorum. Assembly bilgimde fazla yok ama yukarıdaki kodda bir saçmalık olduğu belli. Mesela ilk başta MOVLW  00 bu komutu niye iki defa çalıştırıyor?

Keilde bu tür problemler yaşamıyordum. Bu CCS üzerindeki bir Bug'mudur? Konuya yorum yapmanızı rica ediyorum. Ne yapayım sizce?


sadogan

Sorun CCS ile alakalı.
program memoriden pointer ile adreslemeyi desteklemiyor sanırım bir aralar bende uğraşmıştım
ccsinfo formda böyle bir şey okuduğumu hatırlıyorum.
ROM direktifi eeprom bölgesini kapsıyor büyük tablolar sığmıyor.

Mucit23

@JKramer, Link için teşekkürler. Baktım XX_CİHAN_XX'in son mesajında dediklerini uyguladım. Ama yok olmuyor. Örneğin sadece 3 elemanlı i dizisinin başına const yerine rom ekliyorum. Problem aynı şekilde devam ediyor. 1024 elemanlı dizidede durum aynı.

Şuanda Const ile rom arasında bir fark yok bende.

@sadoğan

büyük tablolarla ilgili değil bence. Çünkü küçük dizilerdede aynı sıkıntı var.



ahmets

Alıntı yapılan: Mucit23 - 01 Temmuz 2014, 12:40:45
Birde pointer tanımlıyorum.
  unsigned char *p;

Şimdi bundan sonra resim dizisinin adresini P pointerine yüklüyorum. Kullanımda problem olmamalı.
   p = (char *) & Resim;
Burada p bir ram pointer, sen ona bir rom adresini veriyorsun. Burası yanlış. Casting yaptığın için de uyarı vermiyor.

Bir pointer'a pointer yani bir adres kopyalayabilirsin, bir dizi değil.
Ram'da boş bir dizi tanımla, sonra istersen rom'daki diziyi doğrudan veya bir rom pointer'a önce adresini vererek taşımayı dene.

sadogan

#5
XX_CİHAN_XX çözümü çalışıyor test ettim

mesaj birleştirme:: 01 Temmuz 2014, 16:30:37

void byte_write (byte x ,byte y , byte veri)
{
     int1 sayfa;
     if(x > 63)  // Check for first or second display area
    {
       x -= 64;
       sayfa=GLCD_RIGHT;;
    }
   else sayfa =GLCD_LEFT;
   output_low(GLCD_DI);                         // Set for instruction
   bit_clear(x,7);                              // Clear the MSB. Part of an instruction code
   bit_set(x,6);                                // Set bit 6. Also part of an instruction code
   glcd_writeByte(sayfa, x);                     // Set the horizontal address
   glcd_writeByte(sayfa, (y & 0xBF) | 0xB8);   // Set the vertical page address
   output_high(GLCD_DI);                        // Set for data
   glcd_writeByte(sayfa, veri);
}


while(1)
 {
    rom unsigned int16  *pnt;
    unsigned int16 l;
       
    for(l=0;l<1024;l++)
    {
          pnt=&resim+l;
          byte_write (l%128 ,l/128 ,*pnt);
    }

 }


Mucit23

Alıntı yapılan: ahmets - 01 Temmuz 2014, 15:46:53
Burada p bir ram pointer, sen ona bir rom adresini veriyorsun. Burası yanlış. Casting yaptığın için de uyarı vermiyor.

Bir pointer'a pointer yani bir adres kopyalayabilirsin, bir dizi değil.
Ram'da boş bir dizi tanımla, sonra istersen rom'daki diziyi doğrudan veya bir rom pointer'a önce adresini vererek taşımayı dene.

Hocam yanlışımı anladım. Pointer ve Dizi aynı bölgede olması gerekiyor. Rom ise ikiside romda olacak.

Pointer tanımlamasının başınada rom ekleyince düzeldi. Fakat CCS de neden bu tür bir problemle karşılaşılıyor bunu henüz anlayamadım. Yani sonuç olarak pointer bir elçi gibi davranıyor. p = (char *) & Resim; yaptığımız zaman P pointerine "Resim dizisinin başlangıç adresini bana getir" Demiyormuyuz.

CCS de bu pointer yapısını özellikle şu Rom tanımlaması hakkında biraz değinebilirmisiniz? İşleyişi nasıl?

ahmets

Aynı bölgede olması gerekmiyor. Senin gözden kaçırdığın şey, ram'a pointer ve rom'a pointer farklı şeyler.
Pointer'ların değişken olarak ram veya rom'da tutulması ise başka bir şey.
Kısacası dört farklı tanımlama mümkün.

Bende CCS kurulu değil, google'dan aşağıdaki bölümü buldum. CCS readme.txt dosyasından alıntı imiş:
Declaration                 Result 
   -----------                 ---------------------------------------- 
   char id;                    id is stored in RAM 
   char rom id;                id is stored in ROM 
   rom char id;                id is stored in ROM 
   rom char * id;              id is stored in RAM, is a pointer to ROM 
   rom char rom * id;          id is stored in RAM, is a pointer to ROM 
   char rom * id;              id is stored in RAM, is a pointer to ROM 
   char * rom id;              id is stored in ROM, is a pointer to RAM 
   rom char * rom id;          id is stored in ROM, is a pointer to ROM


Bir daha hocam diye yazarsan cevap yazmam ;)

Mucit23

Cevap için Teşekkürler.
Aşağıdaki tanımlama benim için yeterli oldu.

    rom char * id;              id is stored in RAM, is a pointer to ROM

Ben Rom yazdığımız zaman datanında rom'da saklanacağını düşünmüştüm. Yanlış anlamadıysam rom unsigned char Resim[1024]={....} dediğimiz zaman dizinin içeriği Rom'a yazılır. Biz örneğin rom unsigned char *p şeklinde tanımlamış olduğumuz pointeri kullanarak bu dizinin elemanlarına ulaşmak istediğimiz zaman p=Resim; yapıyoruz. Bu durumda p pointeri Resim dizisindeki elemanın Rom'daki adresinden datayı alır Ram'de saklar. Anladım ama tam olarak ifade edemiyorum. Karmaşık bir konu gerçekten..

Son olarak derleyici aşağıdaki kullanımı kabul etmiyor
p = (char *) & Resim;
fakat bunu kabul ediyor
p = Resim;

Bunun sebebi nedir?

Alıntı YapBir daha hocam diye yazarsan cevap yazmam ;)

İsminiz Ahmet galiba, O halde en güzeli Ahmet Bey :)

ahmets

#9
p'yi nasıl tanımladıysan cast ederken de aynı şekilde kullanmalısın.
p = (rom unsigned char*)&Resim[0]; gibi

Resim dizisi gerçekte 120 adresine yerleşiyorsa
p = (rom unsigned char*)120;
yazmak da aynı şey olurdu, benim p diye kullandığım rom pointer değişkenim bu adresteki unsigned char diziyi gösteriyor demiş oluyorsun.

p = Resim;
yazmak en kısa hali.

&Resim yazmak bana hatalı gözüküyor. CCS hata vermese de doğru kullanımı &Resim[0] olmalı.
Dizi adları derleyici için const pointer olarak kullanılır. Mesela 5. elemanı kullanmak için Resim[4] yazabildiğin gibi *(Resim+4) de yazabilirsin.