This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

linking error in the program . can not find the solution

I am a newbee in Microcontroller programing . the code I have written in C was from a book and it is giving linker error. please help me to solve the problem.
I am sending the code:

/*reading pwm waveform and calculation of frequency using microcontroller*/
#include<reg52.h>
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;

sbit IN=P2^4;

void delay(void);
void INIT(void);
void ENABLE(void);
void LINE(int);

int ONTIME(int);
int offtime(int);
/*declaration of functions complete*/
//
void LINE(int i)
{ if(i==1) { RS=0; RW=0; P1=0x80; ENABLE(); RS=1; } else { RS=0; RW=0; P1=0xC0; ENABLE(); RS=1; }
}

/*dealy subroutine*/

void delay(void)
{ int i,j; for(j=0;j<10;j++) { for(i=0;i<100;i++); }
}

/*delay complete*/

/*Enable subroutine*/
void ENABLE(void)
{ EN=1; delay(); EN=0; delay();
}

/*initialisation of LCD giving proper command*/

void INIT(void)
{ RS=0; RW=0; EN=0; P1=0x38;// 2 Lines and 5*7 matrix LCD ENABLE(); ENABLE(); ENABLE(); P1=0x06; // Shift cursor to left ENABLE(); P1=0x0E; //display on, cursor blinking ENABLE(); P1=0x01; //clear display screen ENABLE();
} /* measuring ontime*/
int ONTIME(int m)
{ if(m==1) { IN=1; /*input to 8051 is from 555 osc*/ TMOD=0x01; TR0=0; TF0=0; TL0=0x00; TH0=0x00; while(IN); /*check for rising edge*/ while(!IN); TR0=1; while(IN); TR0=0; }

/* TO MEASURE OFFTIME*/

if(m==2) { IN=1; TMOD=0x01; TR0=0; TF0=0; TL0=0x00; TH0=0x00;

while(!IN); // check for falling edge while(IN); TR0=1; while(!IN); // CHECK FOR RISING EDGE TR0=0; } return((TH0*256)+TL0);
}

void main(void)
{ int unit, tens, hundred, thousand, tenthou, x; char code dis3[]="Fre in HZ="; char *p; int i,j,k,freq,l; while(1) { for(x=1;x<=3;x++) { if(x==1) { i=ONTIME(x); k=i; }

if(x==2) { i=offtime(x); l=i; } if(x==3) { freq=k+1; i=1/freq; } }

unit=(i%10); tens=(i/10)%10; hundred=(i/100)%10; thousand=(i/1000)%10; tenthou=(i/1000)%10; unit=unit+0x30; tens=tens+0x30; hundred=hundred+0x30; thousand=thousand+0x30; tenthou=tenthou+0x30; INIT(); LINE(0);

p=&dis3;

for(j=0;j<8;j++) { P1=*p++; ENABLE(); }

LINE(2); P1=tenthou; ENABLE(); P1=thousand; ENABLE(); P1=hundred; ENABLE(); P1=unit; ENABLE(); }
}

Parents
  • I have recopied it

    /*reading pwm waveform and calculation of frequency using microcontroller*/
    #include<reg52.h>
    sbit RS=P2^0;
    sbit RW=P2^1;
    sbit EN=P2^2;
    
    sbit IN=P2^4;
    
    void delay(void);
    void INIT(void);
    void ENABLE(void);
    void LINE(int);
    
    int ONTIME(int);
    int offtime(int);
    
    /*declaration of functions complete*/
    
    void LINE(int i)
    {
            if(i==1)
            {
                    RS=0;
                    RW=0;
                    P1=0x80;
                    ENABLE();
                    RS=1;
            }
            else
            {
                    RS=0;
                    RW=0;
                    P1=0xC0;
                    ENABLE();
                    RS=1;
            }
    }
    
    /*dealy subroutine*/
    
    void delay(void)
    {
            int i,j;
            for(j=0;j<10;j++)
            {
                    for(i=0;i<100;i++);
            }
    }
    
    
    /*Enable subroutine*/
    void ENABLE(void)
    {
            EN=1;
            delay();
            EN=0;
            delay();
    }
    
    /*initialisation of LCD giving proper command*/
    
    void INIT(void)
    {
            RS=0;
            RW=0;
            EN=0;
            P1=0x38;// 2 Lines and 5*7 matrix LCD
            ENABLE();
            ENABLE();
            ENABLE();
            ENABLE();
            P1=0x06; // Shift cursor to left
            ENABLE();
            P1=0x0E; //display on, cursor blinking
            ENABLE();
            P1=0x01; //clear display screen
            ENABLE();
    }
    /* measuring ontime*/
    int ONTIME(int m)
    {
            if(m==1)
            {
                    IN=1;             /*input to 8051 is from 555 osc*/
                    TMOD=0x01;
                    TR0=0;
                    TF0=0;
                    TL0=0x00;
                    TH0=0x00;
                    while(IN);       /*check for rising edge*/
                    while(!IN);
                    TR0=1;
                    while(IN);
                    TR0=0;
             }
    
     /* TO MEASURE OFFTIME*/
    
             if(m==2)
             {
                    IN=1;
                    TMOD=0x01;
                    TR0=0;
                    TF0=0;
                    TL0=0x00;
            TH0=0x00;
    
                    while(!IN);     // check for falling edge
                    while(IN);
                    TR0=1;
                    while(!IN); // CHECK FOR RISING EDGE
                    TR0=0;
            }
            return((TH0*256)+TL0);
    }
    
    void main(void)
    {
            int unit, tens, hundred, thousand, tenthou, x;
            char code dis3[]="Fre in HZ=";
            char *p;
            int i,j,k,freq,l;
            while(1)
            {
                    for(x=1;x<=3;x++)
                    {
                            if(x==1)
                            {
                                    i=ONTIME(x);
                                    k=i;
                }
    
                        if(x==2)
                            {
                                    i=offtime(x);
                                    l=i;
                            }
                            if(x==3)
                            {
                                    freq=k+1;
                                    i=1/freq;
                            }
                    }
    
                    unit=(i%10);
                    tens=(i/10)%10;
                    hundred=(i/100)%10;
                    thousand=(i/1000)%10;
                    tenthou=(i/10000)%10;
                    unit=unit+0x30;
                    tens=tens+0x30;
                    hundred=hundred+0x30;
                    thousand=thousand+0x30;
                    tenthou=tenthou+0x30;
                    INIT();
                    LINE(1);
    
                    p=&dis3;
    
                    for(j=0;j<8;j++)
                    {
                            P1=*p++;
                            ENABLE();
                    }
    
                    LINE(2);
                    P1=tenthou;
                    ENABLE();
                    P1=thousand;
                    ENABLE();
                    P1=hundred;
                    ENABLE();
                    P1=tens;
                    ENABLE();
                    P1=unit;
                    ENABLE();
            }
    }
    


    the error is

    Build target 'Target 1'
    compiling pwm waveform.c...
    linking...
    *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
        SYMBOL:  _OFFTIME
        MODULE:  pwm waveform.obj (PWM_WAVEFORM)
    *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
        SYMBOL:  _OFFTIME
        MODULE:  pwm waveform.obj (PWM_WAVEFORM)
        ADDRESS: 082CH
    Program Size: data=32.0 xdata=0 code=747
    "PWM waveform reading using microcontroller" - 0 Error(s), 2 Warning(s).
    

Reply
  • I have recopied it

    /*reading pwm waveform and calculation of frequency using microcontroller*/
    #include<reg52.h>
    sbit RS=P2^0;
    sbit RW=P2^1;
    sbit EN=P2^2;
    
    sbit IN=P2^4;
    
    void delay(void);
    void INIT(void);
    void ENABLE(void);
    void LINE(int);
    
    int ONTIME(int);
    int offtime(int);
    
    /*declaration of functions complete*/
    
    void LINE(int i)
    {
            if(i==1)
            {
                    RS=0;
                    RW=0;
                    P1=0x80;
                    ENABLE();
                    RS=1;
            }
            else
            {
                    RS=0;
                    RW=0;
                    P1=0xC0;
                    ENABLE();
                    RS=1;
            }
    }
    
    /*dealy subroutine*/
    
    void delay(void)
    {
            int i,j;
            for(j=0;j<10;j++)
            {
                    for(i=0;i<100;i++);
            }
    }
    
    
    /*Enable subroutine*/
    void ENABLE(void)
    {
            EN=1;
            delay();
            EN=0;
            delay();
    }
    
    /*initialisation of LCD giving proper command*/
    
    void INIT(void)
    {
            RS=0;
            RW=0;
            EN=0;
            P1=0x38;// 2 Lines and 5*7 matrix LCD
            ENABLE();
            ENABLE();
            ENABLE();
            ENABLE();
            P1=0x06; // Shift cursor to left
            ENABLE();
            P1=0x0E; //display on, cursor blinking
            ENABLE();
            P1=0x01; //clear display screen
            ENABLE();
    }
    /* measuring ontime*/
    int ONTIME(int m)
    {
            if(m==1)
            {
                    IN=1;             /*input to 8051 is from 555 osc*/
                    TMOD=0x01;
                    TR0=0;
                    TF0=0;
                    TL0=0x00;
                    TH0=0x00;
                    while(IN);       /*check for rising edge*/
                    while(!IN);
                    TR0=1;
                    while(IN);
                    TR0=0;
             }
    
     /* TO MEASURE OFFTIME*/
    
             if(m==2)
             {
                    IN=1;
                    TMOD=0x01;
                    TR0=0;
                    TF0=0;
                    TL0=0x00;
            TH0=0x00;
    
                    while(!IN);     // check for falling edge
                    while(IN);
                    TR0=1;
                    while(!IN); // CHECK FOR RISING EDGE
                    TR0=0;
            }
            return((TH0*256)+TL0);
    }
    
    void main(void)
    {
            int unit, tens, hundred, thousand, tenthou, x;
            char code dis3[]="Fre in HZ=";
            char *p;
            int i,j,k,freq,l;
            while(1)
            {
                    for(x=1;x<=3;x++)
                    {
                            if(x==1)
                            {
                                    i=ONTIME(x);
                                    k=i;
                }
    
                        if(x==2)
                            {
                                    i=offtime(x);
                                    l=i;
                            }
                            if(x==3)
                            {
                                    freq=k+1;
                                    i=1/freq;
                            }
                    }
    
                    unit=(i%10);
                    tens=(i/10)%10;
                    hundred=(i/100)%10;
                    thousand=(i/1000)%10;
                    tenthou=(i/10000)%10;
                    unit=unit+0x30;
                    tens=tens+0x30;
                    hundred=hundred+0x30;
                    thousand=thousand+0x30;
                    tenthou=tenthou+0x30;
                    INIT();
                    LINE(1);
    
                    p=&dis3;
    
                    for(j=0;j<8;j++)
                    {
                            P1=*p++;
                            ENABLE();
                    }
    
                    LINE(2);
                    P1=tenthou;
                    ENABLE();
                    P1=thousand;
                    ENABLE();
                    P1=hundred;
                    ENABLE();
                    P1=tens;
                    ENABLE();
                    P1=unit;
                    ENABLE();
            }
    }
    


    the error is

    Build target 'Target 1'
    compiling pwm waveform.c...
    linking...
    *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
        SYMBOL:  _OFFTIME
        MODULE:  pwm waveform.obj (PWM_WAVEFORM)
    *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
        SYMBOL:  _OFFTIME
        MODULE:  pwm waveform.obj (PWM_WAVEFORM)
        ADDRESS: 082CH
    Program Size: data=32.0 xdata=0 code=747
    "PWM waveform reading using microcontroller" - 0 Error(s), 2 Warning(s).
    

Children