| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| yyc027 Guest
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				| Conflict between Lookup table with interrupt and ICD2 |  
				|  Posted: Wed Jan 16, 2008 4:24 pm |   |  
				| 
 |  
				| Hi, 
 I am using PIC16F877 to control a LCD module. I found when I tried to use lookup table in the code. It will cause Timer interrupt disabled and ICD2 debugger working improperly. My C compiler is CCS (it may be 2005 version). I am wondering whether CCS doesn’t support what I am doing.
 The code looks like as follows:
 
 const unsigned  int Sampl_TableH[100]={1,2,3…}
 
 void main() {
 …
 while (TRUE){
 …
 x = Sampl_TableL[i];
 …
 }
 
 #int_timer2
 
 void timer2_isr() {
 …
 }
 
 
 
 Your help will be quite appreciated.
 
 Thank,
 
 Peter
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Jan 16, 2008 7:18 pm |   |  
				| 
 |  
				| You can find the compiler version by looking at the top of the .LST file. The .LST file will be in your project directory.
 
 Post a complete test program that shows the problem.  It should be
 compilable without errors, and without having to make any changes
 or additions, if we paste it into MPLAB.   But make it as short as possible.
 For example, don't put in code to setup the A/D, etc.  Only put in code
 that demonstrates the problem.
 |  |  
		|  |  
		| yyc027 Guest
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				| Complete code |  
				|  Posted: Thu Jan 17, 2008 10:34 am |   |  
				| 
 |  
				| As per "PCM programmer" suggestion, I attach my complete code as follows. 
 If I add code "j=Table[i];" (marked as * Note), the timer2 won't get interrupted as expected. The CCS version is "CCS PCW C Compiler, Version 3.110, 15982"
 
 I really don't know what happned here.
 Your help will be quite appreciated.
 
 Thank,
 
 Peter
 
 
 Complete code attached
 
 
 [/code] 	  | Code: |  	  | #define _ICD2_ 0 
 #if defined _ICD2_
 #include <16F877_ICD2.h>
 #else
 #include <16F877.h>
 #endif
 
 #fuses HS,NOPROTECT,NOLVP,NOWDT
 #BYTE RCSTA = 0x18
 #BYTE RCREG = 0x1A
 #bit TMR2IF = 0x0C.1
 #use delay (clock=16000000)
 //#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7)
 
 Boolean fT50us;
 
 //-----------------------------------------------------------------------------
 // Name: main()
 //
 
 const unsigned int Table[3]={
 32,16,11
 };
 
 
 void main() {
 byte i,j;
 //delay_ms(100);
 OUTPUT_A(0x0f); // A0,A1,A2,A3=1,A4,A5=0
 OUTPUT_B(0x00); // PORTB=0
 OUTPUT_C(0x80); // PORTC=0
 OUTPUT_D(0x00); // PORTD=0
 OUTPUT_E(0x04); // E0,E1=0,E2=1
 
 SET_TRIS_A(0x0f); // A0,A1,A2,A3=IN, A4,A5=OUT
 SET_TRIS_B(0x00); // PORTB=OUT
 SET_TRIS_C(0x80); // C0,C1,C2,C3,C4,C5,C6=OUT,C7=IN
 SET_TRIS_D(0x00); // PORTD=OUT
 SET_TRIS_E(0x00); // PORTE=OUT
 
 //////// initializing LCD /////////
 //lcd_init();
 //printf(lcd_putc,"\fOZOPTICS\n EPC-V1");
 
 
 //////// initializing Timer /////////
 
 setup_timer_2(T2_DIV_BY_1,200,1); // 200*(4/16MHz))=50us
 
 enable_interrupts(int_timer2);
 enable_interrupts(global);
 
 
 //////////// main loop //////////////
 
 while (TRUE){
 i++;
 j--;
 
 if (!fT50us) continue;
 fT50us = 0;
 
 if (i>3) i=0;
 j=Table[i]; // * Note
 
 }
 }
 
 
 #int_timer2
 
 void timer2_isr() {
 static byte i;
 
 if (i==1){
 i=0;
 OUTPUT_LOW(PIN_C5);
 }else{
 i=1;
 OUTPUT_HIGH(PIN_C5);
 }
 
 fT50us = 1;
 TMR2IF = 0;
 }
 | 
 |  |  
		|  |  
		| Wayne_ 
 
 
 Joined: 10 Oct 2007
 Posts: 681
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Jan 18, 2008 2:36 am |   |  
				| 
 |  
				| For a start you array Table[3] has 3 indexes [0],[1] and [2]. Your code has a check 
 if (i>3) i=0;
 
 This means that i can be 3 and j=Table[3];  Is wrong.
 
 j--; isn't required!
 |  |  
		|  |  
		| yyc027 Guest
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				|  |  
				|  Posted: Fri Jan 18, 2008 7:50 am |   |  
				| 
 |  
				| I posted the code "if (i>3) i=0; " by mistake. it should be "if (i>2) i=0; " 
 I just tried again. If "if (i>2) i=0; " added, the timer interrupt won't be generated. It looks like something wrong with the compiler.
 
 Thanks.
 
 Peter
 |  |  
		|  |  
		| Wayne_ 
 
 
 Joined: 10 Oct 2007
 Posts: 681
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Jan 18, 2008 8:09 am |   |  
				| 
 |  
				| You should set your TRIS before setting any outputs! |  |  
		|  |  
		| SET 
 
 
 Joined: 15 Nov 2005
 Posts: 161
 Location: Glasgow, UK
 
 
			        
 
 | 
			
				|  |  
				|  Posted: Fri Jan 18, 2008 8:16 am |   |  
				| 
 |  
				| What happens if you change the name of the static (in the ISR) from i to something else? Maybe the compiler is getting the variables mixed up.. |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |