|
|
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: | #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;
} | [/code] |
|
|
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
|