problemas al compilar el programa de un fasimetro trifasico digital

Hola amigos del foro, una ayuda por favor ya que es para un proyecto importante.
No sé porque al compilar este programa me bota varios errores.
Al principio pensé que le faltaba algo, luego observé que había una librería de LCD(//flex_lcd.c) la cual la cambie por la original, pero igual me sigue botando error y no se cual será el problema.
¿Serían tan amables de ayudarme en este problema? Les sería muy agradecido.
OJO, un detalle, ese programa no es mio, lo encontré en un libro en la empresa donde laboro actualmente.

Gracias


Programa del proyecto, analizador de redes:
Código:
#include <16f877a.h>

#device adc=10

#fuses HS,NOWDT,PUT,NODEBUG,PROTECT,BROWNOUT,NOLVP

#use delay(clock=20M)



#use fast_io(A)

#use fast_io(B)

#use fast_io(C)

#use fast_io(D)

#use fast_io(E)




#byte porta=0x05

#byte portb=0x06

#byte portc=0x07

#byte portd=0x08

#byte porte=0x09



#bit t1if = getenv("BIT:TMR1IF")

#bit t2if = getenv("BIT:TMR2IF")



#bit sV1 =  portb.5

#bit sV2 =  portb.6

#bit sV3 =  portb.7



#bit sI1 =  portb.0

#bit sI2 =  portc.1

#bit sI3 =  portc.2

#bit pFuncion = portc.3



#define VAL_T0 256-195      // para interrupcion aprox de 10ms



#include <math.h>

#include "flex_lcd.h"

#include "funciones_fas.c"


// variable para mostrar en pantalla


static int1 f_mostrar;

// declaracion de funciones







void mostrar_tension();

void mostrar_corriente();

void mostrar_fase();

void mostrar_factor();


// temporizacion cada 10 milisegundos
#INT_TIMER0



void timer0_isr()

{

   static int cntT0;

   set_timer0(VAL_T0);
   
   if(++cntT0>=40){

      cntT0=0;

      f_mostrar=1;

   }

}


void main()


{

   // CONFIGURACION ADC





   setup_adc_ports(AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF);

   setup_adc(ADC_CLOCK_DIV_32);

   set_adc_channel(0);

   
   // CONFIGURACION PUERTOS E/S


   set_tris_a(0b11101111);

   set_tris_b(0b11100001);

   set_tris_c(0b00001110);

   set_tris_d(0);

   set_tris_e(0b111);
   
  
   porta=0;

   portb=0;

   portc=0;

   portd=0;

   porte=0;



   // CONFIGURACION TIMERS

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);

   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);

   setup_timer_2(T2_DIV_BY_4,64,10);         // 520useg  



   
   enable_interrupts(INT_TIMER0);

   enable_interrupts(GLOBAL);

   
   // INICIA LCD


   lcd_init();
   
   senal_ini();

   lcd_putc("\fRichard Quillas");

   //delay_ms(2000);
   
   lcd_putc("\f  FASIMETRO"); 

   lcd_putc("\n  TRIFASICO"); 

   //delay_ms(2000);

   
   //LAZO INFINITO


   while(TRUE)

   {

      mostrar_fase();

      mostrar_factor();

      mostrar_tension();

      mostrar_corriente();

   }

}      
   
   
   
// ================================================================

// FUNCIONES PARA MOSTRAR VALORES

void mostrar_tension()

{

   long va,vb,vc;
   
   lcd_putc("\fV1=     V2=  ");

   lcd_putc("\nV3=    ");

   do{

      if(f_mostrar)

      {


         f_mostrar=0;

         va=medirSenal(0)*1.73;

         vb=medirSenal(1)*1.73;

         vc=medirSenal(2)*1.73;

         lcd_gotoxy(4,1);

         printf(lcd_putc,"%3Lu",va);

         lcd_gotoxy(12,1);

         printf(lcd_putc,"%3Lu",vb);

         lcd_gotoxy(4,2);


         printf(lcd_putc,"%3Lu",vc);    
     
      }


   }while((pFuncion)==1);

   delay_ms(20);

   while(pFuncion==0);

   delay_ms(20);

}



void mostrar_Corriente()


