Está en la página 1de 19

UNIVERSIDAD ANDRÉS BELLO

FACULTAD DE INGENIERÍA

INGENIERÍA EN AUTOMATIZACIÓN Y ROBÓTICA

Prácticas 2-3
Interrupciones en Microcontrolador,
Uso de pantalla LCD utilizando teclado
matricial
PIC16F877-A
Asignatura
Microcontroladores.

Profesora
Johanna V. Alvarado Neira.

Integrantes
Rafael Rodríguez
Javier Silva

18 de mayo del 2019


Contenido
Introduccion................................................................................................................................... 3
Objetivos generales ........................................................................................................................ 3
Marco teorico................................................................................................................................. 3
Interrupciones ................................................................................................................................ 5
Interrupciones en C ........................................................................................................................ 6
Temporizadores ............................................................................................................................. 7
LCD y teclado matricial ................................................................................................................. 8
Simulación................................................................................................................................... 10
LCD y teclado matricial ................................................................................................................. 15
Codigos de programación ............................................................................................................. 16
Conclusión ................................................................................................................................... 19
Bibliografia .................................................................................................................................. 19

imagen 1 ............................................................................................................................ 4
imagen 2 ............................................................................................................................ 5
imagen 3 ............................................................................................................................ 6
imagen 4 ............................................................................................................................ 6
imagen 5 ............................................................................................................................ 7
imagen 6 ............................................................................................................................ 8
imagen 7 ............................................................................................................................ 9
imagen 8 .......................................................................................................................... 10
imagen 9 .......................................................................................................................... 11
imagen 10 ........................................................................................................................ 12
imagen 11 ........................................................................................................................ 13
imagen 12 ........................................................................................................................ 13
imagen 13 ........................................................................................................................ 14
imagen 14 ........................................................................................................................ 15
imagen 15 ........................................................................................................................ 16

2
Introduccion
En este informe se pondrán en práctica los ejemplos vistos en clase sobre el PIC 16F877A,
específicamente interrupciones, timers, LCD y teclado matricial. Se mostrará una simulación
en proteus 8 professional y luego se examinará a fondo el código de cada simulación. se debe
tener conocimiento previo de los tipos de interrupciones que posee el microcontrolador a
utilizar, y el uso de librerías que requiere el uso de la pantalla LCD y el teclado.

Objetivos generales
Estudiar de forma práctica los conceptos vistos en clase sobre el PIC 16F877A en 3 circuitos
los cuales están orientados en la aplicación de los timers, interrupciones, LCD y teclado
matricial.
Objetivos específicos
• Identificar componentes a utilizar en la simulación del proyecto.
• Programar el proyecto en el programa CCS C Compiler.
• Identificar el archivo compilado .hex el cual será el que se grabará en el PIC.
• Simular en Proteus 8 Professional para verificar su funcionamiento.
• Realizar el proyecto en la protoboar

Marco teorico

PIC 16F877A
El Datasheet del PIC, indica el voltaje de alimentación necesario para el correcto
funcionamiento de este (5V DC) y los pines correspondientes, además se utilizará el
encapsulado 40-Pin PDIP, el cual posee 40 pines.

3
imagen 1

Se debe tener en cuenta los puertos que posee, este PIC tiene 5, y cada uno tiene
características especiales o cierta cantidad de pines como se detallan en el Datasheet; puerto
A (PORTA) 6 pines de conexión, puerto B (PORTB) 8 pines de conexión, puerto C (PORTC)
8 pines de conexión, puerto D (PORTD) 8 pines de conexión, puerto E (PORTE) 3 pines de
conexión.

