TECNOLÓGICO PUERTO DE MEJILLONES MICROCONTROLADORES I
CARRERA: ELECTRÓNICA 33-400
PRACTICA Nº 4
INTERRUPCIONES CON EL PIC 16F877A
1. DEFINICION DE INTERRUPCIÓN
Una “interrupción” en un programa es como su nombre lo indica interrumpir el programa en
cualquier parte del mismo donde se ejecuta toda una rutina y subrutinas según la aplicación.
En el momento de producirse la interrupción, el PIC ejecuta un salto a la rutina de atención a
la interrupción, previamente definida por el programador, donde se atenderá a la demanda de
la interrupción
Inicio interrupción
Inicio
Entrada
s
Activación de
interrupción Procesos
Salidas
Ciclo continuo
Fin interrupción
Terminada la rutina de interrupción el programa vuelve al programa principal de donde se
provocó la interrupción y continua con la ejecución del programa.
2. SENTENCIAS DE INTERRUPCIONES
Se tienen diversos tipos de interrupciones dependiendo del tipo de microcontrolador (se
recomienda revisar la hoja técnica del microcontrolador a emplear), nosotros aplicaremos
para los ejemplos de programación los siguientes tipos:
- INTERRUPCIÓN EXTERNA POR RB0
Esta interrupción se la realiza por la entrada del pin B0, es decir por el cambio de estado de
este dependiendo de la configuración.
La directiva usada es “#INT_EXT” y se debe acompañar de las siguientes funciones:
EXT_INT_EDGE(H_TO_L); //cambio de estado de alto a bajo
EXT_INT_EDGE(L_TO_H); //cambio de estado de bajo a alto
Ing. Javier Tarqui Valeriano
TECNOLÓGICO PUERTO DE MEJILLONES MICROCONTROLADORES I
CARRERA: ELECTRÓNICA 33-400
ENABLE_INTERRUPTS(INT_EXT); //Habilita la interrupción RB0
ENABLE_INTERRUPTS(GLOBAL); //Habilita la interrupción de forma global
- INTERRUPCIÓN EXTERNA POR CAMBIO DE ESTADO DE RB4 – RB7
En este caso la interrupción se la realiza por cualquiera de los puertos: B4, B5, B6 o B7
La directiva usada es #INT_RB y se debe acompañar de las siguientes funciones
EXT_INT_EDGE(H_TO_L); //cambio de estado de alto a bajo
EXT_INT_EDGE(L_TO_H); //cambio de estado de bajo a alto
ENABLE_INTERRUPTS(INT_RB); //Habilita la interrupción
ENABLE_INTERRUPTS(GLOBAL); //Habilita la interrupción de forma global
3. MATERIALES
- Microcontrolador PIC 6f877a
- Resistencias, capacitores y oscilador de cristal que son parte del circuito del
microcontrolador
- Diodos Leds de iluminación
- Resistencias de protección de 330 Ω
4. DESARROLLO DE LA PRÁCTICA
Realizar el siguiente programa:
PROGRAMA 1.
Programar en el C – COMPILER el siguiente programa y luego simularlo en el PROTEUS
Llama a interrupción externa por RB0
Descripción: este programa coloca un led a la salida de la terminal B7, y va cambiar de estado
(de bajo a alto) cuando se llame a la interrupción por RB0, esta operación se va a realizar con un
pulsador; mientras no se llame a la interrupción, el programa realiza una rutina de secuencia de
luces por el puerto A
Programa:
#include <16f877a.h>
#fuses xt,nowdt
#use delay(clock=4M)
#int_ext //define interrupcion externa
void int_rb0() // nombre de la interrupcion, el void va por la precaucion
{
output_toggle(pin_b7); //al activarse la interrupcion cambia de estado b7
Ing. Javier Tarqui Valeriano
TECNOLÓGICO PUERTO DE MEJILLONES MICROCONTROLADORES I
CARRERA: ELECTRÓNICA 33-400
do
{ //esta instrucción hace que mientras este apretado el pin b0, se habilita
} // la interrupcion, y el pin b7 cambia de estado
while(input(pin_b0)==0);
}
void main()
{
set_tris_b(0b00000001); //configura el b0 como entrada
output_low(pin_b7); //inicializa en bajo la salida b7
port_b_pullups(true); //activa resistencia pullups de los puertos b para no colocar resistencias
enable_interrupts(int_ext); //habilita interrupcion
ext_int_edge(h_to_l); //la interrupcion se habilita cuando cambia de alto a bajo
enable_interrupts(global); //habilita interrupcion de forma global en cualquier instante del programa
while(true)
{
output_a(0b00000001); // programa principal
delay_ms(200); //mientras no haya interrupcion
output_a(0b00000011); // el programa realiza esta secuencia
delay_ms(200);
output_a(0b00000111);
delay_ms(200);
output_a(0b00001111);
delay_ms(200);
output_a(0b00000000);
delay_ms(200);
}
}
CIRCUITO EN PROTEUS
Tarea 1. Basado en el programa anterior el estudiante debe programar la secuencia de luces por
los puertos D y deben ser 5 leds, asi mismo el led que cambie de estado debe ser por el puerto
RA0, al llamar la interrupción
Ing. Javier Tarqui Valeriano
TECNOLÓGICO PUERTO DE MEJILLONES MICROCONTROLADORES I
CARRERA: ELECTRÓNICA 33-400
Implementar en el Protoboard, con el PIC el circuito
PROGRAMA 2. INTERRUPCIÓN POR CAMBIO DE ESTADO
Llama a interrupción por cambio de estado de RB4 – RB7
Descripción: en este programa utilizaremos la otra forma de interrupción que puede realizarse
por cualquiera de 4 entradas desde RB4 hasta RB7, es decir:
La rutina principal será un contador de 0 al 9 que tiene 4 salidas por el puerto RC0, RC1,
RC2, RC3 y que va a un decodificador BCD de 7 segmentos (74LS48) y cuya salida a
un display de 7 segmentos cátodo común
En los puertos RB4 al RB7, se tendrá pulsadores donde al apretar cualquiera de ellos
(dejándolo en el estado bajo), se llamara a la interrupción; y al soltar el pulsador se
vuelve a la rutina normal del programa principal
En la sub-rutina de la interrupción se tendrá dos leds que salgan por los puertos RB0 y
RB1, y cada que se llame a la interrupción estos cambiarán de estado
Programa
#include <16f877a.h>
#fuses xt,nowdt
#use delay(clock=4M)
int i;
#int_rb //define interrupcion externa por cambio de estado
//void int_rb0() // nombre de la interrupcion
{
output_toggle(pin_b0);
output_toggle(pin_b1);
do // este do while se hace solo como antirrebote
{ // cuando esta presionado el boton se llama a la interrupcion
} // al soltarlo vuelve a la rutina principal
while ((input(pin_b4)==0)||(input(pin_b5 )==0)||(input(pin_b6)==0)||(input(pin_b7 )==0));
}
void main()
{
set_tris_b(0b11110000); //configura el b7-b4 como entrada al colocar en 1
output_high(pin_b0); //inicializa en alto como salida b0
output_low(pin_b1);
port_b_pullups(true); //activa resistencia pullups de los puertos b para no colocar resistencais
enable_interrupts(int_rb); //habilita interrupcion
ext_int_edge(h_to_l); //la interrupcion se habilita cuando cambia de alto a bajo
enable_interrupts(global); //habilita interrupcion de forma global cualquier instante
Ing. Javier Tarqui Valeriano
TECNOLÓGICO PUERTO DE MEJILLONES MICROCONTROLADORES I
CARRERA: ELECTRÓNICA 33-400
while(true)
{
for(i=0;i<10;i++) //output_high(pin_d0); // programa principal
{
output_c(i); // esta salida d0 parpadea
delay_ms(500);
}
}
}
CIRCUITO EN PROTEUS
En base a lo descrito en las carcaterísitcas del programa, el estudiante realizará el diagrama del
circuito en PROTEUS y obtendrá la simulación
Implementar en el protoboard el circuito con el PIC
5. INFORME
Una vez concluida la práctica el o los estudiantes deben presentar en la siguiente clase el
informe de la práctica, que contenga los siguientes puntos:
Plano o layout del circuito con empleando un software especializado como el software
“fritzing” u otro
Listado del programa del PIC – C Compiler
Observaciones y conclusiones
Hoja de calculo
Ing. Javier Tarqui Valeriano
TECNOLÓGICO PUERTO DE MEJILLONES MICROCONTROLADORES I
CARRERA: ELECTRÓNICA 33-400
HOJA DE LABORATORIO
PRIMERA PARTE. Interrupción RB0
SIMULADOR (5%) CIRCUITO IMPLEMENTADO (12%)
SEGUNDA PARTE. Interrupción RB4 – RB7
SIMULADOR (8%) CIRCUITO IMPLEMENTADO (15%)
Integrantes del Grupo
Nombres y apellidos Practica s/45 Informe (s/15)
Firma del Docente
Ing. Javier Tarqui Valeriano