{

   float ia,ib,ic;
   
   lcd_putc("\fI1=     I2=  ");

   lcd_putc("\nI3=    ");

   f_mostrar=1;

   do{

      if(f_mostrar)

      {


         f_mostrar=0;

         ia=medirSenal(4)*0.1173;      // 120/1023

         ib=medirSenal(5)*0.1173;


         ic=medirSenal(6)*0.1173;

   
         lcd_gotoxy(4,1);

         printf(lcd_putc,"%.1f",ia);

         lcd_gotoxy(12,1);

         printf(lcd_putc,"%.1f",ib);

         lcd_gotoxy(4,2);

         printf(lcd_putc,"%.1f",ic);     
    
      }


   }while((pFuncion)==1);

   delay_ms(20);

   while(pFuncion==0);

   delay_ms(20);

}


void mostrar_fase()

{   

   float time;
   
   lcd_putc("\fa1=     a2=  ");

   lcd_putc("\na3=    ");

   f_mostrar=1;

   do{


      if(f_mostrar==1)

      {


         f_mostrar=0;

         time=medirDesfase(sv1,si1);

         calcula_angulo(time);

         lcd_gotoxy(4,1);

         printf(lcd_putc,"%.1f ",angulo);

         time=medirDesfase(sv2,si2);

         calcula_angulo(time);

         lcd_gotoxy(12,1);

         printf(lcd_putc,"%.1f ",angulo);

         time=medirDesfase(sv3,si3);

         calcula_angulo(time);

         lcd_gotoxy(4,2);

         printf(lcd_putc,"%.1f ",angulo);   
     
      }


   }while((pFuncion)==1);

   delay_ms(20);

   while(pFuncion==0);

   delay_ms(20);

}
  
void mostrar_factor()

{   

   float time;

   
   lcd_putc("\ff1=     f2=  ");

   lcd_putc("\nf3=    ");

   f_mostrar=1;

   do{

      if(f_mostrar)

      {


         f_mostrar=0;

         time=medirDesfase(sv1,si1);

         calcula_angulo(time);

         lcd_gotoxy(4,1);

         printf(lcd_putc,"%.2f ",factor);

         time=medirDesfase(sv2,si2);

         calcula_angulo(time);

         lcd_gotoxy(12,1);

         printf(lcd_putc,"%.2f ",factor);

         time=medirDesfase(sv3,si3);

         calcula_angulo(time);

         lcd_gotoxy(4,2);

         printf(lcd_putc,"%.2f ",factor); 
   
      }


   }while((pFuncion)==1);

   delay_ms(20);

   while(pFuncion==0);

   delay_ms(20);

}
Librería para la pantalla LCD (// flex_lcd.c)
Código:
// flex_lcd.c

///////////////////////////////////////////////////////////////////////////
////                             LCDD.C                                ////
////                 Driver for common LCD modules                     ////
////                                                                   ////
////  lcd_init()   Must be called before any other function.           ////
////                                                                   ////
////  lcd_putc(c)  Will display c on the next position of the LCD.     ////
////                     The following have special meaning:           ////
////                      \f  Clear display                            ////
////                      \n  Go to start of second line               ////
////                      \b  Move back one position                   ////
////                                                                   ////
////  lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)    ////
////                                                                   ////
////  lcd_getc(x,y)   Returns character at position x,y on LCD         ////
////                                                                   ////
// These pins are for the Microchip PicDem2-Plus board,
// which is what I used to test the driver.  Change these
// pins to fit your own board.

#define LCD_DB4   PIN_C7
#define LCD_DB5   PIN_C6
#define LCD_DB6   PIN_C5
#define LCD_DB7   PIN_C4   

#define LCD_RS    PIN_B3
//#define LCD_RW    PIN_A5
#define LCD_E     PIN_B2

// If you only want a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.

//#define USE_LCD_RW   1

//========================================

#define lcd_type 2        // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line
#define on     1
#define off     0

int8 const LCD_INIT_STRING[4] =
{
 0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
 0xc,                    // Display on
 1,                      // Clear display
 6                       // Increment cursor
 };


//-------------------------------------
void lcd_send_nibble(int8 nibble)
{
// Note:  !! converts an integer expression
// to a boolean (1 or 0).
 output_low(LCD_DB4);
 output_low(LCD_DB5);
 output_low(LCD_DB6);
 output_low(LCD_DB7);
 
 if(bit_test(nibble,0)) output_high(LCD_DB4);
 if(bit_test(nibble,1)) output_high(LCD_DB5);
 if(bit_test(nibble,2)) output_high(LCD_DB6);
 if(bit_test(nibble,3)) output_high(LCD_DB7);
/* 
 output_bit(LCD_DB4, !!(nibble & 1));
 output_bit(LCD_DB5, !!(nibble & 2));
 output_bit(LCD_DB6, !!(nibble & 4));
 output_bit(LCD_DB7, !!(nibble & 8));
*/
 delay_cycles(1);
 output_high(LCD_E);
 delay_us(2);
 output_low(LCD_E);   
}

//-----------------------------------    
// This sub-routine is only called by lcd_read_byte().
// It's not a stand-alone routine.  For example, the
// R/W signal is set high by lcd_read_byte() before
// this routine is called.

#ifdef USE_LCD_RW
int8 lcd_read_nibble(void)
{
int8 retval;
// Create bit variables so that we can easily set
// individual bits in the retval variable.
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3

retval = 0;

output_high(LCD_E);
delay_cycles(1);

retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);


output_low(LCD_E);

return(retval);
}
#endif

