Llave electrónica con PIC

Echale un vistazo al que realice, ahi muestra como controlar el teclado pero es en lenguaje picbasic.

Ver el archivo adjunto 57920
Hola, estimado nano 24. Probé tu cerradura y está excelente.
¿Cómo podría activar el backlight del lcd al presionar cualquier tecla para que la pantalla se encienda por un tiempo determinado para ahorrar energía, así como los teléfonos móviles?
Tengo entendido que se puede lograr por el método de interrupciones RBIE del puerto B de los bits más significativos.
Por favor, ¿me podrías dar un ejemplo para lograr esta hazaña?
Espero que me puedas ayudar, te lo agradecería mucho.
 
Última edición por un moderador:
Es mejor que utilices la interrupción externa por RB0, así no desperdicias 3 pines.
En ambos casos necesitas mover el teclado, porque en el diseño de Nano24 se usa el puerto B desde RB0 hasta RB6.

Algo útil para usar los pines sobrantes al usar RBIE, sería poner pulsadores para aumentar y disminuír el brillo.
Esto se logra usando PWM por hardware con los módulos CCP.

PD: Sobre el tema: Curso de programación de PIC en PICBasic Pro, puedes encontrar más ejemplos.
 
Es mejor que utilices la interrupción externa por RB0, así no desperdicias 3 pines.
En ambos casos necesitas mover el teclado, porque en el diseño de Nano24 se usa el puerto B desde RB0 hasta RB6.

Algo útil para usar los pines sobrantes al usar RBIE, sería poner pulsadores para aumentar y disminuír el brillo.
Esto se logra usando PWM por hardware con los módulos CCP.

PD: Sobre el tema: Curso de programación de PIC en PICBasic Pro, puedes encontrar más ejemplos.

Gracias D@rkbytes por la respuesta, lo que yo deseo es que cuando presione cualquier tecla se me encienda el led 4. Esa señal será suficiente para encender el led que trae incorporado el display lcd 2x16 con iluminación; así darle un efecto como los telefonos móviles que cuando se oprime cualquier boton se enciende la pantalla y se apaga despues de algunos segundos y entre en modo sleep ahorro de energía, en que parte del programa debo colocar el codigo por interrupcion rbi para que cumpla con el propósito, espero me puedas ayudar señor moderador.

te adjunto archivos.
 

Adjuntos

Primero. Como te mencioné, debes cambiar el teclado de puerto para poder usar la interrupción por RB0.

Segundo. Si entras en modo de ahorro de energía, harás que el programa principal ya no se ejecute y el microcontrolador despertará únicamente cuando se genere una interrupción.

Adjunto un ejemplo sobre lo que deseas hacer y te recomiendo que lo realices físicamente.
Posteriormente podrás colocar el código en el programa final.

Suerte.
 

Adjuntos

Primero. Como te mencioné, debes cambiar el teclado de puerto para poder usar la interrupción por RB0.

Segundo. Si entras en modo de ahorro de energía, harás que el programa principal ya no se ejecute y el microcontrolador despertará únicamente cuando se genere una interrupción.

Adjunto un ejemplo sobre lo que deseas hacer y te recomiendo que lo realices físicamente.
Posteriormente podrás colocar el código en el programa final.

Suerte.


Hola estimado D@rkbytes, estuve investigando y me di cuenta que usando la interrupción por rb0 no haría el funcionamiento correcto... ya que al presionar el teclado se encendería el backlight del display y este no me dejaría digitar nada con el teclado ya que la interrupcion generada atendería al encendido del backlight hasta que este se apague, entonces la otra forma de hacerlo es con el tmr0 ó tmr1 usando sus contadores internos. Me decidi por el tmr1 ya que este posee 16 bits la cual haciendo unos arreglos me podía dar mas tiempo para encender el backlight, lo que hice fue incrustar 2 codigos de tus ejemplos, el ejemplo ultimo que posee pwm por interrupción rb0 claro que haciendo algunas modificaciones y el otro que saque del tema del contador tmr1 para que el el micro no se congele al atender la temporizacion, te adjuntare el código que estado logrando incrustar; pero en algo fallo. A lo que quiero llegar es del ejemplo del tmr1 que el el led se enciende y que el micro siga realizando sus tareas, pero al momento de apagarse el led lo haga en forma decreciente usando pwm, te adjunto archivos, de antemano gracias por la ayuda que me puedas brindar.
 

