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