Pages Menu
TwitterFacebook



BANNER2_ALT

Posted by on Abr 15, 2014 in PIC | 6 comments

Semaforo+Interrupciones PIC16F84A

Semaforo+Interrupciones PIC16F84A

Semáforo multífunción con PIC16F84A Empleando interrupciones.

Autor: Luis Alberto Guijarro Rodríguez

 Descripción.

En el siguiente tutorial se mostrara como elaborar el firmware para un Semáforo multifunción empleando el PIC16F84A. Si bien un Semáforo puede parecer algo simple la ventaja del código es que se emplearan las interrupciones del microcontrolador, en este caso  la interrupción externa (INT) que se localiza en el bit RB0 del puerto B y también se utilizará una interrupción por cambio de nivel (RB), en este caso la que se localiza en el bit RB4.

 Dicho firmware se realizara en lenguaje C con el programa MPLAB y el traductor CCS. Además se mostrara la simulación del funcionamiento del Semáforo a través del programa ISIS de Proteus.

 Inicialmente vamos a indicar cuales serán las funciones que realizara el microcontrolador para el funcionamiento del Semáforo dependiendo de en que modo de operación se encuentre y que botón se presione.

 A.- Cuando se presione el botón de “reset” el PIC se reiniciara a su estado inicial de funcionamiento automático y ejecutando la función 1 del Semáforo.

B.- En el modo automático el Semáforo funcionara como su nombre lo indica, de forma automática, con cierta duración de encendido en cada color del Semáforo, en este caso, dos secuencias de tiempo distintas y para cambiar de una a otra se deberá presionar el botón de “Temporización”. Las dos diferentes secuencias se describen a continuación.

I.- La secuencia 1 será la secuencia inicial, es decir, la que el microcontrolador ejecutara una vez encendido el circuito: la luz verde quedara encendida 6 segundos, 5 parpadeos de un segundo en la luz amarilla y por último la luz roja quedara encendida por 4 segundos. Esta secuencia se repetirá mientras no se oprima el botón de “Temporización”.

II.- Al oprimir el botón de “Temporización” el Semaforo pasara a la secuencia 2: la luz verde encendida 4 segundos, 4 parpadeos de un segundo en la luz amarilla y finalmente la luz roja encendida 6 segundos. De igual forma a la secuencia anterior esta se repetirá mientras no se presione de nuevo el botón de “Temporización”, de lo contrario regresara a la secuencia 1.

C.- Si se presiona el botón “Auto/Manual” mientras se está en el modo automático el Semáforo pasara al modo manual en el que cada luz (verde, amarillo y rojo) permanecerá encendida por tiempo indefinido y cambiara hasta que se presione el botón de temporización, pasando de la verde a la amarilla (con parpadeo), de la amarilla a la roja y finalmente regresará de la roja a la verde.

D.- Si se oprime de nuevo el botón “Auto/Manual” el semáforo pasara del modo manual al modo automático ejecutando la función 1.

 

Materiales.

En este caso a falta de un micro controlador que se emplea en dicho tutorial para la elaboración del Semáforo, solo se hará la simulación, para ello vamos a necesitar los siguientes programas:

  • MPLAB
  • Traductor CCS del compilador PIC-C
  • Simulador ISIS del programa PROTEUS

 

Introducción.

El micro controlador  PIC16F84A cuenta con dos puertos, el puerto A de 5 bit (RA0-RA4) y el puerto B de 8 bits (RB0-RB7), los cuales pueden ser programados como entradas o como salidas, o inclusive programar algunos bits de un puerto como entrada y el resto de bits de ese mismo puerto como salidas. Para llevar a cabo dicha programación de puertos se requiere estipularlo en el registro del puerto que se desea programar.

 Otra característica de este microcontrolador es que cuenta con una entrada de interrupción externa y con entradas de interrupción por cambio de nivel.

 A continuación se muestran dos tablas, la primera con la  descripción del puerto B y la segunda con los registros asociados a este, ambas tablas obtenidas de la datasheet del microcontrolador.

Semáforo

Tabla 1 de descripion

 

 

Semáforo

Tabla 2 de descripcion

 

 

Procedimiento.

 A continuación de mostrará el proceso para capturar el programa del Semáforo, vincular el traductor y compilar.

 Primero se abre el programa MPLAB y se abre una nueva página del editor de textos en Menú Principal -> FILE -> NEW, en esta página en blanco capturaremos el siguiente código el cual cuenta con comentarios que lo describen.

