Sie sind auf Seite 1von 13

IESTP-SENATI

LABORATORIO DE CIRCUITOS ELECTRONICOS IV LABORATORIO N 7

INTERRUPCION POR RB0 (activacin por flanco)


P1) Interrupcin por RB0 y flanco de subida a) Para entender el funcionamiento de la interrupcin por RB0 y los recursos de PIC que se requieren, leer el archivo Luego compile el siguiente programa para interrupcin con RB0 #include <htc.h> #define _XTAL_FREQ 4000000 char x=0; void interrupt RB0_flanco(void){ x++; Designacin obligatoria de la pila de interrupciones PORTC = x; Nombre arbitrario para la pila __delay_ms(500); // INTF=0; // se desactiva las interrupciones } void main(){ TRISC=0; //configuro PORTC como salidas TRISB=0b11111111; //configuro PORTB como entradas RB7=0; //inicializo RB7 GIE=1; //habilito interrupcion global INTE=1; //habilito interrupcion externa por RB0. INTF=0; //Garantizar que no hay interrupcin por RB0 INTEDG=1; // Se activa la interrupcin por flanco de subida. while(1) //Bucle infinito hasta que se presente una interrupcin { RB7=~RB7 //pulsacin para verificacin de funcionamiento del PIC __delay_ms(200); } } b) Simularlo en MPLAB SIM para verificar su funcionamiento, simulando la entrada RB0 con Stimulus. Simule RB0 para la condicin de: b1) b2) . c) Simularlo en ISIS, usando un pulsador conectado al pin RB0 y verifique su funcionamiento. d) Describa el funcionamiento del circuito, basado en los resultados anteriores. e) Retire las barras inclinadas de INTF y simule el programa en C en MPLAB SIM; Qu diferencia hay con el funcionamiento anterior? Por qu? f) Simularlo en ISIS, usando un pulsador conectado al pin RB0 y verifique su funcionamiento. g) Al circuito anterior cambie el pulsador por una seal de reloj de frecuencia 5 o 10 Hz. Muestre en el osciloscopio la seal de reloj y los pines RC0 y RC1, y del resultado, describa el funcionamiento del programa.
NOTA: Use un circuito de entrada inicialmente en Vcc (1-logico) y que mediante un pulsador se conecta a GND (0-logico). Conctelo luego al revs para analizar su efecto.

Pila nica de interrupciones

P2) Interrupcin por RB0, flanco de subida y LCD Modifique el programa anterior para visualizar el valor de x en un LCD (6 hilos), con una frase que lo acompaa, valor de x= P3) Interrupcin por RB0 y flanco de bajada Repita la pregunta anterior, pero ahora para la activacin de la interrupcin por el flanco de bajada.

Ing. Armando A. Cajahuaringa Camaco

Pgina 1

P4) Sistema de alarma a) Compile el siguiente programa de una alarma. #include <htc.h> #define _XTAL_FREQ 4000000 void interrupt RB0_flanco(void){ if(RB1) // Si el interruptor de desactivacion esta abierto { RB7=1; // activa la alarma conectada en RB7 while(RB1); // mientras RB1=1, bucle infinito RB7=0; // cuando RB1=0, se desactiva la alarma } // INTF=0; // se desactiva las interrupciones } void main(){ TRISB=0b01111111; RB7=0; GIE=1; INTE=1; INTEDG=1; while(1); }

//configuro PORTB como entradas y una salida //inicializo RB7 para evitar disparo de alarma por ruido //habilito interrupcion global //habilito interrupcion externa por RB0. // Se activa la interrupcin por flanco de subida. //Bucle infinito hasta que se presente una interrupcin

b) Simule el cdigo anterior en MPLAB SIM, para analizar su funcionamiento. c) Simule el circuito en ISIS de Proteus, y use el depurador de ISIS, para analizar su funcionamiento. d) Basado en los resultados anteriores, describa el funcionamiento del circuito. P5) Interrupcin por cambio de nivel en RB4:RB7 a) Para entender el funcionamiento de la interrupcin por nivel RB4-RB7 y los recursos de PIC que se requieren, leer el archivo Luego compile el siguiente programa para interrupcin por RB4-RB7.

