TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Agus1581992@gmail.com en 13 de Noviembre de 2020, 12:01:08

Título: Pic16f877A cronometro
Publicado por: Agus1581992@gmail.com en 13 de Noviembre de 2020, 12:01:08
Hola que tal, soy novato en el mundo de los microprocesadores
Y actualmente estoy trabajando en un pequeño menú donde se realizan algunas funciones para controlar en dispositivo, lo estoy haciendo en Ccs compiler
Dentro de las funciones que realizó mi programa pide que el usuario ingrese el tiempo que desea que esté activido un un Pin del microprocesador 16F877A.

La descripción del funcionamiento del temporizador es el siguiente.

El usuario debe seleccionar el tiempo que desea a través de un teclado matricial de 4x4 que está conectado en el puerto B
Una vez el usuario ingrese el tiempo estimado en el que quiere que el pin A1 esté en alto (que haya un voltaje de salida)
Debe presionar la letra # para continuar
Una vez presionada la tecla # el pin A1 debe de ponerse en alto.
Posteriormente el cronómetro debe mostrarse en la pantalla Lcd que está conectada en el puerto D.
El cronómetro es decendente y cuando el tiempo sea 0. El pin A1 se pone en bajo
Y debe de regresar al menú donde salió.



Agradecería de antemano me pudieran ayudar, esta parte es la que aun no he podido solucionar y me he atrasado en el desarrollo de mi proyecto.
Muchas gracias
Título: Re:Pic16f877A cronometro
Publicado por: KILLERJC en 13 de Noviembre de 2020, 12:11:24
¿Que parte no lograste solucionar?
Lo que comentas lo haria asi:

Citar
El usuario debe seleccionar el tiempo que desea a través de un teclado matricial de 4x4 que está conectado en el puerto B
Debe presionar la letra # para continuar
En tu menu, una ves seleccionada la opcion, tenes que seguir leyendo las teclas, por ende podes ir cargando los numeros y si encontrar un # entonces quiere decir que tenes que comenzar es decir poner a A1 en 1, resetear un Timer y activar sus interrupciones.

De alli te puedo decir lo siguiente:
Citar
Una vez presionada la tecla # el pin A1 debe de ponerse en alto.
Posteriormente el cronómetro debe mostrarse en la pantalla Lcd que está conectada en el puerto D.
El cronómetro es decendente y cuando el tiempo sea 0. El pin A1 se pone en bajo

Para el Cronometro, usa la interrupcion del Timer, supongamos que te lleva 10 interrupciones contar 1 segundo. A las 10 interrupciones disminuis 1 (dentro de la interrupcion) y activas una flag que indique que necesitas actualizar el LCD, el LCD se va a actualizar a medida que vaya cambiando algun valor DENTRO DEL MAIN, NO EN LA INTERRUPCION, sino no tiene sentido que se actualice cuando no exista cambio y hacer perder tiempo en el main. En la misma interrupcion del Timer cuando detectas que tu "cronometro" es 0, desactivas A1, desactivas las interrupciones del Timer y podes usar este mismo bit para indicar que termino o no de ejecutarse el cronometro.



Por supuesto, esto va a ser mas o menos facil de implementar todo depende de como es tu menu.
Título: Re:Pic16f877A cronometro
Publicado por: Agus1581992@gmail.com en 13 de Noviembre de 2020, 13:03:53
Hola que tal, te he enviado un mensaje al. Privado, comentándote un poco más sobre el proyecto. Espero puedas apoyarme
Título: Re:Pic16f877A cronometro
Publicado por: KILLERJC en 13 de Noviembre de 2020, 13:34:01
Te voy a responder exactamente lo que te voy a responder por privado.

Entiendo el que quiera mantenerlo privado ya que el código no quieren que se divulga debido a que posiblemente sea un producto comercial, pero....
1-  Siendo que lo programo otra persona (tal vez vos), viendo la estructura del código, observo que la persona que lo programó es mucho mas consciente que yo como funciona, donde puede o no agregar las cosas, sin que se rompa.
2- No sigue algún estándar, ni separación, ni capas y tampoco se busca una abstracción en el código.
3- Recién esta aprendiendo a programar, y si yo quisiera tocar el código realmente lo haría de cero. Hay muchas cosas que pueden ser armadas con un for, o directamente con una operacion, a diferencia de un monton de ifs. En esto algunos te voy a ayudar a reducirlo.

Te puedo decir que, no puedo ayudarte a mirar el código debido a que es "extenso", tiene 485 líneas (no es tanto pero no hay separación de nada) en un solo archivo, sin identación, y uso de instrucciones como goto, que si, se puede usar, pero solo en ciertos lugares.

Entonces... Lo unico que te puedo ayudar es darte una aproximacion a como deberias realizarlo, y eso es lo que hice.. De ahora en adelante es cuestion tuya el aplicarlo en ese codigo, donde "no rompa nada" y funcione.