Autor Tema: 12f508 con timer0  (Leído 2539 veces)

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

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
12f508 con timer0
« en: 02 de Junio de 2013, 20:43:58 »
Hola que tal espero que me puedan ayudar con un programa que estoy haciendo, estoy tratando de usar el timer0 para tener una onda cuadrada de 1msegundo con el 12f508 pero no obteng nada a la salida del RB0, este es el programa


#include <12F508.H>
#fuses INTRC, NOWDT, MCLR, PROTECT
#use delay( clock = 4000000 )
#use standard_io( B )
#byte port_B = 0x06

void main( void )
   {     
      int Cont = 0;              //Contador
     
      setup_timer_0( RTCC_INTERNAL | RTCC_DIV_4 );   //Prescaler de 4.
      set_timer0( 6 );
     
      while( 1 )
         {
            while( get_timer0() >= 6 )       //Obtiene y compara el valor del timer0.
               {
                  Cont++;                    //Incrementa el contador.
               }
            if( Cont <= 10 )
               {
                  set_timer0( 6 );           //Carga el timer0 para 1mseg.
                  output_high( PIN_B0 );
               }
            if( 10 < Cont <= 20 )
               {
                  set_timer0( 6 );     //Carga el timer0 para 1mseg.
                  output_low( PIN_B0 );     
               }
            if( Cont > 20 )
               {
                  Cont = 0;
               }
         }
   }

no se si estoy utilizando de manera correcta el timer0,ya que este microcontrolador no se puede usar una interrupcion para este. espero que me puedan ayudar gracias.

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: 12f508 con timer0
« Respuesta #1 en: 02 de Junio de 2013, 21:09:17 »
Hola hise una modificacion y ya tengo una señal cuadrada en el RB0 pero yo kiero una de 10 msegundos, alguien me podria a ayudar para poder una señal de 10 msegundos. la modificacion es la siguiente, no se si el error esta a la hora de obtener el valor del timer o cuando se incrementa el contador. gracias


while( 1 )
         { 
            if( Cont <= 6 )
               {
                  set_timer0( 6 );           //Carga el timer0 para 1mseg.
                  while( get_timer0() >= 6 )       //Obtiene y compara el valor del timer0.
                     {
                        Cont++;                    //Incrementa el contador.
                        output_high( PIN_B0 );
                     }
               }
            if( 6 < Cont <= 12 )
               {
                  set_timer0( 6 );
                  while( get_timer0() >= 6 )       //Obtiene y compara el valor del timer0.
                     {
                        Cont++;                    //Incrementa el contador.
                        output_low( PIN_B0 );
                     }
               }
            if( Cont > 20 )
               {
                  Cont = 0;
               }
         }
   }

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: 12f508 con timer0
« Respuesta #2 en: 03 de Junio de 2013, 14:22:56 »
Hola mexatronko en tu configuración  de Timer lo que haces al cargar un 6 set_timer0(6); es que si usas el timer0 por la interrupción de su desbordamiento el tiempo que tarda desde que haces la carga hasta que pasa de 255 a 0 es de 1ms, si tu pones el div por 64 RTCC_DIV_64 i pones una carga de set_timer(99) tendrás la interrupción cada 10.048ms. Te recomiendo que empieces por algo mas básico y leer el funcionamiento del timer aquí en el foro hay mucha información sobre eso.
Saludos :-/

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: 12f508 con timer0
« Respuesta #3 en: 04 de Junio de 2013, 23:25:05 »
pero no puedo hacer un retardo de 1omseg repitiendo 10 veces un retardo de 1mseg eso es lo que queria hacer, por eso puse el contador para las veces que se repitiera elretardo de 1mseg  estoy mal. la forma en que configuro el timer es incorrecta?.gracias por sus comentarios

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: 12f508 con timer0
« Respuesta #4 en: 04 de Junio de 2013, 23:35:34 »
Necesitas meter el contador dentro de la rutina de interrupción por timer0 cargar el valor que manejas y cuando el contador sea igual a 10 entonces si, tienes que habilitar la interrupción y poner la rutina.

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: 12f508 con timer0
« Respuesta #5 en: 04 de Junio de 2013, 23:39:16 »
Lee un poco sobre el funcionamiento del timer por aquí en el foro hay bastante información para que te sea mas fácil.

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: 12f508 con timer0
« Respuesta #6 en: 05 de Junio de 2013, 00:27:07 »
pero el 12f508 no tiene interrupciones si asi fuera podria generar un retardo con ela, es por eso ke obtengo el valor del timer con get_timer0() y si este menor o igual al contador pondria en estado 1 un pin y asi se haria el retardo, o lo ue estoy haciendo esta mal?

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: 12f508 con timer0
« Respuesta #7 en: 05 de Junio de 2013, 15:42:36 »
si ya te entendi

 
     
     
     
Código: [Seleccionar]
while( 1 )
         {
         output_high(PIN_B0); //pone en alto pin b0
      while(Cont<10){           //hasta que el contador sea 10(1ms*10=10ms)
         set_timer0( 6 );        //se carga el timer para 1ms
         while(get_timer0());  //se espera aqui hasta que el timer valga 0 osea que se ha desbordado y ha pasado 1ms     
         Cont++;}                 //Cada ms se incrementa contador
         Cont=0;                  //pasado los 10ms en alto pasamos el contador a 0
         output_low(PIN_B0); //pone en bajo el pin b0
       while(Cont<10){        //hara lo siguiente hasta que contador sea =10
         set_timer0( 6 );      //se carga el timer para 1ms
         while(get_timer0()); //se espera hasta que se desborde el timer0
         Cont++;}               //incrementamos el contador cada ms
         Cont=0;                //al finalizar los 10ms en bajo se pone a 0 el contador
         }
creo que a alg asi te refieres
Puedes intentar algo asi
   

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: 12f508 con timer0
« Respuesta #8 en: 06 de Junio de 2013, 17:27:18 »
Gracias gab163 es correcto lo que me has comentado, tengo otra pregunta para poder detener el timer0 solo bastaria con poner un pin b0 en cero?

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: 12f508 con timer0
« Respuesta #9 en: 06 de Junio de 2013, 17:35:23 »
No entiendo a lo que te refieres, quieres parar la señal cuadrada?

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: 12f508 con timer0
« Respuesta #10 en: 06 de Junio de 2013, 17:45:28 »
si, tengo pensado hacer con una opcion A sacar una onda cuadrada por RB0  con una opcin B detner la onda cuadrada

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: 12f508 con timer0
« Respuesta #11 en: 06 de Junio de 2013, 17:56:49 »
Si quieres dejar de mandar señal tienes que mantener el pin b0 en bajo siempre, esto lo puedes hacer donde pones en alto el pin b0 cambiarlo por una condicion algo asi:

SI(OpcionA){
PINB0 en alto
}
else{
PINB0 en bajo}

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: 12f508 con timer0
« Respuesta #12 en: 06 de Junio de 2013, 20:26:45 »
Muchas gracias por la ayuda se resolvio el problema


 

anything