Hi, I am using AT89C4051 to utilize it as an AD Converter for an application as a two digit Voltmeter. I am following the circuit design given in the following address: httpp://http://www.atmel.com/dyn/resources/prod_documents/DOC0524.PDF . I have written a code in C (modified) and it does not work. It would be very helpful if someone were to help me if there are any mistakes in my code. My code is: #include<AT89x051.h> #define TON 79; #define TOFF 79; unsigned int ta,tb; void delay(int count); char a[10]={0x07,0x17,0x27,0x37,0x47,0x57,0x67,0x77,0x87,0x97}; char b[10]={0x0B,0x1B,0x2B,0x3B,0x4B,0x5B,0x6B,0x7B,0x8B,0x9B}; scanled(); void main(void) { int td,tc,m; tc=TON; td=TOFF while(1){ P3_7=1; for(m=0;m<tc;m++){ if(P3&0x40==0) ta++; } delay(3); P3_7=0; for(m=0;m<td;m++){ if(P3&0x40==1) tb++; } tb=tb+td; delay(3); scanled(); } } scanled(){ unsigned int i,flag=0,j; static unsigned int k,h; k=ta; h=tb; if(tb==0){ for(i=0;i<2;i++){ flag=1-flag; if(flag==1){ P1=a[(k)/10]; for(j=0;j<32000;j++); P1=0xFF; } if(flag==0){ P1=b[(k)%10]; for(j=0;j<32000;j++); P1=0xFF; } } } else if(ta==0){ for(i=0;i<2;i++){ flag=1-flag; if(flag==1){ P1=a[(h)/10]; for(j=0;j<32000;j++); P1=0xFF; } if(flag==0){ P1=b[(h)%10]; for(j=0;j<32000;j++); P1=0xFF; } } } } void delay(int count) { int j,l; for(j=0;j<= count;j++) { for (l=0;l<=120;l++); } } Please do note that i am not using the lookup table. That is why i did not include that in my code. I just want to know the number of counts. From the number of counts, i could refer to the lookup table manually and get the voltage output. Really do appreciate your help. Thank you.
"it does not work" More detail required! Does it build without errors & warnings? Does it download OK? What happens when you run it? What steps have you taken so far to debug it? Have you tried it in the simulator? Can you successfully build, download & run a simple "Hello, World" program? If you want people to look at your code, you need to format it properly - the instructions are right above the 'Message' box where you typed your post! See also: http://www.keil.com/forum/tips.asp and be sure to use the 'Preview' button before 'Post'
It does not work as in the sense, after i have burned the programme onto the chip and apply the power, to the circuit, it does not show the input voltage as it is supposed to. I was wondering whether there is any problem with my code itself?
does not show the input voltage as it is supposed to WHAT does it show? Erik
if(P3&0x40==0)
if( (P3&0x40) == 0 )
As for Mr Erik's Question, Whenever i switch on the power button, the number on the LED just flickers randomly and when i give an input to P1_1, it just gives a random number on the LED. Thanks for pointing out the mistake,I shall do that, anyway i am doing that because, i cannot directly access P3_6 (for AT89C4051) as it is internally connected.
what does it show if you replace the A/D read with a constant. Erik
Hi Erik, I dont really understand what you mean by replace the A/D read with a constant.
I dont really understand what you mean by replace the A/D read with a constant. somewhere in your code you have ADC SFR -> variable. replace that with constant-> variable. Erik
Hi, I do have a very fundamental question to ask, How do i directly address port 3.6 directly instead of using ((P3&0x40)? as P3.6 is hard-wired as an input to the output of the on-chip comparator and is not accessible as a general-purpose I/O pin.for (AT89C4051) I cant simply use the command, #define P3_6=0xB6 rite?