Autor Tema: No puedo precargar el Timer2 a cualquier valor, 16F877A, se queda con el último  (Leído 2142 veces)

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

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Hola amigos de todopic, actualmente me encuentro haciendo el control de una antena por medio de un 16F877a, un encoder de 2 pulsos en cuadratura como potenciometro digital y un potenciometro de retroalimentación, no he tenido problemas hasta ahora, tengo implementados en mi programa la interrupción por cambio de edo. en RB para el encoder, el timer0 para hacer la rutina antirebotes de mis botones, el timer1 para refrescar un LCD y medir con el ADC el encoder, y quiero usar el timer2 para diferenciar entre presionar un boton menos de 500ms y más de 500ms, con lo que tendría 2 funciones en un solo botón, al parecer mi programa funciona bien, excepto por una cuestión:

Cuando presiono el botón se habilita el timer2, y le cargo el valor necesario para medir los 500ms, pero resulta que cada que suelto el botón, el timer se queda con el valor precargado en el que iba, y aunque utilice la instrucción set_timer2(x); no consigo que me cuente desde el principio, es decir, si suelto el botón a los 450ms y lo vuelvo a presionar, en lugar de contar de nuevo desde 0, me cuenta desde los 450ms; ya probe desabilitando el timer2, volviendolo a habilitar, deshabilitando y habilitando la interrupción, precargando antes y despues de habilitar el timer el valor, etc, etc, etc, y no logro saber que sucede, este es mi código actual:

Código: [Seleccionar]
if(boton_b_state1==0&&boton_b_state2==1) // Si se presiona el botón
{
setup_timer_2(T2_DIV_BY_16,223,7);
set_timer2(223);
}
if(boton_b_state1==1&&boton_b_state2==0) // Si se suelta el botón
{
setup_timer_2(T2_DISABLED,0,7);
}

También probé así:

Código: [Seleccionar]
if(boton_b_state1==0&&boton_b_state2==1)
{
enable_interrupts(INT_TIMER2);
                set_timer2(223);
}
if(boton_b_state1==1&&boton_b_state2==0)
{
disable interrupts(INT_TIMER2);

}

Y algunas combinaciones de las 2, pero no logro reiniciar el valor de timer2 a cualquier valor, siempre se queda en el último.

Cabe señalar que la interrupción en si funciona bien, el problema es solo la precarga del timer2; alguien me podría ayudar a entender que estoy haciendo mal?.

Muchas gracias por su ayuda.
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: No puedo precargar el Timer2 a cualquier valor, 16F877A, se queda con el último
« Respuesta #1 en: 12 de Agosto de 2011, 22:32:00 »
No se si será correcto pero yo siempre uso los if de la siguiente manera...

Código: C
  1. if (testeo == x) && (otrotesteto == y)
  2. {
  3.   xxxxxxxx
  4. }

Quiero decir que tal vez no sea correcto como tenés los if

Código: C
  1. if (testeo == x && otrotesteo == y)
  2. {
  3.   xxxxxxx
  4. }

Por otro lado, tal vez podrías probar de setear el valor en el registro PR2 en lugar del timer2
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: No puedo precargar el Timer2 a cualquier valor, 16F877A, se queda con el último
« Respuesta #2 en: 13 de Agosto de 2011, 02:35:20 »
Gracias por tu interes y ayuda AngelGris

Te comento que ambas formas son totalmente válidas.

Con respecto a mi problema, ya encontre el problema y me apena decir que era algo extremadamente simple que se me pasó:

Todo el Timer2 estaba correcto, el valor que le precargaba era correcto y lo cargaba bien, el problema radicaba en que estaba utilizando un multiplicador para alargar el tiempo del Timer2 y este me olvide de resetearlo también, por lo que este contador era el que se quedaba en el último valor  :mrgreen:

Bueno, al fin humano (demasiado para mi gusto jejeje), la próxima trataré de no pasar por alto estos detalles.
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: No puedo precargar el Timer2 a cualquier valor, 16F877A, se queda con el último
« Respuesta #3 en: 13 de Agosto de 2011, 09:59:56 »
Suele suceder (o al menos a mi me pasa) que muchas veces uno busca el error por un lado y no se da cuenta que viene por otro... por suerte ya lo pudiste solucionar
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas


 

anything