in

TUTORIAL: Programación de microcontroladores – Entrega 5

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.


TUTORIAL: Programación de microcontroladores - Entrega 5

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.

Reportar

¿Qué te pareció?

Escrito por Ariel Palazzesi

4 Comments

Leave a Reply
  1. Super bueno este tutorial, yo estudio ing electronica y estaba aprendiendo el ASM puro, pero con esto es de muchisima ayuda.

    ¿Hay alguna version descargable de los tutoruales?

    gracias.

  2. muy interesante el tutorial..
    me ayudo mucho…
    y si qiero hacer lo siguiente?

    Utilizando el convertidor A/D del PIC16F877A construya un voltímetro digital de 2 dígitos de precisión con un rango de medición de 0 a 5 voltios.

  3. pues he estado probando lo de los encendido de los led y la verdad la rutina de retardo no funciona o no me funciona en la simulacion nos e que pasa el prgama se queda hay estancado

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Proxology: Navega por páginas restringidas

Extensys 4000: Alarga tu pene