Ing. Armando A. Cajahuaringa Camaco

Pgina 2

#include <htc.h> #define _XTAL_FREQ 4000000 char x=0; void interrupt EXT_RB0(void){ x++; PORTC=x; // RBIF=0; // se desactiva las interrupciones } void main(){ TRISB=0b11111111; //configuro PORTB como entradas GIE=1; //habilito interrupcion global RBIE=1; //habilito interrupcion externa por RB0. while(1) //Bucle infinito hasta que se presente una interrupcin { RB7=~RB7 //pulsacin para verificacin de funcionamiento del PIC __delay_ms(200); } } b) Simularlo en MPLAB SIM para verificar su funcionamiento, simulando la entrada RB4 con Stimulus. c) Simularlo en MPLAB SIM para verificar su funcionamiento, simulando la entrada RB6 con Stimulus. d) Simularlo en ISIS, usando un pulsador conectado al pin RB4. e) Simularlo en ISIS, usando un pulsador conectado al pin RB6. f) Al circuito anterior cambie el pulsador por una seal de reloj de frecuencia 5 o 10 Hz. Muestre en el osciloscopio la seal de reloj y el pin RC4, y del resultado, describa el funcionamiento del programa. g) Al circuito anterior cambie el pulsador por una seal de reloj de frecuencia 5 o 10 Hz. Muestre en el osciloscopio la seal de reloj y el pin RC4 y RC6, y del resultado, describa el funcionamiento del programa. Qu diferencia con la anterior simulacin? P6) Interrupcin por cambio de nivel en RB4-RB7 Deseamos realizar un programa que detecte las veces que se ha producido una interrupcin externa, mostrndonos dicho nmero mediante los 4 leds conectados a los pines RB4-RB7. Nos falta definir el flanco activo de dicha interrupcin, para ello tenemos la siguiente funcin de control del procesador: ********************** MANEJO DE LA INTERRUPCIN EXTERNA ****************** con este ejercicio comenzamos a utilizar las interrupciones. Se desea contabilizar el nmero de veces que se ha producido la interrupcin externa, mostrndolo en los 4 bits de mayor peso del PORTB. ******************************************************************************/ //variables globales char i=0; int valores[10]=(0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90); void interrupt Ext_RB47( ) { i++ ; // sealo al siguiente nmero if(i>9) i=0; // si ha llegado a nueve, se reinicia PORTB = valores[i]; // visualizo valor RBIF=0; }

Ing. Armando A. Cajahuaringa Camaco

Pgina 3

void main() { TRISB=0x0f; PORTB=0x00; GIE=1; RBIE=1; //INTEDG=1; for(;;); }

// // // //

PORTB con RB0-RB3 como entradas; y RB4-RB7 como salidas. valor inicial del PORTB Permito todas las interrupciones habilitadas. Habilito la interrupcin externa por nivel de RB4 a RB7 // Interrupcion por cambio de nivel de bajo a alto // bucle infinito, esperamos una interrupcin

P7) Es una variacin sobre el ejercicio anterior, en el que el bucle infinito de espera lo hacemos mediante: a) while(1){} o while(1); b) do { }while(1); P8) Interrupcin por cambio de nivel en RB4:RB7 Seguidamente comenzamos el estudio de la interrupcin por cambio de nivel en cualquiera de los pines RB4-RB7. Para ello, realizaremos un sencillo ejercicio, en el cual detectaremos esta interrupcin y adems comprobaremos cual es el bit que ha modificado su nivel. El circuito que deberemos construir es:

Ing. Armando A. Cajahuaringa Camaco

Pgina 4

