Reporte Practica7

21
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE ESTUDIOS SUPERIOR ARAGÓN INGENIERIA EN COMPUTACIÓN ALUMNO: BAUTISTA LÓPEZ HÉCTOR HUÉMAC: 410008500 REPORTE DE PRÁCTICA No 7 MATERIA: LABORATORIO DE MICROPROCESADORES Y MICROCONTROLADORES GRUPO: CICLO ESCOLAR 8557 2013 - 2 PROFESOR:

Transcript of Reporte Practica7

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICOFACULTAD DE ESTUDIOS SUPERIOR ARAGÓN

INGENIERIA EN COMPUTACIÓN

ALUMNO:

BAUTISTA LÓPEZ HÉCTOR HUÉMAC: 410008500

REPORTE DE PRÁCTICA No 7

MATERIA:

LABORATORIO DE MICROPROCESADORES Y MICROCONTROLADORES

GRUPO: CICLO ESCOLAR

8557 2013 - 2

PROFESOR:

HERNÁNDEZ HERNÁNDEZ ALDO

CIUDAD NEZAHUALCÓYOTL A 4 DE MAYO DE 2013

INTRODUCCIÓN

Las interrupciones de los microcontroladores PIC de la gama media son interrupciones enmascarables y fijas, de modo que se pueden habilitar o inhabilitar globalmente y además cada fuente de interrupción se puede habilitar o inhabilitar individualmente. Para que una solicitud de interrupción se haga efectiva, tanto la fuente de la interrupción como el sistema en su conjunto deben estar habilitados. El sistema se habilita o inhabilita globalmente mediante el bit GIE del registro de funciones especiales INTCON.

Los dispositivos con posibilidad de interrumpir se habilitan o inhabilita, individualmente mediante bits de los registros INTCON, PIE1 y PIE2.

Al ser todas las interrupciones fijas, todas las solicitudes, si están habilitadas, hacen que el microcontrolador pase a ejecutar la instrucción que esté en la dirección 4 de la memoria de programa. Dentro de la rutina de atención a la interrupción, el programador debe averiguar la fuente de la interrupción consultando los bits apropiados en los registros de funciones especiales (INTCON, PIR1 y PIR2) asociados al sistema de interrupción del PIC.

Cuando se produce una solicitud de interrupción, si el sistema en su conjunto y la fuente en particular están habilitados, el microcontrolador termina la instrucción en curso, guarda en la pila el valor del contador de programa y salta a la dirección 4 de la memoria de programa.

El tiempo transcurrido entre el momento en que se produce la solicitud de interrupción y el comienzo de la ejecución de la primera instrucción de la subrutina de atención a la interrupción (la que está en la dirección 4), está entre 3 y 3,75 ciclos de máquina. Este es el denominado tiempo de latencia de la interrupción, cuyo valor exacto depende del momento en que se produce la solicitud dentro de un ciclo de máquina y de la fuente de interrupción (si es interna o externa).

La figura 2 ilustra las operaciones que tienen lugar en el microcontrolador durante el tiempo de latencia. En primer lugar se completa la instrucción que estaba en curso cuando se produjo la solicitud de interrupción; a continuación se guarda en la pila el valor del contador del programa (PC), que apunta a la siguiente instrucción, y finalmente se pone el valor 0004 en el PC, con lo cual se salta la primera instrucción de la rutina que atiende la solicitud de interrupción. Al atender una solicitud de interrupción, el sistema de interrupciones queda inhabilitado (el bit GIE es puesto a 0).

Cada módulo de entrada y salida puede generar al menos una solicitud de interrupción. Entre las posibles fuentes de interrupción están las siguientes:

1. Interrupción externa por el terminal INT del microcontrolador. 2. Interrupción por cambio en el nivel lógico de las entradas RB4:RB7 del Puerto B. 3. Interrupción por desbordamiento de los temporizadores Timer0, Timer1 y Timer2. 4. Interrupción por algún evento en el módulo CCP. 5. Interrupción por el puerto serie USART. 6. Interrupción por el convertidor A/D. 7. Interrupción por la finalización de escritura en la EEPROM.