4
Interrupciones
Las interrupciones se utilizan para interrumpir la ejecución del programa ya sea de forma
interna o externa la cual puede ser ejecutada mediante periféricos o vía software. Si la
interrupción es ejecutada a través de pines específicos se dice que es una interrupción
externa, por otra parte, si la interrupción es ejecutada por un periférico interno o está
ejecutada en el programa se denomina interrupción interna.
Cuando ejecutamos una interrupción, el PIC salta automáticamente y ejecuta la porción de
programa que corresponde a la atención de la interrupción hasta llegar a la instrucción
RETFIE. Al encontrar dicha instrucción, abandona la interrupción y retorna a la posición de
memoria del programa principal desde la que saltó al producirse la interrupción.
Las fuentes de interrupción dependen del PIC utilizado, la familia PIC16F87X tiene entre 13
y 14, algunas de ellas son:
• Interrupción por pin externo. El pin del puerto B: rb0 está multiplexado con la función
de interrupción externa.
• Por desbordamiento del TMR0 (TiMeR 0).
• Por cambio en los pines de puerto B (RB7 : RB4).
• Por cambio en el Módulo Comparador.
• Interrupciones varias USART (Universal Sincronous Asincronous Receiver Tx).
• Interrupción por el Conversor A/D.
Los PIC gama baja y media tienen un único vector de interrupción situado en la dirección
04h de la memoria del programa, mientras que los de gama alta tienen 2 interrupciones de
alta y baja prioridad situados en la dirección 08h y 18h respectivamente. Al tener un único
vector de interrupción, el PIC cuenta con unos registros de control, y mediante la utilización
de banderas o flags (El usuario puede determinar la causa de la interrupción). En estos
registros también se pueden habilitar o no las distintas fuentes de interrupción (máscaras de
interrupción). Y existe una habilitación general llamada INTCON.
Registro INTCON
INTCON permite la habilitación de las interrupciones y el manejo de los flags. La
habilitación general se activa mediante el bit GIE(INTCON), el cual cuando se responde a
una interrupción, GIE es inhabilitado para evitar interrupciones sucesivas. Los flags activos
deben ser borrados antes de abandonar la rutina de interrupción para evitar re-entradas
erróneas.

imagen 2

Existen 4 registros adicionales para gestión de interrupciones: PIR1, PIR2, PIE1 y PIE2.

5
Interrupciones en C
En el compilador C, la directiva que se utiliza para el manejo de interrupciones es
#INT_XXXX. Los posibles formatos son:

imagen 3

Al utilizar las directivas de interrupción, el compilador genera el código necesario para


ejecutar la función que sigue a la directiva. Además, genera el código necesario para guardar
el contexto y también borra el flag activo por la interrupción.
El compilador C incluye funciones para el mejor manejo de las directivas de interrupción:
enable_interrupts(nivel);
nivel es una constante definida en un fichero de cabecera y genera el código necesario para
activar las máscaras correspondientes, afectando a los registros INTCON, PIE1 y PIE2. En
el PIC 16F877A, algunos de los “niveles” permitidos son:

imagen 4

6
Temporizadores
Los microcontroladores poseen temporizadores integrados los cuales tienen la particularidad
de emplear el conteo de Ciclos de Máquina para generar demoras que son siempre múltiplos
de él. Otra posibilidad de algunos temporizadores integrados es la de ser utilizados como
contadores de eventos externos a través de un pin específico de algún puerto del
microcontrolador.
La cuenta máxima de un temporizador es de 255, el incremento es constante, ascendente e
independiente. Dentro de los temporizadores tenemos el contador, el cual cuenta los eventos
externos (a través del pin RA4/TOCK1), el temporizador, el cual cuenta los pulsos internos
del reloj. Se puede insertar un prescaler, es decir, un divisor de frecuencia programable que
se puede dividir por 2, 4, 8, 16, 32, 64, 128 o 256. La frecuencia de conteo es una cuarta parte
de la frecuencia de reloj (fosc/4). Posteriormente, con el uso del prescaler se puede dividir la
frecuencia.
Los registros implicados en la configuración del TIMER0/WDT son los siguientes:
• OPTION_REG: configura el “hardware” del TIMER0/WDT.
• INTCON: permite trabajar con la interrupción del TIMER0/WDT.
• TRISA: habilita la línea de puerto RA4.

imagen 5

7
imagen 6