El programa (principal) que se ejecutar en modo continuo ser presentar un barrido sobre los 4 leds conectados al PUERTO A, y con una cadencia de 0,3 segundos. Cuando se active cualquiera de los pulsadores conectados desde RB4 a RB7, se debe producir una interrupcin, por cambio de nivel. Las acciones que se ejecutarn dentro de la rutina de atencin a esta interrupcin sern: Encendemos el led conectado al pin B0 (puertoB). Mostramos 0 en los leds conectados al puerto A , Esperamos 2 segundos en esta situacin Apagamos el bit indicador de interrupcin activada. Retornamos al programa principal.

/****************************************************************** ********INTERRUPCIONES POR CAMBIO DE NIVEL EN RB4 A RB7*************/ /***************************************************************** El programa (principal) que se ejecutar en nodo continuo ser presentar un barrido sobre los 4 leds conectados al PUERTO A, y con una cadencia de 0.3 segundos. Cuando se active cualquiera de los pulsadores conectados desde RB4 a RB7, se debe producir una interrupcin, por cambio de nivel. Las acciones que se ejecutarn dentro de la rutina de atencin a esta interrupcin sern: Encendemos el led conectado al pin RB0 (del PORTB). Mostramos 0 en los leds conectados al puerto A, Esperamos 2 segundos en esta situacin. Apagamos el bit indicador de interrupcin activada. Retornamos al programa principal. ******************************************************************/ a) Leer el archivo , y el cdigo del ejercicio 11 escrito en CCS, se ha adaptado el cdigo para el compilador Hi tech. Compile el siguiente programa para verificar que es correcto el cdigo equivalente en Hi Tech. #include <htc.h> #define _XTAL_FREQ 4000000 //DECLARACION DE FUNCIONES GLOBALES //DECLARACIN DE UARIABLES GLOBALES char last_b; //variable para almacenar el ultimo estado del puerto b // AQUI COMIENZA LA RUTINA DE SERUICIO A LA INTERRUPCIN POR CAMBIO DE NIVEL // EN LOS PINES RB4 a RB7 void interrupt RB47( ) { last_b = PORTB; //guardamos el valor del puerto RB0=1; //PONEMOS A 1 EL BIT RBO PARA INDICAR QUE SE HA //PRODUCIDO UNA INTERRUPCION PORTA=0x00; //apagamos los leds del PORTA __delay_ms(2000); //esperamos 2 segundos RB0=0; //PONEMOS A CERO EL BIT QUE INDICA LA INTERRUPCION RBIF=0; }

Ing. Armando A. Cajahuaringa Camaco

Pgina 5

/**************AQU COMIENZA EL PROGRAMA PRINCIPAL ***************************/ void main( ) { char led_on = 0b00000001; //led a iluminar TRISB=0b11111110; // PORTB todas entradas excepto RB0 TRISA=0x00; //PORTA todos salidas last_b = PORTB; GIE=1; RBIE=1; do { //AQUI COMIENZA EL BUCLE INFINITO ... do{ // iluminacin hacia la izquierda PORTA=led_on; led_on= 1 << led_on; // rotacion a la izquierda __delay_ms(300); }while( (led_on && 0b00001000) ==0); // Mascara para el bit3 de led_on do{ //iluminacin a la derecha PORTA=led_on; led_on=led_on >> 1; __delay_ms(300); }while((led_on && 0b00000001)==0); last_b = PORTB; //capturamos el estado del PORTB sin interrupcin }while(1); //AQUI TERMINA EL BUCLE INFINITO ...... } b) Simlelo en MPLAB SIM. Use los estmulos de entrada, mostradas en la figura. Simule primero en uno de los pines la transicin de , y luego otro pin con la transicin de

c) Simule el circuito en ISIS para verificar su funcionamiento. Verifique, con la herramienta de depuracin, desplazamientos a izquierdas y derechas.
Nota: En el ejercicio que acabamos de realizar, cada vez que accionamos el pulsador solo se produce una interrupcin, esto es debido a que el tiempo que lo mantenemos pulsado es inferior a los 2 segundos de retardo que hemos introducido en la rutina de atencin a las interrupciones.

