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:
#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.