Autor Tema: Control Remoto Infrarrojo  (Leído 2028 veces)

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

Desconectado ECHA

  • PIC10
  • *
  • Mensajes: 14
Control Remoto Infrarrojo
« en: 24 de Agosto de 2011, 17:27:38 »
Saludos,

He desarrollado un control infrarrojo de 48 teclas bajo el protocolo nec para el Televisor Semp Toshiba LC 3246WDA pero tengo problemas al programar el pic y no entiendo el por que...
Aquí esta el programa:
Código: [Seleccionar]
#include <16F88.h>             //Microcontrolador Utilizado



#FUSES      NOWDT,NOPROTECT

#FUSES      INTRC,CCPB3,NOBROWNOUT

#FUSES      NOMCLR,NOBROWNOUT

#USE      DELAY(INTERNAL=4M)

#BYTE      PORTA=0x05

#BYTE      PORTB=0x06

#byte TRISA=0x85

#byte TRISB=0x86

#use fast_io(a)

#use fast_io(b)



int32 tecla;               //Definición de Variable

int32 variable;               //Definición de Variable

void ir_send(int32 code);            //Definición de función



#define IR_CHUP   0x02FDD827      //Código Hexadecimal para cada tecla

#define IR_CHDW   0x02FDF807      //Teclas Principales

#define IR_VOLUP   0x02FD58A7

#define IR_VOLDW   0x02FD7887

#define IR_POWER   0x02FD48B7

#define IR_FIZQ      0x02FDB847

#define IR_FUP      0x02FD41BE

#define IR_OK      0x02FD916E

#define IR_FDW      0x02FDC13E

#define IR_MENU   0x02FD01FE

#define IR_EXIT      0x02FD1AE5

#define IR_FDER   0x02FD9867



#define UNO      0x02FD807F      //Código Hexadecimal para cada tecla

#define DOS      0x02FD40BF      //Teclas de Numeración

#define TRES     0x02FDC03F

#define CUATRO   0x02FD20DF

#define CINCO      0x02FDA05F

#define SEIS      0x02FD609F

#define SIETE      0x02FDE01F

#define OCHO      0x02FD10EF

#define NUEVE      0x02FD906F

#define CERO      0x02FD00FF

#define RECALL   0x02FDE817

#define POINT      0x02FD50AF



#define INPUT      0x02FDF00F      //Código Hexadecimal para cada tecla

#define SOUND      0x02FDE619      //Teclas de Entrada y Configuración

#define PIC_MODE   0x02FDB44B

#define PIC_SIZE   0x02FD2AD5

#define STILL      0x02FD32CD

#define MTS      0x02FDC837

#define CAPT      0x02FD04FB

#define SLEEP      0x02FDA857

#define INFO      0x02FD38C7

#define EPG      0x02FDA15E

#define FAV      0x02FDBA45

#define MUTE      0x02FD08F7



#define RED      0x02FD12ED      //Código Hexadecimal para cada tecla

#define GREEN      0x02FD926D      //Teclas de Interactividad

#define YELLOW   0x02FD52AD

#define BLUE      0x02FDD22D

#define PLAY      0x02FD0CF3

#define STOP      0x02FD8C73

#define JUMP_BE   0x02FDEC13

#define JUMP_AF   0x02FD6C93

#define PG_UP      0x02FD847B

#define PG_DN      0x02FD44BB

#define RW      0x02FD2CD3

#define FF      0x02FDCC33



int32 explorar_teclado()            //Función de Lectura de Teclado Matricial 7x7

{

 porta=0xff;

 portb=0xfe;               //Inspección de bit 0 en portb

 if(!bit_test(porta,1)) return IR_POWER;

 if(!bit_test(porta,2)) return IR_CHUP;

 if(!bit_test(porta,3)) return IR_CHDW;

 if(!bit_test(porta,4)) return IR_VOLUP;

 if(!bit_test(porta,5)) return IR_VOLDW;

 if(!bit_test(porta,6)) return IR_POWER;

 if(!bit_test(porta,7)) return IR_FIZQ;



 porta=0xff;

 portb=0xfd;               //Inspección de bit 1 en portb

 if(!bit_test(porta,1)) return IR_FUP;

 if(!bit_test(porta,2)) return IR_OK;

 if(!bit_test(porta,3)) return IR_FDW;

 if(!bit_test(porta,4)) return IR_MENU;

 if(!bit_test(porta,5)) return IR_EXIT;

 if(!bit_test(porta,6)) return IR_FDER;

 if(!bit_test(porta,7)) return UNO;



 porta=0xff;

 portb=0xfb;               //Inspección de bit 2 en portb

 if(!bit_test(porta,1)) return DOS;

 if(!bit_test(porta,2)) return TRES;

 if(!bit_test(porta,3)) return CUATRO;

 if(!bit_test(porta,4)) return CINCO;

 if(!bit_test(porta,5)) return SEIS;

 if(!bit_test(porta,6)) return SIETE;

 if(!bit_test(porta,7)) return OCHO;



 porta=0xff;

 portb=0xef;               //Inspección de bit 4 en portb

 if(!bit_test(porta,1)) return NUEVE;

 if(!bit_test(porta,2)) return CERO;

 if(!bit_test(porta,3)) return RECALL;

 if(!bit_test(porta,4)) return POINT;

 if(!bit_test(porta,5)) return INPUT;

 if(!bit_test(porta,6)) return SOUND;

 if(!bit_test(porta,7)) return PIC_MODE;



 porta=0xff;

 portb=0xdf;               //Inspección de bit 5 en portb

 if(!bit_test(porta,1)) return PIC_SIZE;

 if(!bit_test(porta,2)) return STILL;

 if(!bit_test(porta,3)) return MTS;

 if(!bit_test(porta,4)) return CAPT;

 if(!bit_test(porta,5)) return SLEEP;

 if(!bit_test(porta,6)) return INFO;

 if(!bit_test(porta,7)) return EPG;



 porta=0xff;

 portb=0xbf;               //Inspección de bit 6 en portb

 if(!bit_test(porta,1)) return FAV;

 if(!bit_test(porta,2)) return MUTE;

 if(!bit_test(porta,3)) return RED;

 if(!bit_test(porta,4)) return GREEN;

 if(!bit_test(porta,5)) return YELLOW;

 if(!bit_test(porta,6)) return BLUE;

 if(!bit_test(porta,7)) return PLAY;



 porta=0xff;

 portb=0x7f;               //Inspección de bit 7 en portb

 if(!bit_test(porta,1)) return STOP;

 if(!bit_test(porta,2)) return JUMP_AF;

 if(!bit_test(porta,3)) return JUMP_BE;

 if(!bit_test(porta,4)) return PG_UP;

 if(!bit_test(porta,5)) return PG_DN;

 if(!bit_test(porta,6)) return RW;

 if(!bit_test(porta,7)) return FF;



 return 0;               //Si no se pulso ninguna tecla

}                  //enviamos 0



