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

Error in calculations

Hi guys

I'm having trouble to get this code works. I want to multiply and divide and I use the following code:

valor1=ADC0;
valor1=valor1*2;
valor1=valor1*12;
valor1=valor1/5;
valor1=valor1/4095;

with valor1 as float but the variable valor1 never is the right number. what is wrong?? can be another way to do this multiplication:

valor1*2*2.42/4095

Thanks

Parents
  • The curious thing is when i put breakpoints the value is correct in valor1 variable but when I jump this set of operations I got a wrong number.

    When I read the adc I read 925 and 924 values but when I don't put brakpoints the calculation is bad.

    The code is the following:

    void main (void) {

    //float temperature;
    long valoradc;
    xdata float valor1, valor2, valor3, valor4, valor5, valor6, valor7;

    WDTCN = 0xde; // disable watchdog timer
    WDTCN = 0xad;

    SYSCLK_Init (); // initialize oscillator
    PORT_Init (); // initialize crossbar and GPIO
    UART0_Init (); // initialize UART

    // sample rate
    ADC_Init (); // init ADC


    while(1)
    {

    SFRPAGE = ADC0_PAGE;

    AMX0SL = 0x00;
    delay_ms(1);
    AD0BUSY=1;
    while(AD0BUSY==1);
    AD0INT = 0;
    valor1=ADC0;
    valor1=valor1*2;
    valor1=valor1*12;
    valor1=valor1/5;
    valor1=valor1/4096;




    AMX0SL = 0x02;
    delay_ms(1);
    AD0BUSY=1;
    while(AD0BUSY==1);
    AD0INT = 0;
    valor2=ADC0;
    valor2=valor2*2;
    valor2=valor2*2.42/4096;



    AMX0SL = 0x04;
    delay_ms(1);
    AD0BUSY=1;
    while(AD0BUSY==1);
    AD0INT = 0;
    valor3=ADC0;
    valor3=valor3*2.42/4095;

    AMX0SL = 0x05;
    delay_ms(1);
    AD0BUSY=1;
    while(AD0BUSY==1);
    AD0INT = 0;
    valor4=ADC0;
    valor4=valor4*2.42/4095;

    AMX0SL = 0x06;
    delay_ms(1);
    AD0BUSY=1;
    while(AD0BUSY==1);
    AD0INT = 0;
    valor5=ADC0;
    valor5=valor5*2.42/4095;

    AMX0SL = 0x07;
    delay_ms(1);
    AD0BUSY=1;
    while(AD0BUSY==1);
    AD0INT = 0;
    valor6=ADC0;
    valor6=valor6*2.42/4095;

    SFRPAGE = UART0_PAGE;

    delay_ms(2000);

    printf ("El valor del adc diferencial 1 es %f V. \n", valor1);
    printf ("El valor del adc diferencial 2 es %f V. \n", valor2);
    printf ("El valor del adc 4 es %f V. \n", valor3);
    printf ("El valor del adc 5 es %f V. \n", valor4);
    printf ("El valor del adc 6 es %f V. \n", valor5);
    printf ("El valor del adc 7 es %f V. \n", valor6);


    }
    }

Reply
  • The curious thing is when i put breakpoints the value is correct in valor1 variable but when I jump this set of operations I got a wrong number.

    When I read the adc I read 925 and 924 values but when I don't put brakpoints the calculation is bad.

    The code is the following:

    void main (void) {

    //float temperature;
    long valoradc;
    xdata float valor1, valor2, valor3, valor4, valor5, valor6, valor7;

    WDTCN = 0xde; // disable watchdog timer
    WDTCN = 0xad;

    SYSCLK_Init (); // initialize oscillator
    PORT_Init (); // initialize crossbar and GPIO
    UART0_Init (); // initialize UART

    // sample rate
    ADC_Init (); // init ADC


    while(1)
    {

    SFRPAGE = ADC0_PAGE;

    AMX0SL = 0x00;
    delay_ms(1);
    AD0BUSY=1;
    while(AD0BUSY==1);
    AD0INT = 0;
    valor1=ADC0;
    valor1=valor1*2;
    valor1=valor1*12;
    valor1=valor1/5;
    valor1=valor1/4096;




    AMX0SL = 0x02;
    delay_ms(1);
    AD0BUSY=1;
    while(AD0BUSY==1);
    AD0INT = 0;
    valor2=ADC0;
    valor2=valor2*2;
    valor2=valor2*2.42/4096;



    AMX0SL = 0x04;
    delay_ms(1);
    AD0BUSY=1;
    while(AD0BUSY==1);
    AD0INT = 0;
    valor3=ADC0;
    valor3=valor3*2.42/4095;

    AMX0SL = 0x05;
    delay_ms(1);
    AD0BUSY=1;
    while(AD0BUSY==1);
    AD0INT = 0;
    valor4=ADC0;
    valor4=valor4*2.42/4095;

    AMX0SL = 0x06;
    delay_ms(1);
    AD0BUSY=1;
    while(AD0BUSY==1);
    AD0INT = 0;
    valor5=ADC0;
    valor5=valor5*2.42/4095;

    AMX0SL = 0x07;
    delay_ms(1);
    AD0BUSY=1;
    while(AD0BUSY==1);
    AD0INT = 0;
    valor6=ADC0;
    valor6=valor6*2.42/4095;

    SFRPAGE = UART0_PAGE;

    delay_ms(2000);

    printf ("El valor del adc diferencial 1 es %f V. \n", valor1);
    printf ("El valor del adc diferencial 2 es %f V. \n", valor2);
    printf ("El valor del adc 4 es %f V. \n", valor3);
    printf ("El valor del adc 5 es %f V. \n", valor4);
    printf ("El valor del adc 6 es %f V. \n", valor5);
    printf ("El valor del adc 7 es %f V. \n", valor6);


    }
    }

Children