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

AT89C51CC03 : 10-Bit ADC Problems

Hello,

i have problems to get a 10-Bit result from the internal adc of the AT89C51CC03.

I always got only a 8-Bit result, though setting the PSIDLE-Bit.
Also i did not need the adc-eoc-interrupt to continue after the conversion,
as it is explained in the device manual.

So it seems to me, i made something wrong in setting up the adc for 10-Bit resolution.

I include the following code, which should not run with disabled eoc-interrupt.
But it runs !!!

#include "AT89C51CC03.h"
unsigned int i;
void main(void)
{
        ADCF = 0x20;  /* configure channel P1.5(AN5) for ADC */
        ADCLK = 0x00;  /* init prescaler for adc clock */
        ADCON = 0x20;  /* Enable the ADC */

        EA = 0;  /* disable interrupts */
        EADC = 0;

        P31 = 1;   // signal running via txd pin
        for (i=0; i< 20000; i++);

        while(1)
        {
                ADCON &= ~0x07;  /* Clear the channel field ADCON[2:0] */
                ADCON |= 0x05;   /* Select channel 5 */
                ADCON |= 0x40;   /* 10 bit mode */
                ADCON |= 0x08;   /* Start conversion */

                P31 = ~P31;       // signal running via txd pin
                while (!(ADCON & 0x10));
                ADCON &= 0xef;
                for (i=0; i< 20000; i++);

        }
}

So please contact me, if you have any ideas, hints, solutions, etc.

Parents
  • thank you for your answer.

    i tried your code, but i always got only an 8-Bit result.
    (ADDH toggles +- 1LSB, and ADDL toggles from 0..3)
    I think with 10 Bit precision, ADDH should be stable.

    Also the MCU does not stop, if PSIDLE Bit is set.
    So the ADC seems to be not in the 10Bit mode, or this mode does not work ?

    I have changed one line in adcreadpre() :
    ADCON |= channel; // Select channel ADCON.[SCH2..0]

Reply
  • thank you for your answer.

    i tried your code, but i always got only an 8-Bit result.
    (ADDH toggles +- 1LSB, and ADDL toggles from 0..3)
    I think with 10 Bit precision, ADDH should be stable.

    Also the MCU does not stop, if PSIDLE Bit is set.
    So the ADC seems to be not in the 10Bit mode, or this mode does not work ?

    I have changed one line in adcreadpre() :
    ADCON |= channel; // Select channel ADCON.[SCH2..0]

Children