Autor Tema: emisor IR  (Leído 1193 veces)

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

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
emisor IR
« en: 29 de Septiembre de 2014, 18:53:03 »
Hola espero que me puedan ayudar, estoy haciendo un emisor para encender tres focos  por IR pero tengo problemas en la forma de generar el código, tengo una opción para escoger el código que se va a mandar pero no cambia la opción, lo he revisado pero no entiendo porque no hace este cambio. Dejo el código que hice, espero que me puedas ayudar. Gracias

#include <12F683.H>
#fuses INTRC, NOWDT, MCLR, NOIESO, PROTECT, PUT, NOBROWNOUT, NOFCMEN
#use delay( clock = 8000000 )
#use standard_io( A )

#define CO1 0xA1
#define CO2 0xA2
#define CO3 0xA3

void Rutime( int limt )       //Rutina de tiempo.
   {
     int Cont = 0;
     while( Cont < limt )  
      {          
        set_timer0( 100 );        //Carga el timer para 5ms.
        while( get_timer0() );  //Se espera aqui hasta que el timer0 valga 0 osea que se ha desbordado y ha pasado 10ms.    
        Cont++;                //Cada 5ms se incrementa contador.
      }                
     Cont = 0;                  //Pasando los 5ms en alto pasamos el contador a 0.
   }
  
void espera( void )     //Esta funcion retarda 1/2 segundo.
   {
     int lime = 100;
     set_pwm1_duty( 0 );
     Rutime( lime );
   }

void mancode( int cod, int lim1, int lim2 )
   {
     int s = 0;
     espera();
     while( s < 8 )           //genera el codigo
       {
         #bit uno = cod.7
         if( uno )
          {
            set_pwm1_duty( 25 );    //Modula a 38KHz
            Rutime( lim1 );
          }
         else
          {
            set_pwm1_duty( 0 );     //PWM a cero
            Rutime( lim2 );
          }
         cod <<= 1;
         s++;
       }
     espera();
   }

void main( void )
   {      
      int menu = 0;     //Variable del menu.
      int li1, li2;     //Intervalos de tiempo
      
      //setup_oscillator( OSC_4MHZ );
      setup_wdt( WDT_OFF );
      setup_adc( ADC_OFF );         //Desactiva el ADC.
      setup_adc_ports( NO_ANALOGS );   //No puertos analogos
      setup_timer_2( T2_DIV_BY_1, 51, 1  );  //Prescaler de 1, PR2 = 51.
      setup_ccp1( CCP_PWM );              //Activa el PWM
      set_pwm1_duty( 0 );                 //Desactiva el modulo PWM. si se lo pone 0 al ciclo util es como si se desactivara.
      set_timer0( 100 );         //Carga del Timer0.
      setup_timer_0( RTCC_INTERNAL | RTCC_DIV_64 );   //Prescaler de 64.
      
      while( 1 )
        {            
          if( !INPUT( PIN_A0 ) )
           {
             menu++;             //Incrementa menu si A0 = 0.
             if( menu == 4 )
              {
                menu = 0;
              }
             delay_ms( 500 );   //Espera 500mseg para evitar rebotes.
           }
          if( menu == 0 )
           {
             set_pwm1_duty( 0 );  //CCP a cero
           }
          if( menu == 1 )
           {
             li1 = 2;
             li2 = 1;
             mancode( CO1, li1, li2 ); //Manda a generar el primer codigo
           }
          if( menu == 2 )
           {
             li1 = 4;
             li2 = 1;
             mancode( CO2, li1, li2 );    //Manda a generar el segundo codigo
           }
          if( menu == 3 )
           {
             li1 = 6;
             li2 = 1;
             mancode( CO3, li1, li2 );    //Manda a generar el tercer codigo
           }
        }
   }

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: emisor IR
« Respuesta #1 en: 01 de Octubre de 2014, 23:56:45 »
Hola que tal ya solucione el problema de escoger una opcion, alguien me podria decir ¿cuantas veces un control remoto manda un codigo para alguna accion? dejo el codigo espero que le sirva a alguien.laidea principalla obtube de esta pagina http://electronicayciencia.blogspot.mx/2010/05/transmisor-protocolo-nec-con-pic.html

