Autor Tema: Error al compilar cuando llamo a función (mando IR)  (Leído 2890 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Error al compilar cuando llamo a función (mando IR)
« en: 17 de Diciembre de 2010, 21:42:00 »
Hola a todos de nuevo, sigo en mi intento por aprender, pero vuelvo a tropezar, os comento: de un artículo de la revista ucontrol (Diciembre 2010), intento hacer un receptor de IR de sony, en el artículo el código está explicado por trozos y llego a casi a entenderlo por completo. Pues bien, cuando tomo algunos trozos de sus códigos, más algunas cosas que pongo yo, como por ejemplo definición de variables (si pueden revisar también si están éstas bien definidas), al compilar me da dos errores, concretamente, cuando se llamar las funciones, el error que sale es el siguiente:

xxxError 12"control_sony.c"Line26[12,13]:Undefined identifier --take_adress
xxxError 12"control_sony.c"Line27[13,14]:Undefined identifier --take_command
     2 Errors, 0Warnings

y el código es el siguiente:

Código: [Seleccionar]
#include "16f877a.h"                    // Pic a utilizar
#use delay(clock=4000000)       // Cristal a utilizar
#fuses xt,nowdt,nobrownout,nolvp,noprotect   // Fusibles
#include "lcd.c"
int1 cambio;
int tiempo;
int1 start;
int16 word;
int16 i;
int longitud;
int1 dato_recibido;
int adress;
int command;
int j;


void main (void)
{
lcd_init();

if(start==1){                                // Si hem rebut START, esperem dades
while(!dato_recibido);                       // Esperamos mientras recibimos datos
dato_recibido=0;                             // Ponemos datos recibidos a 0
DISABLE_INTERRUPTS(INT_EXT);                 // Deshabilitamos INT EXTERNA
                                             // Tratamos los datos
take_adress();                               // Cogemos la Dirección
take_command();                              // Cogemos el Comando
                                             // En este caso no se utiliza adress
switch (command){                            // Mostramos por el LCD la tecla
                                             // del mando pulsada
case 0: printf(lcd_putc,"\fCanal 1");break;
case 1: printf(lcd_putc,"\fCanal 2");break;
case 2: printf(lcd_putc,"\fCanal 3");break;
case 3: printf(lcd_putc,"\fCanal 4");break;
case 4: printf(lcd_putc,"\fCanal 5");break;
case 5: printf(lcd_putc,"\fCanal 6");break;
case 6: printf(lcd_putc,"\fCanal 7");break;
case 7: printf(lcd_putc,"\fCanal 8");break;
case 8: printf(lcd_putc,"\fCanal 9");break;
case 9: printf(lcd_putc,"\fCanal 0");break;
case 16: printf(lcd_putc,"\fCanal +");break;
case 17: printf(lcd_putc,"\fCanal ");break;
case 18: printf(lcd_putc,"\fVolumen +");break;
case 19: printf(lcd_putc,"\fVolumen ");break;
case 20: printf(lcd_putc,"\fSilencio");break;
case 47: printf(lcd_putc,"\fStandby");break;
default: printf(lcd_putc,"\fCom:%3U Adr:%2U",command,adress);

}
ENABLE_INTERRUPTS(INT_EXT); // Habilitamos la interrupción externa
}
}
#INT_EXT

void ext_isr()
{

if(cambio){                                  // Hemos recibido flanco de subida
tiempo=get_timer0();                         // Miramos de cuanto tiempo es el pulso
EXT_INT_EDGE(H_TO_L);                        //Configuramos para recibir flanco de bajada
cambio=0;

}else {                                      // Hemos recibido flanco de bajada
set_timer0(0);                               // Timer0 a 0
tiempo=0;                                    // Tiempo a 0
EXT_INT_EDGE(L_TO_H);                        //Configurramos para recibir flanco de subida
cambio=1;
}

if (tiempo>140 && tiempo<160){               // Comprobamos START
start=1;                                     // flag start a 1
i=0;                                         // Reseteamos el contador de bits
}

if(start){                                   // Si hemos detectado start...
   if(tiempo>27 && tiempo<55){                  // es un 0 ?
   bit_clear(word,i);                           // Añadimos el bit a la palabra
   i++;                                         // incrementa contador bits
   }

   if(tiempo>65 && tiempo<90){                  // es un 1 ?
   bit_set(word,i);                             // Añadimos el bit a la palabra
   i++;                                         // incrementa contador
   }

   if(i==longitud){                             // Si contador = ntotalbits
   dato_recibido=1;                             // flag dato redibido activado
   EXT_INT_EDGE(H_TO_L);                        // Flanco de subida para el START
   start=0;                                     // Inicialización para la siguiente palabra
   }
}
}

void take_adress(void){                      // Separamos la dirección de la palabra
   i=longitud-1;
   adress=0;
   for(j=0;j<longitud-7;j++){                    // Hacemos un recorrido al revés
      adress=adress<<1;                         //al revés para separar la direccion
      adress=adress+bit_test(word,i);
      i--;
      }
}

void take_command(void){                     //Separamos el comando de la palabra
   i=6;
   command=0;
   for(j=0;j<7;j++){                         // Hacemos un recorrido para separar el comando
      command=command<<1;
      command=command+bit_test(word,i);
      i--;
      }
}

de nuevo gracias a todos por vuestra colaboración.

Que pasen un buen día.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Error al compilar cuando llamo a función (mando IR)
« Respuesta #1 en: 18 de Diciembre de 2010, 03:45:26 »
El problema es que cuando el compilador pasa por esas líneas, todavía no tiene las definiciones de las funciones take_address y take_command porque están más adelante en el programa.
Tienes dos opciones:
- pones las funciones antes del main
- declaras el prototipo de las funciones al principio del programa y las pones donde te de la gana

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: Error al compilar cuando llamo a función (mando IR)
« Respuesta #2 en: 18 de Diciembre de 2010, 07:04:08 »
Gracias Nocturno por tu respuesta, efectivamente ahora compila correctamente, el problema que se presenta es que no aparece nada en el LCD (solo se ilumina, he hecho una prueba poniendo una línea y si escribe), en estos momentos lo estoy repasando, así que si veis algo extraño en el códidgo (sobre todo en la definición de variables) os lo agradecería.

Gracias y a pasar un buen día.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Error al compilar cuando llamo a función (mando IR)
« Respuesta #3 en: 18 de Diciembre de 2010, 08:33:12 »
¿Qué quieres decir con que sí escribe si pones una sola línea?

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: Error al compilar cuando llamo a función (mando IR)
« Respuesta #4 en: 18 de Diciembre de 2010, 09:58:09 »
Que verifico que el lcd funciona correctamente, ya que al principio del main escribo lo siguiente:

void main (void)
{
lcd_init();

printf(lcd_putc,"\fhola");
delay_ms(1000);

y este mensaje si lo veo en el lcd, pero aquí se queda, si quito el mensaje "hola", el lcd se queda iluminado y nada.

El dato que introduzco es el que se puede ver en archivo adjunto.

De nuevo gracias

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Error al compilar cuando llamo a función (mando IR)
« Respuesta #5 en: 18 de Diciembre de 2010, 16:46:52 »
Yo soy el responsable del programa ! si quieres y lo encuentro.... te paso el codigo completo !


Aunque lo mejor es que nos vuelvas a colgar tu código y miremos a ver que es lo que falla !
« Última modificación: 18 de Diciembre de 2010, 16:51:13 por jim_17 »
Share the world !

Blog's

http://www.area0x33.com

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: Error al compilar cuando llamo a función (mando IR)
« Respuesta #6 en: 19 de Diciembre de 2010, 04:23:38 »
Gracias jim_17 por tu ofrecimiento, el código es el mismo que el de la publicación, a excepción de que no pongo la parte del teclado con el código, lo único que he puesto yo ha sido la configuración y declaración de variables,lo último que tengo es lo siguiente (compila bien)
Código: [Seleccionar]
#include "16f877a.h"                    // Pic a utilizar
#use delay(clock=4000000)       // Cristal a utilizar
#fuses xt,nowdt,nobrownout,nolvp,noprotect   // Fusibles
#include <lcd.c>
int1 cambio;
int tiempo;
int1 start;
int16 word;
int16 i;
int longitud;
int1 dato_recibido;
int adress;
int command;
int j;

void take_adress(void){                      // Separamos la dirección de la palabra
   i=longitud-1;
   adress=0;
   for(j=0;j<longitud-7;j++){                    // Hacemos un recorrido al revés
      adress=adress<<1;                         //al revés para separar la direccion
      adress=adress+bit_test(word,i);
      i--;
      }
}

void take_command(void){                     //Separamos el comando de la palabra
   i=6;
   command=0;
   for(j=0;j<7;j++){                         // Hacemos un recorrido para separar el comando
      command=command<<1;
      command=command+bit_test(word,i);
      i--;
      }
}

void main (void)
{
lcd_init();

printf(lcd_putc,"\fhola");
delay_ms(1000);
if(start==1){                                // Si hem rebut START, esperem dades
while(!dato_recibido);                       // Esperamos mientras recibimos datos
dato_recibido=0;                             // Ponemos datos recibidos a 0
DISABLE_INTERRUPTS(INT_EXT);                 // Deshabilitamos INT EXTERNA
                                             // Tratamos los datos
take_adress();                               // Cogemos la Dirección
take_command();                              // Cogemos el Comando
                                             // En este caso no se utiliza adress
switch (command){                            // Mostramos por el LCD la tecla
                                             // del mando pulsada
case 0: printf(lcd_putc,"\fCanal 1");break;
case 1: printf(lcd_putc,"\fCanal 2");break;
case 2: printf(lcd_putc,"\fCanal 3");break;
case 3: printf(lcd_putc,"\fCanal 4");break;
case 4: printf(lcd_putc,"\fCanal 5");break;
case 5: printf(lcd_putc,"\fCanal 6");break;
case 6: printf(lcd_putc,"\fCanal 7");break;
case 7: printf(lcd_putc,"\fCanal 8");break;
case 8: printf(lcd_putc,"\fCanal 9");break;
case 9: printf(lcd_putc,"\fCanal 0");break;
case 16: printf(lcd_putc,"\fCanal +");break;
case 17: printf(lcd_putc,"\fCanal ");break;
case 18: printf(lcd_putc,"\fVolumen +");break;
case 19: printf(lcd_putc,"\fVolumen ");break;
case 20: printf(lcd_putc,"\fSilencio");break;
case 47: printf(lcd_putc,"\fStandby");break;
default: printf(lcd_putc,"\fCom:%3U Adr:%2U",command,adress);

}
ENABLE_INTERRUPTS(INT_EXT); // Habilitamos la interrupción externa
}
}
#INT_EXT

void ext_isr()
{

if(cambio){                                  // Hemos recibido flanco de subida
tiempo=get_timer0();                         // Miramos de cuanto tiempo es el pulso
EXT_INT_EDGE(H_TO_L);                        //Configuramos para recibir flanco de bajada
cambio=0;

}else {                                      // Hemos recibido flanco de bajada
set_timer0(0);                               // Timer0 a 0
tiempo=0;                                    // Tiempo a 0
EXT_INT_EDGE(L_TO_H);                        //Configurramos para recibir flanco de subida
cambio=1;
}

if (tiempo>140 && tiempo<160){               // Comprobamos START
start=1;                                     // flag start a 1
i=0;                                         // Reseteamos el contador de bits
}

if(start){                                   // Si hemos detectado start...
   if(tiempo>27 && tiempo<55){                  // es un 0 ?
   bit_clear(word,i);                           // Añadimos el bit a la palabra
   i++;                                         // incrementa contador bits
   }

   if(tiempo>65 && tiempo<90){                  // es un 1 ?
   bit_set(word,i);                             // Añadimos el bit a la palabra
   i++;                                         // incrementa contador
   }

   if(i==longitud){                             // Si contador = ntotalbits
   dato_recibido=1;                             // flag dato redibido activado
   EXT_INT_EDGE(H_TO_L);                        // Flanco de subida para el START
   start=0;                                     // Inicialización para la siguiente palabra
   }
}
}



Gracias de nuevo por vuestra colaboración

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Error al compilar cuando llamo a función (mando IR)
« Respuesta #7 en: 19 de Diciembre de 2010, 09:50:02 »
Veamos, vayamos por partes !

1: Falta inicializar el programa, es decir, tienes que decirle los puertos que van a ser entrada los que van a ser salidas y configurar las interrupcion externa para que se produzca.

Seria así:
Código: C
  1. void main(void){
  2.  
  3. // *******  CONFIGURACION INICIAL  ******** //
  4.  
  5.    setup_adc_ports(NO_ANALOGS);
  6.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16); // CONFIGURAMOS EL TIMER0
  7.    SET_TRIS_A(0X00);                            // CONFIGURAMOS PUERTOS
  8.    SET_TRIS_B(0XFF);
  9.    SET_TRIS_C(0X00);
  10.    SET_TRIS_D(0X00);
  11.    SET_TRIS_E(0X00);
  12.  
  13. //** CONFIGURAMOS INTERRUPCIONES **//
  14.  
  15.    EXT_INT_EDGE(H_TO_L);
  16.    ENABLE_INTERRUPTS(INT_EXT);
  17.    ENABLE_INTERRUPTS(GLOBAL);
  18.  
  19. //** INICIALIZACION DEL LCD **//
  20.  
  21.    lcd_init();
  22.  
  23.    Aqui va tu codigo.
  24. }
Share the world !

Blog's

http://www.area0x33.com

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: Error al compilar cuando llamo a función (mando IR)
« Respuesta #8 en: 19 de Diciembre de 2010, 13:15:20 »
Gracias jim17 por los datos, debe de existir algo más que sea erróneo, ya que siguel igual, es decir solo se ilumina el lcd.

Gracias de nuevo por la aportación

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Error al compilar cuando llamo a función (mando IR)
« Respuesta #9 en: 19 de Diciembre de 2010, 17:09:46 »
Mira que en el esquema de proteus tengas el pic a 4Mhz, puede ser eso !
Share the world !

Blog's

http://www.area0x33.com

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: Error al compilar cuando llamo a función (mando IR)
« Respuesta #10 en: 19 de Diciembre de 2010, 20:23:09 »
Ya he encontrado el fallo y es el siguiente:

En la línea:

if(i==longitud){                             

no estaba definido longitud, que debe de ser 12 para leer los 12 bits.

Gracias de nuevo por esta gran colaboración, ahora tengo otra pregunta, ¿cómo se ha calculado los tiempos (intervalos) para saber si se trata de start un 1 o un 0?