Você está na página 1de 5

UNIVERSIDAD TECNOLGICA DEL PER

INGENIERA ELECTRNICA

CIRCUITOS DIGITALES II: MICROCONTROLADORES

MICROCONTROLADOR PIC 16F84A: EJEMPLOS PARA MANEJO DE INTERRUPCIONES MLTIPLES TMR0 1. Realicemos un programa completo que contenga varias interrupciones. Por ejemplo si la causa ha sido la activacin del pin RB0, se debe mostrar un nmero dos en binario en el puerto A. Si ha sido un cambio de nivel en RB4:RB7, se debe mostrar el uno en binario en el puerto A. Si se ha desbordado el TMR0, se debe mostrar el cuatro en binario en el puerto A. SOLUCIN LIST P=16F84A INCLUDE P16F84A.INC W_TEMP equ 20H ; Se declaran los registros generales para ESTADO_TEMP equ 21H ; salvar los registros STATUS y W org 00H goto INICIO org 04H ; Se coloca el vector interrupcin para que se goto RUTINTERR ; Ejecute la rutina de interrupcin RUTINTERR movwf swapf modificar movf y movwf W_TEMP W_TEMP,1 ; Se inicia a la rutina de servicio de interrupcin ; se salva el valor actual de W, el SWAPF es para no ; los bits del registro de estado ; se toman los bits de estado actuales (W STATUS) ; se guardan

STATUS,0

ESTADO_TEMP

;*** Exploramos los bits FLAGS del registro INTCON, uno a uno para ver si alguno se activ btfsc INTCON,0 ; Se empieza exploracin de causa de interrupcin goto INTERRB47 ; Si RBIF=1, se va a ejecutar btfsc INTCON,1 ; si no se hace este segundo testeo goto INTERRB0 ; Si INTF=1, se va a ejecutar btfsc INTCON,2 ; si no se hace este tercer testeo goto INTERRTMR ; Si TOIF=1, se va a ejecutar goto SALIRINT ; Si no es ninguna, se sale de la interrupcin SALIRINT bsf movf movwf swapf .. retfie INTCON,7 ESTADO_TEMP,0 STATUS W_TEMP,0 ; Se habilita GIE, para permitir de nuevo otra ; Interrupcin y se restaura el entorno, observa ; como recuperamos el STATUS y ; el contenido de W, que haba antes de . Interr ; El uso de return o retlw k, puede producir ; errores en la ejecucin del programa

;********************************************** ;*** Subrutina de tratamiento de cambio de RB4:RB7 *** ;********************************************** INTERRB47 bcf INTCON,0 ; apagamos RBIF movlw 01H ; mandamos a mostrar lo pedido movwf PORTA ; por el PORTA movf PORTB,0 ; Ver NOTA (1) bcf INTCON,0 ; Se borra por software el sealizador de esta goto SALIRINT ; Interrupcin ;************************************************ ;*** Subrutina de tratamiento de activacin de INT/RB0 *** ;************************************************ INTERRB0 movlw 02H ; carga dato a mostrar movwf PORTA ; y lo enva por el PORTA
DOCENTE: ING. Luis Pacheco Cribillero

UNIVERSIDAD TECNOLGICA DEL PER

INGENIERA ELECTRNICA

CIRCUITOS DIGITALES II: MICROCONTROLADORES

bcf INTCON,1 ; Se borra por software el sealizador goto SALIRINT ;********************************************** ;*** Subrutina de tratamiento del desborde del TMR0 *** ;********************************************** INTERRTMR movlw 04H ; cargamos el valor a mostrar movwf PORTA ; y lo enviamos por el PORTA movlw d'01' ; Se carga el valor calculado para el TMR0 movwf TMR0 ; para asegurarnos que al regresar tenga este valor bcf INTCON,2 ; Se borra el sealizador goto SALIRINT ;************************* ;***PROGRAMA PRINCIPAL*** ;************************* INICIO bsf STATUS,5 clrf PORTA ; PORTA como entrada movlw 0FFH movwf PORTB ; PORTB como entrada movlw b'01000110' movwf OPTION_REG ; Diga: Cmo se configur OPTION? bcf STATUS,5 movlw b'10111000' ; Se habilita GIE y las interrupciones movwf INTCON ; Individuales DORMIR nop movlw d'01' movwf TMR0 SINFIN CLRWDT goto SINFIN ; Se coloca al microcontrolador en bucle o lazo sin fin end ; NOTA (1): En este tipo de interrupcin, internamente el procesador lee el nibble alto del puerto B y hace una copia. ; La interrupcin se genera cuando la lectura del nibble alto del puerto B es diferente de la copia. Dentro de ; la ejecucin de esta rutina de interrupcin, es importante que se lea el puerto B, para actualizar la copia, y ; el procedimiento adecuado es el mostrado anteriormente. 2. Se pide escribir un programa que genere una seal cuadrada de 200 Hz. Diseo libre. Paso 1. Enunciado y delimitacin del problema: Como no se ha especificado por cual pin del microcontrolador saldr la seal, asumiremos RB0. Cuando se trabaja con el Timer 0, se deben incluir los clculos que se hayan realizado para generar el retardo deseado. Para una frecuencia de 200 Hz, tendremos un perodo de:

