Autor Tema: Medir segundos con pic  (Leído 2977 veces)

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

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Medir segundos con pic
« en: 11 de Enero de 2011, 23:54:01 »
Hola a todos, les comento que estoy queriendo medir un segundo con un 16F877A
esta todo casi bien, salvo por este "casi" jaja
Para medirlo, lo que hago es cargarle al timer1 el valor de 3036, dicho valor
sale de un calculo y cuando el timer desborde, habran pasado 500 ms y se
producira la interrupcion.
El problema que tengo es que para corroborar que realmente el pic esta contando
un "verdadero" segundo, conecto el osciloscopio a una salida y veo en el mismo
el periodo de un pulso, cuando dicho periodo es igual a 1 segundo,
entonces todo funciona perfecto.
Dicho pulso de 1 segundo se compone de 500 ms de nivel bajo y 500 ms de nivel alto,
midiendo estos con el osciloscopio, los 500 ms de nivel alto son perfectos, pero cuando
mido los de nivel bajo son algo mas de 500 ms (525 ms), por lo tanto el programa esta demorando
25 ms en mandar la orden que suba la salida (especificamente dentro del if (cantidad ==2)).
A continuacion les muestro la interrupcion para que alguien me diga que puede ser que
me este produciendo esta demora, que al cabo de un largo tiempo empezaria a tener
importancia.

Sera el tipo de variable con la que fue declarada la variable cantidad ?
Sera la propia funcion output_high (PIN_D4) ?
O sera set_timer1 (3036) ?


#int_TIMER1       

void tratamiento(void){     //Función de tratamiento del rtcc (Cada vez que el timer1 desborda se llama a esta funcion)

if (cantidad == 2){        // Para que sea un segundo debe entrar dos veces la interrupcion, ya que cada interrupcion entra cada 0.5 seg
                  output_high (PIN_D4);
                  cantidad=1;         
                  set_timer1 (3036);
                  }
else {
output_low (PIN_D4);
cantidad++;
     }
     
                 } // Cierro la funcion tratamiento

Estaria bueno lograr que funcione bien para que quede algo estandar que puedan utilizar todos de como medir un segundo, ya que lo busque
y no lo he encontrado en otra parte del foro. ;-)

Gracias y saludos !!
« Última modificación: 12 de Enero de 2011, 00:04:27 por Simon21 »
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Medir segundos con pic
« Respuesta #1 en: 12 de Enero de 2011, 00:22:06 »
Hola.

Al Timer1 se le puede configurar para que reciba los pulsos de un oscilador externo. Si se conecta un cristal de 32k768Hz se obtiene 1 segundo al hacer una precarga del timer de 32768 en cada interrupción.

Respecto a tu código, se nota que toma mas tiempo de proceso si se cumple la condición, una opción para mejorarlo sería trabajar con un cristal de mayor frecuencia.

Saludos.
El papel lo aguanta todo

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Medir segundos con pic
« Respuesta #2 en: 12 de Enero de 2011, 00:49:27 »
Seria ideal utilizar dicho cristal, no lo hago ya que tengo el programa terminado y todo configurado en base al
cristal de 4 MHz.

Acabo de probar declarar la variable cantidad como int1 (entero de 1 bit) pensando que de esa forma
el tiempo en comparar seria menor, pero sigue estando 25 ms retrasado.

Queria hacer algunos intentos mas antes de cambiarle el cristal por uno mas grande..

Tienes idea si el 16F877A se banca un cristal de 20 MHz ?
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Medir segundos con pic
« Respuesta #3 en: 12 de Enero de 2011, 02:49:11 »
Creo que el problema es que los dos semiciclos de la onda que generas no tienen la misma carga de trabajo para el PIC, porque en uno de ellos haces varias cosas y en el otro no.

Prueba esto:
#int_TIMER1       

void tratamiento(void){     //Función de tratamiento del rtcc (Cada vez que el timer1 desborda se llama a esta funcion)
    output_toggle(PIN_D4);
    set_timer1 (3036);
}

Si esto no te sirve o no funciona bien, la única opción es poner un set_timer(x1) dentro del if y un set_timer(x2) en el else.

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Medir segundos con pic
« Respuesta #4 en: 12 de Enero de 2011, 13:41:44 »
Hola Simon21, estás precargando el Timer1 solamente cuando la variable cantidad es igual a 2.  El Timer se debe precargar en cada interrupción.  Puedes intentar así:

Código: C
  1. #int_TIMER1        
  2.  
  3. void tratamiento(void){     //Funcion de tratamiento del rtcc (Cada vez que el timer1 desborda se llama a esta funcion)
  4.  
  5.    if (cantidad == 2){        // Para que sea un segundo debe entrar dos veces la interrupcion, ya que cada interrupcion entra cada 0.5 seg
  6.       output_high (PIN_D4);
  7.       cantidad=1;          
  8.    }
  9.    else {
  10.       output_low (PIN_D4);
  11.       cantidad++;
  12.    }
  13.  
  14. set_timer1 (3036);
  15.      
  16. } // Cierro la funcion tratamiento

Saludos!

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Medir segundos con pic
« Respuesta #5 en: 12 de Enero de 2011, 14:16:32 »
 :-/ Siempre dije que en este foro estan los mejores electronicos de la web !!  :-/

Nocturno: Funciono de maravilla lo que me aconsejaste que haga, solo que no me encaja tan facil con lo que estoy haciendo, pero
por lo que me pusiste al ultimo de tu mensaje, veo que tambien has encontrado que mi error fue no haber puesto un set_timer1
tanto en el if como en el else.

bmb: Ese era el problema que estaba teniendo !! Se me habia pasado por alto cargar el timer con el valor 3036 cada vez que
entra en la interrupcion, estaba cometiendo el error de solo cargarlo cuando la variable cantidad era igual a 2, por lo que
el codigo quedaria como lo acabas de poner.

Un millon de gracias a los dos por sus respuestas !! son unos genios !!

En lo que pueda serles util en algun momento, asi será :)

Saludos
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Medir segundos con pic
« Respuesta #6 en: 12 de Enero de 2011, 14:19:14 »
Me alegro que lo tengas

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Medir segundos con pic
« Respuesta #7 en: 12 de Enero de 2011, 14:21:12 »
También me alegro, es con gusto.

Saludos!