void ir_send(unsigned int32 code)         //Función de Modulación de Código en PWM

{

 unsigned char i = 0;

 //disable_interrupts(GLOBAL);



 set_pwm1_duty(13);

 delay_us(9000);   

 set_pwm1_duty(0);

 delay_us(4500);



 while (i < 32)

   {

   #bit first=code.31

   if (first)               //Transmitimos un 1

      {

      set_pwm1_duty(13);

      delay_us(560);

      set_pwm1_duty(0);

      delay_us(1690);   

      }

   else               //Transmitimos un 0

      {

      set_pwm1_duty(13);

      delay_us(560);   

      set_pwm1_duty(0);

      delay_us(560);   

      }

   code <<= 1;

   i++;

   }



 set_pwm1_duty(13);

 delay_us(560);

 set_pwm1_duty(0);

 //enable_interrupts(GLOBAL);

}



void main()                  //Función Principal

{

 //setup_oscillator(OSC_4MHZ|OSC_INTRC);

 setup_ccp1(CCP_PWM);               //Habilita el PWM

 set_pwm1_duty(0);

 setup_timer_2(T2_DIV_BY_1,26,1);         //Se asigna la frecuencia del PWM=38,46kHz

 setup_adc(ADC_OFF);               //Solo puertos digitales

 setup_adc_ports(NO_ANALOGS);

 set_tris_a(0xff);                  //Configuración de I/O

 set_tris_b(0x00);

while (true)

   {

   //enable_interrupts(GLOBAL);

   tecla=explorar_teclado();         //Llama a la función explorar teclado y guarda el valor

   variable=tecla;            //Se asigna este valor a otra variable

   if(tecla!=0)            //Verifica que se halla pulsado alguna tecla

      {

      ir_send(tecla);         //Llama a la función que modula el código

      delay_us(40020);         //Completa el tiempo de duración del protocolo NEC

      tecla=explorar_teclado();      //Lee teclado para comprobar si la tecla sigue siendo presionada

      while (tecla==variable)

         {

         set_pwm1_duty(13);   //Se envía el código de repetición de tecla

         delay_us(9000);

         set_pwm1_duty(0);

         delay_us(2250);

         set_pwm1_duty(13);

         delay_us(560);

         set_pwm1_duty(0);

         delay_us(96190);

         tecla=explorar_teclado();

         }

      tecla=0;

      variable=0;

      }

   }

}

ya habia realizado uno de 12 teclas principales para el mismo televisor y funciono sin problemas...al quemar el de 12teclas me dice programación exitosa, pero al quemar el de 48 teclas me dice verificacion de la configuracion exitosa


Desconectado zerovlc

  • PIC10
  • *
  • Mensajes: 28
Re: Control Remoto Infrarrojo
« Respuesta #1 en: 25 de Agosto de 2011, 05:30:55 »
hola buenos dias he estado observando tu codigo, en principio esta todo bien, solo que tienes en esta parte de codigo que ahora adjunto una pregunta, dentro del bucle while tiene la variable i de tipo caracter, no seria aconsejable que fuera de tipo entero?

igual lo que ocurre que al ser de tipo entero no llegue a hacerte ninguna pasada en el bucle y por eso no te funcione.

void ir_send(unsigned int32 code)         //Función de Modulación de Código en PWM

{

 unsigned char i = 0;

 //disable_interrupts(GLOBAL);



 set_pwm1_duty(13);

 delay_us(9000);   

 set_pwm1_duty(0);

 delay_us(4500);



 while (i < 32)

   {

   #bit first=code.31

   if (first)               //Transmitimos un 1

      {

      set_pwm1_duty(13);

      delay_us(560);

      set_pwm1_duty(0);

      delay_us(1690);   

      }

   else               //Transmitimos un 0

      {

      set_pwm1_duty(13);

      delay_us(560);   

      set_pwm1_duty(0);

      delay_us(560);   

      }

   code <<= 1;

   i++;

   }



 set_pwm1_duty(13);

 delay_us(560);

 set_pwm1_duty(0);

 //enable_interrupts(GLOBAL);

}


P.D.: Muy buen aporte en septiembre encuentro un hueco y me pongo a hacerme uno