CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Any better way to do this?

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
LITTLE JON



Joined: 20 Oct 2006
Posts: 5

View user's profile Send private message

Any better way to do this?
PostPosted: Thu Mar 22, 2007 3:47 am     Reply with quote

We have to process the analog inputs of two resistors (sensors of temperature and presure). The values of temperature and presure are not linear with the values of voltage given by the circuit. So we have written a code with an if-else structure to translate the voltage given to real values of temperature.

Our PIC 16F877A does not support such a big code, and shows an error "Out of ROM". Is there any better solution, without having to change the PIC (it's integrated in an SMD card)

This code is a full program to display in an LCD the values of two batteries which power a diesel motor(if the motor is not running) or the value of temperature and oil presure (if the motor is running) We only need help to optimize the library "tablas.h", the rest of the program is to ilustrate

Here is the code:
tablas.h
Code:

///////////////////////////////////////////////////////////////////////////////
//       Función que convierte el código en temperatura                      //
///////////////////////////////////////////////////////////////////////////////

int temp1 (long cod) //FAE
{
   if (cod<1024>848)
      return (40);
   else if (cod<848>815)
      return (45);
   else if (cod<815>782)
      return (50);
   else if (cod<782>745)
      return (55);
   else if (cod<745>707)
      return (60);
   else if (cod<707>502)
      return(65-20/205*(cod-707));
   else if (cod<502>477)
      return (90);
   else if (cod<477>467)
      return (91);
   else if (cod<467>375)
      return (92-12/92*(cod-467));
   else if (cod<375>354)
      return (105);
   else if (cod<354>324)
      return (110);
   else if (cod<324>295)
      return (115);
   else if (cod<295>276)
      return (120);
   else
      return (1); //alarma
}
int temp2 (long cod)  //VDO
{
   if (cod>=1024 && cod>=860)
      return (40);
   else if (cod<860>831)
      return (45);
   else if (cod<831>799)
      return (50);
   else if (cod<799>764)
      return (55);
   else if (cod<764>729)
      return (60);
   else if (cod<729>682)
      return (65);
   else if (cod<682>643)
      return (70);
   else if (cod<643>616)
      return (75);
   else if (cod<616>580)
      return (80);
}
int temp3 (long cod)  //VDO
{
   if (cod<580>547)
      return (84);
   else if (cod<547>524)
      return (87);
   else if (cod<524>502)
      return (90);
   else if (cod<502>473)
      return (94);
   else if (cod<473>453)
      return (97);
   else if (cod<453>434)
      return (100);
   else if (cod<434>412)
      return (104);
   else if (cod<412>389)
      return (107);
   else if (cod<389>373)
      return (110);
   else if (cod<373>358)
      return (114);
   else if (cod<358>334)
      return (117);
   else if (cod<334>307)
      return (120);
   else
      return (1); //alarma
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////
//       Función que convierte el código en presión                          //
///////////////////////////////////////////////////////////////////////////////

int pres1 (long cod) //FAE
{
   if (cod<1024>858)
      return (0);
   else if (cod<858>838)
      return (10);
   else if (cod<838>815)
      return (20);
   else if (cod<815>784)
      return (30);
   else if (cod<784>745)
      return (40);
   else if (cod<745>690)
      return (50);
   else if (cod<690>618)
      return (60);
   else if (cod<618>516)
      return (70);
   else if (cod<516>397)
      return (80);
   else if (cod<397>233)
      return (90);
   else
      return (100);
}
int pres2 (long cod)   //VDO
{
   if (cod<227>0)
      return (0);
   else if (cod<319>227)
      return (4);
   else if (cod<393>319)
      return (8);
   else if (cod<451>393)
      return (12);
   else if (cod<498>451)
      return (16);
   else if (cod<539>498)
      return (20);
   else if (cod<571>539)
      return (24);
   else if (cod<600>571)
      return (28);
   else if (cod<623>600)
      return (32);
   else if (cod<639>623)
      return (35);
   else if (cod<655>639)
      return (38);
   else if (cod<715>655)
      return (41+12/60*(cod-655));
   else if (cod<748>715)
      return (56+9/33*(cod-715));
   else if (cod<803>748)
      return (68+28/55*(cod-748));
   else
      return (100);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////




taco.c
Code:

#include "taco.h"
//#include "E:\Universidad\beca\Tacodinamo\LCD420.h"
#include <Flex_LCD420.c>
#include "tablas.h"
  #include <float.h>




#define dir_min    10
#define dir_horah  11
#define dir_horal  12

long revoluciones(void);
void sobrevelocidad(float vel);

int sec=0,min,horah,horal,i=0;
long hora,rpm;


#int_TIMER1
TIMER1_isr()   //interrupción del horometro y de lectura de  la velocidad y del cad
{
   int temperatura,j,var,var2;
   float presion,voltA,voltB,ampA,ampB;
   long cod_ad;
   i+=1;

   rpm = revoluciones();
   //sobrevelocidad(rpm);

   if (rpm >= 800)  //en marcha
   {
      sec+=1;
      if (sec == 60)   //horometro
      {
         sec=0;
         min = read_EEPROM (dir_min);
         min+=1;
         if (min == 60)
         {
            min=0;
            horah = read_EEPROM (dir_horah);
            horal = read_EEPROM (dir_horal);
            hora = make16(horah,horal);
            hora+=1;
            horah = hora/256;
            horal = hora%256;
         }
         write_eeprom(dir_min,min);
         write_eeprom(dir_horah,horah);
         write_eeprom(dir_horal,horal);
      }
   }


   if (i == 3)    //lecturas cada 3seg
   {
      i=0;
      //////////////////////////////////
      //////lecturas del cad////////////
      //////////////////////////////////

      set_adc_channel(0);
      delay_ms(1);
      cod_ad=read_adc();
      delay_ms(1);
      if (PIN_B5  == 0)   //FAE
         temperatura= temp1(cod_ad);
      else   //VDO
         if (cod_ad<1024>580)
            temperatura= temp2(cod_ad);
         else
            temperatura= temp3(cod_ad);


      set_adc_channel(1);
      delay_ms(1);
      cod_ad=read_adc();
      delay_ms(1);
      /*if (PIN_B5 == 0) //FAE
         presion=pres1(cod_ad);
      else
         presion=pres2(cod_ad);
*/

      set_adc_channel(4);
      delay_ms(1);
      cod_ad=read_adc();
      delay_ms(1);
      voltA=(cod_ad*5.0*6.0)/1024.0;


      set_adc_channel(5);
      delay_ms(1);
      cod_ad=read_adc();
      delay_ms(1);
      voltB=(cod_ad*5.0*6.0)/1024.0;

      set_adc_channel(6);
      delay_ms(1);
      cod_ad=read_adc();
      delay_ms(1);
      ampA=(cod_ad*5.0)/1024.0;


      set_adc_channel(7);
      delay_ms(1);
      cod_ad=read_adc();
      delay_ms(1);
      ampB=(cod_ad*5.0)/1024.0;
      ///////////////////////////////
      //fin de las lecturas del cad//
      ///////////////////////////////

      ///////////////////////////////
      /////////uso del lcd///////////
      ///////////////////////////////
      printf(lcd_putc, "\f");// Clear the LCD.
      delay_ms(500);

      if (rpm >= 800)  //en marcha
      {
         if (PIN_C4)
         {
            printf(lcd_putc, "\fTemper Motor  %3dCº",temperatura);
            printf(lcd_putc, "\nPresion Aceite %fBar",presion);
            printf(lcd_putc, "\nTacometro   %LdRpm",rpm);
            printf(lcd_putc, "\nHorometro:%05Ldh-%2dm",hora,min);
            delay_ms(3000);
         }
         else
         {
            printf(lcd_putc, "\fTemper Motor  %3dCº",temperatura);
            printf(lcd_putc, "\nPresion Aceite %fBar",presion);
            printf(lcd_putc, "\nTacometro    %4LdRpm",rpm);
            if(j != 0 )
            {
               j=0;
               var=voltA*10;
               var2=ampA*100;
               printf(lcd_putc, "\nBateriaA %d,%01dV %d,%02dA",var/10,var%10,var2/100,var2%100);
            }
            else
            {
               j=1;
               var=voltB*10;
               var2=ampB*100;
               printf(lcd_putc, "\nBateriaB %d,%01dV %d,%02dA",var/10,var%10,var2/100,var2%100);
            }
            delay_ms(3000);
         }
      }
      else  //parado
      {
         var=voltA*10;
         var2=ampA*100;
         printf(lcd_putc, "\fBateriaA %d,%01dV %d,%02dA",var/10,var%10,var2/100,var2%100);
         var=voltB*10;
         var2=ampB*100;
         printf(lcd_putc, "\nBateriaB %d,%01dV %d,%02dA",var/10,var%10,var2/100,var2%100);
         printf(lcd_putc, "\nHorometro:%5Ldh-%2dm",hora,min);
         delay_ms(3000);
      }
   }



}

///////////////////////////////////////////////////////////////////////////////
/////////////lectura de las revoluciones///////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
long revoluciones()
{
   long contador;
   int salir;
   restart_wdt();
   while (PIN_C2);  //Esperar al 0
   restart_wdt();
   while (!PIN_C2);  //Esperar al 1
   restart_wdt();
   contador=0;
   salir=0;
   do{
      delay_us(100);
      contador+=1;
      salir=!PIN_C2;
   }while ((salir==0) && (contador<40000));
   if (salir==1)
   {
      salir=0;
      do{
         delay_us(100);
         contador+=1;
         salir=PIN_C2;
      }while ((salir==0) && (contador<40000));
   }
   rpm=60*(1/(contador*0.0001));
   return(rpm);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
/////////////alarma de sobrevelocidad//////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

void sobrevelocidad(float vel)
{
   int conf=0;
   float limite;

   conf = (PIN_B4<<4)||(PIN_B3<<3)||(PIN_B2<<2)||(PIN_B1<<1>= limite)  //alarma
       output_high(PIN_C7);
   else
       output_low(PIN_C7);

}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

void main()
{


   setup_adc_ports(ALL_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_CLK_OUT);
   setup_timer_2(T2_DISABLED,0,1);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   setup_wdt(WDT_2304MS);

   // The lcd_init() function should always be called once,
   // near the start of your program.
   lcd_init();

   // Clear the LCD.

}
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Thu Mar 22, 2007 4:25 am     Reply with quote

1) When posting code make sure to set the 'disable HTML in this post' option, now some of your posted code is corrupted because it is interpreted as HTML code. You can set this option as a default in your user profile.

2) Float calculations use a lot of program memory and processing power. A much better solution is to use 'fixed point' calculations, also called 'scaled integers'. For an explanation of this technique have a look at http://www.embedded.com/98/9804fe2.htm.
Fabri



Joined: 22 Aug 2005
Posts: 275

View user's profile Send private message

PostPosted: Thu Mar 22, 2007 5:22 am     Reply with quote

Hi,

I use I simple function based on table to linearization NTC, PT100 and thermocouple.

Take a look to this link
http://www.ccsinfo.com/forum/viewtopic.php?t=17528&highlight=ntc

Regards,
Fabri
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group