Autor Tema: ¿como parar timer0 en 12F683 para generar un codigo?  (Leído 1880 veces)

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

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
¿como parar timer0 en 12F683 para generar un codigo?
« en: 04 de Agosto de 2014, 01:21:27 »
Hola espero que me puedan ayudar estoy tratando de hacer un un pequeño codigo y despues modularlo con una señal de 38KHz y mandarlo por un led IR, el codigo lo estoy haciendo con el timer0 del 16f683 (espero que sea una forma optima) y mi duda es ¿el codigo lo tengo que generar solo una vez? para que cuando este sea recibido solo lo detecte una vez el recptor, (ya que cuando lo hago con el timer0 despues de que manda cierta "tramita" lo vuelve a generar), si es asi ¿como puedo parar el timer0?, no se si usar la funcion sleep o haya algo asi como setup_timer_0( DISABLE ); pero creo que esto no se puede hacer. Otra duda que tengo es que si esta forma es buena al tratar de generar un codigo o se puede hacer de otra forma mas simple y mejor.

dejo mi codigo, espero que me puedan ayudar

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

int Cont = 0, lim = 0, f1 = 0, f2 = 0, f3 = 0;              //Contador.

void tcode ( void )
   {
      while( Cont < lim )   //entra a este ciclo si el contador es menor que limite.
         {           
            set_timer0( 231 );        //Carga el timer para 0.1ms.
            while( get_timer0() );  //Se espera aqui hasta que el timer0 valga 0, osea que se ha desbordado y ha pasado 0.1ms.     
            Cont++;           //Cada 0.1ms se incrementa contador.           
         }                 
      Cont = 0;               //Pasando los 0.1ms pasamos el contador a 0.
   }

void code1( void )
   {
      f1++;                     //Aqui se pretende generar un codigo numero1.
      if( f1 == 8 )             
        {
          f1 = 0;
        }
      switch( f1 )
        {
           case 0: output_high( PIN_A1 ); break;
           case 1: lim = 1;
                   output_low( PIN_A1 );    //Pone en bajo RA0.
                   tcode(); break;
           case 2: lim = 2;
                   output_high( PIN_A1 );    //Pone en alto RA0.
                   tcode(); break;
           case 3: lim = 1;
                   output_low( PIN_A1 );   
                   tcode(); ;break;
           case 4: lim = 2;
                   output_high( PIN_A1 );   
                   tcode(); break;
           case 5: lim = 3;
                   output_low( PIN_A1 );   
                   tcode(); break;
           case 6: lim = 1;
                   output_high( PIN_A1 );   
                   tcode(); break;
           case 7: lim = 3;
                   output_low( PIN_A1 );   
                   tcode(); break;
         }
   }
   
void code2( void )
   {
      f2++;                 //Aqui se pretende generar un codigo numero2
      if( f2 == 8 )
        {
          f2 = 0;
        }
      switch( f2 )
        {
           case 0: output_high( PIN_A1 ); break;
           case 1: lim = 1;
                   output_low( PIN_A1 );   
                   tcode(); break;
           case 2: lim = 2;
                   output_high( PIN_A1 );   
                   tcode(); break;
           case 3: lim = 1;
                   output_low( PIN_A1 );   
                   tcode(); ;break;
           case 4: lim = 2;
                   output_high( PIN_A1 );   
                   tcode(); break;
           case 5: lim = 3;
                   output_low( PIN_A1 );   
                   tcode(); break;
           case 6: lim = 2;
                   output_high( PIN_A1 );   
                   tcode(); break;
           case 7: lim = 3;
                   output_low( PIN_A1 );   
                   tcode(); break;
        }
   }

void code3( void )
   {
      f3++;                      //Aqui se pretende generar un codigo numero3
      if( f3 == 8 )
        {
          f3 = 0;
        }
      switch( f3 )
        {
           case 0: output_high( PIN_A1 ); break;
           case 1: lim = 1;
                   output_low( PIN_A1 );   
                   tcode(); break;
           case 2: lim = 2;
                   output_high( PIN_A1 );   
                   tcode(); break;
           case 3: lim = 1;
                   output_low( PIN_A1 );   
                   tcode(); ;break;
           case 4: lim = 2;
                   output_high( PIN_A1 );   
                   tcode(); break;
           case 5: lim = 1;
                   output_low( PIN_A1 );   
                   tcode(); break;
           case 6: lim = 3;
                   output_high( PIN_A1 );   
                   tcode(); break;
           case 7: lim = 3;
                   output_low( PIN_A1 );   
                   tcode(); break;
        }
   }

void main( void )
   {     
      int menu = 0;
      int16 duty = 106;             //Ciclo util al 50%

      setup_timer_0( RTCC_INTERNAL | RTCC_DIV_8 );   //Prescaler de 8.
     
      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( duty );              //Carga elciclo util.
     
      while( 1 )
         {           
           
            if( INPUT( PIN_A0 ) == 0 )
              {
                  menu++;
                  if( menu == 4 )
                    {
                        menu = 0;
                    }
                  delay_ms( 250 );
              }
            if( menu == 0 )
               {
                 output_low( PIN_A1 );
               }
            if( menu == 1 )
               {
                    code1();
               }
            if( menu == 2 )
               {
                   code2();
               }
            if( menu == 3 )
               {
                   code3();
               }
           
         }
   }


 

anything