Autor Tema: Temporizador por monedas  (Leído 5253 veces)

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

Desconectado gg.tecnico

  • PIC12
  • **
  • Mensajes: 60
Temporizador por monedas
« en: 12 de Abril de 2018, 14:54:50 »
Buenas tardes a todos, hace mucho que no entro en el foro, he estado un poco ausente de la electronica y este año he vuelto a ella.
Estoy intentando hacer un temporizador como los utilizados en las maquinas de limpieza para los vehiculos, osea al depositar una moneda el temporizador te da un tiempo para utilizar dicha maquina.
Lo que llevo hecho hasta ahora es muy poco y ademas me he quedado sin ideas de como seguir adelante. Lo que pretendo es lo siguiente, por si alguien me puede echar una mano. Cada vez que se introduce una moneda el temporizador nos da un tiempo prefijado, si son mas monedas habria que mlutiplicar el tiempo, pero si una vez a empezado a descontar y en ese transcurso introducimos otra moneda el tiempo que ya a empezado a descontar se debe sumar con el que aun resta por terminar.
Subo lo que tengo que como digo es muy poco.
Agradezco por adelantado si pueden colaborar conmigo.

Saludos....

Desconectado Fer_TACA

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3187
Re:Temporizador por monedas
« Respuesta #1 en: 13 de Abril de 2018, 07:37:37 »
Tal como yo o veo creo que:

1º Deberías cambiar la entrada de las monedas a un puerto que tenga interrupción por ejemplo el pin B0.
2º Configurar la interrupción por flanco ascendente o descendente, según veas.
3º Crear una macro(subrutina) nueva en la cual dentro de la misma solo tengas un bloque de cálculo, en este caso sumar un número determinado al valor de a la variable "count" que tenga en ese momento.
4º y dentro de tu programa main esperar, comprobando cuando dicha variable llega a cero. En ese caso pararía el tiempo.

Desconectado gg.tecnico

  • PIC12
  • **
  • Mensajes: 60
Re:Temporizador por monedas
« Respuesta #2 en: 13 de Abril de 2018, 13:53:05 »
Gracias por responder Fer_TACA, la cuestión es que no se como hacerlo.
¿podrías crear un ejemplo en Flowcode?

Saludos.

Desconectado gg.tecnico

  • PIC12
  • **
  • Mensajes: 60
Re:Temporizador por monedas
« Respuesta #3 en: 13 de Abril de 2018, 15:34:54 »
Encontré esto en internet y he intentado modificarlo un poco a lo que necesito, pero me gustaría que al incrementar el tiempo este se sume a lo que va restando. Ahora lo que hace es sumar fracciones completas´


Muchas gracias.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3187
Re:Temporizador por monedas
« Respuesta #4 en: 14 de Abril de 2018, 08:42:37 »
Sigo pensando que deberíais utilizar el pin RB0(por ejemplo) como entrada por interrupción para utilizarlo como entrada de las monedas.
De esa forma cada vez que detecte el paso de una moneda, dentro de la "macro" de la interrupción solo tienes que realizar la suma (del tiempo que estimes por paso de moneda) al registro que cuenta (en tu caso de decremento)  el tiempo de funcionamiento.
Después en tu programa "main", independientemente de la visualización que requieras, solo tienes que ir descontando el tiempo y comprobando que llega a 0.
En ese punto activas/desactivas lo que requieras, reseteas la cuenta del tiempo y esperas a una nueva moneda.
Básicamente sería:

1º Inicializo los bloques que necesites, por ejemplo LCD y configuras las señales.
2º Espero constantemente la entrada de una moneda. Si no hay moneda no hago nada y si la hay paso al punto siguiente.
3º Al haber una moneda activas/desactivas lo que requieras.
4º Esperas el final de la cuenta a esa moneda.
5º Como tienes una interrupción esa siempre se va a atender independientemente del punto del programa donde te encuentres. es decir el programa parará lo que estaba realizando, saltará a realizar lo de la interrupción En este caso solo sumar el tiempo y al final de la interrupción volverá al programa principal al sitio donde lo dejo pero con el incremento del tiempo por el paso de una(s) nueva(s) moneda(s).
6º Al salir de interrupcion, si no hay monedas tu programa solo se dedicará a atender a lo indiado en el punto 4º.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1032
Re:Temporizador por monedas
« Respuesta #5 en: 14 de Abril de 2018, 13:07:06 »
Una pregunta, ¿mediante que mecanismo piensas sensar la entrada de monedas?.
Lo digo porque a menos que sea con un selector electronico, puedes tener el problema de que engañen a tu circuito. Hay cientos de metodos para hacerlo y los amigos de lo ajeno los conocen todos.
En caso de utilizar un selector de monedas de cierta calidad, debes tener en cuenta que estos no disponen de una unica salida de conteo, sino que pueden tener una por cada tipo aceptado o varios bit que reflejen igualmente mediante un codigo, que tipo de moneda se introdujo. Algunos selectores tambien tienen una salida de habilitacion, que seria la que dispararia la interrupcion y en base al bit o codigo de moneda, haria el incremento proporcional al valor de dicha moneda.
Respecto a tu consulta no te puedo ayudar, ya que no domino el Flow Code, pero estoy de acuerdo con lo que te comenta Fer_Taca.

