Autor Tema: ayuda Sony SIRC  (Leído 4608 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
ayuda Sony SIRC
« en: 01 de Octubre de 2006, 02:29:19 »
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.htm
he 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
.

Desconectado El_Gonza®

  • PIC10
  • *
  • Mensajes: 2
Re: ayuda Sony SIRC
« Respuesta #1 en: 12 de Julio de 2007, 15:58:33 »
Hola, soy nuevo en el foro y quisiera saber si alguno tiene una pagina donde pueda ver el protocolo de los remotos para TV marca LG o Goldstar (que creo que es lo mismo). La verdad es que estuve investigando y no pude dar con pagina alguna, y tengo la duda de si usan el rc-5 igual que Phillips