Hola saludos, antes de ausentarme un tiempo, deseo dejar algo en lo que puedan ayudarme, he estado conversando con Algec (si lee esto y me ayuda, estaria perfecto, jeje) hace ya tiempo, por qeu pretendia hacer el programa para el manejo de un receptor infrarrojo, obviamente usando un control remoto de TV, he adquirdo unos cuantos receptores de Infrarrojos.
aqui el protocolo Sony SIRC:
http://www.sbprojects.com/knowledge/ir/sirc.htmhe aqui el programa:
/*---------------------------------------------------------------*/
// CCS Compiler// Receptor IR (código Sony SIRC de Sony)
// Programado por
// Cryn 30-Septiembre-2006
// HAY QUE TENER EN CONSIDERACION QUE EL SENSOR
// IR INVIERTE LOS DATOS (el 1 es 0 y el 0 es 1)
/*---------------------------------------------------------------*/
#include <16F84a.h>
#fuses XT,NOWDT,NOPROTECT,PUT // Los Fuses de siempre
#use delay(clock=4000000) // Oscilador a 4 Mhz
#define REC_IR PIN_A4 // selecciona la entrada a usar para el sensor IR
int error = 0; //Bit global de error
int on =0;
int1 recibir_bit()
{
// OJO los bits son diferentes en tiempo si son 1 o 0
// el 1 dura 600(0)+600(0)+600(1)
// el 0 es 600(0)+ 600(1)
// empieza a leer bits
delay_us(600);
if(inpu1t(REC_IR) == 0) // si lee un 0 es correcto de momento
{
delay_us(600);
if(input(REC_IR) == 0) // si lee un 0 es 1 y es correcto de momento
{
delay_us(600);
if(input(REC_IR) == 1) // si lee un 1 es 1 y es correcto el bit completo
error =0;
return 1;
}
else // si es 1 es cero y es correcto y ya acabo el bit completo
{
error =0;
return 0;
}
}
else
{
error = 3;
return 0;
}
}
void main()
{
// define Bytes
byte direccion = 0;
byte comando = 0;
while(1)
{
// inicializa los bits de control de comunicacion
direccion = 0;
comando = 0;
// Espera al 1er bit de START (flanco de bajada) del receptor IR
// mientras se queda en el bucle While
while(input(REC_IR)==0)
{
// cuando llega el flanco de bajada
// LEER el BIT DE START que dura 2,4 msg en 0 + 600msg en 1
delay_us(400); // se posiciona para leer en mitad del periodo de 600 msg a partir de que el flanco bajo
if(input(REC_IR)==0) // si llega un 0 es que va bien y continua
{
delay_us(1000); // se posiciona en mitad
if(input(REC_IR) == 0) // si llega un 0 es que sigue bien
{
delay_us(1000); // se posiciona en mitad
if(input(REC_IR) == 0) // si llega un 0 es que sigue bien
{
delay_us(600); // se posiciona en mitad
if(input(REC_IR) == 1) // ojo ahora llega el CERO
error=0; }
// estos tiempos son correctos?? he cambiado muhcas veces y siempre ha estado un tanto aleatoria la respuesta que deseo; paso de todo, con una distancia determinada por ejemplo encendia RB6, me alejaba y ya no encendia, raro no?, tb con un botones que no correspondian se encendian leds que no correspondian, alguna vez funciono todo bien, pero creo que fue cuando pasaba lo de la distancia, jajaja, weno aver si me correjen algunos errores que seguramente he cometido else
error = 1;
}
else
error=2; // si no se cumple todo asi, hay un error
}
else
error = 4;
if(error==0)
{ // lee los bits de direccion y comando ( 5 direccion + 7 comando)
if(recibir_bit())
bit_set(comando,0);
if(recibir_bit())
bit_set(comando,1);
if(recibir_bit())
bit_set(comando,2);
if(recibir_bit())
bit_set(comando,3);
if(recibir_bit())
bit_set(comando,4);
if(recibir_bit())
bit_set(comando,5);
if(recibir_bit())
bit_set(comando,6);
if(recibir_bit())
bit_set(direccion,0);
if(recibir_bit())
bit_set(direccion,1);
if(recibir_bit())
bit_set(direccion,2);
if(recibir_bit())
bit_set(direccion,3);
if(recibir_bit())
bit_set(direccion,4);
// aqui vendria la rutina a ejecutar para chequeo de que la direccion sea la
// adjudicada al receptor
// y la rutina a ejecutar para cada comando
switch(comando)
{
case 4:
{
output_high(PIN_B7); // adelante, weno es para control de un auto pequeño
delay_ms(500);
output_low(PIN_B7);
break;
}
case 6:
{
if(on==1) // izquierda;...........
esta es una condición que nunca me ha funcionado, la explico, el auto requiere para girar un constante valor de vcc en el motor ya sea para derecha o izquierda, si se quita la enegia (en el driver) pues no girará cuando se le de a avanzar; quiero que si por ejemplo al principio der o izq estan en cero (on=0), despues de presionado, ya sea izq o der se quede el uno donde se presione y entonces on cambiara: on=1, lo que hará que cuando se presione hacia el otro lado se desactive para avanzar recto. Talvez no he especificado en el programa qeu pasa si esta encendido derecha y vuelvo a presionar derecha, ocurrira un problema seguramente (se apagara derecha, creo); bueno, en lo posible no se presionará dos veces derecha, jaja, pero de poder implementarlo en código seguro qeu se prodra, solo incrementarán algunas condiciones, cierto?? {
output_low(PIN_B4);
on=0;
}
else
{
output_high(PIN_B5);
on=1;
}
break;
}
case 7:
{
output_high(PIN_B6); // atras
delay_ms(500);
output_low(PIN_B6);
break;
}
case 8:
{
if(on==1)
{
output_low(PIN_B5); // derecha
on=0;
}
else
{
output_high(PIN_B4);
on=1;
}
break;
}
comando=0;
direccion =0;
}
}
}
}
}
para probarlo solamente he grabado y grabado en el pic, alguna idea para la simulación? talvez haciendo código para un generador por pic, podria ser no?? otra alternativa??
Bueno, he hecho muchas preguntas, y no en muy buen orden, trate de hacer lo mejor que pude; disculpas por el enrollo; muchas gracias