Adjuntos

Fogonazo

Exorcista & Moderador eventual
Hola estimado D@rkbytes, estuve investigando y me di cuenta que usando la interrupción por rb0 no haría el funcionamiento correcto... ya que al presionar el teclado se encendería el backlight del display y este no me dejaría digitar nada con el teclado ya que la interrupcion generada atendería al encendido del backlight hasta que este se apague, entonces la otra forma de hacerlo es con el tmr0 ó tmr1 usando sus contadores internos. Me decidi por el tmr1 ya que este posee 16 bits la cual haciendo unos arreglos me podía dar mas tiempo para encender el backlight, lo que hice fue incrustar 2 codigos de tus ejemplos, el ejemplo ultimo que posee pwm por interrupción rb0 claro que haciendo algunas modificaciones y el otro que saque del tema del contador tmr1 para que el el micro no se congele al atender la temporizacion, te adjuntare el código que estado logrando incrustar; pero en algo fallo. A lo que quiero llegar es del ejemplo del tmr1 que el el led se enciende y que el micro siga realizando sus tareas, pero al momento de apagarse el led lo haga en forma decreciente usando pwm, te adjunto archivos, de antemano gracias por la ayuda que me puedas brindar.

Reglas generales de uso del foro

05) Escribe de manera correcta y legible para todos. Estás en un Foro no en un Chat. Esto incluye emplear signos de puntuación, (Por ejemplo "Punto y Aparte, signos de interrogación, Etc"), comenzar un renglón nuevo con mayúscula, Etc. No nos gusta la escritura "En Bloque"
 
El programa que propuse lo que hace es encender el LED de la pantalla y apagarlo poco a poco usando PWM.
Obviamente, cuando se de la orden de apagar la pantalla, es porque ya no se va a usar el teclado.

Para lo que quieres hacer se requiere hacer un pseudo multitasking, algo así como RTOS.
En PICBasic Pro lograr ese propósito es muy complicado, porque al parecer no hay librerías para eso.

El problema para lo que quieres surge, porque para lograr que la luz del LED vaya disminuyendo, se necesita realizar un bucle.
Por lo tanto, cuando se entre al bucle no se podrán atender otras tareas hasta que el bucle finalice.

Tal vez se pueda hacer uso de algún flag y un contador dentro del servicio de interrupción por desborde del Timer 1.
Un flag indicaría cuando se requiera iniciar un contador descendente y el valor del contador se usaría para determinar el valor del ciclo activo del PWM.
Esto es una idea que podría funcionar, pero que no he llevado a la práctica.
 
Última edición:
El programa que propuse lo que hace es encender el LED de la pantalla y apagarlo poco a poco usando PWM.
Obviamente, cuando se de la orden de apagar la pantalla, es porque ya no se va a usar el teclado.

Para lo que quieres hacer se requiere hacer un pseudo multitasking, algo así como RTOS.
En PICBasic Pro lograr ese propósito es muy complicado, porque al parecer no hay librerías para eso.

El problema para lo que quieres surge, porque para lograr que la luz del LED vaya disminuyendo, se necesita realizar un bucle.
Por lo tanto, cuando se entre al bucle no se podrán atender otras tareas hasta que el bucle finalice.

Tal vez se pueda hacer uso de algún flag y un contador dentro del servicio de interrupción por desborde del Timer 1.
Un flag indicaría cuando se requiera iniciar un contador descendente y el valor del contador se usaría para determinar el valor del ciclo activo del PWM.
Esto es una idea que podría funcionar, pero que no he llevado a la práctica.
Estimado D@rkbytes olvidemos lo del PWM.

Ahora he intentando incrustar el código de TMR1 al codigo de una cerradura codificada con el propósito que al presionar las teclas activen esa señal temporizada por el TMR1 y activen el led. En el intento hubo errores que al presionar la tecla se me encendía y no se apaga el led.

Te adjunto archivos cerradura + encendido de led 9 seg. por TMR1 todo eso para que la cerradura me deje meter los codigos mientras esta el led temporizado simulando que es el backlight del display.

