TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ECHA 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:
#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
-
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