//---------------------------------------
// Read a byte from the LCD and return it.

#ifdef USE_LCD_RW
int8 lcd_read_byte(void)
{
int8 low;
int8 high;

output_high(LCD_RW);
delay_cycles(1);

high = lcd_read_nibble();

low = lcd_read_nibble();

return( (high<<4) | low);
}
#endif

//----------------------------------------  
// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);

#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif

if(address)
   output_high(LCD_RS);
else
   output_low(LCD_RS);

 delay_cycles(1);

#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
#endif

output_low(LCD_E);

lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);  
}

//----------------------------------------------------
//---------pone cursor on o off-----------------------
void lcd_cursor(int on_off)
{
   if(on_off==on){lcd_send_byte(0,0xf);}     // 0x0e es cursor on sin parapadeo
   else {lcd_send_byte(0,0xc);}              // 0x0f cursor on con parpadeo
                                             // 0x0c cursor off
}

//------------------------------------------------------------------------------
//                  INICIALIZACION DE LCD
//------------------------------------------------------------------------------
void lcd_init(void)
{
int8 i;

output_low(LCD_RS);

#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif

output_low(LCD_E);

delay_ms(15);  

for(i=0 ;i < 3; i++)
   {
    lcd_send_nibble(0x03);
    delay_ms(5);
   }

lcd_send_nibble(0x02);

for(i=0; i < sizeof(LCD_INIT_STRING); i++)
   {
    lcd_send_byte(0, LCD_INIT_STRING[i]);

    // If the R/W signal is not used, then
    // the busy bit can't be polled.  One of
    // the init commands takes longer than
    // the hard-coded delay of 60 us, so in
    // that case, lets just do a 5 ms delay
    // after all four of them.
    #ifndef USE_LCD_RW
    delay_ms(5);
    #endif
   }

}


// FIN INICIALIZACION   
//----------------------------------------------------------------------------

void lcd_gotoxy(int8 x, int8 y)
{
int8 address;

if(y != 1)
   address = lcd_line_two;
else
   address=0;

address += x-1;
lcd_send_byte(0, 0x80 | address);
}

//-----------------------------
void lcd_putc(char c)
{
 switch(c)
   {
    case '\f':
      lcd_send_byte(0,1);
      delay_ms(2);
      delay_us(500);
      break;

    case '\n':  
       lcd_gotoxy(1,2);
       break;

    case '\b':
       lcd_send_byte(0,0x10);
       break;

    default:
       lcd_send_byte(1,c);
       break;
   }
}


//---------------------------------------
//   LEYENDO EL LCD
//---------------------------------------
#ifdef USE_LCD_RW

char lcd_getc(int8 x, int8 y)
{
   char value;

   lcd_gotoxy(x,y);

// Wait until busy flag is low.
   while(bit_test(lcd_read_byte(),7));   

   output_high(LCD_RS);
   value = lcd_read_byte();
   output_low(lcd_RS);

   return(value);
}
#endif
//----------------------------------------

void lcd_setcursor_vb(short visible, short blink) { 
  lcd_send_byte(0, 0xC|(visible<<1)|blink); 
}
 
Última edición por un moderador:
Atrás
Arriba