Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Práctica 3.2
Tema: Interrupciones en C
10 Total
FECHA - CIUDAD
DEPARTAMENTO DE ELECTRICA Y ELECTRONICA
UNIDAD Nº3
Informe de práctica No. 3.2
1. Tema: Interrupciones en C
2. Objetivos:
3. Materiales
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:
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
Ilustración 1 (Imagen tomada del pdf 2DESCRIPCION GENERAL DEL PIC 16F877=
3.1.2. Lenguaje C
3.1.4. 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.
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.
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
fuses
NOCPD,
NOWDT
BROWNOUT
PUT,XT
NOWRT
NOLVP
NODEBUG
NOPROTECT
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_ADCCLOCK INTER
Setup_ADC PORTS(A0)
LCD_FNIT
RETURN
CONFIG PIC16F788A
CONFIGPIC
LCD_PUTC”VOLTIMETRO”
DELAY_msliad
Voltaje=(s*valorADC)/1023
LCD_PUTCVoltaje
INICIO 628a
CONFIG_PIC
Char k=0
Int X=0
KKbad_get()
SI
NO
SI
A71 Delay10ms A0
K=B
CONFIG PIC628
INIT_Kbd
TRISA 0X00
RETURN
INTERRUPCION
INICIO
INT_EXT
NO
RB00
SI
INICIO1
VECES217
RTCC236
CONT0
RETURN
INTERRUPCION
PAUSA
INT_RB
NO
RB00
SI
INICIO0
RETURN
INTERRUPCION
INICIO
RTCC238
VECES217
SI
RB00
INTERRUPT
NO
RETURN
INTERRUPCION
INICIO
VECES-1
RTCC238
SI NO
RB00 CONTCONT+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;
}
}
}
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