Saludos.

Desconectado gg.tecnico

  • PIC12
  • **
  • Mensajes: 60
Re:Temporizador por monedas
« Respuesta #6 en: 15 de Abril de 2018, 05:12:59 »
Hola Fer_TACA, serie pedir mucho que me iniciaras el programa, se lo que dices peor me cuesta empezarlo. No se como hacer que sume a lo que va consumido.

Si no te es mucha molestia te agradecería me iniciaras el programa.


Saludos.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3187
Re:Temporizador por monedas
« Respuesta #7 en: 15 de Abril de 2018, 08:53:30 »
Bueno intentaré dentro de mis básicos conocimientos:

Fijándonos en mi primer respuesta y dejando de momento la visualización en LCD, podemos empezar por ver como se haría la suma para que lo vayas adaptando a tu proyecto:

1º Crear una variable de entrada, llámala moneda o como quieras y otra de salida, llámala como relé, por ejemplo. ambas deben de ser del tipo booleano.
La salida puedes ponerla en pin C2 como en tus ejemplos y la entrada en el pin A2, según tu ejemplo y micro utilizado ya que según el datashet es el que soporta la interrupción.

2º Debes de crear una variable de contaje por ejemplo "cuenta_1sg" del tipo byte y otra llamada "Flag_T1s"

3º Antes de los bloque dl While inicializas la salida y las variables a 0. A continuación insertas el bloque de interrupción. realizas doble clic sobre el y en las propiedades en Interrumpir seleccionas TMRO y después en propiedades eliges como quieres que sea la interrupción de alto a bajo o al revés. Para finalizar eliges crear Macro le das un nombre y seleccionas oK y después OK&editar. Con esto se te creará una nueva pestaña que será donde vamos a colocar lo que tiene que hacer la interrupción.

4º  Interrupción: tendrás inicialmente 2 bloques: inicio y fin. Pues insertas uno de calculo. Realizando doble clic en sus propiedades de calculo pones:"cuenta_1sg=cuenta_1sg+1". Le das a OK y regresas al entorno "main".

5º Acá ya dentro del While ya puedes poner el bloque de decisión "cuenta_1sg" ha llegado al valor que desees si es si cambias de estado la salida y si no, pues no haces nada.

Esto seria lo básico con 2 consideraciones. La primera es que el tiempo de un segundo va a depender del cristal del oscilador y del valor del predivisor del TMR0 que hayas seleccionado. Esto ya es un calculo que deberías de realizar-
La segunda consideración es que esto no va a funcionar a la perfección. ¿Dirás porque?  No te has dado cuenta que no hemos utilizado la segunda variable "Flag_T1s".
La respuesta esta es que el TMR0 va a contar muy rápido y necesitas saber cuando ha pasado un segundo. para ello dentro de la rutina de interrupción debes incluir el bloque de decisión de si cuenta ha llegado aun valor proporcional al valor del segundo que hayas calculado.
A continuación si la respuesta es no, no haces nada; pero si es si añades otro bloque de decisión para saber si la variable "Flag" es 0, si la respuesta es no cambias el flag a 0 y si es si lo pones a uno. Después ambas salidas las llevas a un bloque de calculo donde reseteas el contador.
Con esto habrás creado una base de tiempo de 1sg, que incluso te puede servir para futuros usos.
Ahora bien con esto no has terminado ya que debes cambiar tu programa "main" de forma que en vez de preguntar si el registro de cuenta ha llegado a un valor, debes cambiarlo pro preguntar el estado de la variable "Flag" y dependiendo de ello ahora si ya pueds cambiar la salida a tu gusto.

Bien todo esto que es un poco rollo de explicar se realiza con pocos bloques en flowcode. No te adjunto el ejemplo porque dispongo de una versión superior a la tuya y no podrías abrirlo. Te adjunto unas capturas de imagen de una base de tiempos de 1 sg que suelo utilizar. Solo tienes que cambiar tus nombres y pines a utilizar según lo explicado.

Desconectado gg.tecnico

  • PIC12
  • **
  • Mensajes: 60
Re:Temporizador por monedas
« Respuesta #8 en: 15 de Abril de 2018, 08:57:13 »
Muchas gracias Fer_TACA, seguiré estos consejos que me indicas y comenzare a realizar pruebas, en realidad el LCD no me hace falta para donde implementaría este proyecto.

Muchisimas gracias de nuevo.

Saludos.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3187
Re:Temporizador por monedas
« Respuesta #9 en: 15 de Abril de 2018, 14:08:23 »
De nada.
ya sabes por dónde estamos para cualquier consulta que podamos responder.

