We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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(); } }
he says he got it from a book!
I'll say it again: if you are not capable of writing a given code yourself, it serves no purpose to get it from elsewhere. "transfer of code" invariably will result is something not working and if you are not capable of writing the code yourself, you will be totally lost trying to make the 'found' code work. However, it can sometimes be a shortcut to grab some code and fix it rather than starting from scratch.
Erik
""transfer of code" invariably will result is something not working"
that may be a little bit too strong, don't you think?
A little - but not nuch!
Especially with embedded code, it does tend to be so very specific to a particular target & environment that expecting any random piece of cut-&-paste code to "just work" is wishful thinking in the extreme!
"Especially with embedded code, it does tend to be so very specific to a particular target & environment that expecting any random piece of cut-&-paste code to "just work" is wishful thinking in the extreme!"
exaggerated truth is a lie.
sure, there is a degree of hardware dependency in any code, more in embedded than others. but that does not mean one piece of code written for one target cannot work for another hardware, unmodified or slightly modified (to use different header files for example).
this is particularly true if your code is written with a logic structure and with portability in mind.