Como no se ha especificado el ciclo de trabajo, asumiremos el 50 %, por lo que el perodo en alto y en bajo sern iguales, es decir 2,5 ms. Hagamos los clculos para 2,5 ms: De la frmula proporcionada, despejando nos quedar:

Sustituyendo los valores (Como no se nos especific el oscilador, asumiremos el estndar de 4 MHz:

DOCENTE: ING. Luis Pacheco Cribillero

UNIVERSIDAD TECNOLGICA DEL PER

INGENIERA ELECTRNICA

CIRCUITOS DIGITALES II: MICROCONTROLADORES

Por lo que el valor a cargar en el TMR0= 217

Paso 2. Hacemos un diagrama de flujo, en este caso mostramos 2 formas de encarar el problema:

DOCENTE: ING. Luis Pacheco Cribillero

UNIVERSIDAD TECNOLGICA DEL PER

INGENIERA ELECTRNICA

CIRCUITOS DIGITALES II: MICROCONTROLADORES

FORMA A. POR EXPLORACIN (POLLING) DEL BIT TOIF: LIST P=16F84A INCLUDE P16F84A.inc org 00H goto INICIO ;*************************** ;***PROGRAMA PRINCIPAL*** ;*************************** INICIO bsf STATUS,5 clrf TRISB movlw B'00010101' movwf OPTION_REG bcf STATUS,5 clrf PORTB nop CICLO bsf PORTB,0 call DELAY2_5MS bcf PORTB,0 call DELAY2_5MS goto CICLO DELAY2_5MS movlw .217 movwf TMR0 bcf INTCON,2 ESPERA btfss INTCON,2 goto ESPERA return end FORMA B. POR INTERRUPCIN LIST P=16F84A INCLUDE P16F84A.inc org goto org goto 00H INICIO 04H RSI

; Zona de configuraciones ; Predivisor= 128

; Inicializamos el Puerto B ; Seal a nivel alto ; Llamamos subrutina 2,5 ms ; Seal a nivel bajo ; Llamamos subrutina 2,5 ms ; Repetimos ciclo ; Cargamos TMR0 con valor ; calculado previamente ; Borramos el sealizador ; Se desbord el TMR0? ; No. Seguimos esperamos ; Si, han transcurrido 2,5 ms

;******************************** ;***RUTINA DE INTERRUPCIN*** ;******************************** RSI bcf INTCON,7 btfss INTCON,2 goto bcf movlw xorwf movlw movwf SALIR bsf retfie ;*************************** ;***PROGRAMA PRINCIPAL*** ;*************************** INICIO bsf clrf movlw movwf
DOCENTE: ING. Luis Pacheco Cribillero

SALIR INTCON,2 .01 PORTB,1 .217 TMR0 INTCON,7

; Deshabilitamos las interrupciones ; La causa de la interrupcin es desborde ; del TIMER0 TOIF=1? ; No, Salimos ; Si, borramos el sealizador TOIF

; Cargamos el valor del TMR0 ; Para una nueva temporizacin ; Habilitamos las interrupciones

STATUS,5 TRISB B'00010101' OPTION_REG

;Predivisor= 128

UNIVERSIDAD TECNOLGICA DEL PER

INGENIERA ELECTRNICA

CIRCUITOS DIGITALES II: MICROCONTROLADORES

movlw B'10100000' ; Habilitamos las interrupciones movwf INTCON ; Con GIE=1 y TOIE=1 bcf STATUS,5 clrf PORTB ; Inicializamos el Puerto B movlw .217 ; Cargamos el TMR0 con el movwf TMR0 ; valor previamente calculado SINFIN clrwdt ; Usamos esta instruccin para goto SINFIN ; evitar reinicio del programa ; De resto, el programa se queda en este bucle sin fin esperando el desborde ; del TMR0, que ocurrir segn sea el tiempo calculado. end Nota: Generalmente cuando los puertos A y/o B pueden sufrir modificaciones dentro de la rutina de interrupcin, se salva el entorno, sin embargo para este ejemplo, no se modifican otros bits de los puertos, por lo que no es necesario salvar el entorno.

DOCENTE: ING. Luis Pacheco Cribillero