#include <16f84a.h>          //PIC a utilizar
#fuses XT,NOWDT,NOPROTECT,NOPUT       //ordenes para el programador
#use delay (clock=4000000) //Se usaran retardos tomando en cuenta que la frecuencia del
//oscilador es de 4Mhz
#use fast_io(a)         //Rápida entrada y salida

 
int Modo=1, Temp=1, i=0;  //Declaración de variables del tipo entero

//Prototipo de la funcion que configurara los puertos
void Config_Puertos(void);
//Funciones de interrupciones
#INT_EXT     //Para la interrupción INT (RB0)
void EXT_isr(void)
{
Modo++;
if(Modo==3)
{
Modo=1;
Temp=1;
}
}

#INT_RB       //Para la interrupción RB (RB4)

void RB_isr(void)
{
if(input(PIN_B4))
{
Temp++;
}
if(Modo==1 && Temp==3)
{
Temp=1;
}
if(Modo==2 && Temp==4)
{
Temp=1;
}
}
///Programa principal

void main(void)
{
Config_Puertos();//Llamado a funcion
while(true)
{
if(Modo==1)//Modo automatico
{
output_low(PIN_A2); //led verde off
output_low(PIN_A1); //led amarillo off
output_low(PIN_A0); //led rojo off
if(Temp==1)//Temporizacion 1
{
output_high(PIN_A2); //led verde on
delay_ms(6000);
output_low(PIN_A2); //led rojo off
for(i=0;i<=4;i++)
{
output_high(PIN_A1); //led amarillo on
delay_ms(500);
output_low(PIN_A1); //led amarillo off
delay_ms(500);
}
output_high(PIN_A0);//lrd rojo on
delay_ms(4000);
output_low(PIN_A0); //led rojo off
}
if(Temp==2)//Temporizacion 2
{
output_high(PIN_A2); //led verde on
delay_ms(4000);
output_low(PIN_A2); //led rojo off
for(i=0;i<=3;i++)
{
output_high(PIN_A1); //led amarillo on
delay_ms(500);
output_low(PIN_A1); //led amarillo off
delay_ms(500);
}
output_high(PIN_A0);//lrd rojo on
delay_ms(6000);
output_low(PIN_A0); //led rojo off
}
}
if(Modo==2)//Modo manual
{
while(Temp==1)
{
output_high(PIN_A2); //led verde on
output_low(PIN_A1); //led amarillo off
output_low(PIN_A0); //led rojo off
}
while(Temp==2)
{
output_low(PIN_A2); //led verde off
output_high(PIN_A1); //led amarillo on
delay_ms(500);
output_low(PIN_A1); //led amarillo off
delay_ms(500);
output_low(PIN_A0); //led rojo off
}
while(Temp==3)
{
output_low(PIN_A2); //led verde off
output_low(PIN_A1); //led amarillo off
output_high(PIN_A0); //led rojo on
}
}
} //bucle infinito
}

 void Config_Puertos(void)
{
set_tris_A(0xF8); //portA como salidas(RA0, RA1 y RA2 ,las demas desactivadas)
set_tris_B(0xFF);
enable_interrupts(GLOBAL); //todas las interrupciones activadas
enable_interrupts(INT_EXT);//Habilitando interrupcion externa (RB0)
enable_interrupts(INT_RB);//Habilitando interrupciones de cambio de nivel (RB4-RB7)
ext_int_edge(H_TO_L);//Seleccionando flanco de interrupcion externa
output_low(PIN_A2); //led verde off
output_low(PIN_A1); //led amarillo off
output_low(PIN_A0); //led rojo off
Modo=1;
Temp=1;
}

 

Una vez capturado el código se guarda de la siguiente forma FileàSave As… y se nombra el archivo y se selecciona la carpeta en que se va a guardar, este archivo tendrá una extensión .c.

 A continuación se va a construir el proyecto. MPLAB es una plataforma de programa en la cual se puede realizar desde la edición del código de programa, las compilación del programa, la simulación del programa y la programación del microcontrolador, todo ello sin necesidad de recurrir a otro programa, para utilizar todas las herramientas con las que cuenta MPLAB IDE es necesario la creación de un Proyecto en el cual se vinculen las diferentes herramientas a manejar, los pasos a seguir en la creación de un proyecto son los siguientes:

 Desde el menú principal se selecciona ProjectàProject Wizard…,. De forma casi instantánea aparecerá la ventana de bienvenida del ayudante Project Wizard de MPLAB, de forma general son cuatro pasos a seguir en la creación de un proyecto.

 Paso 1.- Se presiona Next y la ventana cambiara a una en la que tenemos que elegir el microcontrolador que se va a emplear, en este caso DeviceàPIC16F84A, y damos clic en Next.