#include <12F683.H>
#fuses INTRC, NOWDT, MCLR, IESO, PROTECT, PUT, NOBROWNOUT, FCMEN
#use delay( clock = 8000000 )
#use standard_io( A )

#define CODIGO  0xA1       //Codigo 1
#define APAGADO 0xA8       //Codigo de Apagado.

int lim1, lim2;

void Rutime( int limt )       //Rutina de tiempo.
   {
     int Cont = 0;
     while( Cont < limt )
      {           
        set_timer0( 100 );        //Carga el timer para 5ms.
        while( get_timer0() );  //Se espera aqui hasta que el timer0 valga 0 osea que se ha desbordado y ha pasado 10ms.     
        Cont++;                //Cada 5ms se incrementa contador.
      }                 
     Cont = 0;                  //Pasando los 5ms en alto pasamos el contador a 0.
   }

void tardio( void )
  {
    int ttard = 100;
    set_pwm1_duty( 0 );
    Rutime( ttard );
  }

void manco1( int cod, int l1,int l2 )
   {
     int s = 0;
     tardio();
     while( s < 8 )           //genera el codigo
       {
         #bit uno = cod.7
         if( uno )
          {
            set_pwm1_duty( 25 );    //Modula a 38KHz
            Rutime( l1 );
          }
         else
          {
            set_pwm1_duty( 0 );     //PWM a cero
            Rutime( l2 );
          }
         cod <<= 1;
         s++;
       }
     tardio();
   }

void main( void )
   {     
      int menu = 0, vec = 0;     //Variable del menu y variable de las veces que se repetira el codigo.
     
      //setup_oscillator( OSC_8MHZ );
      setup_wdt( WDT_OFF );
      setup_adc( ADC_OFF );         //Desactiva el ADC.
      setup_adc_ports( NO_ANALOGS );   //No puertos analogos
      setup_timer_2( T2_DIV_BY_1, 51, 1  );  //Prescaler de 1, PR2 = 51.
      setup_ccp1( CCP_PWM );              //Activa el PWM
      set_pwm1_duty( 0 );                 //Desactiva el modulo PWM. si se lo pone 0 al ciclo util es como si se desactivara.
      set_timer0( 100 );         //Carga del Timer0.
      setup_timer_0( RTCC_INTERNAL | RTCC_DIV_64 );   //Prescaler de 64.
     
      while( 1 )
        {           
          if( INPUT( PIN_A0 ) == 0 )
           {
             menu++;
             delay_ms( 300 );
             if( menu == 4 )
              {
                menu = 0;
              }
             switch( menu )
              {
                case 0: lim1 = 1, lim2 = 1;  //Manda el codigo para la primera opcion
                        while( vec < 3 )     //la duracion de los '1' es de 20ms la de los '0' es 10ms.
                         {
                           manco1( APAGADO, lim1, lim2 );
                           vec++;
                         }
                        vec = 0;
                break;
                case 1: lim1 = 4, lim2 = 2;  //Manda el codigo para la primera opcion
                        while( vec < 3 )     //la duracion de los '1' es de 20ms la de los '0' es 10ms.
                         {
                           manco1( CODIGO, lim1, lim2 );
                           vec++;
                         }
                        vec = 0;
                break;
                case 2: lim1 = 8, lim2 = 2;  //Manda el codigo para la segunda opcion
                        while( vec < 3 )     //la duracion de los '1' es de 40ms la de los '0' es 10ms.
                         {
                           manco1( CODIGO, lim1, lim2 );
                           vec++;
                         }
                        vec = 0;
                break;
                case 3: lim1 = 12, lim2 = 2;  //Manda el codigo para la segunda opcion
                        while( vec < 3 )     //la duracion de los '1' es de 60ms la de los '0' es 10ms.
                         {
                           manco1( CODIGO, lim1, lim2 );
                           vec++;
                         }
                        vec = 0;
                break;
              }
           }
        }
   }

Desconectado allennet

  • PIC16
  • ***
  • Mensajes: 108
Re: emisor IR
« Respuesta #2 en: 05 de Octubre de 2014, 15:27:35 »
depende del protocolo que use el control remoto por ejemplo
rc5 100ms

"La curiosidad mato al gato, pero murio sabiendo"