|
|
View previous topic :: View next topic |
Author |
Message |
bharatwalia
Joined: 04 May 2009 Posts: 35 Location: India
|
math.h problem |
Posted: Fri Jul 30, 2010 10:48 am |
|
|
Hi every time I compile my program it gives this error:
*** Error 112 "simple_meter.c" Line 205(1,1): Function used but not defined: ... ceil SCR=862
I am using ceil() in my program and have included <math.h> in the program.
Here's the demo code:
Code: |
#include <16f876A.h>
#device adc=10
#include <math.h>
#include <timers.h>
#include <button.c>
#USE DELAY( CLOCK=4000000) /* Using a 4 Mhz clock */
#FUSES XT,NOWDT,NOPROTECT,NOPUT
#PRIORITY INT_TIMER1,INT_RTCC
#define TICKS_BETWEEN_INTERRUPTS 5000 //5000 5ms
#define INTERRUPT_OVERHEAD 500 //cycles wasted
#define TMR1RESET (0xFFFF-(TICKS_BETWEEN_INTERRUPTS-INTERRUPT_OVERHEAD))
#USE FAST_IO(B)
#USE FAST_IO(C)
|
Thanks |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jul 30, 2010 11:59 am |
|
|
That's not enough code to demonstrate the problem. Post a complete
(but small) program that we can copy and paste into MPLAB, and compile
it and get the error. Your posted code is missing the main() and it's
missing the call to the ceil() function. Try to keep the program down to
20 to 25 lines. It's easier for us to find the problem in a small program.
Also post your compiler version. |
|
|
bharatwalia
Joined: 04 May 2009 Posts: 35 Location: India
|
|
Posted: Fri Jul 30, 2010 10:30 pm |
|
|
compiler version 4.084
Code: |
#include <16f876A.h>
#device adc=10
#include <math.h>
void calPower(void);
unsigned int32 adc_voltage=751,adc_current=170,res,mode=0;
float power,volts,current;
float result_power;
byte cnt=0;
void main()
{
cpuSetup();
while(1)
{
calPower();
}
}
//--------------------------------------------------------
void calPower(void)
{
volts=0;
current=0;
result_power=0;
volts=(300*adc_voltage)/1023;
current=(300*adc_current)/1023;
power=(volts*current)/1000.00; //in KW.
// result_power=(1023.00/300.00)*power;
result_power=ceil(11.95);
}
//--------------------------------------------------------
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jul 30, 2010 11:56 pm |
|
|
That program is not complete. It calls 'cpuSetup()' but there is no
function definition for that function.
Quote: |
void main()
{
cpuSetup();
while(1)
{
calPower();
}
}
|
But anyway, I commented out 'cpuSetup();' and it compiled with no
errors with vs. 4.084:
Code: |
CCS PCM C Compiler, Version 4.084, xxxxx 30-Jul-10 22:53
Filename: pcm_test.lst
ROM used: 1530 words (19%)
Largest free fragment is 2048
RAM used: 39 (11%) at main() level
79 (21%) worst case
Stack: 2 locations
Executing: "C:\Program Files\PICC\Ccsc.exe" "pcm_test.c" +FM +DF +LY -T -A +M -Z +Y=9 +EA -EW
Memory usage: ROM=19% RAM=11% - 21%
0 Errors, 0 Warnings.
Loaded C:\Program Files\PICC\Projects\PCM_Test\pcm_test.cof.
BUILD SUCCEEDED: Fri Jul 30 22:53:27 2010
|
Please post a program that is complete (has all necessary function
definitions) and that you have tested.
Also, I suggest that you re-install the compiler. |
|
|
bharatwalia
Joined: 04 May 2009 Posts: 35 Location: India
|
|
Posted: Sat Jul 31, 2010 12:20 am |
|
|
this is my complete program
Code: |
/*----------------------------------------------------------SUNOXER DIGITAL METER------------------------------------------------------*/
#include <16f876A.h>
#device adc=10
#include <math.h>
#include <timers.h>
#include <button.c>
#USE DELAY( CLOCK=4000000) /* Using a 4 Mhz clock */
#FUSES XT,NOWDT,NOPROTECT,NOPUT
#PRIORITY INT_TIMER1,INT_RTCC
#define TICKS_BETWEEN_INTERRUPTS 5000 //5000 5ms
#define INTERRUPT_OVERHEAD 500 //cycles wasted
#define TMR1RESET (0xFFFF-(TICKS_BETWEEN_INTERRUPTS-INTERRUPT_OVERHEAD))
#USE FAST_IO(B)
#USE FAST_IO(C)
// These are the "Bvar" variables required by Button.c.
int8 C0 = 0; // For the button on pin C1
int8 C1 = 0; // For the button on pin C2
int8 C2 = 0; // For the button on pin C2
void cpuSetup(void);
void HTO7S(unsigned int32 Num);
void display();
void readADCdata(void);
void calPower(void);
void checkButton(void);
#byte port_b=6 /* define the location of register port_b */
#byte port_c=7 /* define the location of register port_c */
byte CONST LED_MAP[11] = {0x81,0xF3,0x49,0x61,0x33,0x25,0x05,0xF1,0x01,0x21,0xFF};
// 0 1 2 3 4 5 6 7 8 9 OFF
byte Column[4] = {0x80,0x40,0x20,0x10}; //Low bits(right,center,left)
byte Segment[4] = {0x25,0xC7,0x57,0x5F}; // S , u, n, r
unsigned int32 adc_voltage=0,adc_current=0,res,mode=0;
float power,volts,current;
float result_power;
byte cnt=0;
//--------------------------------------------------------
#INT_TIMER1
void Timer1(void)
{
set_timer1(TMR1RESET);
display();
}
//--------------------------------------------------------
//--------------------------------------------------------
void display()
{
if(cnt>=4){
cnt=0;}
port_b=Segment[cnt];
//port_b=0x25;
port_c=Column[cnt];
cnt++;
}
//--------------------------------------------------------
//--------------------------------------------------------
// The rtcc interrupt occurs when the rtcc rolls over from FF to 00.
// I have programmed it to interrupt at a 100 Hz rate.
//
// RTCC interrupt rate = Fosc / (4 * rtcc pre-scaler * rtcc pre-load)
//
// = 4 MHz / (4 * 256 * 39)
//
// = 100.16 Hz
//
// This gives us a timer tick approx. every 10 ms (9.98 ms actually).
#INT_RTCC
void rtcc_isr(void)
{
// Reload the RTCC, so it will keep overflowing every 10 ms.
set_rtcc(RTCC_PRELOAD);
// Decrement any timers that are running.
if(gc_refresh_timer) //7-Segment counter to count down till 500ms for 7-Segment refresh rate
gc_refresh_timer--;
if(gc_button_timer) //Buttons counter to count till 40ms for buttons scan
gc_button_timer--;
}
//--------------------------------------------------------
void cpuSetup(void)
{
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //setting timer0 for display refesh rate and for scanning buttons
enable_interrupts(INT_RTCC);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //no division
set_timer1(TMR1RESET); //65535-4965=60570
enable_interrupts(INT_TIMER1); //timer1 for 7-Segment display
enable_interrupts(GLOBAL);
setup_adc_ports(AN0_AN1_AN3); //Setting ADC Channels
setup_adc(ADC_CLOCK_DIV_64);
set_tris_b(0x01);
set_tris_c(0x07);
delay_ms(1500);
gc_refresh_timer = REFRESH_TIMER_TICKS; //Display Counter
gc_button_timer = BUTTON_TIMER_TICKS; //Buttons Counter
}
//--------------------------------------------------------
//--------------------------------------------------------MAIN PROGRAM STARTS-----------------------------------------------
void main()
{
cpuSetup();
while(1)
{
switch(mode){
case 0:
Column[3]=0x00;
readADCdata();
HTO7S(adc_voltage);
checkButton();
break;
case 1:
Column[3]=0x10;
readADCdata();
HTO7S(adc_current);
checkButton();
break;
case 2:
Column[3]=0x10;
readADCdata();
calPower();
HTO7S(result_power);
checkButton();
break;
}
}
}
//--------------------------------------------------------
void HTO7S(unsigned int32 Num)
{
unsigned int32 res;
if(gc_refresh_timer)
return;
else
gc_refresh_timer = REFRESH_TIMER_TICKS; //500ms interrupt to control display refresh rate
// output_toggle(PIN_C3); //for testing only
Segment[0]=LED_MAP[30*Num/10230]; //calculating look-up value from LED_MAP array.
if (Segment[0]==0x81) //turning off 1st digit if 0
Segment[0]=0xFF; //dividing the three digits
res = 30*Num%10230;
Segment[1]=LED_MAP[10*res/10230];
res=10*res%10230;
Segment[2]=LED_MAP[10*res/10230];
res=10*res%10230;
Segment[3]=LED_MAP[10*res/10230];
}
//--------------------------------------------------------
void calPower(void)
{
volts=0;
current=0;
result_power=0;
volts=(300*adc_voltage)/1023;
current=(300*adc_current)/1023;
power=(volts*current)/1000.00; //in KW.
// result_power=(1023.00/300.00)*power;
result_power=ceil(11.95);
}
//--------------------------------------------------------
void checkButton(void)
{
if(gc_button_timer)
return;
else
gc_button_timer = BUTTON_TIMER_TICKS;
if(button(PIN_C0, 0, 50, 10, C0, 1)){
mode=0; //changing the mode.
}
if(button(PIN_C1, 0, 50, 10, C1, 1)){
mode=1; //changing the mode.
}
if(button(PIN_C2, 0, 50, 10, C2, 1)){
mode=2; //changing the mode.
}
}
//--------------------------------------------------------
void readADCdata(void)
{
adc_voltage=0;
adc_current=0;
set_adc_channel(0);
delay_us(10); //-------->NOTE:AQUISITION TIME NECCESARY
adc_voltage=read_adc(); //reading voltage
delay_us(10);
set_adc_channel(1);
delay_us(10); //-------->NOTE:AQUISITION TIME NECCESARY
adc_current=read_adc(); //reading current
delay_us(100);
}
//-------------------------------------------------------
/*------------------------------------------------------END OF PROGRAM----------------------------------------------*/
|
thanks
Error:
*** Error 112 "simple_meter.c" Line 205(1,1): Function used but not defined: ... ceil SCR=862
i now re-install the compiler and then i'll agan compile it |
|
|
bharatwalia
Joined: 04 May 2009 Posts: 35 Location: India
|
|
Posted: Sat Jul 31, 2010 1:09 am |
|
|
i re-installed the compiler and still getting the same error.... |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sat Jul 31, 2010 1:33 am |
|
|
Quote: | this is my complete program |
It isn't, unfortunately. After commenting function calls to missing include files, it compiles without problems (also in V4.084). |
|
|
bharatwalia
Joined: 04 May 2009 Posts: 35 Location: India
|
|
Posted: Sat Jul 31, 2010 1:58 am |
|
|
I tried compiling this program on my other PC which has version 4.106 but the error is same.
I hope I am making some mistake in the syntax or so.
Thanks |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Sat Jul 31, 2010 2:07 am |
|
|
It is common in CCS, for a problem to be a long way from the line reporting it. I'd guess in one of your include files (button.c, since this is the only one that you have written - unless you have modified the standard compiler files), you have a function defintion, that has perhaps the wrong number of brackets. Then the code carries on compiling OK, till it gets to line 205 in the main, where it 'spots' the imbalance.
Best Wishes |
|
|
bharatwalia
Joined: 04 May 2009 Posts: 35 Location: India
|
|
Posted: Sat Jul 31, 2010 2:26 am |
|
|
i removed the button.c header file and compiled the program, i even compile the small piece of code proved above but the error remains same with "math.h"
Thanks |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Sat Jul 31, 2010 2:41 am |
|
|
You are missing the point.
The code posted _is_ OK. It may well have operational faults, but compiles fine. If we take what you have posted, modify the header, so that it doesn''t load your other include files, and add dummies for the undefined things (variables and a function), it _works_ without any error.
If I take exactly what you have posted, and change the first dozen lines, to:
Code: |
#include <16f876A.h>
#device adc=10
#include <math.h>
//#include <timers.h>
//#include <button.c>
int8 gc_button_timer,gc_refresh_timer;
#USE DELAY( CLOCK=4000000) /* Using a 4 Mhz clock */
#FUSES XT,NOWDT,NOPROTECT,NOPUT
#PRIORITY INT_TIMER1,INT_RTCC
#define TICKS_BETWEEN_INTERRUPTS 5000 //5000 5ms
#define INTERRUPT_OVERHEAD 500 //cycles wasted
#define TMR1RESET (0xFFFF-(TICKS_BETWEEN_INTERRUPTS-INTERRUPT_OVERHEAD))
#USE FAST_IO(B)
#USE FAST_IO(C)
#define RTCC_PRELOAD (200)
#define REFRESH_TIMER_TICKS (10)
#define BUTTON_TIMER_TICKS (10)
int8 button(int16 val, int8 v1, int8 v2, int8 v3, int8 v4, int8 v5) {
return 1;
}
|
It is fine.
Your fault _is_ in one of your other include files. It may well be 'math.h', _if_ you have edited the file. But with the supplied files from CCS, this code compiles...
Best Wishes |
|
|
bharatwalia
Joined: 04 May 2009 Posts: 35 Location: India
|
|
Posted: Sat Jul 31, 2010 3:08 am |
|
|
Hi,
I deleted the math.h file and again copy and pasted it now it compiles.
Thanks |
|
|
sahu77
Joined: 08 Sep 2011 Posts: 202
|
|
Posted: Mon Jan 06, 2014 10:30 am |
|
|
bharatwalia wrote: | this is my complete program
Code: |
/*----------------------------------------------------------SUNOXER DIGITAL METER------------------------------------------------------*/
#include <16f876A.h>
#device adc=10
#include <math.h>
#include <timers.h>
#include <button.c>
#USE DELAY( CLOCK=4000000) /* Using a 4 Mhz clock */
#FUSES XT,NOWDT,NOPROTECT,NOPUT
#PRIORITY INT_TIMER1,INT_RTCC
#define TICKS_BETWEEN_INTERRUPTS 5000 //5000 5ms
#define INTERRUPT_OVERHEAD 500 //cycles wasted
#define TMR1RESET (0xFFFF-(TICKS_BETWEEN_INTERRUPTS-INTERRUPT_OVERHEAD))
#USE FAST_IO(B)
#USE FAST_IO(C)
// These are the "Bvar" variables required by Button.c.
int8 C0 = 0; // For the button on pin C1
int8 C1 = 0; // For the button on pin C2
int8 C2 = 0; // For the button on pin C2
void cpuSetup(void);
void HTO7S(unsigned int32 Num);
void display();
void readADCdata(void);
void calPower(void);
void checkButton(void);
#byte port_b=6 /* define the location of register port_b */
#byte port_c=7 /* define the location of register port_c */
byte CONST LED_MAP[11] = {0x81,0xF3,0x49,0x61,0x33,0x25,0x05,0xF1,0x01,0x21,0xFF};
// 0 1 2 3 4 5 6 7 8 9 OFF
byte Column[4] = {0x80,0x40,0x20,0x10}; //Low bits(right,center,left)
byte Segment[4] = {0x25,0xC7,0x57,0x5F}; // S , u, n, r
unsigned int32 adc_voltage=0,adc_current=0,res,mode=0;
float power,volts,current;
float result_power;
byte cnt=0;
//--------------------------------------------------------
#INT_TIMER1
void Timer1(void)
{
set_timer1(TMR1RESET);
display();
}
//--------------------------------------------------------
//--------------------------------------------------------
void display()
{
if(cnt>=4){
cnt=0;}
port_b=Segment[cnt];
//port_b=0x25;
port_c=Column[cnt];
cnt++;
}
//--------------------------------------------------------
//--------------------------------------------------------
// The rtcc interrupt occurs when the rtcc rolls over from FF to 00.
// I have programmed it to interrupt at a 100 Hz rate.
//
// RTCC interrupt rate = Fosc / (4 * rtcc pre-scaler * rtcc pre-load)
//
// = 4 MHz / (4 * 256 * 39)
//
// = 100.16 Hz
//
// This gives us a timer tick approx. every 10 ms (9.98 ms actually).
#INT_RTCC
void rtcc_isr(void)
{
// Reload the RTCC, so it will keep overflowing every 10 ms.
set_rtcc(RTCC_PRELOAD);
// Decrement any timers that are running.
if(gc_refresh_timer) //7-Segment counter to count down till 500ms for 7-Segment refresh rate
gc_refresh_timer--;
if(gc_button_timer) //Buttons counter to count till 40ms for buttons scan
gc_button_timer--;
}
//--------------------------------------------------------
void cpuSetup(void)
{
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //setting timer0 for display refesh rate and for scanning buttons
enable_interrupts(INT_RTCC);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //no division
set_timer1(TMR1RESET); //65535-4965=60570
enable_interrupts(INT_TIMER1); //timer1 for 7-Segment display
enable_interrupts(GLOBAL);
setup_adc_ports(AN0_AN1_AN3); //Setting ADC Channels
setup_adc(ADC_CLOCK_DIV_64);
set_tris_b(0x01);
set_tris_c(0x07);
delay_ms(1500);
gc_refresh_timer = REFRESH_TIMER_TICKS; //Display Counter
gc_button_timer = BUTTON_TIMER_TICKS; //Buttons Counter
}
//--------------------------------------------------------
//--------------------------------------------------------MAIN PROGRAM STARTS-----------------------------------------------
void main()
{
cpuSetup();
while(1)
{
switch(mode){
case 0:
Column[3]=0x00;
readADCdata();
HTO7S(adc_voltage);
checkButton();
break;
case 1:
Column[3]=0x10;
readADCdata();
HTO7S(adc_current);
checkButton();
break;
case 2:
Column[3]=0x10;
readADCdata();
calPower();
HTO7S(result_power);
checkButton();
break;
}
}
}
//--------------------------------------------------------
void HTO7S(unsigned int32 Num)
{
unsigned int32 res;
if(gc_refresh_timer)
return;
else
gc_refresh_timer = REFRESH_TIMER_TICKS; //500ms interrupt to control display refresh rate
// output_toggle(PIN_C3); //for testing only
Segment[0]=LED_MAP[30*Num/10230]; //calculating look-up value from LED_MAP array.
if (Segment[0]==0x81) //turning off 1st digit if 0
Segment[0]=0xFF; //dividing the three digits
res = 30*Num%10230;
Segment[1]=LED_MAP[10*res/10230];
res=10*res%10230;
Segment[2]=LED_MAP[10*res/10230];
res=10*res%10230;
Segment[3]=LED_MAP[10*res/10230];
}
//--------------------------------------------------------
void calPower(void)
{
volts=0;
current=0;
result_power=0;
volts=(300*adc_voltage)/1023;
current=(300*adc_current)/1023;
power=(volts*current)/1000.00; //in KW.
// result_power=(1023.00/300.00)*power;
result_power=ceil(11.95);
}
//--------------------------------------------------------
void checkButton(void)
{
if(gc_button_timer)
return;
else
gc_button_timer = BUTTON_TIMER_TICKS;
if(button(PIN_C0, 0, 50, 10, C0, 1)){
mode=0; //changing the mode.
}
if(button(PIN_C1, 0, 50, 10, C1, 1)){
mode=1; //changing the mode.
}
if(button(PIN_C2, 0, 50, 10, C2, 1)){
mode=2; //changing the mode.
}
}
//--------------------------------------------------------
void readADCdata(void)
{
adc_voltage=0;
adc_current=0;
set_adc_channel(0);
delay_us(10); //-------->NOTE:AQUISITION TIME NECCESARY
adc_voltage=read_adc(); //reading voltage
delay_us(10);
set_adc_channel(1);
delay_us(10); //-------->NOTE:AQUISITION TIME NECCESARY
adc_current=read_adc(); //reading current
delay_us(100);
}
//-------------------------------------------------------
/*------------------------------------------------------END OF PROGRAM----------------------------------------------*/
|
thanks
Error:
*** Error 112 "simple_meter.c" Line 205(1,1): Function used but not defined: ... ceil SCR=862
i now re-install the compiler and then i'll agan compile it |
any body can draw its SCH diagram . .? _________________ sahu |
|
|
|
|
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
|