Mostrando entradas con la etiqueta ICSP. Mostrar todas las entradas
Mostrando entradas con la etiqueta ICSP. Mostrar todas las entradas

sábado, 6 de julio de 2013

Rutina Anti-Rebote para Pulsador

Una de las complicaciones que se presenta a la hora de crear una rutina anti-rebotes para pulsador, al trabajar con microcontroladores, es evitar los impulsos múltiples, los (valga la redundancia) “rebotes” que insertan dos, tres, diez impulsos en lugar de uno sólo, como sería nuestro deseo. Las soluciones que los programadores aplican son incontables. Hay decenas de ejemplos por toda la web de estas rutinas y como es lógico; cada uno de nosotros utiliza la que entiende como “la mejor” de acuerdo al lenguaje de programación que estamos utilizando.

 Un simple ejemplo de un sistema que necesita un método "Anti-Rebotes"

Mucha gente coloca un retardo de tiempo, luego de la acción de pulsar el botón y calculan un tiempo “medio” de activación para una acción “normal”. Por supuesto, el resultado es que no existen dos personas que pulsen un botón de igual modo. A unos no les actuará la acción y a otros (que se pasarán en tiempo) les avanzará, por ejemplo un menú, en varias secciones. De manera irremediable, cuando a un equipo lo manipulan muchas personas, es imperioso incorporar un sistema que no falle y nos garantice que el sistema actúe sin errores, ante todo tipo de usuarios. Hay una rutina (que es mi preferida) que utilizo en BASIC y que es la siguiente:


 La rutina del lazo infinito para asegurar el momento en que el botón deja de ser pulsado

Utilizando un pin I/O cualquiera, en este caso el pin 7 del Puerto B, aprovecho a darle tres funciones al pin. Lo utilizo para trabajar con el programador mediante el modo ICSP, para activar un LCD alfanumérico (D7) y, como lo mencionamos, para un pulsador. Esta acción vale tanto para el pin RB7 como para el RB6. Claro está, de este modo puedes utilizar cualquier pin I/O del microcontrolador que esté configurado como salida (LED, Dispaly, Relé, etc.). La rutina es sencilla y se corresponde con el siguiente circuito:

 Circuito clásico, multifunción, con entradas y salidas simultáneas.

Lo primero que hacemos es crear un punto en la estructura del programa donde SW1 tenga la posibilidad de ser pulsado y de generar un estado lógico bajo que actúe del modo en que deseamos. Podemos hacer un “barrido”, o una lectura secuencial de múltiples pulsadores, conectados a diferentes pines I/O del microcontrolador en esa parte del software, nosotros te mostramos una. Con la instrucción TRISB.7 = 1 transformamos el pin en entrada y luego observamos su estado lógico. Si es “activo”, es decir, si está presionado, nos mantenemos dentro del lazo infinito hasta que cambie de estado. En nuestro caso, que retorne a un “1” lógico mientras está configurado como entrada. Cuando ello ocurre, el programa sale del lazo infinito y retorna (RETURN) al punto donde fue ejecutada la rutina de “observación de nivel lógico” del pulsador. 

Por supuesto, la explicación vale para conmutar el pin a un estado alto o bajo. Nosotros empleamos la técnica de hacerlo a GND, pero sin problemas se puede hacer a Vcc, invirtiendo las resistencias. Esto es: 47K a GND y 4K7 a Vcc intercalando allí el pulsador. La situación de “activo” se presenta entonces como un “1” lógico en la entrada. Debemos tener muy presente de asegurarnos la configuración TRIS del pin para no cometer errores y lograr que todo funcione de manera adecuada, sin errores. Por último, también puedes lograr el mismo resultado utilizando la siguiente combinación:

 Si el GOTO no es de tu agrado, aquí tienes el mismo ejemplo con WHILE-WEND

La solución es la misma, se realiza en un solo renglón y no utiliza la "endemoniada" instrucción GOTO, que muchos no admiten, y que se adecúa más a una rutina para utilizar en lenguaje C. También se puede adaptar una rutina con REPEAT-UNTIL para este mismo propósito y muchos otros métodos que seguramente tú habrás ensayado con éxito.¿Qué método utilizas para realizar un sistema “Anti-Rebote” de un pulsador mediante la programación? ¿Te manejas con un Timer que controlar el estado del pulsador en forma repetitiva? Hay tantas preguntas como opciones de trabajo cuando hablamos de pulsadores. ¿Deseas compartir tus rutinas con nosotros y los lectores? 

sábado, 12 de junio de 2010

BootLoader para 18F2550

Un BootLoader es un pequeño conjunto de instrucciones que forman un programa y se graban, en este caso en un microcontrolador, para permitir un posterior manejo y actualización de sus programas internos (firmware) sin necesidad de utilizar programadores (hardware) específicos. Es decir, utilizas un programador (o quemador) de microcontroladores una única vez para cargarle el mencionado BootLoader al microcontrolador y luego te bastará con una sencilla aplicación en tu ordenador para cambiar a tu antojo el funcionamiento de tus sistemas. Todo mediante una vulgar conexión al puerto USB. Las plataformas modernas que se asemejan a Arduino (incluida ésta) utilizan este sistema de programación y nosotros no podíamos quedar afuera. Ahora la programación está al alcance de todos.

Es imposible resumir en un sumario de pocas palabras las infinitas ventajas que posee un BootLoader. Sólo debes imaginarte la situación: tu hardware, tu ordenador y un cable de conexión USB entre ambos. Eso es todo lo que necesitas para transformar al entrenador NeoTeo en un voltímetro, en un videojuego, en un operador de servomotores y en miles de cosas más. A pesar de que el conector ICSP es una de las herramientas maestras de las que dispone una persona que se dedica a experimentar con microcontroladores, la utilización de un BootLoader te ahorra el uso de un hardware adicional de trabajo como es el programador (o quemador).

Un ejemplo de las miles de ventajas que puedes tener sería este: Tú le has vendido a Max una aplicación y luego de un tiempo de uso él te expresa su lamento y pesar sobre algunas deficiencias del producto, mientras te comenta que desearía que hagas algunas mejoras para lograr un funcionamiento óptimo y acorde a sus necesidades. ¿Qué deberías hacer en esa situación? ¿Pedirle a Max que desarme todo el equipo y te lo envíe? Imposible. ¿Viajar tú de un país a otro para cambiar dos líneas de programa, conectar el hardware programador y demorar menos de cinco minutos en resolver el problema? ¡De locos! En cambio, si el sistema inicial posee la sencilla carga previa de un BootLoader, le envías a Max un pequeño archivo por correo electrónico y él mismo podrá actualizar la versión de firmware con un elemental cable USB conectado a su ordenador. Así trabajan Arduino, Amicus y todas las plataformas similares que compiten en la web. Así de sencillo y tentador. ¿Quieres verlo? Observa como se cambia de una aplicación a otra diferente en apenas algunos segundos.



Este extenso artículo continúa aquí.