Te comento que un amigo logro encender el led al presionar la tecla sin que el micro se congele,
temporizando al led con un contador interno pic, pero lo hizo en mikrobasic.

gracias...:apreton:
 

Adjuntos

Última edición:
Mira el ejemplo adjunto, es un sistema que ya tenía hecho de clave con teclado matricial 4x4 pero le agregué la subrutina con el Timer 1, así tal y como te había mencionado anteriormente. (Ahora sin usar PWM)
No probé el funcionamiento físicamente, pero debe funcionar.

Espero te sirva el proyecto. Suerte.
 

Adjuntos

Gracias D@rkbytes, veo que el codigo de tu cerradura es mas simplificado.



Me olvidaba estimado D@rkbytes , ¿como puedo hacer..? para que me salga los numeros de la tecla presionada, luego de 1 segundo se vuelva asterisco, muchas gracias...
 
Última edición:
Mira el ejemplo adjunto, es un sistema que ya tenía hecho de clave con teclado matricial 4x4 pero le agregué la subrutina con el Timer 1, así tal y como te había mencionado anteriormente. (Ahora sin usar PWM)
No probé el funcionamiento físicamente, pero debe funcionar.

Espero te sirva el proyecto. Suerte.
Estimado D@rkbytes , ¿como puedo hacer..? para que me salga los numeros de la tecla presionada, luego de 1 segundo se vuelva asterisco.

Lo otro es que a la primera pulsación me encienda el led del backlight, pero que no digite nada en la pantalla, no!.. hasta la segunda pulsacion.

Estuve ensayando con un contador y lo cargue con 2 intentos, pero lo que conseguí fué... despues de tipear 2 digitos se me encendiera el backligh; es algo que no tiene sentido, adjunto
archivo y codigo incrustado, espero me puedas ayudar... gracias de antemano.
 

Adjuntos

Última edición:
Posible solución a la primer pregunta:
Utilizando variables temporales que sirvan para memorizar los dígitos.
Aquí tal vez se tenga que hacer uso de otro timer para mostrar posteriormente los dígitos.

Sobre la segunda pregunta:
El incremento y comparación del contador de segunda tecla pulsada, lo debes colocar en la sección en donde se verifica cuando se presionó una tecla.
Y debes poner en 1 la variable "Flag_Key" cuando ese contador llegue a 2, para que durante el servicio de interrupción por desborde del Timer 1, se encienda el LED de Backlight.
Como "Flag_Key" debe permanecer en 1 durante el resto de pulsaciones, se debe poner a 0 en la sección de comparación, cuando la variable "i" llega a 4

También será conveniente que la variable "Contador" se ponga a 0 cada vez que se detecte la pulsación de una tecla.
 
Posible solución a la primer pregunta:
Utilizando variables temporales que sirvan para memorizar los dígitos.
Aquí tal vez se tenga que hacer uso de otro timer para mostrar posteriormente los dígitos.

Sobre la segunda pregunta:
El incremento y comparación del contador de segunda tecla pulsada, lo debes colocar en la sección en donde se verifica cuando se presionó una tecla.
Y debes poner en 1 la variable "Flag_Key" cuando ese contador llegue a 2, para que durante el servicio de interrupción por desborde del Timer 1, se encienda el LED de Backlight.
Como "Flag_Key" debe permanecer en 1 durante el resto de pulsaciones, se debe poner a 0 en la sección de comparación, cuando la variable "i" llega a 4

También será conveniente que la variable "Contador" se ponga a 0 cada vez que se detecte la pulsación de una tecla.
Hola, estimado D@rkbytes. He intentado hacerlo como me describiste, pero no logro hacerlo.
Por favor, échame una manito y podré saber cuan cerca estuve. Te lo voy a agradecer bastante.
 
Última edición por un moderador:
Pues no es complicado, solo es cuestión de que busques una lógica para conseguir el funcionamiento.
Aquí te adjunto el código para que el LED de backlight encienda con dos pulsaciones.
El esquema a usar es el mismo que el del post #109

Ahora intenta mostrar los dígitos después de cierto tiempo, tampoco debe ser complicado.
 

Adjuntos

Temas similares

Arriba