Autor Tema: consulta sobre TIMER1 como contador  (Leído 3495 veces)

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

Desconectado Kurtxxx

  • PIC10
  • *
  • Mensajes: 5
consulta sobre TIMER1 como contador
« en: 22 de Julio de 2015, 20:30:15 »
Hola,...
Estaba haciendo un pequeño programa para manejar un encoder para un posicionador de una válvula de cuchilla y resulta que decidí usar el timer1 para esta tarea. Los pulsos que quiero contar son 1505 por lo cual es más que suficiente el timer1 (con sus 16 bits). Podría hacerlo con el timer0 realmente, pero me pareció más cómodo inicialmente hacerlo con dicho timer.
Ahora que ya tengo el programa y lo pruebo simulado (con CCS 4.130 y el proteus 7.10) me doy con la sorpresa que la cuenta sale mal si uso el pin RB7 (ya que lo uso para como pin de datos D7 del lcd). He probado cambiando dicho pata a uno de los pocos pines que me quedan libres en el PORTA y la cuenta sale bien (uso un VSM Counter Timer para verificar). Sin embargo he hecho la depuración detalladamente con el ISIS y no encuentro el error.
Creo que puede haber un error de concepto de mi parte en lo referente al funcionamiento del TIMER1 como contador, yo solo pretendo usar un PIN para el contador el RB6/T1CKI, pero creo que el RB7 está ligado también con el funcionamiento del TIMER1.
Según entiendo lo tengo configurado correctamente: setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1,)
Según el datasheet no debería pasar eso por lo que yo llego a entender.

Counter mode is selected by setting bit TMR1CS. In this mode the TMR1 register pair value increments on every rising edge of clock input on pin RB7/T1OSI
when bit T1OSCEN is set or pin RB6/T1OSO/T1CKI when bit T1OSCEN is cleared.


Sin embargo me pasa que se altera la cuenta, quisiera saber el por qué ya que no entiendo. No llego a creer que sea una falla en el simulador,
Según el proteus yo tengo el T1CON = 0b10000111
TMR1ON = 1
TMR1CS = 1
T1SYNC = 1 (activo en 0)
T1OSCEN = 0
T1CKPS0..1 = 0


Si alguien puede ayudarme se lo agradeceré.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: consulta sobre TIMER1 como contador
« Respuesta #1 en: 22 de Julio de 2015, 21:06:49 »
De que PIC estamos hablando ?
Para poder ver los registros y los pines, parece ser un de 18 pines pero no se cual.

Imagino que T1SYNC deberia ser 0, asi estar sincrono con el reloj, sino hay que tomar ciertas cuidados, pero el datasheet lo hace en ASM. Si los pulsos no son demasiados rapidos entonces no habria problema.

Y explica a que te referis con "altera la cuenta", no cuenta lo suficiente, cuenta por demas, lees un valor es uno, y luego lees de nuevo y es otro?
« Última modificación: 22 de Julio de 2015, 21:15:55 por KILLERJC »

Desconectado Kurtxxx

  • PIC10
  • *
  • Mensajes: 5
Re: consulta sobre TIMER1 como contador
« Respuesta #2 en: 22 de Julio de 2015, 21:11:55 »
De que PIC estamos hablando ?

Hola, gracias por responder... no lo mencioné, pero el mcu es el 16f628A lo uso con el oscilador interno.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: consulta sobre TIMER1 como contador
« Respuesta #3 en: 22 de Julio de 2015, 21:26:22 »
Bueno 3 cosas.

Primer el PIC16F628A tiene un error en el Timer1 en modo asincrono, en el que necesita ver un flanco de bajada antes de empezar a contar. Errata:
http://ww1.microchip.com/downloads/en/DeviceDoc/80329B.pdf
Solucion: Usalo sincrono, es decir con TSYNC = 0; no veo razon para que no lo puedas usar sincrono a no ser que sea mas rapido que el reloj del PIC los pulsos


Y segundo no se como podes tener este valor:
T1CON = 0b10000111

cuando los 2 bits de mayor peso deberian ser 0, ya que no estan implementados. Y deberias tener:
T1CON = 0b00000011

Solo TMR1CS y TMR1ON.

y 3ro y mas importante para vos, por lo que parece no vas a poder hacerlo como queres, si el diagrama es "correcto"  hay una especie de "resistencia" modelada ahi entonces todo lo que entre por RB7 va a ir al TMR1. Pero antes probaria lo otro y si funciona.

