| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| deepakomanna 
 
 
 Joined: 06 Mar 2007
 Posts: 92
 Location: Pune,India
 
 
			        
 
 | 
			
				| problem with comparing arrays |  
				|  Posted: Tue May 08, 2007 12:24 am |   |  
				| 
 |  
				| Dear sir, here i am using 16f913, MPLAB 7.5 Ver. & CCS PCM C Compiler, Version 3.249, 34534.
 
 here i am comparing the pointer 'ptr' with array value.
 but while debugging on ICD2 i saw the ptr value changing after 2 increments.
 and pointing to random locations.
 Plz tell me the proper way of comparing.
 here is my sample code
 
  	  | Code: |  	  | #include<16F913.h>
 #fuses INTRC_IO,NOWDT,PUT,MCLR,PROTECT,NOCPD,NOBROWNOUT,NOPROTECT,NOIESO,NOFCMEN
 #use delay(clock=8000000)
 
 #define DIGIT1  COM3+6,   COM2+6,   COM0+6,   COM1+6,   COM0+5,   COM3+5,   COM2+5,   COM1+5   // DISPALYS FROM RIGHT SIDE
 #define DIGIT2  COM3+7,   COM2+7,   COM0+7,   COM1+7,   COM0+4,   COM3+4,   COM2+4
 
 #define VLCD_ENABLE 0x10
 
 #define BLANK 0
 
 byte const Digit_Map[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};
 byte  *ptr;
 
 void init_CPU();
 void lcd_putc(int);
 byte lcd_pos = 1;
 
 
 void main()
 {
 int number = 0 ;
 ptr = Digit_Map[0];
 init_CPU();
 while(TRUE)
 {
 lcd_putc(number);
 if(number++ == 9)
 {
 number = 0;
 }
 
 //      delay_ms(1000);
 }
 
 }
 
 
 void lcd_putc(int c)
 {
 byte segments;
 
 if((c>=0)&&(c <=9))
 {
 segments=Digit_Map[c];
 
 }
 
 else
 {
 segments = BLANK;
 lcd_symbol(segments,DIGIT6);
 lcd_symbol(segments,DIGIT5);
 lcd_symbol(segments,DIGIT4);
 lcd_symbol(segments,DIGIT3);
 lcd_symbol(segments,DIGIT2);
 lcd_symbol(segments,DIGIT1);
 }
 switch(lcd_pos)
 {
 case 1:
 LCD_SYMBOL(segments,DIGIT1);
 LCD_SYMBOL(ptr,DIGIT2);
 if(segments == Digit_Map[9])
 {
 ptr++;      // Ater 2 increment it shows garbage value
 segments = Digit_Map[0];
 if(ptr == Digit_Map[9])
 {
 lcd_pos++;
 ptr = Digit_Map[0];
 }
 
 }
 break;
 case 2:
 break;
 
 }
 
 }
 
 void init_CPU()
 {
 /**************  PORT SETTINGS ****************/
 PORT_B_PULLUPS(0XC0);
 SET_TRIS_A(0X80);
 SET_TRIS_B(0XC0);
 SET_TRIS_C(0X27);
 SET_TRIS_E(0X08);
 OUTPUT_A(0X00);
 OUTPUT_B(0X00);
 OUTPUT_C(0X00);
 OUTPUT_E(0X00);
 
 /****************  COMPARATOR SETTINGS  ***************/
 SETUP_COMPARATOR(NC_NC_NC_NC);
 
 /****************  INTERRUPT SETTINGS  *****************/
 ENABLE_INTERRUPTS(GLOBAL);
 ENABLE_INTERRUPTS(INT_TIMER1);      //enable timer1 interrupt
 /*************** LCD SETTINGS ********************/
 SETUP_LCD( LCD_MUX14 | LCD_INTRC |VLCD_ENABLE , 2);
 
 }
 
 
 | 
 _________________
 Thank You,
 With Best Regards,
 Deepak.
 |  |  
		|  |  
		| ckielstra 
 
 
 Joined: 18 Mar 2004
 Posts: 3680
 Location: The Netherlands
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue May 08, 2007 2:46 am |   |  
				| 
 |  
				| You enable the timer1 interrupt but you don't have an interrupt handler present. Either disable the interrupt or add an interrupt handler for timer1. 
 
 To get the address of an array you have to use 	  | Code: |  	  | ptr = Digit_Map[0]; | 
  	  | Code: |  	  | ptr = &Digit_Map[0]; 
 or equivalent
 
 ptr = Digit_Map;
 | 
 
 The same error is in
  	  | Code: |  	  | if(ptr == Digit_Map[9])    // add an '&' | 
 and
  	  | Code: |  	  | ptr = Digit_Map[0];    // add an '&' | 
 |  |  
		|  |  
		| deepakomanna 
 
 
 Joined: 06 Mar 2007
 Posts: 92
 Location: Pune,India
 
 
			        
 
 | 
			
				| problem with assigning arrays.... |  
				|  Posted: Wed May 09, 2007 12:19 am |   |  
				| 
 |  
				| Dear Support, thanks for replying,
 but, at first i was did the same what u suggest i.e.
 
  	  | Code: |  	  | ptr = &Digit_Map[0];
 
 or equivalent
 
 ptr = Digit_Map;
 
 and
 if(ptr == &Digit_Map[9])
 and
 ptr = &Digit_Map[0];
 
 | 
 
 but while compling it gives three error,
 Line 32(19,20): Expecting an identifier
 Line 82(34,35): Expecting an identifier
 Line 85(28,29): Expecting an identifier
 
 thats why i changed format of assigning arrays.
 plz tell the modifications.
 _________________
 Thank You,
 With Best Regards,
 Deepak.
 |  |  
		|  |  
		| ckielstra 
 
 
 Joined: 18 Mar 2004
 Posts: 3680
 Location: The Netherlands
 
 
			    
 
 | 
			
				| Re: problem with assigning arrays.... |  
				|  Posted: Wed May 09, 2007 1:37 am |   |  
				| 
 |  
				| Remove the 'const' keyword and your code will compile. 	  | Code: |  	  | byte const Digit_Map[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6}; | 
 
 Explanation:
 The PIC processor has two different memories: program memory and data memory (this is called a Harvard architecture while your normal PC has only a single memory space, called a _von Neumann architecture). The v3.xxx compiler is limited and only supports pointers to data memory, not to program memory.
 When you define the array as 'const' the data will be placed in program memory. Remove 'const' and the array will be located in data memory.
 Yes, the error message you got is not very helpfull.
 |  |  
		|  |  
		|  |  
  
	| 
 
 | You cannot post new topics in this forum You cannot reply to topics in this forum
 You cannot edit your posts in this forum
 You cannot delete your posts in this forum
 You cannot vote in polls in this forum
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 
 |