Sobre el circuito de Proteus, si hacemos que el pulsador est presionado dure ms de 2 segundos, y cuando se haya retornado al programa principal soltamos el pulsador, comprobaremos que se salta otra vez a la rutina de interrupciones, esto es debido a que realmente se producen dos cambios de nivel, uno cuando pulsamos (el pin lo forzamos a valer 0) y otra al

Ing. Armando A. Cajahuaringa Camaco

Pgina 6

soltarlo, en que pasa a valer 1 (estado de reposo). Tenga esto en cuenta para posibles aplicaciones. P9) a) Lea el archivo he implemente el cdigo para la interrupcin RB4-RB7, pasndolo del cdigo del compilador CCS al cdigo para el compilador Hi Tech. #include <16F877.h> //Configuracin de los fusibles. #FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG #use delay(clock=4000000) //Frecuencia de reloj 4MHz #byte puerto_B = 0x06 // Identificador para el puerto B. #byte puerto_D = 0x08 // Identificador para el puerto C. #int_RB void RB_isr(void) //funcin de interrupcin { switch(puerto_B) { case 239: puerto_D = 0x06; break; case 223: puerto_D = 0x5B; break; case 191: puerto_D = 0x4F; break; case 127: puerto_D = 0x66; break; default: break; } } void main() { set_tris_b(0xFF); //Puerto B como entrada set_tris_d( 0x00 ); // Puerto D como salida. enable_interrupts(INT_RB);//habilita interrupcin particular enable_interrupts(GLOBAL);//habilita interrupcin global puerto_D =0x00; //inicializo puerto D while(True) { //cdigo principal } } b) Simule el cdigo en MPLAB SIM y verifique su funcionamiento. c) Simule el cdigo y el circuito en ISIS y verifique su funcionamiento. d) Cul es la diferencia entre las interrupciones por RB0 y por RB4-RB7? P10) Teclado 4x4 Enunciado En esta prctica vamos a conectar a nuestro PIC un teclado matricial de 4 filas por 4 columnas. Queremos atender un teclado matricial (pasivo) y aprender como conectarlo. Al mismo tiempo se busca eliminar los rebotes mecnicos de los pulsadores y disponer de una asignacin dinmica de valores a las pulsaciones obtenidas. En una segunda parte buscamos atender el teclado usando interrupciones, lo que permitir al microcontrolador no dedicarse en exclusiva a

Ing. Armando A. Cajahuaringa Camaco

Pgina 7

la atencin de teclado. Al mismo tiempo tendremos una oportunidad inmejorable de aplicar el modo SLEEP de bajo consumo del microcontrolador y comprobarlo. Especificaciones Se pide realizar la programacin necesaria para escanear el teclado matricial y su conexin hardware. La rutina deber devolver un valor numrico entre 1 y 16 dependiendo de la tecla pulsada. Si no se puls ninguna tecla deber devolver el valor 0. Es muy interesante hacer una traduccin de la tecla hardware pulsada con el valor serigrafiado en los pulsadores. Realiza la traduccin mediante una tabla. Para sacar nota Los rebotes mecnicos son un efecto no deseado. Cmo los eliminaras? Desarrllalo. Si el microcontrolador est esperando a que el usuario pulse una tecla, entonces es buena idea dormir el micro para reducir el consumo elctrico utilizando la instruccin SLEEP. Las interrupciones lo despertarn. Comprueba experimentalmente la reduccin del consumo. Diagramas Se muestra el diagrama fsico de un teclado

Circuito de ejemplo a) Esquema hardware

Ing. Armando A. Cajahuaringa Camaco

Pgina 8