Desconectado Kurtxxx

  • PIC10
  • *
  • Mensajes: 5
Re: consulta sobre TIMER1 como contador
« Respuesta #4 en: 22 de Julio de 2015, 21:35:08 »
Bueno 3 cosas.

Primer el PIC16F628A tiene un error en el Timer1 en modo asincrono, en el que necesita ver un flanco de bajada antes de empezar a contar. Errata:
http://ww1.microchip.com/downloads/en/DeviceDoc/80329B.pdf
Solucion: Usalo sincrono, es decir con TSYNC = 0; no veo razon para que no lo puedas usar sincrono a no ser que sea mas rapido que el reloj del PIC los pulsos


Y segundo no se como podes tener este valor:
T1CON = 0b10000111

cuando los 2 bits de mayor peso deberian ser 0, ya que no estan implementados. Y deberias tener:
T1CON = 0b00000011

Solo TMR1CS y TMR1ON.

y 3ro y mas importante para vos, por lo que parece no vas a poder hacerlo como queres, si el diagrama es "correcto"  hay una especie de "resistencia" modelada ahi entonces todo lo que entre por RB7 va a ir al TMR1. Pero antes probaria lo otro y si funciona.

Gracias por la respuesta, me quedé esperando una...
1. no sabía del bug que mencionas lo tendré en cuenta. Aunque no vi problemas en la simulación por ese motivo ya que las cuentas me coinciden.
2. Correcto los dos bits más altos es lo que me lee el proteus al chequear con el watch window, tienes razón, pero creo que no importa mucho ese detalle.
3. Ese me parece ser el problema, la resistencia.
Aunque según el datasheet:
debajo del diagrama de bloques del timer dice lo siguiente:
Note 1: When the T1OSCEN bit is cleared, the inverter and feedback resistor are turned off. This eliminates power drain.

Pensé que con el T1OSCEN = 0 se deshabilitaba esa realimentación, pero creo que aún así no pasa.
El problema ahora está que me faltarían pines... bueno uno nada más.
7 para el LCD.
3 para entradas para modificación de la posición
2 para activar al motor (en ambos sentidos)
1 para el timer1 en contador
2 para límites de carrera de seguridad.
1 para detectar cuando hay corte de luz.
Total = 16 de 16
pero el RB7 me queda amarrado por usarlo como contador al timer1.
Creo que tendré que cambiar de timer al 0.
« Última modificación: 22 de Julio de 2015, 21:41:59 por Kurtxxx »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: consulta sobre TIMER1 como contador
« Respuesta #5 en: 26 de Julio de 2015, 08:36:56 »
Citar
7 para el LCD.
3 para entradas para modificación de la posición
2 para activar al motor (en ambos sentidos)
1 para el timer1 en contador
2 para límites de carrera de seguridad.
1 para detectar cuando hay corte de luz.

Por que 7 para el LCD ?
Ah no ser que estes controlando la luz de backlight y ahi si son 7 , sino tendrias RS / E y 4 de datos.

Lo de los limites de seguridad tengo 2 opiniones

1 - podrias ponerlo en uno solo, ambos pararian completamente todo, excepto que quieras saber a donde llego, pero eso lo vas a saber ya que segun donde tenes activado la direccion del motor vas a saber cual se activo.
2 - Esos no deberian depender del microcontrolador para parar el motor, Si para avisar al micro que ocurrio eso, pero no para que el micro pare el motor, lo cual deberia ser un paso del micro al actuador que activa el motor y luego si un aviso al micro
Ej: comun al pin del micro, NC al actuador y NO a otro pin del micro para detectar, aunque esta forma existe el problema de que si no esta activa la salida no sabes que esta tocando el limite de seguridad, sino deberia ser algo que tenga un doble contacto ( 1 NO y 1 NC independientes )
Esto por que si falla el microcontrolador deberia ser independiente. Al menos es lo que pienso yo, es como si se tratara de un switch zeta de parada de emergencia y un PLC.
Igual ambos se pueden podrian poner en 1 pin.

Ya no se podria achicar mas, si es importante deberia tener un enclavamiento que evite que se activen los 2 giros del motor al mismo tiempo, todo por seguridad, y puede que este pensando en motores un poco mas grandes.
Y de ultima si no queres complicarla demasiado como decis, arreglarlo por soft con el TMR0.
« Última modificación: 26 de Julio de 2015, 08:40:50 por KILLERJC »


 

anything