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

v to f interfacing with 89s52

hi there i am interfacing the v to f converter AD645
to 89s52 i am going to used this v to f converter as an ADC.but i trapped in some problem the value is not displayed on the display(7 SEGMENT)the routine for the display is working properly as i tried it with the test value following code give you the clear idea.

#include<reg52.h>
#include<define.h>
#include<intrins.h>

/*****************function declaration***************************/
void disp_wait(void);
void disp(unsigned int);
unsigned int cal();//v2f
/**********************************************************************/

unsigned char number_code[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7_seg
unsigned int i,j,k,l,val;//7_seg
unsigned int No_Of_Count,Over_Flow_Occours,No_In_Counter,No_In_CounterHI,No_In_CounterLO;//v2f
unsigned int sec_1 = 0; //v2f

/********************* interrupt setting (routine)*************************/
void TMR_1(void) interrupt 3      //v2f
                   {Over_Flow_Occours++;}

void TMR_0(void)interrupt 1
           {

                   TF0  = 0;                               //reload timer
               TR0  = 0;
               TH0  = 0x63;
           TL0  = 0xbf;
               disp(val);         // call display
                   sec_1++;               // dec upto 1 sec
                   if(sec_1 == 50)
             {
                          sec_1 = 0;
                          No_Of_Count = cal();
                          TR0  = 1;
                         }
                   else
                      {TR0  = 1;}
               }

void disp(unsigned int val)
        {
        unsigned int tempreg,i_digi,j_digi,k_digi,l_digi;
        unsigned int val_2,val_3;

        tempreg = val;
        i_digi = tempreg % 10;
        val_2 = tempreg / 10;
    i = i_digi;

        j_digi = val_2 % 10;
        val_3 = val_2 / 10;
    j = j_digi;

        k_digi = val_3 % 10;
        k = k_digi;
        l_digi = val_3 / 10;

        l= l_digi;

        DECOD1 = 0;
    DECOD2 = 0;
    DECOD3 = 0;
    P0 = number_code[i];
        disp_wait();

        DECOD1 = 1;
    DECOD2 = 0;
    DECOD3 = 0;
    P0 = number_code[j];
    disp_wait();

        DECOD1 = 0;
    DECOD2 = 1;
    DECOD3 = 0;
    P0 = number_code[k];
    disp_wait();


        DECOD1 = 1;
    DECOD2 = 1;
    DECOD3 = 0;
    P0 = number_code[l];
    disp_wait();
        }


void main(void)
         {
                 P0   = 0x3f;
                 P1   = 0xff;
                 P2   = 0xf8;
                 P3   = 0xff;

                 IE   = 0x8A;
                 TMOD = 0x51; /* Timer 0 as timer in mode 1 ; Timer 1 as counter in mode 1 */
             TH0  = 0x63;
         TL0  = 0xbf;
                 TR0  = 1;
                 while(1)
                     {}
                 }

/**************************dly routine's*******************************/
void disp_wait()
         {
         unsigned int w1=0;
         unsigned int w2=0;
         for(w1=0;w1<=20;w1++)
                {
                for(w2=0;w2<=22;w2++)
                {}
                }
         }
/**********************************************************************/



unsigned int cal()
         {
                 unsigned int w1 = 0;
             unsigned int w2 = 0;
                 unsigned int Value;//count in 100 msec period
                 Over_Flow_Occours = 0x00;
                 TR1 = 1; // run countrer and give dly for 100 msec
                 for(w1 = 1;w1<=40;w1++)
                {
                    for(w2 = 1;w2<=930;w2++)
                       {}
                    }
                 TR1 = 0; // stop the counter
                 TH1 = ACC;      // get value from TH1 to ACC
                 ACC = No_In_CounterHI; // move value(HI) form ACC to   No_In_CounterHI
                 No_In_CounterHI = No_In_CounterHI * 100;
                 TL1 = ACC;
         ACC = No_In_CounterLO; // move value(LO)form ACC to    No_In_CounterLO
                 No_In_Counter = No_In_CounterHI + No_In_CounterLO;
                 Value =(Over_Flow_Occours*512) + (No_In_Counter);//calculation for no of count.
                 Value = 2345 ; //test value
                 val = Value;//No_In_Counter;
                 return(val); // return No_In_Counter [No_In_Counter == vtg]
                 }

for ad654 click on www.analog.com/.../AD654.pdf
page no. 8 and 9 will give you the clear idea

0