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

Problem in SPI Data Access in AT89C51ED2

Hi Friends,

I have used AT89C51ED2 for computing serial ADC MCP 3202 using SPI Protocol, the code is working fine for the volatages above 1V, as the voltage decresses below 1 Volts the data retrived is indeterminstic i.e., the value below 1000 counts are represented as aribitary.

I am attaching the code with mail., If there is any valid solution for this, Plz let me know

#include <REG51xD2.H>
        #include<stdio.h>
        #include<stdlib.h>
        #include"display.h"

        sbit  CS    = P1^0;

        #define CLEAR_TI   (SPSTA =SPSTA & 0x7F);


         unsigned int call_adc(unsigned char Ch);


         unsigned int call_adc(unsigned char Ch)
         {

                  unsigned int Data1=0x00,Data2=0x00;
                  unsigned int Value=0x0000;
                  unsigned char Channel;

                  if(Ch==0)
                  Channel=0x00;                                 /*  Channel Select 0    */
                  else
                  Channel=0xE0;                                 /*  Channel Select 1    */


                  CS=0;                                                 /*  Chip Select for ADC Active State  */

                  SPDAT=0x01;                               /*  Channel i/p for SPI                             */
                  while(!(SPSTA & 0x80));
                  CLEAR_TI;

                  SPDAT=Channel;                                /*  Channel i/p for SPI                         */
                  while(!(SPSTA & 0x80));
                  CLEAR_TI;
                  Data1=SPDAT;                                  /*  Higher 8bit of ADC  value           */


                  SPDAT=0xFF;
                  while(!(SPSTA & 0x80));
                  CLEAR_TI;
                  Data2=SPDAT;                                   /* Lower 8bit of ADC value */


                  Value=Value|Data1;                /*  OR First Byte */

                  Value=Value<<8;

                  Value=Value|Data2;                     /*  Or 2nd Byte*/

                  Value=Value & 0x0fff ;             /* Masking Higher 4 bits (Nibble) */

                  CS=1;                                                  /* Chip Select for ADC off State*/

                  return Value;                                  /* 12 Bit ADC Data              */


         }



        void main()
        {

            unsigned int  Adc_Data=0x0000;
                unsigned char Buffer[6];

        //      P1_1=1;

                SPCON |=  0x10;                /* Master mode                                   */
                SPCON |=  0x20;                /* Disable Slave Select                  */
                SPCON |=  0x82;                /* Fclk Periph/128                               */
                SPCON &= ~0x08;                /* CPOL=0; transmit mode example */
                SPCON |=  0x04;                /* CPHA=1; transmit mode example */
                SPCON |=  0x40;                /* run spi                                               */
                SPSTA &=  0x0F;                                /* Clear Trasmit Flag            */


                Initlcd();

                while(1)
                {
                 Adc_Data=call_adc(0x00);
                 sprintf(Buffer,"%d",(unsigned int)Adc_Data);
                 display(Buffer,0x80);
                }


        }


0