TUTORIAL: Programación de microcontroladores - Entrega 5

Ariel Palazzesi . Vista 33383 veces
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.

    14A1.jpg

    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.
    14A3.jpg

¿Y tú, qué opinas?

  • #1 Luis Carlos
    Luis Carlos miércoles, 04 de julio de 2007, 18:12

    GOSTEI MUITO DO ARTIGO SOBRE PIC. PORÉM VOCES PODERIAM PUBLICAR ALGO SOBRE 8051. ***MUITO OBRIGADO***.

    Responder >> Attention Minus Plus Votos: 0 de 4
  • #2 Gustavo
    Gustavo lunes, 19 de mayo de 2008, 01:59

    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.

    Responder >> Attention Minus Plus Votos: 1 de 1
  • #4 <a href="../../foro/member.php?u=10612" target="_self">erasmo_vega</a>
    erasmo_vega miércoles, 06 de agosto de 2008, 05:41

    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.

    Responder >> Attention Minus Plus Votos: 2 de 2
  • #5 <a href="../../foro/member.php?u=55991" target="_self">jorgekat112</a>
    jorgekat112 lunes, 05 de septiembre de 2011, 03:43

    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

    Responder >> Attention Minus Plus Votos: 0 de 0
  • Cargando...Cargando...

  • nuevo comentario
    Nombre

    Campo obligatorio

    Email

    Escriba una dirección de correo electrónico con el formato sunombre@ejemplo.com.

    Campo obligatorio

 
Ir arriba