Manejo de Salidas en un PIC16F877a usando lenguaje C

avatar

En los últimos temas nos hemos centrado de lleno en el aprendizaje sobre microcontroladores, sin embargo no debemos olvidar que los estamos estudiando como parte de un sistema más amplio como lo es un sistema electrónico en cuya estructura los microcontroladores estaran en el bloque de control.

Ahora que sabemos lo suficiente para iniciarnos en el amplio mundo de los microcontroladores vamos a ver cómo podemos crear un control basado en la activación de salidas, en el proceso aprenderemos a configurar estas y como ilustración diseñaremos un control para dos semáforos en un cruce ya que está basado en un programa que no requiere señales de entrada.

Implementación del programa en proteus para ser simulado. Fuente: @electrónico

Manejo de salidas en C

Una vez que se han configurado las salidas y limpiado es sencillo manejarlas, esto puede hacerse mediante la instrucción output_ que presenta dos variantes.

  • output_PORT(VALOR) que podemos usar para manejar un puerto completo donde PORT debe ser reemplazado por la letra correspondiente al puerto que deseamos manejar y VALOR por el valor que deseamos escribir en el puerto en binario, hexadecimal o cualquier otro siempre que respetemos la indicación de formato de datos usado.

Ejemplo para escribir un valor en el port d:
output_d(0xA2); Escribimos el valor en hexadecimal.
output_d(0b00010101); Escribimos el valor en binario, es más fácil ver cuales bits estamos activando y cuales no si usamos binario.

  • Output_ESTADO(PIN_BIT) este lo podemos usar para manejar un solo bit de cualquier puerto, ESTADO debe ser reemplazado por high si queremos colocar un estado alto o low si queremos colocar un estado bajo y en BIT debemos colocar el bit que deseamos modificar iniciando con la letra del puerto al que corresponde y luego el numero del bit correspondiente a ese puerto.

Si queremos poner a 1 el pin RD6 sería: output_high(PIN_D6);
Si queremos ponerlo a 0 entonces es: output_low(PIN_D6);

Estos datos deberían ser suficientes para el manejo de las salidas ahora veamos cuan útil puede ser diseñando nuestro primer programa.


Requerimiento:

Se quiere controlar un cruce de vías para vehículos mediante dos semáforos, uno para la vía horizontal y uno para la vertical.

Las luces verdes nunca deben estar encendidas de forma simultánea por cuestiones obvias. Tampoco se puede encender una luz verde cuando el otro semáforo mantiene su luz amarilla.

Para reducir tiempos en la simulación cada vía tendrá acceso durante 6 segundos de los cuales 5 corresponden a la luz verde y 1 a la luz amarilla, luego de eso aparecerá la luz roja prohibiendo el paso y habilitando la otra vía.


Recursos usados en el microcontrolador:

Se necesitan controlar 6 luces (2 rojas, 2 amarillas y 2 verdes) por lo que se usarán 6 pines configurados como salidas.

El semáforo vertical estará controlado por el PORTB sus pines B0, B1 y B2 (Verde, amarillo y rojo respectivamente) y el semáforo horizontal por el PORTD en sus pines D5, D6 y D7 (Verde, amarillo y rojo respectivamente)


Codigo a usar

Se programará en C usando los códigos de configuración descritos en el artículo Antes de programar un microcontrolador

Se usará la directiva fast_io para configurar los puertos que se usaran (PORTB y PORTD).

Se usarán las instrucciones para el manejo de salidas a nivel de bits ouput_high() y ouput_low()

Se usará la instrucción DELAY la cual permite añadir retardos antes de ejecutar la siguiente línea, con ella creamos los tiempos de espera entre los cambios de luces.

Se usará el bucle while para que nuestros semáforos inicien y operen mientras tengan energía sin que sean interrumpidos, es decir, un bucle infinito.


He escrito el código lo suficientemente comentado para que se entienda lo que representa cada línea.

Código del programa en C. Fuente: @electronico

dejaré el código a continuación para que sea más fácil de leer.


#include <16f877a.h> //Definimos el microcontrolador a usar.
#fuses HS,NOWDT,NOPUT,NOLVP,NOPROTECT,BROWNOUT //Definimos los fusibles
#use delay(clock=20M) // Definimos la frecuencia del reloj.
#use fast_io(B) //Usaremos el puerto B para el semáforo vertical
#use fast_io(D) // Usaremos el puerto D para el semáforo horizontal

