Autor Tema: Temporizador programable por serial  (Leído 1772 veces)

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

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Temporizador programable por serial
« en: 23 de Marzo de 2021, 21:59:42 »
Hola, no soy un experto en assembler pero me gusta mucho este lenguaje, en esta ocacion quiero hacer un temporizador programable por serial, es decir activar una salida el tiempo que le alla llegado por el puerto serial.
 ya tengo hecho todo el codigo para la comunicacion serial, activar por pulsadores, activar y desactivar de acuerdo a un comando que le llegue por serial, etc, pero no tengo ni idea de como hacer para temporizar tantos tiempos distintos, la idea es que se pueda temporizar desde minutos hasta horas, como son tantos tiempos distintos no me doy cuenta de como puedo hacerlo.
Pienso que podria tener  delay de 1 hora, 30 minutos, 15 minutos, 10 minutos, 5 minutos, 1 minuto, y con eso armar los tiempos, pero no se como hacerlo de forma dinamica.

Alguien me puede hechar algunas luces de como se puede hacer?

Saludos   

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:Temporizador programable por serial
« Respuesta #1 en: 23 de Marzo de 2021, 23:14:15 »
Los retardos son sencillos, te recomiendo usar interrupción serial para recibir los datos.

Asi asignas los valores de retardo.

Tienes algun avance??

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Temporizador programable por serial
« Respuesta #2 en: 24 de Marzo de 2021, 06:48:35 »
En ASM es mas complicado asignar los valores de los retardos.

Lo ma sencillo es trabajar con interrupciones del timer. Tus tiempos son

Citar
1 hora, 30 minutos, 15 minutos, 10 minutos, 5 minutos, 1 minuto

Observa que el de 1 minuto te sirve para todos, solo que para hacer 30 minutos necesitas contar 30 veces 1 minuto.
Entonces en tu timer vas a elegir un valor de tiempo que divisor a estos. Y mientras mas grande mejor. Supongamos

Si logras hacer una interrupcion de 100ms, tendrias:
1 min = 10 interrupciones
5 min = 50 interrupciones
10 min = 100 interrupciones
30 min = 300 interrupciones (mas de 8 bits para que lo tengas en cuenta)

Todo va a depender del reloj que le llegue al temporizador. Si usas un oscilador de muy alta frecuencia vas a tener interrupciones "cortitas" y vas a tener que contar mas.

Existen problemas al hacer esto, y es que si no es perfecto el tiempo entre interrupciones o se espera un poquito para iniciar la nueva interrupcion, al hacerlo 300 veces o 600 veces para la hora, ese error se suma, entonces por ahi es conveniente que el micro tenga el moduclo CCP, ya que en modo Compare te lo reinicia solo y sin demoras.

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re:Temporizador programable por serial
« Respuesta #3 en: 25 de Marzo de 2021, 12:04:38 »
Hola gracias por sus respuestas, si, manejo la comunicacion serial por interrupciones, killer, nunca he trabajado con el timer, me pongo a investigar, en tu idea, como seria para asignar el tiempo que llegue por serial?, es decir, si llega por serial 45 minutos como puedo hacer para cargar el tiempo?, porque podria chequear todos los tiempos posibles y de acuerdo a eso actuar, pero se me hace que van a ser muchisimas lineas de codigo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Temporizador programable por serial
« Respuesta #4 en: 25 de Marzo de 2021, 17:18:17 »
EDIT: En si.. te va a llevar lineas de codigo, pero si sos ordenado, no deberia ser demasiado.

Y eso depende de que envias o de que queres enviarle al Timer... ¿Como lo envias? Yo te doy un ejemplo:
"t45:15"   (45min , 15 seg)

donde t es como para indicarle que ahi comienza los datos del tiempo. o tal ves envias
"30m20s" Para indicar minutos y segundos.

Eso depende de como vos lo queres.

Como te comente el timer es fijo, y si lo haces de 0.1s (100ms) o 1s te resulta mucho mas sencillo de realizar. Voy a suponer 1 segundo para que sea mas sencillo la explicacion.

Supongamos que te llega lo siguiente:

"t45:15"

Esperas una 't' en tu recepcion serial, al detectar la t, ahora esperar 2 valores como maximo que son el '4' y el '5'.
Lo transformas de ASCII a decimal restandole '0', es decir '4' - '0' = 4
Al primer digito lo multiplicas por 10 y lo guardas en un registro que sean los "minutos" quedando minutos en 40
Luego llega el '5', nuevamente lo transformas en un digito '5' - '0' = 5, y lo sumas en minutos, quedando 45.
El proximo dato si o si hay que esperar los dos puntos ':' si no estan, tiras todo y esperas la 't' nuevamente (ya que hay un error en lo enviado, lo mismo si antes no es un numero) comenzando de nuevo todo.
Si todo va bien, necesitas esperar los 2 valores mas que son los segundos, y hacer exactamente lo mismo que antes, guardarlo ahora en "segundos" si queres.

Ya ahora tenes "minutos" y "segundos" separados y en binario/decimal. Solo resta juntarlos, ya que como mi interrupcion es de 1s, necesitaria saber cuantos segundos esperar :P.
Entonces minutos lo multiplico por 60, lo guardo en 2 registros al resultado (se necesitan 16 bits) y luego sumas los segundos.

Ese registro lo vas a decrementar para ir contando las interrupciones..
En caso de que sea 0.1s la interrupcion, necesitas 10 interrupciones por cada segundo, entonces multiplicas ese registro por 10.

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re:Temporizador programable por serial
« Respuesta #5 en: 26 de Marzo de 2021, 10:52:30 »
genial, ya tengo una idea mas clara, investigo, pruebo y vuelvo :D