Está en la página 1de 16

DEPARTAMENTO DE ELECTRICA Y ELECTRONICA

ÁREA DE SISTEMAS DIGITALES

ASIGNATURA: MICROCONTROLADORES NRC: …….

Práctica 3.2

Tema: Interrupciones en C

Docente: Carlos Ponce

Equipo #: 1 Integrantes: 1 Almachi Diego


2 Fernández Leonardo

Base Aspectos de evaluación Calificación


0.25 Fundamento teórico
0.25 Diagrama de bloques
0.50 Tabla de asignación de variables
3.5 Informe 1.00 Diagrama de flujo
1.00 Programa
0.25 Conclusiones
0.25 Diagrama electrónico
1.00 Presentación del circuito, condiciones
4.5 Funcionamiento 1.00 Funciones (Inicio - Paro)
2.50 Indicador tensión LCD
2.0 Defensa

10 Total

Sangolquí – 04 de febrero de 2018

FECHA - CIUDAD
DEPARTAMENTO DE ELECTRICA Y ELECTRONICA

UNIDAD Nº3
Informe de práctica No. 3.2

1. Tema: Interrupciones en C

2. Objetivos:

- Programar microcontroladores utilizando interrupciones en lenguaje C.

3. Materiales

- Microcontrolador PIC 16F877A.


- LCD 16x2
- Microcontrolador PIC 16F62X
- Teclado matricial 4x4.
- Fuente de alimentación.
- Protoboard
- Multímetro
- Cristal 4Mhz
- Capacitores, resistencias, dipswitch, leds. Cables.
- Computador
- Grabador de PICs

4. Procedimiento

En base al Pic 16F877A, diseñar un voltímetro digital, en donde la variación de tensión que ingresa
por el canal 0, se podrá observar en un LCD con dos décimas de resolución. Adicionalmente el
voltímetro digital funcionará un minuto cada vez que se ha presionado la tecla inicio.

El voltímetro digital requiere de dos funciones ingresadas por teclado, que podrán ser ejecutadas en
cualquier momento:

1. INICIO: Permite iniciar el funcionamiento del voltímetro.


2. PAUSA : Permite pausar el funcionamiento si aún no ha transcurrido un minuto de
funcionamiento. Para reiniciar el funcionamiento deberá presionarse nuevamente
INICIO.

NOTA:
Se presenta los siguientes requerimientos para la implementación:
- La programación será en lenguaje ensamblador.
- Se deberán utilizar las siguientes interrupciones:
Teclado (INT)
Timer (0, 1 o 2)
- Conversor análogo digital
5. Contenido
3.1.Fundamento teórico

3.1.1. Pic

Es un microcontrolador que usa del tipo RISC, posee una arquitectura


minimalista. Los microcontroladores que produce Microchip cubren
una amplio rango de dispositivos cuyas características pueden variar
como sigue:

 Tecnología de la memoria incluida (EEPROM, ROM, Flash)


 Voltajes de operación (desde 2.5 V. Hasta 6V)
 Empaquetado (desde 8 patitas hasta 80 patitas)
 Frecuencia de operación (Hasta 48 Mhz)