Ojo que con los bloques que te adjunte de mi base de tiempos tiene un valor de cristal determinado, se utiliza el TMR1 en vez del TMR0.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3187
Re:Temporizador por monedas
« Respuesta #10 en: 16 de Abril de 2018, 05:58:10 »
Sigamos.
Dirás es que lo adjuntado no se parece a lo que pretendo realizar. ¡Cierto! Lo importante es que hayas comprendido el funcionamiento de la base de tiempos. Falta todo lo de la detección de monedas y la resta de tiempos, aunque ya en el post del adjunto ya te adelante como realizarlo de forma simplificada.
En la base de tiempos creamos una variable "Flag_T1s", ésta solo es para saber cuando ha pasado un segundo y poder hacer oscilar una salida dentro del entorno del "main". En tu proyecto no se va a utilizar y vamos a pasar directamente a el.
Voy a suponer que por cada paso de moneda se va a incrementar el tiempo en 1 minuto=60 segundos (tu podrás cambiar y poner el que desees). También voy a suponer que no existe un limite superior de tiempo (después se podrá limitar). Por lo tanto vamos a necesitar una nueva variable que vamos a llamar "tiempo_total" y vamos a declararla como "int".
A continuación nos toca modificar ya las rutinas:
1º Al inicio hay que poner a 0 el valor de "tiempo_total"
2º Crear una nueva interrupción, ésta para detectar el paso de la moneda. La llamanos "interrupcion_tiempo" y dentro de ella solo ponemos un bloque de calculo de forma que "Tiempo_total0Tiempo_total+60.
3º Ahora pasamos a modificar la rutina de interrupcion del TMR0 de la siguiente forma:
a.- Incrementamos el registro cuenta_1s en una unidad.
b.- Si el cristal es de 4MHz, añadimmos el bloque de decision y comparamos si es mayor o igual de 122 (valor para que pase 1sg.)
c.- Si no lo es salimos de la interrupción y si es se cumple (> o =) entonces hacemos dos cosas: Restamos una unidad a la vatriable tiempo_total y reseteamos el contador de la base de tiempos.
4º Lo siguiente es modificar el entrono del Main. Para ello dentro del while colocamos un blque de comparacion para ver si la variable "tiempo_total" ha llegado a 0 o no. Si no llega es porque ha pasado alguna moneda y entonces activas la salida. Por contra si es que si es que o bien no ha pasado moneda o que el tiempo llego a 0 y por tanto desactivas la salida.

Basicamente esto es lo que pretendias realizar. A partir de ahi, ya que bajo mi punto de vista hay cosas que mejorar y variables a tener en cuenta, pero como no conozco todos los detalles de tu proyecto pues de momneto lo dejo ahi. Esto es lo basico y a partir de ahi podemos seguir hablando.


Desconectado gg.tecnico

  • PIC12
  • **
  • Mensajes: 60
Re:Temporizador por monedas
« Respuesta #11 en: 16 de Abril de 2018, 07:40:36 »
Muchas gracias Fer_TACA, me he puesto a crear lo primero que me enviaste pero estoy totalmente atascado con este tema que no veo como hacerlo. Se que solo hay que pedir ayuda y no que te hagan el trabajo, pero aqui en esta ocasión lo necesito, si puedes por favor enviamelo en flowcode y así podré solucionar un problema que tengo.


Muchas gracias y perdona.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3187
Re:Temporizador por monedas
« Respuesta #12 en: 16 de Abril de 2018, 13:54:19 »
Te adjunto lo que he realizado en Flowcode.
No se si lo podrás abrir. Pienso que mi versión es posterior a la tuya y quizás no puedas. No obstante en mi post anterior te puse las imágenes de esto mismo.
Es muy simple y deberías de poder realizarlo. Ya te dije que lo importante es conocer y saber porque se hacen las cosas.
No obstante lo adjuntado es básicamente lo que pretendes pero con las limitaciones de no saber en profundidad todo lo que necesitas. Además es tan básico que hay cosas que deberías de ser consideradas e implementadas.

Desconectado gg.tecnico

  • PIC12
  • **
  • Mensajes: 60
Re:Temporizador por monedas
« Respuesta #13 en: 16 de Abril de 2018, 15:30:49 »
Hola Fer_TACA, lo he podido abrir ya que también tengo la versión 6 de Flowcode, lo que pasa es que es una versión que he tocado poco.

Perdona si pregunto algo absurdo, pero no entiendo lo del pulsador, en el panel está, pero la entrada en el diagrama no.
Estoy muy perdido, de ahí que te pida tanta ayuda.

Mil gracias.
« Última modificación: 16 de Abril de 2018, 15:39:59 por gg.tecnico »

Desconectado Fer_TACA

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3187
Re:Temporizador por monedas
« Respuesta #14 en: 16 de Abril de 2018, 16:57:08 »
El pulsador lo tienes que tener asignado al pin RA2 del pic que has utilizado y que es el que dispone de la interrupción "INT".
Lo he cambiado en este ultimo adjunto ya que como base utilicé tu primer ejemplo y allí lo tenis puesto a RA0.