void main() //Establecemos la estructura del programa principal
{
set_tris_b(0x00); //Configuramos el puerto B como salida.
set_tris_d(0x00); //Configuramos el puerto D como salida.
output_b(0x00); //Limpiamos el puerto B para evitar salidas erroneas.
output_d(0x00); //Limpiamos el puerto D para evitar salidas erroneas.

while(true) //Establecemos el bucle while para una ejecución infinita de nuestro código.
{
output_high(PIN_B2); //Poner en rojo el semáforo vertical.
output_low(PIN_D7); //Apagar luz roja del semáforo horizontal.
output_high(PIN_D5); //Poner en verde el semáforo horizontal.
delay_ms(5000); //5 segundos de espera
output_low(PIN_D5); //Apagar la luz verde del semáforo horizontal.
output_high(PIN_D6); //Encender luz amarilla del semáforo horizontal para anunciar el cambio a rojo.
delay_ms(1000); //1 Segundo de espera antes del cambio a rojo del semáforo horizontal.
output_low(PIN_D6); //Apagar luz amarilla del semáforo horizontal.
output_high(PIN_D7); //Poner en rojo el semáforo Horizontal.
output_low(PIN_B2); //Apagar luz roja el semáforo vertical.
output_high(PIN_B0); //Poner en verde el semáforo vertical.
delay_ms(5000); //5 segundos de espera
output_low(PIN_B0); //Apagar la luz verde del semáforo vertical.
output_high(PIN_B1); //Encender luz amarilla del semáforo vertical para anunciar el cambio a rojo.
delay_ms(1000); //1 Segundo de espera antes del cambio a rojo del semáforo horizontal.
output_low(PIN_B1); //Apagar luz amarilla del semáforo horizontal.
}
}


Para nuestra simulación en proteus usaremos:

  • 1 Microcontrolador PIC16F877a
  • Cristal oscilador de 20Mhz.
  • Una resistencia de 10K para el MCLR
  • Un pulsador para el MCLR
  • 6 resistencias de 250 ohmios para protección de las luces leds que se usaran.
  • 2 Dos luces leds rojas.
  • 2 Luces leds verdes.
  • 2 luces leds amarillas.

Se usan leds para representar las salidas del micro pero si queremos controlar un semáforo real no se deben colocar las luces directamente a los pines del microcontrolador ya que no tiene la suficiente potencia para encenderlas, en su lugar se debe acoplar esa salida como señal de "activación" de un circuito que maneje más potencia y pueda encender las luces de un semáforo real. Esto se ha explicado en artículos anteriores sobre relés y transistores.

Ahora veamos nuestra simulación.

Después de esto ya sabemos cómo manipular las señales de las salidas cuando necesitemos escribir valores en ellas.

Espero que haya sido de tu agrado y me despido como siempre agradeciendote por leer y quedando atento a tus comentarios.


Artículos relacionados.

Lecturas recomendadas

  • José M. Angulo Usategui, Ignacio Angulo Martínez, Microcontroladores PIC: Diseño práctico de aplicaciones (primera parte)
  • Ronald J. Tocci, Neal S. Widmer, Sistemas digitales: principios y aplicaciones
  • Albert Paul Malvino, Principios de electrónica, Sexta edición.
  • Robert L. Boylestad, Electrónica: Teoría de Circuitos.
  • Timothy J. Maloney, Electrónica Industrial, dispositivos y sistemas.



0
0
0.000
2 comments
avatar

Thanks for your contribution to the STEMsocial community. Feel free to join us on discord to get to know the rest of us!

Please consider delegating to the @stemsocial account (85% of the curation rewards are returned).

Thanks for including @stemsocial as a beneficiary, which gives you stronger support. 
 

0
0
0.000
avatar

Congratulations @electronico! You have completed the following achievement on the Hive blockchain And have been rewarded with New badge(s)

You received more than 5000 upvotes.
Your next target is to reach 6000 upvotes.

You can view your badges on your board and compare yourself to others in the Ranking
If you no longer want to receive notifications, reply to this comment with the word STOP

Check out the last post from @hivebuzz:

Our Hive Power Delegations to the November PUM Winners
HiveBuzz World Cup Contest - Recap of the last day of the group stage.
Feedback from the December Hive Power Up Day
0
0
0.000