El tiempo de desbordamiento del TIMER0 se calcula de acuerdo a la siguiente ecuación:

donde 𝑇𝐶𝑀 es el ciclo de máquina que se puede calcular mediante la ecuación:

En el caso de la primera etapa se ocupará el comando INT_EXT, el cual es una interrupción


externa activada por RB0 y en el segundo circuito se ocupará el comando INT_RTCC, el
cual es una interrupción por desbordamiento de TMR0.
Además, para habilitar estas interrupciones y todas en general se deben activar mediante la
línea de instrucción “enable_interrupts(GLOBAL);” y después bajar de nivel ocupando el
mismo comando, cambiando lo que está entre paréntesis, en el caso de este proyecto las líneas
correspondientes serán: “enable_interrupts(INT_EXT);” que activa las interrupciones
externas, y “enable_interrupts(INT_TIMER0);” que activa las interrupciones por el desborde
de TMR0. Dónde van estas líneas de instrucción se detalla en la página correspondiente a la
programación

LCD y teclado matricial


Para utilizar el teclado matricial de 3x4 se debe conectar al Puerto B del PIC mientras que la
pantalla LCD debe ir en el puerto D, En la primera línea del LCD debe aparecer la palabra
tecla, mientras que en la segunda se debe mostrar los caracteres que corresponden al que se
esté presionando en el teclado matricial. Para el correcto desarrollo del proyecto se debe tener
en cuenta el uso de la instrucción “lcd_gotoxy(byte x, byte y);” el cual indicara la posición
que queremos que muestre los datos entregados por el teclado.
Ademas tenemos la instrucción “lcd_putc(char s);” la cual escribe la variable en la posición
correspondiente. Si, además, se indica:

8
❖ \f Limpia el LCD
❖ \n El cursor va a la posición (1,2)
❖ \b El cursor retrocede una posición

imagen 7

El uso del LCD se debe complementar con una librería con los parámetros vistos en clases.
Como el “kbd_init();” para iniciar el teclado y el “kbd_getc();” que permite obtener el
carácter ingresado por el teclado.
En la práctica se utilizará por ejemplo la siguiente línea de instrucción “lcd_putc,”\ nTEMP=
%1.2fC"”, el cual está utilizando la función “\n” el cual indica que va a la posición 1,2 de la
pantalla, además del “%1.2fc”, que indica que se van a mostrar números con coma y un valor
flotante truncado con un carácter.

9
Simulación
Antes de comenzar con la simulación, se debe configurar el clock externo y su respectivo
reset. Para esto se necesita:
• 2 condensadores cerámicos con la misma capacitancia, que estén dentro del
rango de 15 a 33 pF.
• 1 cristal de 20 Mhz.
• 1 condensador electrolítico de 1 μF.
• 1 resistencia de 4.7 KΩ.
• 2 pulsadores.
• 3 resistencias de 220 Ω.
• 3 diodos leds.
• 1 PIC 16F877A.
• Proteus 8 Professional

imagen 8

10
Para la primera parte de la práctica se utilizará el mismo circuito para la interrupción de
pulsador y la interrupción de timer, donde se hará las conexiones correspondientes al
pulsador (RB0) y los leds con sus respectivas resistencias. Para el caso de la interrupción por
timer se ocupa el mismo esquema, pero solo se utilizarán los leds conectados a RA0 y RA1.

imagen 9
Luego, en el programa CCS C Compiler se deben escribir los codigos correspondientes a
cada simulación los cuales serán analizados al detalle a continuación, siendo el primer
código de la interrupción por pulsador y el segundo por Timmer.

11
imagen 10

12
Timer

imagen 11

Una vez escrito los codigos en el CCS C Compiler, se debe hacer click en la opción “compile”
(ver imagen 12) y se guardara el código en la carpeta que donde guardó el proyecto, donde
debemos identificar el archivo .hex el cual se debe grabar en el PIC.

imagen 12

