TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: dario9669 en 29 de Diciembre de 2016, 11:38:56

Título: duda con trabajo del pic
Publicado por: dario9669 en 29 de Diciembre de 2016, 11:38:56
hola gente les planteo mi duda , quiero saber si se puede hacer trabajar un pic con un contador descendente constante y tambien darle otras ordenes mientras trabaja el contador , es decir tengo tres botones 1 me suma de a uno en un digito "x" el otro me suma en otro digito "x" tambien de a uno , estos dos son independientes , y a su vez tengo el pulsador 3 que da inicio el conteo en otro digito "x" , 3 digitos independientes , si pulso el 3 inicia el contador que cuenta segundos , si pulso el 1 para sumar un numero en otro digito con el bloqueo del pulsador para que sume solo uno por pulsada , esto me altera el tiempo del contador que esta funcionando ? , mi razon dice que si pero no estoy seguro, desde ya gracias
Título: Re:duda con trabajo del pic
Publicado por: KILLERJC en 29 de Diciembre de 2016, 11:58:22
Si se puede..

Lo que a uno le parece "simultaneamente" en realidad son trabajos independientes entre uno y otro que se ejecutan a alta velocidad.

Lo mas seguro es que codigo tenga algun delay, o un while para evitar el rebote de los botones, lo cual hace que mientras presiones ese tiempo sea perdido.
Pienso que lo ideal para tu caso es usar interrupciones.

En tu rutina principal verificarias el tema de los botones e incrementarias o no segun lo presionado (Excepto boton 3), El boton 3 lo explico en lo siguiente a pesar que parte del codigo va aca.
En una interrupcion de un timer, procedes a hacer la cuenta ( lo del boton 3 ), un poco mas explicado seria: En la rutina principal verifico que se presiono el boton 3, de ser asi activo una bandera o una varaible de 1 bit. En la rutina de interrupcion verifico que esta variable este en 1, si lo esta entonces procedo a contar cuantas veces entro a la interrupcion. Cuando entre X veces quiere decir que paso cierto tiempo procedo a cambiar el valor del digito.
De esta forma la interrupcion con solo manejar esa variable de 1 solo bit puedo controlar el timer.

Si observas nunca hable hasta ahora de donde muestro los digitos.
¿Donde meto el codigo de muestra de digitos?
Podriamos usar otro Timer y su interrupcion para que maneje eso. Si esta multiplexado los displays, supongamos que el Timer actua cada 10ms, lo unico que haria es desactivar el anterior comun, cambiar el numero por el correspondiente y luego activarlo. Asi siempre y sin delays de por medio. De esa forma tendrias multiplexado tu display y sin generar demoras o que te moleste lo que pongas en la rutina principal.
Título: Re:duda con trabajo del pic
Publicado por: dario9669 en 29 de Diciembre de 2016, 14:56:36
muchas gracias por contestar , ok mi duda era que yo al precionar el boton 1 sumo un digito , pero como tengo un bucle en esa rutina para que no siga sumando mientras el boton 1 este precionado , tenia dudas de que el reloj que cuenta los segundos pierda el tiempo mientras mantengo precionado el boton 1 , es decir si preciono boton 1 sumo un digito pero si no lo suelto , no sigue sumando hasta que lo suelte y vuelva a precionar , digo eso no afecta al contador de tiempo ?, ( vamos a llamarlo cronometro )
Título: Re:duda con trabajo del pic
Publicado por: KILLERJC en 29 de Diciembre de 2016, 17:32:11
Primero separemos los trabajos que tenemos:
- Lectura de botones
- Contador ( Decrementar cada xx tiempo )
- Mostrar en display

Dependiendo de donde tengas cada funcion puede que tengas problemas o no.

Vamos a pensarlo de 2 formas distintas.

Si usamos interrupciones:
Mientras el microcontrolador se queda encerrado en un bucle dentro del programa principal debido a que tenes presionado el boton, al ocurrir una interrupcion de un Timer ( en el cual paso una parte de tiempo), el microcontrolador guarda la posicion de la instruccion que estaba ejecutando ( bucle infinito ) y ejecuta el codigo de la interrupcion, cuando termina el codigo de la interrupcion vuelve al programa principal o a donde habia guardado esa posicion de instruccion. De esa forma mientras tenes el boton presionado la interrupcion se ejecuta. Por lo cual no afectaria en nada lo que pongas en tu rutina principal.

En este metodo la interrupcion, supongamos que interrumpe cada 100ms, y queremos que descuente cada 1 segundo, entonces al contar 10 interrupcion procedo a restar el contador.
Por lo cual el contador NO se ve afectado.

Si tenemos el codigo de muestra de display en otra interrupcion de otro Timer ( o en el mismo que el anterior ), veriamos que el mostrar en el display TAMPOCO se veria afectado.

SIN interrupcion:

En este caso tendrias problemas si tu codigo se queda encerrado esperando que sueltes el boton, nada de lo demas se va a ejecutar, por lo tanto se veria afectado el contador.
¿ Es posible hacer un codigo en el cual no quede encerrado ? Si. Si podes hacerlo. Aunque para mantener un valor correcto de tiempo, lo mejor es que uses una interrupcion para tu contador. Sino al decrementar puede que tarde distinto de la ves que decremento con anterioridad.

Termino medio, solo contador en uan interrupcion

Supongamos que decido usar solo 1 Timer y su interrupcion, y lo uso unicamente para el contador. Que reduce 1 cada 1 segundo. Empiezo con un valor 9.
El codigo que se encarga de mostrar el valor esta junto con el de los botones, en la rutina principal.
Presiono un boton que es para incrementar el valor y lo tengo presionado por 4 segundos.

Lo que voy a notar mientras esta presionado es que El display solo muestra un solo valor, en caso de que sea multiplexado solo un display va a estar encendido. Esto por que al tener presioando el boton no dejo que se ejecute la parte de muestra del display.
Al momento de soltarlo luego de esos 4 segundos, el contador al estar en la interrupcion continua ejecutando, por lo tanto al soltar el boton comienza a ejecutarse el codigo de muestra en los displays, por lo que el numero pasaria de 9 a 5 ( por esos 4 segundos que pasaron ).

El contador siguio contando. El problema aca fue que no se muestra a tiempo.

Puse este ejemplo por que cuando hablas de "afecta al contador" lo podes percibir de 2 formas, uno es el contador interno y lo otro es lo que ves que serian los displays. Que al ver solo el display te parece que no funcione pero por detras si lo hace.