Autor Tema: Duda con timer utilizandolo como contador  (Leído 2800 veces)

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

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Duda con timer utilizandolo como contador
« en: 09 de Agosto de 2006, 11:19:30 »
Hola a todos

Estoy utilizando el Timer1 como contador de pulsos y el Timer0 como temporizador, pero tengo un pequeño problema y es que al introducir una señal de 1 Hz el resultado que me arroja es aproximadamente de 3 Hz, mi pregunta es si tengo que hacer algun arreglo extra en hardware o software? De antemano muchas gracias.

Saludos


Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Duda con timer utilizandolo como contador
« Respuesta #1 en: 09 de Agosto de 2006, 11:53:01 »
Si colocas un pequeño esquema y el trozo de código que corresponde se podrá ver mejor

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Re: Duda con timer utilizandolo como contador
« Respuesta #2 en: 09 de Agosto de 2006, 12:50:16 »
Hola

Este es el código:

Código: [Seleccionar]
#include <16f874A.h>
#fuses XT, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=3579545)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

int16 pulsos;
int16 interrupcion;
int16 velocidad;
 
#int_RTCC
RTCC_isr()
{   
interrupcion++;
if(interrupcion==100)
{   
pulsos=get_timer1();   
velocidad=pulsos;   
printf("%lu   ",velocidad);   
delay_ms(500);   
interrupcion=0;   
set_timer1(0);   
set_rtcc(177);
}
}

main()
{
char valor;
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_128);
set_rtcc(177);
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1);
set_timer1(0);
interrupcion=0;
while(!kbhit()); //Espera la recepcion de un caracter         
valor=getc();         
if(valor=='j')
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_RTCC);
}
else
reset_cpu();
while(true)
{
}
}

Para el caso del hardware conecto directamen la salida de un generador de señales al PIC

Gracias

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Duda con timer utilizandolo como contador
« Respuesta #3 en: 09 de Agosto de 2006, 14:37:44 »
¿Esa señal toma valores negativos? porque por lo que veo en el data la entrada del timer1 no está preparada para soportar tensiones negativas.
A ver si puedes colgar el .hex para poder simularlo pq no me compila el código en ccs,me dice que hay por ahí un caracter ilegal,aunque no lo encuentro por ningun sitio :?
De todas formas te comento un par de cosas.
La precarga del timer0 con el valor 177 únicamente la haces cada 100 overflows,lo cual hace,según mis cuentas,que interrumpa cada 36.47 ms,y tras 100 interrupciones,la 101 sea transcurridos unos 11 ms más los 500 ms del delay.
No recuerdo bien,pero ccs usa los timers para el cálculo de los delays,por lo que no es recomendable que dentro de una rutina de atención al timer se incluyan retardos de este tipo.
Dejando aparte el posible mal funcionamiento que el delay te pueda ocasionar,ten en cuenta que,si no me equivoqué en las cuentas,estás representando en el lcd la cantidad de pulsos recibidos en un tiempo igual a 36 ms x 100 = 3.6 seg,es decir,que si tu señal de entrada es de 1 Hz,ahí parece estar el motivo por el que estás leyendo 3 Hz.
Prueba a recargar el timer0 fuera del if

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Re: Duda con timer utilizandolo como contador
« Respuesta #4 en: 11 de Agosto de 2006, 14:32:59 »
Tienes toda la razón Modulay, de hecho ya habia tenido el problema de recarga del timer en otra ocasión. Lo hago y te cuento que pasó.
Contestando a tus otras preguntas no manejo tensiones negativas, como ahora estoy utilizando el hyperterminal para ver los datos quitaré también el retardo dentro de la interrupción.
En verdad muchas gracias por tu ayuda y seguimos en contacto.

Saludos

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Re: Duda con timer utilizandolo como contador
« Respuesta #5 en: 15 de Agosto de 2006, 13:13:12 »
Hola Modulay

Pues ya corregi el programa y ya no pasa lo que mencione anteriormente, ahora tengo el problema que cuando incremento la frecuencia empiezan a salir errores en los conteos por parte del pic, por ejemplo, cuando tengo una frecuencia patrón de 255 hz el pic me da una lectura de 289 hz, coloqué un capacitor de acoplamiento entre el generador de señales y el pic pero no se si esto ayude en algo.

Gracias

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Duda con timer utilizandolo como contador
« Respuesta #6 en: 15 de Agosto de 2006, 14:00:15 »
Yo quitaría ese condensador,no te ayuda en nada.
El error que estás teniendo es debido a que tu base de tiempos de 11 ms y pico no te cuadra en los cálculos...es decir,si haces la lectura cada 100 interrupciones sería cada 11 ms x 100 = 1.1 seg,lo cual quiere decir que tu lectura corresponde a un intervalo de tiempo de más de 1 segundo,por lo que estás leyendo más hercios de los que hay.A baja frecuencia el error pasa desapercibido,pero tu mismo estás comprobando como se acentúa conforme sube la frecuencia de la señal.
Busca una base de tiempos de 10 ms exactos si quieres mantener intacto el código de la interrupción,ó cambia el código,ó cambia el cristal....
Ya nos cuentas

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Re: Duda con timer utilizandolo como contador
« Respuesta #7 en: 15 de Agosto de 2006, 14:33:16 »
Gracias Modulay

Lo hago y les cuento

Saludos