Ilustración 1 (Imagen tomada del pdf 2DESCRIPCION GENERAL DEL PIC 16F877=

3.1.2. Lenguaje C

C es un lenguaje de programación de propósito general que ofrece


economía sintáctica, control de flujo y estructuras sencillas y un buen
conjunto de operadores. No es un lenguaje de muy alto nivel y más
bien un lenguaje pequeño, sencillo y no está especializado en ningún
tipo de aplicación. Esto lo hace un lenguaje potente, con un campo
de aplicación ilimitado y sobre todo, se aprende rápidamente. En
poco tiempo, un programador puede utilizar la totalidad del lenguaje.

Este lenguaje ha sido estrechamente ligado al sistema operativo


UNIX, puesto que fueron desarrollados conjuntamente. Sin embargo,
este lenguaje no está ligado a ningún sistema operativo ni a ninguna
máquina concreta. Se le suele llamar lenguaje de programación de
sistemas debido a su utilidad para escribir compiladores y sistemas
operativos, aunque de igual forma se puede desarrollar cualquier tipo
de aplicación.
3.1.3. Pic C compiler
PIC C es una herramienta que permite programar un
microcontrolador por medio de lenguaje C, a diferencia del lenguaje
máquina o ensamblador (ASM) que se maneja por defecto, este hace
los programas más fáciles de escribir, analizar y comprender. PIC C
ha sido desarrollado por PIC CMU, y cuenta con una gran cantidad
de librerías o drivers que permiten optimizar los programas en el
momento de manejar dispositivos externos, tales como pantallas
LCD, memorias, conversores, etc. Queremos destacar que el orden
de este mini-tuto se basó principalmente en el libro Compilador C
CCS y simulador Proteus para Microcontroladores PIC, de Eduardo
García.

 Crear un Proyect Wizard nuevo.

 Elegir el microcontrolador a utilizar dado por la opción DEVICE.

 Crear un nuevo archivo con extensión .C y nombre cualquiera

 Agregar el archivo .C como un SOURCE FILE.

 Seleccionar la opción build all.

 Seleccionar si el dese que el programa solo funcione desde el


ordenador donde fue realizado o no (depende del usuario).

3.1.4. LCD

El esquema correspondiente al circuito de este display se encuentra


en la siguiente figura:

Ilustración 2(Display led "Tomado de Informatica.UV")

Los displays LCD son mayoritariamente estándar y se controlan de formas


muy parecidas, incluso cuando no coincide el número de caracteres. En la
figura podemos ver los elementos básicos de un display LCD estándar. Por
un lado se tiene el bus de datos D0..D7 que en este caso está conectado al
puerto B del PIC. Este bus de datos puede ser de entrada al LCD (para
escribir caracteres y enviar instrucciones) o puede ser de salida del LCD
(para poder leer el estado por ejemplo). El LCD tiene tres señales de
control: E es la de habilitación y está conectada al bit 2 del puerto A del
PIC, sirve para habilitar el LCD y como vemos está conectada a un
interruptor para deshabilitar permanentemente el LCD; la señal R/W sirve
para indicar operación de lectura o escritura; por último se la señal RS es
la de sincronismo de datos e instrucciones y está conectada al bit 1 del
puerto A. Además el LCD tiene señales para alimentación y una señal
(VEE) que sirve para controlar el contraste de la pantalla.

Para simplificar las operaciones de escritura y control en el LCD, se provee


un fichero (lcd.h) disponible en la página web de la asignatura. Este fichero
contiene varias rutinas muy útiles entre las que destacan las siguientes:

• LCD_Prepara() Esta rutina prepara los puertos A y B de forma adecuada


y pone las señales de control en un estado de preparado.
• LCD_Ini() Esta rutina envía al LCD la secuencia de inicialización. Esta
rutina es necesaria al encender el LCD y debe venir siempre después de la
rutina anterior.
• LCD_Comando(char) Esta rutina permite enviar cualquier comando o
instrucción al LCD. Hay numerosas instrucciones, todas ellas se pueden
consultar en el manual del LCD que se puede encontrar en la página web
de la asignatura. Por ejemplo:

 LCD_Comando(0b00111100) indica que el bus de datos es de 8


bits, que se van a utilizar las 2 líneas del LCD con una fuente 5x10.
 LCD_Comando(0b00001110) enciende el LCD para que se vea,
enciende el cursor y le dice que no parpadee.
 LCD_Comando(0b10000000 + pos) mueve el cursor hasta una
posición determinada por el parámetro pos:; // Pos = 0x40 para el
principio de la segunda fila.
 LCD_Comando(0b00000001) hace un reset del LCD barrando su
contenido y posiciona el cursor en la posición 0x00.

• LCD_Dato(char) Si todo se ha iniciado bien, esta instrucción muestra por


pantalla el carácter que se le pase en la posición actual del cursor. En
principio basta con estas cuatro funciones para operar con el LCD.

Es bastante aconsejable tener cerca el manual del LCD para ver los
comandos de control, ya que son muy útiles. Estos comandos permiten
apagar y encender la pantalla, mostrar el cursor, llevar el cursor a una
determinada posición, limpiar la pantalla, etc. Es importante que los
conmutadores de la placa EduMIC que sirven para elegir Analógico o
Digital estén en su posición central (LIBRE) de esta manera los per

3.1.5. Interrupciones
Se le llama interrupción a un salto especial a una subrutina que no está
contemplado en un punto específico del programa principal, sino que puede ocurrir
en cualquier punto de éste y no es provocado por una instrucción en el programa,
sino por un evento interno o externo al sistema del microcontrolador.

Los dispositivos que manejan eventos capaces de provocar una solicitud de


interrupción se denominan fuentes de interrupción. La familia del PIC16F87x
cuenta con hasta 14 fuentes de interrupción, de las cuales algunas de ellas se
habilitan por medio del registro de control INTCON, otras, sin embargo, como la
del convertidor A/D se encuentra en el registro PIE1, en este mismo registro está el
bit del TIMER1 (TMRIE ,PIE1) entre otros.

INT
Interrupción externa por RB0/INT Las transiciones de bajo a alto, o viceversa, de la
patilla RB0/INT puede ocasionar una interrupción, el flanco que la producirá se
elige con el bit INTEDG (OPTION_REG). Cuando este bit se pone a uno, la
interrupción tendrá lugar en la transición de cero a uno, por el contrario, el flanco de
bajada ocasionará la interrupción cuando el bit se coloque a cero. En cuanto tenga
lugar en la patilla RB0/INT el flanco elegido, el bit INTF (INTCON) se pondrá a
uno; el estado de los bits de interrupciones globales (GIE) e interrupción externa
(INTE) determina si se atenderá o no la interrupción. Si están habilitadas y el
microcontrolador se encuentra en reposo (Sleep) éste despertará.

TMR0
. Interrupción de TMR0 Si el temporizador TMR0 se ha desbordado, el flag de
overflow (T0IF) del registro INTCON se habrá puesto a uno. Es evidente que
previamente se habrán borrado todos los flags que pudieran ocasionar una
interrupción, así se evitarán interrupciones recursivas. Para habilitar esta
interrupción se debe poner en 1 el bit T0IE.

CALCULO DEL CIRCUITO

Para interrupciones de 1 segundo

1520 ∗ 4000000
𝑐𝑎𝑟𝑔𝑎𝑇 =
4 ∗ 𝑃𝑅𝐸𝑆𝐶𝐴𝐿𝐴𝐷𝑂𝑅
PRESCALADOR=256

1 ∗ 4 ∗ 106
𝑐𝑎𝑟𝑔𝑎𝑇 =
4 ∗ 256
3906= Vlor inicial timer valor contador a reducir
3906=18 x 217
RTCC=256-18
RTCC=238
CONTADOR=217

6. Diagrama de bloques

Tension
11
16F877 DISPLAY
2 A LCD
3
16F628
teclado A

7. Tabla de asignación de variables y configuración

 fuses
 NOCPD,
 NOWDT
 BROWNOUT
 PUT,XT
 NOWRT
 NOLVP
 NODEBUG
 NOPROTECT

VALOR_ADC Toma el valor de 1 a 1023


VOLTAJE Toma el valor de 1 a 5
CONT Valor que toma el contador del timer
ACU Acumulador que cuenta cada desborde del timer

Para el 628
K Toma el valor del teclado matricial
X Transforma el valor de ascii a entero

8. Diagrama de flujo

CONFIG PIC

Setup_ADCCLOCK INTER
Setup_ADC PORTS(A0)
LCD_FNIT

RETURN

CONFIG PIC16F788A

CONFIGPIC

LCD_PUTC”VOLTIMETRO”

DELAY_msliad
Voltaje=(s*valorADC)/1023

LCD_PUTCVoltaje

INICIO 628a

CONFIG_PIC

Char k=0
Int X=0

KKbad_get()

K=A A01 Delay10ms A00

SI

NO

SI
A71 Delay10ms A0
K=B

CONFIG PIC628

INIT_Kbd
TRISA 0X00

RETURN
INTERRUPCION
INICIO

INT_EXT

NO
RB00

SI
INICIO1

VECES217
RTCC236
CONT0

RETURN

INTERRUPCION
PAUSA

INT_RB

NO
RB00

SI
INICIO0

RETURN
INTERRUPCION
INICIO

RTCC238
VECES217

SI
RB00
INTERRUPT

NO

RETURN

INTERRUPCION
INICIO

VECES-1

RTCC238

SI NO
RB00 CONTCONT+1 CONT=60

NO SI
INICIO=0

RETURN
9. Programa
PROGRAMA 16F77A
#include <16f877a.h>
#device ADC = 10
#fuses
NOCPD,NOWDT,BROWNOUT,PUT,XT,NOWRT,NOLVP,NODEBUG,N
OPROTECT
#use delay(clock=4M)
#define lcd_data_port getenv("sfr:portd")
#define lcd_enable_pin pin_d2
#define lcd_rs_pin pin_d0
#define lcd_rw_pin pin_d1
#include <lcd.c>
int16 valor_adc;
float voltaje;
int VECES,cont;
int inicio=0;
#int_rtcc// esta diseñado para un segundo por lo tanto, cada ves que cuenta
uno hasta llegar a 60 mi variable inicio se pondra en 0
void timer_0(){
VECES--; //Se decrementa la variable VECES
SET_RTCC(238); //Se carga el timer con 238
IF(VECES==0) //Pregunta si VECES ya llego a cero
{
cont=cont+1;
if(cont==45){
inicio=0;
}
}
}

#int_ext//Interrupcion para iniciar el codigo, pone en 1 mi inicio y ejecuta


mi ciclo while y resetea mi timer
void int_rbO()
{
inicio=1;
VECES=217;
SET_RTCC(238);
cont=0;
}

#int_rb//interrupcion para la pausa, pone en 0 mi variable inicio, por lo tanto


no corre mi ciclo while lo detiene.
void int_rb0()
{
inicio=0;//cuando se activa la interrupcion el pin b7 cambia de estado
do
{
}while(input(pin_b4)==0||input(pin_b5)==0||input(pin_b6)==0||input(pin_b7
)==0);//es para antirebote

void main(){
VECES=217;
cont=0;
set_tris_b(0b11110001);
setup_counters(rtcc_internal,rtcc_div_256);
set_rtcc(238);
enable_interrupts(int_rtcc);
enable_interrupts(int_ext);
enable_interrupts(int_rb);
ext_int_edge(h_to_l);// cuando nuestro pin b0 pasa de un alto a un bajo se
active la interrupcion
port_b_pullups(true);
enable_interrupts(global);
SETUP_ADC(ADC_CLOCK_internal);
SETUP_ADC_PORTS(ALL_ANALOG);
SET_ADC_CHANNEL(0);
lcd_init();
lcd_putc("\f VOLTIMETRO");
a:
WHILE(inicio==1){
valor_adc=READ_ADC();
voltaje=5.0*valor_adc/1023.0;
lcd_gotoxy(3,2);
printf(lcd_putc,"VALOR= %fV",voltaje);
}
goto a;
}

PROGRAMA 16F628A
#include <16f628a.h>
#fuses xt,nowdt,noprotect,noput
#use delay(clock=4M)
#define use_portb_kbd true
#include<kbd4x4_1.c>
char k;
int x;
void main(){
port_b_pullups(true);//resistencias pull up del puerto
kbd_init();//inicializo el teclado
while(true){
k=kbd_getc();//captura el valor que se pulso en el teclado
x=k-48;//convierto el caracter en numero entero
if(k!=0){
if(k=='A'){
output_low(pin_a0);
delay_ms(10);
output_high(pin_a0);
delay_ms(10);
}
if(k=='B'){
output_low(pin_a1);
delay_ms(10);
output_high(pin_a1);
delay_ms(10);
}
}
}
}
10. Diagrama electrónico
11. Conclusiones
 Las interrupciones son partes del programa que funcionan como su nombre lo dice
para interrumpir la operación del pic y saltar a una instrucción específica, para este
caso se pudo observar que dependiendo de las diferentes interrupciones toca hacer
cálculos diferentes, por lo cual un buen desarrollo de fórmulas como por ejemplo
para el TIMER 0, hará que este funcione a la perfección o con errores.
 Las interrupciones funcionan en pines específicos y pueden ser programadas para
ordenes específicas, por lo cual, los pines en los cuales van a ser usadas o llamadas
deberían estar libres y entregar el nivel sea alto o bajo según la programación para
poder ser llamadas, ya que un fallo en esto provocara un bucle infinito en la
interrupción.
12. Bibliografía

Fernando E. PRIMERA 2007 Español Marcombo


Microcontroladores: fundamentos y Valdés Pérez,
aplicaciones con PIC Ramón Pallás
Areny
Programación de microcontroladores Ibrahim Dogan PRIMERA 2006 Español Marcombo
PIC

También podría gustarte