Paso 2.- Seleccionar el compilador a usar (language toolsuit). En la nueva ventana se deben configurar los siguientes aspectos:

a)    En el recuadro Active Toolsuit se debe seleccionar  CCS C Compliler.

b)    En el recuadro Toolsuit Contents se debe cerciorar que cada programa tenga su ruta correctamente direccionada a la carpeta PICC correspondiente, en nuestro caso solo será la siguiente.

 

Toolsuit Contents

Location

CCS C Compiler (ccsc.exe)

C:\Program Files\Picc\CCSC.exe

 

Una vez terminado este paso damos clic en Next.

 Paso 3.- En la nueva ventana que aparece se debe ingresar el nombre con el que se desea nombrar al proyecto y la dirección donde se va a guardar dicho proyecto. Una vez hecho esto se da clic en Next.

Paso 4.- En la nueva ventana, del lado izquierdo se deben de buscar dos archivos

a)    El archivo con la extensión .c del código que capturamos previamente.

b)    Un archivo con extensión .h que se localiza en C: \Program Files\PICC\Devices\16F84A.h

 Incorporados los dos archivos se da clic en Next.

 A continuación aparece una ventana indicando las propiedades del nuevo proyecto que se está creando, si se comprobó que todo está correcto se da clic en Finish.

 Si los pasos se realizaron correctamente aparecerá la ventana Project con el nombre que se le dio al proyecto, esta contiene los archivos .c y .h que seleccionamos.

 Ahora procederemos a configurar las opciones del proyecto (Build Options). Antes de iniciar con la compilación y simulación, es necesario verificar que el compilador CCS C Compiler (nuestro traductor) se encuentre correctamente configurado, para ello se realiza lo siguiente, Menú PincipalàProjectàBuild OptionsàProject. Al hacer esto aparecerá una nueva ventana de configuración, en esta seleccionaremos la pestaña General. Al seleccionar esta pestaña aparecen una serie de recuadros, solo tendremos que configurar el recuadro de Include Search Path ingresando en este la ruta C:\Program Files\PICC\Devices. Una vez hecho esto se da clic en OK.

 El último paso en MPLAB es compilar el proyecto, esto se hace de la siguiente forma, Menú PrincipalàProjectàBuild All. Si todo se realizó correctamente y no hay errores en el código, la compilación del proyecto se llevará a cabo correctamente son errores.

 Simulación.

Para llevar a cabo la simulación del funcionamiento del Semáforo y verificar que el programa funcione como lo deseamos primero es necesario construir el circuito que se muestra a continuación en el programa ISIS de PROTEUS.

 

Semáforo con PIC16F84A empleando interrupciones.

Semáforo

Diagrama de simulación del Semáforo

 

 

Se debe recordar que el cristal es de una frecuencia de 4MHz. Una vez construido el circuito se va cargar el archivo de programa que simulara el microcontrolador. Esto se hace dando doble clic en el microcontrolador y en la opción Program File se selecciona el archivo .hex que estará ubicado en la dirección en la que se creó el proyecto en MPLAB, este archivo tendrá el mismo nombre que el proyecto pero con una terminación .hex. De igual forma en la opción Processor Clock Frecuency escribiremos 4MHz. Una vez hecho esto damos clic en OK.

 Ahora se puede proceder a dar Play a la simulación, esto se hace dando clic en el botón Play ubicado en la parte inferior izquierda de la ventana de ISIS de PROTEUS.

 Si todo está correcto el circuito debe funcionar de la misma forma en que se describió al principio.

 Cabe mencionar que la interrupción, como su nombre lo indica, interrumpe a la función que se esté ejecutando, pero que una vez que se sale de la interrupción se regresa al punto de la función que interrumpió, por lo que se debe de esperar a que termine esa secuencia para ver el cambio que provoco la interrupción, en este caso los tiempo de encendido de cada luz del Semáforo.

 

Autor: Luis Alberto Guijarro Rodríguez

6 Comments

  1. necesito ayuda con el codigo, no me funciona en arduino

    • Kevin, tienes alguna duda? no podemos ayudar si no sabemos que pasa.

  2. Necesito un poco de ayuda con el codigo… lo estoy tratando de cargar con arduino y me lanza un error

    • ¿Cual es el error que te marca? PD: Este codigo NO es de Arduino.

  3. si no popnemos los interruptores aun asi funcionara

Post a Reply

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