Todos los PIC de la clase media usan al menos un registro de funciones especiales para controlar las interrupciones, a continuación se describe cada uno:

INTCON.- En este registro se controla la interrupción externa (proveniente del terminal INT), la interrupción por cambio en los terminales RB4 a RB7 y la interrupción por desbordamiento del Timer0. Hay también un bit (GIE) para habilitar globalmente el sistema de interrupción. Las restantes fuentes de interrupción se controlan con los registros PIE1, PIR1, PIE2 y PIR2. La figura 3 muestra los bits del registro de control de las interrupciones INTCON.

Para conocer el significado de cada bit del registro INTCON, será necesario que te auxilies con la hoja de datos del microcontrolador.

OPTION.-Controla del comportamiento del TMR0,tiene un bit relacionado con interrupciones externas, TMR0 almacena el valor del contador que funciona continuamente e incrementa el valor almacenado una unidad con cada impulso de reloj, cada vez que llega al valor FF regresa a 00, esto genera una interrupción en dado caso que se le haya autorizado; este ciclo continúa indefinidamente. El registro TMR0 puede leer o escribir directamente con cualquier instrucción para conocer su posición actual o inicializarlo en un registro determinado, es importante recordar que la escritura en este registro se necesita un retardo de dos ciclos de instrucción para retomar el incremento. La figura 4 muestra los bits de registro de control de interrupciones OPTION.

Para conocer el significado de cada bit del registro OPTION, será necesario que te auxilies con la hoja de datos del microcontrolador.

RBI.-Consiste en el cambio de nivel en los pines RB7 a RB4, para producir este cambio se activa la bandera RBIF del registro INTCON; al igual que el registro GIE tienen que estar a 1. Este tipo de interrupciones están pensadas para un teclado matricial de 16 teclas (4 x 4). Los pines RB7 a RB4 se configuran como entrada y se considera como interrupción externa si algunos de los pines cambia de estado.

TIMER 0, TIMER 1, TIMER 2.- Son generadas por TF0, TF1 y TF2 cuando se produce un desbordamiento en el registro del Timer correspondiente, la bandera que esté activada es borrada por el hardware cuando es vectorizada la rutina de atención a la interrupción.

CCP.- Tiene un registro de 16 bits que pueden ser utilizados para captura de tiempo al producirse un evento, como comparador del valor que cuenta un temporizador TMR1, registro de 10 bits del ciclo de trabajo de una señal PWM que es generada por el microcontrolador. El módulo CCP se comporta idénticamente salvo el caso del funcionamiento por disparo, tras un reset se apaga.