b) Programa Compile el programa para el manejo del teclado. #include <htc.h> // #include "binario.h" #define _XTAL_FREQ 100000000 const unsigned char Teclas[]={0, 7, 8, 9,0xF, 4, 5, 6,0xE, 1, 2, 3,0xD, 0xC, 0,0xB, 0xA}; unsigned char TECLADO_Scan() { unsigned char Tecla=1; //; Muestrea el teclado //; 1. Pone la variable Tecla a 1 para el primer codigo //; 2. Pone todas las filas de salida a 1, excepto la fila //; a muestrear que tiene un 0. //; 3. Se chequea cada columna de entrada buscando el 0 //; Si no hay ninguna tecla pulsada la columna se leera //; como un 1 gracias a las resistencias de pull - up . //; Si esta pulsada se leera un 0. //; 4. Se continua el proceso con todas las filas. //; Si se ha pulsado una tecla, se sale de la rutina con //; el valor de la tecla pulsada en la variable Tecla //; Col. 1 2 3 4 //; Fila +----+----+----+----+ //; 1 | 1 | 2 | 3 | 4 | //; +----+----+----+----+ //; 2 | 5 | 6 | 7 | 8 | //; +----+----+----+----+ //; 3 | 9 | 10 | 11 | 12 | //; +----+----+----+----+ //; 4 | 13 | 14 | 15 | 16 | //; +----+----+----+----+ //; Si no se ha pulsado ninguna tecla //; se sale con el valor 0 en Tecla . //; Si se pulsan dos o mas teclas a la vez, solo la //; primera (siguiendo el orden) se detecta. PORTB = 0b00001110; // Saco un cero en la fila cero // RBIF = 0; // Borro la notificacion (por si interrupciones se usa) while(1) { if ((PORTB & (1<<4))==0) return Tecla; // Comprueba la primera columna Tecla++; if ((PORTB & (1<<5))==0) return Tecla; // Comprueba la segunda columna Tecla++; if ((PORTB & (1<<6))==0) return Tecla; // Comprueba la tercera columna Tecla++; if (( PORTB & (1<<7))==0) return Tecla; // Comprueba la cuarta columna Tecla++; if (Tecla==17) return 0; // Si no se pulso ninguna retorna cero PORTB = PORTB << 1; // Selecciona otra fila } return 0; }

Ing. Armando A. Cajahuaringa Camaco

Pgina 9

void main() { unsigned char T; ADCON1 = 7; // TRISB = 0xF0; // TRISA = 0x00; // // RBPU = 0; // while(1) { T = TECLADO_Scan (); // T = Teclas[T]; // PORTA = T; } } Configuro el PORTA como digital RB0 .. RB3 salidas , RB4 .. RB7 entradas RA0 .. RA4 salidas Resistencias pull-up entradas activas

Comprueba el teclado Traduce

c) Simlelo en MPLAB SIM para verificar su funcionamiento. Explique las funciones que existen. d) Simlelo en ISIS para verificar su funcionamiento. P11) Repetir las preguntas a), b) y c) para el siguiente programa, al que se ha separado la funcin del teclado en un archivo . Programa si el contenido de la funcin de teclado. #include <htc.h> #define _XTAL_FREQ 40000000 unsigned char TECLADO_Scan();

//declaracion de funcion //arreglo con los numeros del teclado