Para grabar el código escrito en CCS C Compiler, en Proteus se hace doble click sobre el
microncontrolador y se desplegará el siguiente menú, donde se configurará el oscilador en

13
“Processor Clock Frequency” estableciéndolo en 20MHz, y para cargar el programa se debe
seleccionar en la opción “Program File” la pequeña imagen de una carpeta, en donde
aparecerá una ventana con los archivos del código anteriormente guardados en la carpeta de
destino que se le haya dado, y se procederá a seleccionar el archivo con la extensión “.hex”

imagen 13

14
LCD y teclado matricial
Para la segunda parte del proyecto el cual corresponde al teclado matricial y el LCD, se
utilizará el siguiente esquema de conexiones, donde se realizan las correspondientes
conexiones del teclado y el LCD siendo en el Puerto B y Puerto D respectivamente. Tal
como se muestra en la figura a continuación.

imagen 14

Escribimos el código correspondiente a esta práctica en el programa CCS C Compiler como


se muestra a continuación.

15
imagen 15

Codigos de programación

Código 1: interrupción por botón

#include <16F877A.H>
#fuses HS
#use delay (clock=20000000)
#byte PORTA = 0x05
#byte TRISA = 0x85
#byte PORTB = 0X06
#byte TRISB = 0X86
#byte OPTION_REG = 0X81
#INT_EXT

void ext_isr(){
bit_clear(PORTA,1); //se limpia las salidas de RA1 y RA2
bit_clear(PORTA,2);

bit_set(PORTA,0); //se tira un “1” lógico a la salida


RA0
delay_ms(500);

16
bit_clear(PORTA,0); //se tira un “0” lógico a la salida
RA0
//led parpadeante (inicia al presionar el
botón)
}
void main(){
OPTION_REG=0X00;
TRISA=0x00;
PORTA=0X00;
TRISB=0XFF;
PORTB=0X00;

enable_interrupts(GLOBAL); //habilita las


interrupciones
enable_interrupts(INT_EXT); //habilita la interrupción
externa con RB0
ext_int_edge(L_TO_H); //flanco LOW to HIGH (de 0 a 1)

while(true){

bit_set(PORTA,0);
bit_clear(PORTA,1);
bit_clear(PORTA,2);
delay_ms(1000);

bit_set(PORTA,1);
bit_clear(PORTA,0);

bit_clear(PORTA,2);
delay_ms(1000);

bit_set(PORTA,2);
bit_clear(PORTA,1);
bit_clear(PORTA,0);
delay_ms(1000);
//secuencial simulando semáforo simple
}
}

Codigo 2: Interrupcion por Timer

#include <16F877A.H>
#fuses HS
#use delay(clock=20000000)
#byte PORTA = 0X05
#byte TRISA = 0X85

17
#byte OPTION_REG=0x81
#INT_TIMER0
void timer0_isr(){
bit_set(PORTA,1);
delay_ms(3);
bit_clear(PORTA,1);
set_timer0(0x00);
}
void main (){
TRISA = 0X00;
PORTA = 0X00;
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_TIMER0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
set_timer0(0x00);
while (true){
bit_set(PORTA, 0);
}
}

Codigo 3: Teclado matricial y LCD

#include <16f877A.h>
#fuses hs
#use delay(clock=20000000)
#define use_portb_kbd TRUE
#include <LCD.C>
#include "KBD1.C"
void main()
{
lcd_init();
kbd_init();
char k;
port_b_pullups(TRUE);
while(true)
{
k=kbd_getc();
if(k!=0)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"tecla:");
lcd_gotoxy(1,2);
printf(lcd_putc, " %c ",k);
}
}
}

18
Conclusión
La experiencia recientemente vista tiene como finalidad ayudar al lector a comprender y a
como utilizar el PIC 16F877A en proteus mediante la simulación para luego ser llevado a la
práctica, además de la implementación de otros componentes de la electrónica y periféricos
para el PIC.

Bibliografia
[1] Datasheet PIC16F87XA, Microchip Technology Inc. USA, 2003.

19

También podría gustarte