USART.- Es un sistema asíncrono full-duplex1el cual puede comunicarse con dispositivos periféricos como terminales CRT y con computadoras, puede programarse como un sistema asíncrono half-duplex2 como maestro o esclavo para comunicarse al MCU con circuitos integrados periféricos tales como ADC, DAC y EPROM serial. Tiene dos banderas que indican su estado y generan interrupciones UDRE indica registro de datos vacíos y TXC indica Transmisión completada. Se encuentra en los registros RCREG y TXREG (recibir y transmitir datos respectivamente.

Convertidor A/D.- Se encuentra en los registros INTCONT, PIE1 y PIR1 para interrupciones por mencionar algunos, en la figura 4 se muestran los bits de cada registro.

EEPROM.- Esta interrupción se activa por la finalización de escritura en la EEPROM, dispone de 64 bytes donde se pueden almacenar datos que no se pierden al desconectar alguna alimentación. La memoria EEPROM no se encuentra mapeada en la zona de memoria de datos donde se encuentran los registros SFR y GPR, para poder escribir y leerla durante el funcionamiento del microcontrolador se deben utilizar registros especiales como EEDATA, EEADR, EECON1 y EECON2.

OBJETIVOS

El objetivo de esta práctica es implementar un reloj con cronómetro digital. La técnica de diseño se verá modificada, ya que haremos uso de interrupciones para generar diferentes eventos que controlen la operación del sistema.

OBJETIVOS ESPECÍFICOS

Analizar y configurar el funcionamiento de los registros INTCON y OPTION del microcontrolador PIC 16F887.Aprenderá a programar las interrupciones en lenguaje C.

MATERIAL Y EQUIPO DE LABORATORIO

Equipo de cómputo con el siguiente software y características o MPLAB IDE de Microchip 8.6 o superior o Acceso a internet

Memoria USB Fuente de 5 volts Programa practica7.asm Protoboard PIC16f887 6 resistencias de 1KΩ 2 push button Cristal de 32.678kHz Cristal de 4 MHz Teclado LCD alfanumérica de 2 líneas de 16 caracteres. Potenciómetro* se utiliza en caso de ajustar el contraste de la pantalla, de preferencia

conectar a tierra. 4 capacitores cerámicos de 22 pF Cable calibre 22 o 24 de distinto color

DESARROLLO. CAPTURA Y COMPILACIÓN

1. Crea una carpeta llamada <practicas microcontroladores> en la unidad C y dentro de ella cree una carpeta llamada <practica 03>.

2. Crea un proyecto en MPLAB IDE llamado practica 03 dentro de la ruta <c:\practicas microcontroladores\practica 03> usando el asistente de proyectos (Project Wizard).

3. Crea y agrega al proyecto un nuevo archivo de código fuente llamado <main.asm> y captura el código fuente de la práctica 3 descrito en el anexo 1 y guarda tu archivo.

4. Compila el proyecto presionando F10. Si existen errores revisa el código fuente y corrige los errores hasta que el programa sea compilado con éxito.

Para la presente práctica, use el código de apoyo que se me facilito en la documentación, y, realizando unas modificaciones menores, le añadí la autenticación mediante el uso de un switch para recibir solamente la contraseña. En base a la contraseña se concedía o no el acceso al sistema.

A continuación muestro el código que use para la realización de la práctica:

CÓDIGO COMPILADO

/*UNIVERSIDAD NACIONAL AUTONOMA DE MEXICOFACULTAD DE ESTUDIOS SUPERIORES ARAGON

LABORATORIO DE MICROPROCESADORES Y MICROCONTROLADORES

BAUTISTA LOPEZ HECTOR HUEMAC410008500*/ #include <16F887.h> #fuses XT,NOWDT,NOPROTECT,NOLVP,MCLR,NOCPD,NOBROWNOUT,NODEBUG,NOLVP,NOIESO,NOFCMEN #use delay(clock=4000000) #include "lcd.c" #include "kbd.c" #include "string.h" int8 hrs; int8 min; int8 seg; void isr_int(void) ;

// Espera por dos digitos del teclado // Regresa un int8 con el valor convertido de 0 a 99

int8 kbd_get_data(void) { int8 key = 0; int8 valor = 0; while(key==0) key = kbd_getc(); // Esperar por un digito de decena while(kbd_getc() != 0){}; // Esperar por soltar la tecla valor = ((key-'0')*10); // Convertir de ASCII a binario key = 0; while(key==0) key = kbd_getc(); // Esperar por segundo digito de unidad while(kbd_getc() != 0){}; // Esperar por soltar la tecla valor += key-'0'; // Convertir de ASCII a binario return valor; }

// Rutina de servicio a la interrupcion del T1 // Se ejecuta cada segundo // Incrementa la cuenta del reloj #INT_TIMER1 void isr_t1(void) { set_timer1(32678); seg++; if(seg >= 60) { seg = 0; min++; if(min >= 60) { min = 0; hrs++; if(hrs >= 24) hrs=0; } } }

// Rutina de servicio a la interrupcion externa // Se ejecuta cuando se preciona el boton SET // Pide un la contraseña para accesar #INT_EXT

void hora(void) { int8 pass1; int8 pass2; int n=0; printf(lcd_putc,"\f Introducir\n codigo de acceso"); delay_ms(300); pass1 = kbd_get_data(); // Esperar por digitos del teclado pass2 = kbd_get_data();

if ((pass1 ==17 )&&(pass2==37)){ n=1; } if ((pass1 ==06 )&&(pass2==23)){ n=2; } if ((pass1 ==88 )&&(pass2==24)){ n=3; } if ((pass1 ==13 )&&(pass2==13)){ n=4; } if ((pass1 ==11 )&&(pass2==11)){ n=5; } if ((pass1 ==77 )&&(pass2==77)){ n=6; } switch (n) { case 1: printf(lcd_putc,"\f Acceso concedido"); delay_ms(500); printf(lcd_putc,"\f Bienvenido\n HUEMAK"); delay_ms(1000); break; case 2: printf(lcd_putc,"\f Acceso concedido"); delay_ms(500); printf(lcd_putc,"\f Bienvenido\n JAMES JORDAN"); delay_ms(1000); break; case 3: printf(lcd_putc,"\f Acceso concedido"); delay_ms(500); printf(lcd_putc,"\f Bienvenido\n KOBE"); delay_ms(1000); break; case 4: printf(lcd_putc,"\f Acceso concedido"); delay_ms(500); printf(lcd_putc,"\f Bienvenido\n TECO"); delay_ms(1000); break;

case 5: printf(lcd_putc,"\f Acceso concedido"); delay_ms(500); printf(lcd_putc,"\f Bienvenido\n ROSE"); delay_ms(1000); break; case 6: printf(lcd_putc,"\f Acceso concedido"); delay_ms(500); printf(lcd_putc,"\f Configurar Hora"); delay_ms(1000); isr_int(); break; default: printf(lcd_putc,"\f Acceso Denegado"); delay_ms(1000); break; } }

void isr_int(void) { int8 buffer; //Ingresar hora printf(lcd_putc,"\f hora (00 - 23)\n"); do { buffer = kbd_get_data(); // Esperar por dos digitos del teclado } while(buffer >= 24); // Validar hora hrs = buffer; printf(lcd_putc,"\f min (00 - 59)\n"); printf(lcd_putc," %02u:",hrs); //Ingresar minuto do { buffer = kbd_get_data(); // Esperar por dos digitos del teclado } while(buffer >= 60); // Validar minutos min = buffer; printf(lcd_putc,"\f Hora actualizada"); printf(lcd_putc,"\n %02u:%02u",hrs,min); delay_ms(500); seg = 0; } void Reemplace(char old, char new, char *string) { int leng, index; leng = strlen(string); for(index = 0; index < leng; index++) { if(string[index] == old) { string[index] = new; } }

} void main() { char timeString[10]; //Bloque de congfiguracion set_timer1(32678); hrs = 0; min = 0; seg = 0; delay_ms(500); lcd_init(); // Inicializar LCD kbd_init(); // Inicializar teclado enable_interrupts(GLOBAL); // Habilitar permiso para interrupciones globales enable_interrupts(INT_TIMER1); // Habilitar permiso para interrupcion en T1 INT T1 enable_interrupts(INT_EXT); // Habilitar permiso para interrupcion extena INT_EXT ext_int_edge( H_TO_L ); setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_CLK_OUT); // Configurar T1: // Oscilador externo de 32.678KHz // Preescala a 1 // Bloque principal while (TRUE) { sprintf(timeString,"%2u:%2u:%2u",hrs,min,seg); Reemplace(' ', '0', timeString); printf(lcd_putc,"\f %s",timeString); sleep(); // Entrar en modo de bajo consumo } }

DESARROLLO. VALIDACIÓN MEDIANTE SIMULACIÓN

Los pasos siguientes los seguí al pie de la letra y en la parte de Resultados se anexan las pantallas correspondientes de MPLAB que saque a la hora de simular.

1. Activa el simulador MPLAB SIM en el menú <Debugger → Select tool → MPLAB SIM>. 2. Abre la ventana watch desde el menú <View → watch> y agrega los registros en la lista de

símbolos: a. STATUS b. PORTB c. TRISB d. PORTD e. TRISD f. WREG g. ANSELH

3. Crea una nueva ventana del generador de estímulos asíncronos desde el menú <Debugger → Stimuls → New Work Book> y agrega los pines desde RB0 hasta RB7 con la acción <Set High> y nuevamente los mismos pines con la acción <Set Low>.

4. Realiza la simulación paso a paso del programa presionando F8 mientras visualiza el código fuente y la ventana watch. Analiza el contenido de cada símbolo de la ventana watch y comenta cual es el estado o configuración del microcontrolador.

5. Realiza la simulación de entradas digitales a través del puerto B presionando en el botón correspondiente en el generador de estímulos asíncronos mientras sigue simulando paso a paso con F8.

6. Valida que el programa de la práctica 1 lea 8 bits del puerto B y refleje la lectura en el puerto D.

DESARROLLO. ARMADO DEL CIRCUITO

Los siguientes pasos también fueron seguidos como se indica a continuación. Las fotografías correspondientes se muestran en el apartado de resultados.

1. Arma el circuito de que se muestra en el anexo 2. 2. Programa tu microcontrolador con el código de ejecutable 3. Alimenta tu circuito con 5V cuidando la correcta polarización. Puedes armar una fuente de

5V tomando como base el diagrama del anexo 3. 4. Valida la correcta operación del circuito. Si tu circuito no funciona correctamente

comprueba la alimentación con un multímetro, de persistir la falla comprueba la directiva __config para que ésta tenga configurado el oscilador interno y deshabilitados el botón de reinicio (NOMCLR), el perro guardián (NOWDT) y bajo voltaje de programación (NLPV) particularmente, compila y programa nuevamente.

RESULTADOS

Simulación del circuito en PROTEUS:

En vez de usar push button, en la simulacion use DIP-SWITCH para facilitarme las cosas, sin embargo, funciona igual que al momento de armarlo.

Cuando se presiona el push-button que habilita la interrupcion externa:

Con la contraseña 1737:

Con la contraseña 1111:

Con la contraseña 0623, el acceso de los “dioses”:

Con la contraseña 1313:

Con la contraseña 8824:

Con la contraseña 7777, se accede a la configuracion de la hora:

Con lo que se comprueba que efectivamente, que el sistema accede con las contraseñas especificadas en la programación de la PIC.

Armado del Circuito:

Cuando arme el circuito, ya alimentado, se veía de la siguiente manera:

CONCLUSIONES

Esta práctica me ayudo a conocer el funcionamiento de interrupciones en el PIC, tanto internas (Timer) como externas (INT_EXT, activada mediante el pin RB0).

Esto es benéfico para nosotros porque en el ámbito de los microcontroladores nuestro dispositivo debe poder comunicarse con el exterior, o hacer algo cuando se genere algún evento interno, por lo cual, aprender a manejar las interrupciones es muy importante, y conocer cuántos tipos de ellas tiene el mismo peso, para poder aprovecharlas y usarlas como mejor nos convenga.

Para esta práctica manejamos la interrupción interna con el Timer, para generar un contador que pudiéramos usar para un reloj que mostrara la hora en la LCD, y esta aplicación tan sencilla explicaba muy bien ambos conceptos, la interrupción interna y el manejo del Timer como contador.

Ahora, en el caso de la interrupción externa, la ocupamos para activar la detección de datos que entraban por el puerto B a través de un teclado matricial, lo que involucro además conocer el funcionamiento de dicho dispositivo para poderlo manejar.

Entonces, para esta práctica tuvimos que aprender varias cosas, comparada con las practicas anteriores, además de que el involucrar el acceso por contraseña hace de esta una práctica bastante interesante, si no es que la más interesante que hemos visto en el laboratorio.

La aplicación de este circuito que viene a mi mente es para poder abrir una puerta. Sé que esto involucraría mayores conocimientos y dispositivos extra, pero de momento sé que la parte de control ya la tengo, aunque sea en un PIC.

Los conocimientos adquiridos en esta práctica serán de mucha utilidad para futuros proyectos, en caso de existir alguno que involucre interrupciones, que, como he podido averiguar, se ocupan en la mayoría de proyectos más que nada porque permiten la comunicación del circuito con dispositivos externos y computadoras.

BIBLIOGRAFÍA

Practica No. 4 del laboratorio de Microprocesadores y Microcontroladores Datasheet del PIC16F887 Datasheet del Driver L293D Compilador C CCS y simulador PROTEUS para microcontroladores PIC.