Tal como dijimos en la entrega anterior, hoy veremos como utilizar todo lo aprendido en un proyecto. Bienvenido a la quinta entrega de este tutorial.Utilizaremos como base la PIC TRAINER de 40 pines y el modulo de 8 Entradas/Salidas para hacer una serie de programas que empleen las instrucciones y conceptos que hemos visto hasta aquí. Si no haz construido estas dos placas, seria una buena idea de te pongas en ello, ya que a lo largo del tutorial las utilizaremos con frecuencia.
Si no, siempre tienes la alternativa de utilizar un protoboard o crear una placa de circuito impreso cada vez, aunque seguramente perderás mucho tiempo en ello.
El modulo de 8 E/S nos proporciona 8 LEDs para “jugar” con ellos, así que vamos a aprovecharlos.
Ejercicio 1: 8 LEDs destellando.
En nuestra primer y segunda entrega vimos como se hacia para encender y/o apagar una de las salidas del microcontrolador. Es muy sencillo utilizar lo visto en esa oportunidad para ampliarlo a un mayor número de salidas.
En esa oportunidad utilizábamos como salida el bit 7 del PORTA, por lo que las instrucciones que activaban y desactivaban el LED eran PORTA.7 = 1 y PORTA.7 = 0 respectivamente. Hoy usaremos el PORTC de un 16F877A montado en el PIC TRAINER de 40 pines. Si nos atenemos a lo visto con anterioridad, para encender las 8 salidas deberíamos tener 8 instrucciones separadas, del tipo PORTC.0 = 1… PORTC.7 = 1. El programa que enciende y apaga las 8 salidas del PORTC quedaría así:
AllDigital
TRISC = %00000000 ‘Todos los pines como salidas
loop:
‘Enciendo los 8 LEDs
PORTC.0 = 1
PORTC.1 = 1
PORTC.2 = 1
PORTC.3 = 1
PORTC.4 = 1
PORTC.5 = 1
PORTC.6 = 1
PORTC.7 = 1
WaitMs 500 ‘Espero medio Segundo (500 ms)
‘Apago los 8 LEDs
PORTC.0 = 0
PORTC.1 = 0
PORTC.2 = 0
PORTC.3 = 0
PORTC.4 = 0
PORTC.5 = 0
PORTC.6 = 0
PORTC.7 = 0
WaitMs 500‘Espero medio Segundo (500 ms)
Goto loop
Este programa, como puede verse en las imágenes y videos que acompañan el tutorial, funciona perfectamente. Pero existe una forma más concisa de hacer lo mismo. El truco esta en encender (o apagar) todas las salidas en la misma instrucción. Esto tiene dos ventajas: nuestro programa será más corto y fácil de entender, y no se producirá una pequeña demora (de 1 millonésima de segundo) entre la activación de una salida y la siguiente, como ocurre en el programa anterior).
Si escribimos PORTC = %00000000 estamos poniendo en “0” (apagando) las 8 salidas en una sola instrucción. Y si escribimos PORTC = %11111111 las encendemos a todas. Cada uno de los 0” o “1” de esas instrucciones corresponde a cada una de las salidas. El de más a la izquierda corresponde al bit 7, el siguiente al 6, y así sucesivamente hasta llagar al de la derecha que corresponder al bit 0. Nuestro programa modificado quedaría así:
AllDigital
TRISC = %00000000 ‘Todos los pines como salidas
loop:
‘Enciendo los 8 LEDs
PORTC = %11111111
WaitMs 500 ‘Espero medio Segundo (500 ms)
‘Apago los 8 LEDs
PORTC = %00000000
WaitMs 500‘Espero medio Segundo (500 ms)
Goto loop
Como puede verse, el programa es mucho mas compacto que el anterior.
Ejercicio 2: LEDs saltarines.
Nada impide modificar el programa del ejercicio 1 para hacer que las salidas se activen en un orden diferente. Supongamos por un momento que queremos encender los LEDs 0,1,4 y 5 primero, y luego apagarlos a la vez que encendemos los restantes, y repetir esto indefinidamente.
El programa es prácticamente igual al ya visto, solo varían las instrucciones que le dicen al PIC que salidas deben encenderse y apagarse en cada momento:
AllDigital
TRISC = %00000000 ‘Todos los pines como salidas
loop:
‘Enciendo 4 LEDs
PORTC = %11001100
WaitMs 500 ‘Espero medio Segundo (500 ms)
‘Apago los anteriores y enciendo los otros 4
PORTC = %00110011
WaitMs 500‘Espero medio Segundo (500 ms)
Goto loop
¿Sencillo, verdad?
Ejercicio 3: El LED viajero
Todos hemos visto esos juegos de luces donde la secuencia de encendido y apagado da la sensación de que un punto luminoso se mueve de un lado a otro. Con lo visto hasta aquí, estamos en condiciones de hacerlo. Solo tenemos que escribir un programa que encienda primero el primer LED, luego el segundo, el tercero, etc., a medida que se apaga el anterior. Eso justamente es lo que hace el siguiente programa:
AllDigital
TRISC = %00000000 ‘Todos los pines como salidas
loop:
PORTC = %10000000
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %01000000
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00100000
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00010000
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00001000
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00000100
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00000010
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00000001
WaitMs 500 ‘Espero medio Segundo (500 ms)
Goto loop
El video siguiente ilustra el funcionamiento del programa.
Ejercicio 4: El “Coche Fantástico”Si hay algo que a todo el mundo le llama la atención, es el efecto de luces que tenia a bordo el “Auto Fantástico”. En realidad, construir un circuito que haga esa tarea es muy simple. De hecho, unas pocas modificaciones a nuestro programa del ejercicio 3 bastarían para hacerlo: solo hay que agregar las instrucciones necesarias para que el punto de luz regrese y luego se repita indefinidamente. Eso es lo que hace el programa siguiente:
AllDigital
TRISC = %00000000 ‘Todos los pines como salidas
loop:
PORTC = %10000000
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %01000000
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00100000
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00010000
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00001000
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00000100
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00000010
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00000001
WaitMs 500 ‘Espero medio Segundo (500 ms)
‘Aquí comienza la secuencia de “regreso”
PORTC = %00000010
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00000100
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00001000
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00010000
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %00100000
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %01000000
WaitMs 500 ‘Espero medio Segundo (500 ms)
PORTC = %10000000
WaitMs 500 ‘Espero medio Segundo (500 ms)
Goto loop
Si queremos que el efecto sea más rápido, vasta con reducir los tiempos de demora de 500ms a, por ejemplo, 250ms. Incluso puede ser interesante poner tiempos distintos entre cada led y el siguiente, para que se produzca un ejemplo de “aceleración” o “frenado” en la velocidad del punto luminoso.
Si vemos el listado de arriba, notaremos que es bastante extenso para la sencilla tarea que lleva a cabo. Seguramente estarás pensando en que debe existir una manera más eficiente de hacer lo mismo. Y de hecho, la hay.
SHIFTLEFT y SHIFTRIGHT
Estas dos son funciones que operan a nivel bit que pueden ser utilizadas para “correr” el contenido de variable a la izquierda o a la derecha. Cada uno de los bits que componen la variable se desplazan una posición (a la izquierda o a la derecha, de acuerdo a que función utilicemos). Esto tiene dos consecuencias. En primer lugar, el bit de más a la izquierda (SHIFTLEFT) o derecha (SHIFTRIGHT) se pierde. Y el espacio creado en el otro extremo se completa con un “0”.
El siguiente programa hace lo mismo que el del ejercicio anterior, pero utilizando estas dos potentes funciones y algunas de las instrucciones vistas en capítulos anteriores:
AllDigital
TRISC = %00000000 ‘Todos los pines como salidas
PORTC = %00000001
goleft:
WaitMs 500
PORTC = ShiftLeft(PORTC, 1)
If PORTC = %10000000 Then Goto goright
Goto goleft
goright:
WaitMs 500
PORTC = ShiftRight(PORTC, 1)
If PORTC = %00000001 Then Goto goleft
Goto goright
Lo que hace el programa es muy sencillo: enciende el primer bit del PORTC y espera durante medio segundo. Luego, desplaza hacia la izquierda el contenido del byte que representa al PORTC en la memoria del microcontrolador, y verifica si esos bits llegaron al extremo. Si es así, se invierte el sentido del desplazamiento. El video siguiente muestra como se ve esto en el PIC TRAINER.
Como pueden ver, es mucho lo que se puede hacer con un poco de imaginación y el puñado de instrucciones que hemos visto. A partir de ahora, en cada entrega del tutorial veremos instrucciones nuevas y realizaremos diferentes ejercicios con ellas, de manera que sea mas fácil recordar que tarea realiza cada una. Siempre que sea posible, intentaremos mostrar diferentes formas de llevar a cabo las mismas acciones. Los esperamos la semana próxima.