|
|
View previous topic :: View next topic |
Author |
Message |
M11
Joined: 30 Apr 2011 Posts: 9
|
error after adding interrupt code to main program |
Posted: Sun May 22, 2011 10:35 am |
|
|
Hi,
I have written a program to pull up one of the pins high if a certain time has passed. It worked fine when I download it to the pic. But when I added it to my main program (which also works fine), I get 19 errors when compiling. None of the two programs gives error if I compile them separately.
Here is the interrupt code.
Code: |
#include <16F877.H>
#use Delay(clock=4000000)
#define HIGH_START 916
long high_count;
#INT_RTCC
clock_isr() {
if(--high_count==0) {
output_high(PIN_B0);
delay_us(500);
output_low(PIN_B0);
high_count=HIGH_START;
}
}
main() {
high_count=HIGH_START;
set_rtcc(0);
setup_counters(RTCC_INTERNAL, RTCC_DIV_256);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
while(TRUE);
} |
Thanks |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9226 Location: Greensville,Ontario
|
|
Posted: Sun May 22, 2011 10:44 am |
|
|
It'd help if you told us what the 19 errors were..... |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun May 22, 2011 2:02 pm |
|
|
The program you posted compiles with only 2 warnings with compiler
vs. 4.121. The warnings can be fixed by adding 'void' to the front of
the function declarations for main() and clock_isr(). Example:
Code: | void main()
void clock_isr()
|
Is the code that you posted, the true actual code that you are trying
to compile ? Because I don't get 19 errors. Also, what's your CCS
compiler version. Version numbers look like this:
http://www.ccsinfo.com/devices.php?page=versioninfo |
|
|
M11
Joined: 30 Apr 2011 Posts: 9
|
|
Posted: Mon May 23, 2011 10:44 am |
|
|
Thanks for the response.
this is the main program:
Code: | #include <16F877.H>
#device adc=10
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)
#use i2c(Master,sda=PIN_C4,scl=PIN_C3)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
//****************************************************************************************
// "read": Function to get the reading of the sensors
int16 read(int n){
int i;
int16 range[1]=0;
i2c_start(); // initiate start condition
i2c_write(0xE0 + n); // device address
i2c_write(0x00); // register address
i2c_write(0x54); // set units to cm
i2c_stop();
delay_ms(70); // wait for returning ping
i2c_start(); // initiate a new start condition
i2c_write(0xE0 + n); // device address
i2c_write(0x02); // address of high byte register
i2c_start();
i2c_write(0xE1 + n); // device address put to read
for (i=0;i<17;i++)
{
range[i] = i2c_read(1); // read first byte and shift to the left
range[i] = range[i] << 8;
if(i<16)
range[i] += i2c_read(1); // read second byte and add to 1st
else
range[i] += i2c_read(0);
}
i2c_stop();
for (i=0;i<1;i++)
{
printf("range in cm = %lu\n\r", range[i]);
}
return range[i];
} // end of "read" function
//****************************************************************************************
// "GetRef" : function to get the reference value of the buttom sensor
int16 GetRef (void)
{
while(1)
if(input(PIN_A0) == 1) //wait for push button to be pressed
return read(0); // return reading of the ground sensor
}//end of GetRef function
//****************************************************************************************
// Audio instructions functions
void GoRight (void)
{
output_low(Pin_B7);
delay_ms(65);
output_high(Pin_B7);
delay_ms(1300);
output_low(Pin_B7);
delay_ms(65);
output_high(Pin_B7);
delay_ms(130);
}
void GoLeft (void)
{
output_low(Pin_B6);
delay_ms(65);
output_high(Pin_B6);
delay_ms(1300);
output_low(Pin_B6);
delay_ms(65);
output_high(Pin_B6);
delay_ms(130);
}
void RightClear (void)
{
output_low(Pin_B5);
delay_ms(65);
output_high(Pin_B5);
delay_ms(1300);
output_low(Pin_B5);
delay_ms(65);
output_high(Pin_B5);
delay_ms(130);
}
void LeftClear (void)
{
output_low(Pin_B4);
delay_ms(65);
output_high(Pin_B4);
delay_ms(1300);
output_low(Pin_B4);
delay_ms(65);
output_high(Pin_B4);
delay_ms(130);
}
void PitAhead (void)
{
output_low(Pin_B3);
delay_ms(65);
output_high(Pin_B3);
delay_ms(1300);
output_low(Pin_B3);
delay_ms(65);
output_high(Pin_B3);
delay_ms(130);
}
void LowBattery (void)
{
output_low(Pin_B2);
delay_ms(65);
output_high(Pin_B2);
delay_ms(1300);
output_low(Pin_B2);
delay_ms(65);
output_high(Pin_B2);
delay_ms(130);
}
//****************************************************************************************
main()
{
int16 A,B,C,D,ADCval; // A=> Right , B=>front , C=> left, D=> buttom
int flag=0;
int counter1=0,counter2=0;
int16 ref,ref1,ref2,ref3,min;
ref=read(6); // read the buttom sensor to get the reference value
ref1=read(6);
ref2=read(6);
ref3=read(6);
min=ref;
if(min<ref1)
min=ref1;
if(min<ref2)
min=ref2;
if(min<ref3)
min=ref3;
setup_adc_ports(RA0_ANALOG);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);
input(Pin_C2); // sleep mode pin
output_high(Pin_B7);
output_high(Pin_B6);
output_high(Pin_B5);
output_high(Pin_B4);
output_high(Pin_B3);
output_high(Pin_B2);
output_high(Pin_B1);
output_high(Pin_B0);
delay_ms(200);
while(1)
{
/*
ADCval=read_adc();
// volt = (float)(ADCval * 5)/1023.0;
if(ADCval<550)
{
LowBattery();
delay_ms(600);
continue;
}
*/
A= read(0); // Read Right Sensor
B= read(2); // Read Front Sensor
C= read(4); // Read Left Sensor
D= read(6); // read buttom sensor
if( counter1==25 || counter2==25 )
{
output_high(Pin_C2); // switch off the system
delay_ms(500);
}
if(B<90)
{
output_high(pin_C0);
if(A>C)
{
GoRight();
flag=1;
delay_ms(200); //wait for the user to turn
counter1=counter1+1;
counter2=0;
continue;
}
else
{
GoLeft();
flag=2;
delay_ms(200); //wait for the user to turn
counter2=counter2+1;
counter1=0;
continue;
}
output_low(pin_C0);
}
counter2=0;
counter1=0;
if (flag==1)
{
if(C>100)
{
LeftClear();
flag=0;
continue;
}
}
if (flag==2)
{
if(A>100)
{
RightClear();
flag=0;
continue;
}
}
if (D>min+15)
{
PitAhead();
}
} //End of While loop
} // End of main
|
This is how I added the interupt code:
First part:
Code: | #include <16F877.H>
#device adc=10
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)
#use i2c(Master,sda=PIN_C4,scl=PIN_C3)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
[b]#define HIGH_START 916
long high_count;
#INT_RTCC
void clock_isr() {
if(--high_count==0) {
output_high(PIN_B0);
delay_us(500);
output_low(PIN_B0);
high_count=HIGH_START;
}
}[/b]
|
Second part:
Code: | void main()
{
[b] high_count=HIGH_START;
set_rtcc(0);
setup_counters(RTCC_INTERNAL, RTCC_DIV_256);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL); [/b]
// line 158 (where I get error) is the line below
int16 A,B,C,D,ADCval; // A=> Right , B=>front , C=> left, D=> buttom
int flag=0;
int counter1=0,counter2=0;
int16 ref,ref1,ref2,ref3,min;
.
.
. |
These are the errors I get:
Line 158(1,6): A numeric expression must appear here
Line 159(1,6): A numeric expression must appear here
Line 160(1,6): A numeric expression must appear here
Line 161(1,6): A numeric expression must appear here
The rest of the errors says: undefined identifier for each of the variables that I have defined.
Undefined identifier ref
Undefined identifier ref1
Undefined identifier ref2
Undefined identifier A
Undefined identifier B
and so on |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon May 23, 2011 11:59 am |
|
|
Please post the actual code that fails. You posted good code and then
some edits that I'm supposed to do, to make it fail. I may not do the
edits in exactly the same way you do it, so I may not duplicate the
problem. Post the program that fails.
Also, you need to post the compiler version. Every version has different
bugs and there are hundreds of versions. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Mon May 23, 2011 1:29 pm |
|
|
First thing, I'd guess the latest compiler.
In C, declarations of variables _must_ be at the start of a code block.
Now the latest compilers allow you to not do this, but if you do you may still get errors, and it is safer even with these to keep to the old C form. You show the declarations being put into the middle of the code block, after five functions calls. Hence they are not accepted, and the variables have not been declared....
Then your new code and the old use the same variable names....
I'm afraid you need to actually learn a bit about programming rather than how to cut and paste.
Best Wishes |
|
|
M11
Joined: 30 Apr 2011 Posts: 9
|
|
Posted: Tue May 24, 2011 12:32 pm |
|
|
Thanks a lot for your help and advices.
I just moved the declarations to the top of the code and it built successfully.
Just to make things clear,
I am only used to C++ programming and this is my second C program.
Regarding copying and pasting, I wouldn't do it unless I fully understand how the code works and what it does exactly. |
|
|
|
|
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
|