UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS COORDINACIÓN DE ELECTRÓNICA GUÍA DE LABORATORIO Nº 04 CICLO 02 2013 I. ASIGNATURA: Control Digital NOMBRE DE LA PRACTICA: Interrupciones LUGAR DE EJECUCIÓN: Laboratorio de Microprocesadores. Salón 3.21 DOCENTE(S): Samuel Murcia / Eduardo Henríquez OBJETIVOS Implementar el repertorio de interrupciones de los microcontroladores PIC mediante la creación de programas. Diseñar rutinas de retardo de tiempo mediante software. II. EQUIPO Y MATERIAL Ordenador con software MPLAB IDE v8.9 Programador PICkit 2 Microcontrolador PIC16F88 Breadboard Herramientas varias III. PROCEDIMIENTO PARTE I. INTERRUPCIÓN EXTERNA RB0/INT En esta primera parte de la practica a desarrollar, escribiremos un programa que permita utilizar la interrupción externa RB0/INT para la ejecución de una rutina determinada. La configuración y habilitación de esta interrupción se hace mediante los registros INTCON y OPTION_REG. Figura 1. Estructura del registro INTCON. El bit 7 (GIE=1) habilita todas las interrupciones no enmascarada; El bit 4 (INT0IE=1) habilita la interrupción externa en RB0/INT. Figura 2. Estructura del registro OPTION_REG. El bit 7 (/RBPU=0) habilita las resistencias pull-up del puerto B; El bit 6 permite seleccionar el flanco que producirá la interrupción en RB0/INT (INTEDG=0, flanco ascendente; INTEDG=1, flanco descendente). 1. 2. Ejecutar MPLAB IDE y crear un nuevo proyecto con el nombre <InterrupcionExt>. Disponer de una nueva hoja de trabajo y escribir un programa que permita enviar a los pines <RA3:RA0> el estado de los pines <RB7:RB4>. Cuando la interrupción en RB0/INT sea activada, en los pines <RA3:RA0> se visualizara el complemento del estado anterior durante un tiempo aproximado de 1s. Para escribir el programar solicitado, procederemos como sigue. 3. En el encabezado del código escribiremos las directivas para indicar el microcontrolador a utilizar, que para nuestro caso es el PIC16F88, y la palabra de configuración. Por otra parte se define el vector de interrupción (0x04) que es el lugar donde apunta el programa cuando ocurre cualquier interrupción, y que posteriormente salta a la “Rutina de Servicio de Interrupción” que en nuestro caso la denominamos <RSINT>. LIST INCLUDE __CONFIG _CONFIG1, _INTRC_IO&_WDT_OFF&_PWRTE_ON&_MCLRE_OFF&_BODEN_ON&_LVP_OFF&_DEBUG_OFF ORG GOTO ORG GOTO 4. 7. EQU EQU EQU 0x20 0x21 0x22 Luego se configuran los puertos de entrada/salida y el oscilador interno. Mediante el registro OSCCON configuramos un oscilador interno de 1MHz, los bits <RA7:RA4> se configuran como entrada, los bits <RA3:RA0> se configuran como salida, el puerto B se configura como entrada. PRINCIPAL 6. 0x00 PRINCIPAL 0x04 RSINT A continuación crearemos tres registros, el primero (COM_PORTA) servirá para almacenar el estado en <RB7:RB4>, complementarlo y luego enviarlo a <RA3:RA0>. Los registros CONTADOR1 y CONTADOR2 nos ayudarán a crear una rutina de retardo mediante bucles anidados. COM_PORTA CONTADOR1 CONTADOR2 5. P=16F88 <P16F88.INC> BCF BSF STATUS,RP1 STATUS,RP0 CLRF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF ANSEL 0x4E OSCCON 0xF0 TRISA 0xFF TRISB Ahora se procede a configurar el funcionamiento y habilitación de la interrupción externa RB0/INT. El valor cargado en el registro OPTION_REG permite habilitar las resistencias Pull-Up en el puerto B y establece que la interrupción externa RB0/INT se produzca por un flanco ascendente. El valor cargado en INTCON habilita todas las interrupciones no enmascaradas y la interrupción externa RB0/INT. Cabe mencionar que en este registro se encuentra la bandera para la interrupción externa (INT0IF), más adelante se explicara su aplicación. Al final de esta parte del código se cambia al Banco 0 y se limpia el puerto A. MOVLW MOVWF MOVLW MOVWF B'01000000' OPTION_REG B'10010000' INTCON BCF CLRF STATUS,RP0 PORTA La tarea primaria del programa es relativamente simple, desplazar los bits <RB7:RB4> a las posiciones menos significativas (mediante instrucción SWAPF) y transferirlos a los pines <RA3:RA0> del puerto A. RUTINA SWAPF MOVWF GOTO PORTB,W PORTA RUTINA 8. La rutina para el servicio de la interrupción (RSI) se define a continuación. a) Al inicio de la rutina se cambian de posición los bits <RB7:RB4> a las posiciones menos significativas, tal y como en la rutina de la tarea primaria, luego estos bits se almacenan en el registro <COM_PORTA> para complementarlos mediante la instrucción COMF y luego enviarlos al puerto A. En este momento todas las interrupciones se encuentran inhabilitadas (GIE=0), esto es para que el microcontrolador no atienda otra interrupción. b) En las instrucciones siguientes se cargan los registros CONTADOR1 y CONTADOR2. Estos registros se emplean en la rutina de retardo de tiempo. Posteriormente se llama a la rutina <RETARDO2> c) Para finalizar la rutina de servicio de interrupción se limpia la bandera <INT0IF> para que el programa no quede en un bucle atendiendo indefinidamente la interrupción, y la instrucción <RETFIE> retorna la tarea primaria del microcontrolador habilitando las interrupciones nuevamente. RSINT 9. SWAPF MOVWF COMF MOVWF PORTB,W COM_PORTA COM_PORTA,W PORTA MOVLW MOVWF MOVLW MOVWF CALL D'255' CONTADOR1 D'200' CONTADOR2 RETARDO2 BCF RETFIE INTCON,INT0IF Esta rutina denominada <RETARDO2> permite establecer un retardo de tiempo de aproximadamente 1.02s. Esta rutina no es más que dos bucles anidados en los cuales se tienen dos registros en decremento. En la etiqueta <RETARDO1> se tiene una rutina que establece un retardo base de <5ms> aproximadamente, cuyo tiempo se logra mediante la ejecución repetitiva de las instrucciones contenidas en la rutina. Cada instrucción toma uno o dos ciclos de instrucción para ejecutarse. El retardo base se repite 200 veces (CONTADOR2) provocando en retardo de tiempo de 200x5ms=1s. RETARDO2 DECFSZ GOTO GOTO CONTADOR2 RETARDO1 SALIR_RETARDO RETARDO1 DECF NOP BTFSS GOTO GOTO RETURN CONTADOR1 SALIR_RETARDO STATUS,Z RETARDO1 RETARDO2 END 10. Compile el programa escrito, analice su funcionamiento mediante la herramienta MPLAB SIM y compruebe su funcionamiento mediante el circuito propuesto en la figura 3. Notara que el interruptor conectado en RB0/INT debe permanecer normalmente cerrado, pues la interrupción se produce por cada cambio de flanco ascendente. Figura 3. Circuito de prueba. 11. Considerando el programa anterior, escriba un programa que permita realizar un conteo ascendente de 4 bits a una frecuencia de 1Hz. Esta cuenta se ejecuta cada vez que ocurra la interrupción externa. Mientras no ocurra una interrupción, los indicadores LED deben permanecer en un estado ON/OFF a una frecuencia de 1Hz. Una vez terminado el programa compruebe el funcionamiento del mismo a su docente. IV. BIBLIOGRAFÍA [1] ANGULO USATEGUI, JOSÉ. Microcontroladores PIC: Diseño práctico de Aplicaciones. McGraw Hill, España. 2da Edición. (4 ejemplares). [2] Hoja Técnica del microcontrolador PIC16F88. Microchip.