const unsigned char Teclas[]={0, 7, 8, 9,0xF, 4, 5, 6,0xE, 1, 2, 3,0xD, 0xC, 0,0xB, 0xA}; void main() { unsigned char T;

ADCON1 = 7; // Configuro el PORTA como digital TRISB = 0xF0; // RB0 .. RB3 salidas , RB4 .. RB7 entradas TRISA = 0x00; // RA0 .. RA4 salidas nRBPU = 0; // Resistencias pull-up entradas activas while(1) { T = TECLADO_Scan (); // Comprueba el teclado T = Teclas[T]; // Traduce PORTA = T; // Para ver el numero de la tecla en binario. } }

Ing. Armando A. Cajahuaringa Camaco

Pgina 10

Archivo teclado1.c #include <htc.h> unsigned char TECLADO_Scan() { unsigned char Tecla=1; //; Muestrea el teclado //; 1. Pone la variable Tecla a 1 para el primer codigo //; 2. Pone todas las filas de salida a 1, excepto la fila //; a muestrear que tiene un 0. //; 3. Se chequea cada columna de entrada buscando el 0 //; Si no hay ninguna tecla pulsada la columna se leera //; como un 1 gracias a las resistencias de pull - up . //; Si esta pulsada se leera un 0. //; 4. Se continua el proceso con todas las filas. //; Si se ha pulsado una tecla, se sale de la rutina con //; el valor de la tecla pulsada en la variable Tecla //; Col. 1 2 3 4 //; Fila +----+----+----+----+ //; 1 | 1 | 2 | 3 | 4 | //; +----+----+----+----+ //; 2 | 5 | 6 | 7 | 8 | //; +----+----+----+----+ //; 3 | 9 | 10 | 11 | 12 | //; +----+----+----+----+ //; 4 | 13 | 14 | 15 | 16 | //; +----+----+----+----+ //; Si no se ha pulsado ninguna tecla //; se sale con el valor 0 en Tecla . //; Si se pulsan dos o mas teclas a la vez, solo la //; primera (siguiendo el orden) se detecta. PORTB = 0b00001110; // Saco un cero en la fila cero // RBIF = 0; // Borro la notificacion (por si interrupciones se usa) while(1) { if ((PORTB & (1<<4))==0) return Tecla; // Comprueba la primera columna Tecla++; if ((PORTB & (1<<5))==0) return Tecla; // Comprueba la segunda columna Tecla++; if ((PORTB & (1<<6))==0) return Tecla; // Comprueba la tercera columna Tecla++; if (( PORTB & (1<<7))==0) return Tecla; // Comprueba la cuarta columna Tecla++; if (Tecla==17) return 0; // Si no se pulso ninguna retorna cero PORTB = PORTB << 1; // Selecciona otra fila } return 0; } P12) Teclado con lcd. a) Se probara otra librera para teclado. Compile el siguiente cdigo, configurando el para que el nible superior del PORTD sea de datos, que Para completar el proyecto, adjunte a la carpeta de sea el , sea

, el archivo

, que tie-

Ing. Armando A. Cajahuaringa Camaco

Pgina 11

ne el PORTB configurado para el teclado. Por simplicidad no se han incorporado retardos de tiempos. selos en donde sea conveniente. #include <htc.h> #include <stdio.h> #include "lcd_6hilos.h" #define _XTAL_FREQ 4000000 unsigned char lee_teclado(void); //funcion que esta en teclado.c char mensaje[16]; void main(){ TRISC=0; TRISB=0; PORTC=0; nRBPU=0; //Habilita que las entradas del PORTB esten en ALTO (Pull-Up) lcd_init(); lcd_gotoxy(0,0); lcd_puts("tecla presionada"); for(;;) { PORTC=lee_teclado(); lcd_gotoxy(1,1); sprintf(mensaje," tecla= %3c",PORTC); lcd_puts(mensaje); } } Guardar el siguiente contenido en un archivo teclado. #include <htc.h> #define Fil_1 RB4 #define Fil_2 RB5 #define Fil_3 RB6 #define Fil_4 RB7 /* convierte numero de tecla en carcter a generar */ unsigned const char tabla_teclado[]={'7','4','1','A','8','5','2','0', '9','6','3','B','C','D','E','F'}; unsigned const char secuencia[]={0xFE,0xFD,0xFB,0xF7}; unsigned char lee_teclado(void) { unsigned char i; for (i=0;i<4;i++) { PORTB=secuencia[i]; TRISB=secuencia[i]; if (!Fil_1) return tabla_teclado[i*4]; if (!Fil_2) return tabla_teclado[i*4+1]; if (!Fil_3) return tabla_teclado[i*4+2]; if (!Fil_4) return tabla_teclado[i*4+3]; } return 0; } b) Simular el programa en MPLAB SIM para analizar el funcionamiento del sistema teclado LCD c) Simularlo en ISIS para verificar su funcionamiento, siguiendo la implementacin del siguiente circuito. . Este archivo usa todo el PORTB para el

Ing. Armando A. Cajahuaringa Camaco

Pgina 12

d) Cambie la secuencia de los valores de miento mediante la simulacin en ISIS.

y verifique su correcto funciona-

Ing. Armando A. Cajahuaringa Camaco

Pgina 13

Das könnte Ihnen auch gefallen