Autor Tema: Problemas de TIMER0 y TIMER1 en 16f886  (Leído 2430 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Problemas de TIMER0 y TIMER1 en 16f886
« en: 29 de Octubre de 2013, 20:05:47 »
Hola espero me puedan ayudar tengo problemas con el timer0 y timer1 del 18f886 los dos timers los estoy ocupando para incrementar una variable, los timers hacen un retardo cada 10mseg, pero no se que pasa ya revise mi programa y creo que esta bien pero al simular no hace lo correcto y al grabar el programa en el micro hace los mismos errores que en el simulador espero me puedan ayudar ya que me estoy tardando mucho, dejo mi programa para que lo puedan observar. gracias por su ayuda.

#include <16F886.h>                   
#fuses INTRC, MCLR, NOWDT   
#use delay( clock = 8M )          //frecuencia de Oscilacion de 8MHz.
#use standard_io( B )                 

int Cont0 = 0, Opc = 0;
int16 Cont1 = 0, k = 0, Lim, t;           
int16 const Re[ 8 ] = { 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F };   
int16 const Ro[ 20 ] = { 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F,
                       0x7F, 0x7F, 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB,
                       0xFD, 0xFE, 0xFE, 0xFE };    //Recorre un Bit.
int16 const Rd[ 4 ] = { 0x7E, 0xBD, 0xDB, 0xE7 };           
int16 const Rr[ 8 ] = { 0x7E, 0xBD, 0xDB, 0xE7, 0xDB, 0xBD, 0x7E, 0xFF };     
int16 const Ru[ 36 ] = { 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F,       
                       0x7E, 0x7D, 0x7B, 0x77, 0x6F, 0x5F, 0x3F, 0x3E,
                       0x3D, 0x3B, 0x37, 0x2F, 0x1F, 0x1E, 0x1D, 0x1B,
                       0x17, 0x0F, 0x0E, 0x0D, 0x0B, 0x07, 0x06, 0x05,
                       0x03, 0x02, 0x01, 0x00 };

#INT_TIMER0                   //Interrupcion del Timer0.
void timer0( void )
   {
      Cont0++;
      if( Cont0 == 200 )       
         {
            Opc++;         
            Cont0 = 0;     
            if( Opc > 4 )       
               {
                  Opc = 0;     
               }
         }
      set_timer0( 99 );       
   }
   
#INT_TIMER1               
void timer1( void )
   {       
      Cont1++;                   
      if( Cont1 == t )   
         {
            k++;
            Cont1 = 0;
            if( k > Lim )       
               {
                  k = 0;       
               }
         }
      set_timer1( 45536 );   
   }
   
void main( void )
   {
      set_timer0( 99 );                     
      setup_timer_0( RTCC_INTERNAL | RTCC_DIV_128 );   
      enable_interrupts( INT_TIMER0 );         
     
      set_timer1( 45536 );           
      setup_timer_1( T1_INTERNAL | T1_DIV_BY_1 ); 
      enable_interrupts( INT_TIMER1 );     
     
      enable_interrupts( GLOBAL );     
     
      while( 1 )
         {
            if( Opc == 0 )     
               {
                  t = 5;
                  Lim = 8;       
                  output_B( Re[ k ] );       
               }
            if( Opc == 1 )     
               {
                  t = 5;
                  Lim = 20;         
                  output_B( Ro[ k ] );           
               }
            if( Opc == 2 )     
               {
                  t = 15;
                  Lim = 4;       
                  output_B( Rd[ k ] );             
               }
            if( Opc == 3 )       
               {           
                  t = 5;
                  Lim = 36;               
                  output_B( Ru[ k ] );             
               }         
            if( Opc == 4 )       
               {
                  t = 7;
                  Lim = 8;                 
                  output_B( Rr[ k ] );                     
               }
        }
  }

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problemas de TIMER0 y TIMER1 en 16f886
« Respuesta #1 en: 29 de Octubre de 2013, 21:54:10 »
  Creo que además de especificar la frecuencia para las rutinas de delay, también debes configurar el oscilador interno para que trabaje a 8MHz, ya que por defecto el registro OSCCON (quien controla el funcionamiento del oscilador interno) queda configurado para que el oscilador trabaje a 4MHz
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: Problemas de TIMER0 y TIMER1 en 16f886
« Respuesta #2 en: 30 de Octubre de 2013, 00:03:26 »
el oscilador interno se configura en los fuses con el INTRC y despues se especifica lafrecuencia en el clock = 8M o estoy mal?

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problemas de TIMER0 y TIMER1 en 16f886
« Respuesta #3 en: 30 de Octubre de 2013, 00:10:17 »
  Con los fuses indicas que vas a utilizar el oscilador interno, pero no configuras la frecuencia. Con #use delay creo que simplemente se indica a que frecuencia está funcionando, para que el compilador pueda hacer los cálculos para los delay, pero no configura el oscilador.

  Fijate si no encuentras nada con el buscador del foro, creo recordar que alguien ya ha pasado por estos inconvenientes.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado vdiazg

  • PIC12
  • **
  • Mensajes: 68
Re: Problemas de TIMER0 y TIMER1 en 16f886
« Respuesta #4 en: 30 de Octubre de 2013, 00:29:57 »
el oscilador interno se configura en los fuses con el INTRC y despues se especifica lafrecuencia en el clock = 8M o estoy mal?

Yo tuve un problema similar con esta nueva serie 16f88X, pero la falla la detectaba en el circuito real, en la simulacion uno ni se da cuenta, de ese error (detalle) se presenta por la version del compilador que usas, parece que las nuevas versiones tienes que ponerle en programa todos los fuses, lee el link y realiza una simple rutina de parpadeo con esos nuevos fuses y descartalo

http://www.todopic.com.ar/foros/index.php?topic=41210.0

OJO: yo uso un cristal externo, revisalo para el osc interno
quiero construir un "Condensador de flujos"

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: Problemas de TIMER0 y TIMER1 en 16f886
« Respuesta #5 en: 30 de Octubre de 2013, 01:18:38 »
encontre que para fijar la frecuencia debe ser con setup_oscillator( OSC_8MHZ ); pero tambien encontre este parrafo en la ayuda del ccs

Note that if INTRC or INTRC_IO is specified in #fuses and a  #USE DELAY is used for a valid speed option, then the compiler will do this setup automatically at the start of main().

entendi que configura automaticamente, entonces no seria necesariomponer en etup_oscillator( OSC_8MHZ );?


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problemas de TIMER0 y TIMER1 en 16f886
« Respuesta #6 en: 30 de Octubre de 2013, 09:57:40 »
  En teoría debería configurarlo automáticamente, pero... no sería nada raro que dicho compilador falle y no haga lo que tiene que hacer. Prueba a usar setup_oscillator y comprobar que ocurre.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: Problemas de TIMER0 y TIMER1 en 16f886
« Respuesta #7 en: 30 de Octubre de 2013, 15:34:56 »
ya probe con setup_oscillator y los timer funcionan bien pero se presento un problema porque tengo las siguientes interrupciones del timer0 y timer1, estoy incrementando una variable ( Opc ) con el timer0 y dependiendo delvalor deesta valriable el timer1 despliega una onda cuadrada de diferente periodo, esto solo lo hace durante cierto tiempo despues deja de hacerlo, creo que el timer1 no hace caso a esta variable Opc o sea un error que he cometido enla programacion.

#INT_TIMER0                   //Interrupcion del Timer0.
void timer0( void )
   {
      Cont0++;
      if( Cont0 == 60 )       //Condicion de Incremento.
         {
            output_high( PIN_C0 );
            Opc++;            //Incrementa la Op
            Cont0 = 0;     //Reinicia el Cont0.
            if( Opc == 3 )       //Condicion para reiniciar la Opc.
               {
                  output_high( PIN_C1 );
                  Opc = 1;      //Reinicia la Opc.
               }
            else
               {
                  output_low( PIN_C1 );
               }
         }
      else
         {
            output_low( PIN_C0 );
         }
      set_timer0( 99 );       //Carga el Timer0 para 833.333useg.
   }

#INT_TIMER1                //Interrupcion del Timer1.
void timer1( void )
   {       
      Cont1++;                //Incrementa Cont0 cada 10mseg.       
      if( Opc == 1 )
         {
            if( Cont1 == 2 )
               {       
                  output_B( 0x01 );
                  Cont1 = 0;
               }
            else
               {
                  output_B( 0x00 );
               }
         }
      if( Opc == 2 )
         {
            if( Cont1 == 4 )
               {
                  output_B( 0x02 );
                  Cont1 = 0;
               }
            else
               {
                  output_B( 0x00 );
               }
         }
      set_timer1( 45536 );    //Carga el Timer1 para 10mseg.
   }


 

anything