Guia Laboratorio Semana 08. Control Digital 022013

Anuncio
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.
Descargar