You are on page 1of 26

CARACTERSTICAS DE LAS INTERRUPCIONES DEL PIC 16F877

La Pila
La pila permite almacenar las direcciones a donde debe retornar el programa cuando se finaliza una llamada a una subrutina o cuando se finaliza la ejecucin de una rutina de interrupcin. Los microcontroladores de la familia PIC16 tienen una pila de 8 niveles x 13 bits, que por tanto permite como mximo 8 llamadas a subrutinas (CALLs) o ejecuciones de rutinas de interrupcin (salto a 0004h). El espacio de memoria para la pila no forma parte de la memoria de programa ni de la memoria de datos que tiene el microcontrolador. Es un espacio de memoria totalmente independiente. El puntero de pila no se puede leer ni escribir. La pila es gestionada por el hardware.

Interrupciones
En las interrupciones el proceso que se sigue es el que muestra la figura. Cuando se origina una interrupcin el bit GIE (habilitacin global de interrupciones) del registro INTCON es puesto a 0, lo que impide cualquier otra interrupcin. El bit de flag correspondiente se pone a 1 y debe borrarse por software. La habilitacin de una determinada interrupcin exige poner a 1 el bit GIE y el correspondiente bit de habilitacin de la interrupcin particular; ambos se encuentran en el registro INTCON. La instruccin RETFIE vuelve a poner GIE a 1. El registro INTCON est en el banco 0 y el 1

Interrupciones

Interrupciones
Al llegar la peticin de interrupcin, no significa que una interrupcin ocurrir automticamente, puesto que debe ser habilitada por el usuario (por el programa) tambin. Por esta razn, hay bits especiales utilizados para habilitar o deshabilitar interrupciones. Es fcil de reconocerlos por las letras IE contenidas en sus nombres (Interrupt Enable - Interrupcin habilitada). Adems, cada interrupcin se asocia con otro bit denominado bandera que indica que una peticin de interrupcin ha llegado sin verificar si est habilitada. Asimismo, se reconocen con facilidad por las dos ltimas letras contenidas en sus nombres - IF (Interrupt Flag - Bandera de interrupcin).

Interrupciones
La idea es muy simple y eficiente. Al llegar la peticin de interrupcin, primero el bit de bandera se pone a uno. Si el bit IE apropiado est a cero (0), esta condicin ser ignorada completamente. De lo contrario, ocurre una interrupcin. Si varias fuentes de interrupcin estn habilitadas, es necesario detectar la activa antes de que la rutina de interrupcin se ponga a ejecutar. La deteccin de la fuente se realiza al comprobar los bits de las banderas.

Interrupciones

REGISTROS DE CONTROL Y PERMISO DE LAS INTERRUPCIONES DEL PIC 16F877

Registro INTCON

El registro OPTION_REG contiene varios bits de control para configurar el pre - escalador del Timer0/WDT, el temporizador Timer0, la interrupcin externa y las resistencias pull-up en el puerto PORTB.

Leyenda: R/W - Bit de lectura/escritura, (0) Despus del reinicio, el bit se pone a cero, (X) - Despus del reinicio, el estado de bit es desconocido GIE - Global Interrupt Enable bit (bit de habilitacin de interrupciones globales) controla simultneamente todas las fuentes de interrupciones posibles. 1 - Habilita las interrupciones no enmascaradas. 0 - Deshabilita las interrupciones no enmascaradas. PEIE - Peripheral Interrupt Enable bit (bit de habilitacin de interrupciones perifricas) es similar al bit GIE, sin embargo controla interrupciones habilitadas por los perifricos. Eso significa que no influye en interrupciones causadas por el temporizador Timer0 o por el cambio del estado en el puerto PORTB o por el cambio en el pin RB0/INT. 1 -Habilita las interrupciones perifricas no enmascaradas. 0 -Deshabilita las interrupciones perifricas no enmascaradas T0IE - TMR0 Overflow Interrupt Enable bit (bit de habilitacin de interrupciones por el desbordamiento del registro Timer0) controla interrupciones causadas por el desbordamiento del Timer0. 1 - Habilita interrupciones por Timer0 0 - Deshabilita interrupciones por Timer0 INTE - RB0/INT External Interrupt Enable bit (bit de habilitacin de la interrupcin externa en RB0) controla interrupciones causadas por el cambio del estado lgico en el pin de entrada RB0/INT (interrupcin externa). 1 - Habilita interrupciones externas INT 0 - Deshabilita interrupciones externas INT RBIE - RB Port Change Interrupt Enable bit. (bit de habilitacin de interrupciones por cambios en el puerto PORTB). Cuando se configuran como entradas, los pines en el puerto PORTB pueden causar una interrupcin al cambiar el estado lgico (no importa si se produce bajada o subida de tensin, lo que importa es que se produce un cambio). Este bit determina si una interrupcin va a ocurrir. 1 - Habilita interrupciones por cambio en el puerto PORTB 0 - Deshabilita interrupciones por cambio en el puerto PORTB T0IF - TMR0 Overflow Interrupt Flag bit (bit de bandera de interrupcin por el desbordamiento del Timer0) detecta el desbordamiento en el registro del temporizador Timer0, o sea el contador se pone a cero. 1 - En el registro TMR0 ha ocurrido desbordamiento (esta bandera debe volverse a 0 por software) 0 - En el registro TMR0 no ha ocurrido desbordamiento INTF - RB0/INT External Interrupt Flag bit (bit de bandera de interrupcin externa en INT) detecta el cambio en el estado lgico en el pin INT. 1 - Ha ocurrido una interrupcin externa por INT (esta bandera debe volverse a 0 por software) 0 - No ha ocurrido una interrupcin externa por INT RBIF - RB Port Change Interrupt Flag bit (bit de bandera de interrupcin por cambio en el puerto RB) detecta cualquier cambio del estado lgico de alguno de los pines de entrada en el puerto PORTB. 1 - Al menos uno de los pines de E/S de propsito general en el puerto PORTB ha cambido de valor. Despus de leer el puerto PORTB, el bit RBIFdebe volverse a 0 por software) 0 - Ninguno de los pines de E/S de propsito general en el puerto PORTB ha cambiado de valor.

Registro PIE1

El registro PIE1 contiene los bits de habilitacin permisologia de interrupciones perifricas.

Leyenda: (-) Bit no implementado, (R/W) - Bit de lectura/escritura, (0) Despus del reinicio, el bit se pone a cero ADIE - A/D Converter Interrupt Enable bit (bit de habilitacin de interrupciones del convertidor A/D)
1 - Habilita la interrupcin ADC. 0 - Deshabilita la interrupcin ADC.

RCIE - EUSART Receive Interrupt Enable bit (bit de habilitacin de interrupciones de recepcin del EUSART)
1 - Habilita la interrupcin de recepcin del EUSART. 0 - Deshabilita la interrupcin de recepcin del EUSART.

TXIE - EUSART Transmit Interrupt Enable bit (bit de habilitacin de interrupciones de transmisin del EUSART)
1 - Habilita la interrupcin de transmisin del EUSART. 0 - Deshabilita la interrupcin de transmisin del EUSART.

SSPIE - Master Synchronous Serial Port (MSSP) Interrupt Enable bit (bit de habilitacin de la interrupcin del puerto serie sncrono maestro (MSSP) habilita generar una peticin de interrupcin despus de cada transmisin de datos por el mdulo de comunicacin serie sncrona (modo SPI o I2C).
1 - Habilita la interrupcin del MSSP. 0 - Deshabilita la interrupcin del MSSP.

CCP1IE - CCP1 Interrupt Enable bit bit de habilitacin de la interrupcin del mdulo 1 de Comparacin/Captura/PWM - CCP1) permite generar una peticin de interrupcin en el mdulo CCP1 utilizado para procesamiento de la seal PWM.
1 - Habilita la interrupcin CCP1. 0 - Deshabilita la interrupcin CCP1.

TMR2IE - TMR2 to PR2 Match Interrupt Enable bit (bit de habilitacin de la interrupcin de igualdad entre TMR2 y PR2)
1 - Habilita la interrupcin de igualdad entre TMR2 y PR2 0 - Deshabilita la interrupcin de igualdad entre TMR2 y PR2

TMR1IE - TMR1 Overflow Interrupt Enable bit (bit de habilitacin de la interrupcin de desbordamiento del temporizador Timer1) habilita generar una peticin de interrupcin despus de cada desbordamiento en el registro del temporizador Timer1, o sea el contador se pone a cero.
1 - Habilita la interrupcin por desbordamiento en el registro TMR1. 0 - Deshabilita la interrupcin por desbordamiento en el registro TMR1.

Registro PIE2

El registro PIE2 tambin contiene varios bits de habilitacin de interrupciones.

Leyenda: (-) Bit no implementado, (R/W) - Bit de lectura/escritura, (0) Despus del reinicio, el bit se pone a cero OSFIE - Oscillator Fail Interrupt Enable bit (bit de habilitacin de la interrupcin de fallo en el oscilador) 1 - Habilita la interrupcin de fallo en el oscilador. 0 - Deshabilita la interrupcin de fallo en el oscilador. C2IE - Comparator C2 Interrupt Enable bit (bit de habilitacin de la interrupcin del comparador C2) 1 - Habilita la interrupcin del comparador C2. 0 - Deshabilita la interrupcin del comparador C2. C1IE - Comparator C1 Interrupt Enable bit (bit de habilitacin de la interupcin del comparador C1) 1 - Habilita la interrupcin del comparador C1. 0 - Deshabilita la interrupcin del comparador C1. EEIE - EEPROM Write Operation Interrupt Enable bit (bit de habilitacin de la interrupcin de escritura en la memoria EEPROM) 1 - Habilita la interrupcin de escritura en la memoria EEPROM. 0 - Deshabilita la interrupcin de escritura en la memoria EEPROM. BCLIE - Bus Collision Interrupt Enable bit (bit de habilitacin de la interrupcin de colisin de bus) 1 - Habilita la interrupcin de colisin de bus. 0 - Deshabilita la interrupcin de colisin de bus. ULPWUIE - Ultra Low-Power Wake-up Interrupt Enable bit (bit de habilitacin de la interrupcin para salir del modo de ultra bajo consumo - la reactivacin) 1 - Habilita la interrupcin para salir del modo de ultra bajo consumo. 0 - Deshabilita la interrupcin para salir del modo de ultra bajo consumo. CCP2IE - CCP2 Interrupt Enable bit (bit de habilitacin de la interrupcin del mdulo 2 de Comparacin/Captura/PWM (CCP2) 1 - Habilita la interrupcin del CCP2. 0 - Deshabilita la interrupcin del CCP2.

Registro PIR1

El registro PIR1 contiene los bits de banderas da la interrupcin. Acta de sealizador del momento en que se origina la causa que provoca la interrupcin independientemente de que este permitida prohibida

Leyenda: (-) Bit no implementado, (R/W) - Bit de lectura/escritura, (R) - Bit de lectura (0), Despus del reinicio, el bit se pone a cero ADIF - A/D Converter Interrupt Flag bit (bit de bandera de la interrupcin del convertidor A/D) 1 - Se ha completado una conversin A/D (el bit debe volverse a 0 por software). 0 - No se ha completado una conversin A/D o no ha empezado. RCIF - EUSART Receive Interrupt Flag bit (bit de bandera de la interrupcin de recepcin del EUSART) 1 - El bfer de recepcin del EUSART est lleno. El bit se pone a cero al leer el registro RCREG. 0 - El bfer de recepcin del EUSART no est lleno. TXIF - EUSART Transmit Interrupt Flag bit (bit de la interrupcin de transmisin del EUSART) 1 - El bfer de transmisin del EUSART est vaco. El bit se pone a cero al esribir un dato en el registro TXREG 0 - El bfer de transmisin del EUSART est lleno. SSPIF - Master Synchronous Serial Port (MSSP) Interrupt Flag bit (bit de bandera de la interrupcin de puerto serie sncrono maestro) 1 - Se ha cumplido la condicin de ocurrir una interrupcin del MSSP al transmitir/recibir los datos. Difieren dependiendo del modo de operacin del MSSP (SPI o I2C). El bit debe ponerse a cero por software antes de volver de la rutina de servicio de interrupciones) 0 - No se ha cumplido ninguna condicin de ocurrir una interrupcin del MSSP. CCP1IF - CCP1 Interrupt Flag bit (bit de bandera de la interrupcin del mdulo 1 de Comparacin/Captura/PWM (CCP1) 1 - Se ha cumplido la condicin de la interrupcin del CCP1 (CCP1 es una unidad para captar, comparar y generar una seal PWM). Dependiendo del modo de operacin (modo captura o modo comparacin), se produce una captura o la igualdad en la comparacin. En ambos casos, el bit debe volverse a cero por software. El bit no se utiliza en el modo PWM. 0 - No se ha cumplido la condicin de la interrupcin del CCP1 TMR2IF - Timer2 to PR2 Interrupt Flag bit (bit de bandera de la interrupcin de igualdad entre el temporizador Timer2 y el registro PR2) 1 - Se ha producido igualdad con el valor del TMR2 (registro de 8 bits del temporizador) y el valor del PR2. El bit debe ponerse a cero por software antes de volver de la rutina de servicio de interrupciones) 0 - No se ha producido igualdad con el valor del TMR2 y el valor del PR2. TMR1IF - Timer1 Overflow Interrupt Flag bit (bit de bandera de la interrupcin de desbordamiento del temporizador Timer1) 1 - Se ha producido desbordamiento en el registro TMR1. El bit debe ponerse a cero por software. 0 - No se ha producido desbordamiento en el registro TMR1.

Registro PIR2

El registro PIR2 contiene los bits de banderas da la interrupcin. Acta de sealizador del momento en que se origina la causa que provoca la interrupcin independientemente de que este permitida prohibida

Leyenda: (-) Bit no implementado, (R/W) - Bit de lectura/escritura, (0) Despus del reinicio, el bit se pone a cero OSFIF - Oscillator Fail Interrupt Flag bit (bit de bandera de la interrupcin de fallo en el oscilador) 1 - Se ha producido un fallo en el oscilador del sistema. La entrada de reloj ha sido conmutada al oscilador interno INTOSC. El bit debe ponerse a cero por software. 0 - El oscilador del sistema funciona correctamente. C2IF - Comparator C2 Interrupt Flag bit (bit de bandera de la interrupcin del comparador C2) 1 - La salida del comparador analgico C2 ha sido cambiada (el bit C2OUT). El bit debe ponerse a cero por software. 0 - La salida del comparador analgico C2 no ha sido cambiada. C1IF - Comparator C1 Interrupt Flag bit (bit de bandera de la interrupcin del comparador C1) 1 - La salida del comparador analgico C1 ha sido cambiada (el bit C1OUT). El bit debe ponerse a cero por software. 0 - La salida del comparador analgico C1 no ha sido cambiada EEIF - EE Write Operation Interrupt Flag bit (bit de bandera de la interrupcin de la operacin de escritura en la memoria EEPROM) 1 - La operacin de escritura en la memoria EEPROM se ha completado. El bit debe ponerse a cero por software. 0 - La operacin de escritura en la memoria EEPROM no se ha completado o todava no se ha iniciado. BCLIF - Bus Collision Interrupt Flag bit (bit de bandera de la interrupcin de colisin de bus en el MSSP) 1 - Se ha producido una colisin de bus en el MSSP al ser configurado para el modo maestro I2C. El bit debe ponerse a cero por software. 0 - No se ha producido colisin de bus en el MSSP. ULPWUIF - Ultra Low-power Wake-up Interrupt Flag bit (bit de bandera de la interrupcin para salir del modo de ultra bajo consumo - la reactivacin) 1 - Se ha cumplido la condicin de salir del modo de ultra bajo consumo. El bit debe ponerse a cero por software. 0 - No se ha cumplido la condicin de salir del modo de ultra bajo consumo. CCP2IF - CCP2 Interrupt Flag bit (bit de la interrupcin del mdulo 2 de Comparacin/Captura/PWM - CCP2) 1 - Se ha cumplido la condicin de la interrupcin del CCP2 (CCP2 es una unidad para captar, comparar y generar una seal PWM). Dependiendo del modo de operacin (modo captura o modo comparacin), se produce una captura o la igualdad en la comparacin. En ambos casos, el bit debe volverse a cero por software. El bit no se utiliza en el modo PWM. 0 -No se ha cumplido la condicin de la interrupcin del CCP2.

CARACTERSTICAS ESPECIALES DE LOS PIC


Estas caractersticas suelen ser los aspectos que ms distinguen la CPU de estos dispositivos con otros microprocesadores. Oscilador: ms simple y con menos elementos adicionales necesarios

Resets y Watchdog: seguridad en el arranque, reinicio y autovigilancia Sleep: modo de bajo consumo para aplicaciones con bateras Interrupciones: lgica de mscaras y eventos y posicin comn de la RSI Proteccin de cdigo: para evitar la copia de programas grabados ICSP e ICSP LVP: (In-Circuit Serial Programming) programacin en serie ya en la tarjeta de la aplicacin y a baja tensin (Low Voltage Program) Modo depuracin ICD: (In-Circuit Debugger) modo especial que permite depurar el cdigo pero ya con el MCU conectado con el resto del circuito.

INTERRUPCIONES
Los PIC16F87XA tienen hasta 15 posibles fuentes de interrupcin, entre otras: Escritura o lectura del puerto esclavo paralelo (PSPIF) Desbordamiento del TMR0 Desbordamiento del TMR1 Desbordamiento del TMR2 Captura de un mdulo CCP (CCPxIF). Comparacion del modulo CCP en modo disparo de evento especial. Mdulo SSP al detectar un bit de START STOP Mdulo SSP al transmitir o recibir en modo esclavo Mdulo USART al RX o TX (modo sncrono) (RCIF TXIF). Al finalizar una conversin A/D Al completar una escritura en EEPROM (EEIF). Al modificarse el estado de salida de alguno de los comparadores (CMIF). Interrupcin externa por flanco en el pin RB0/INT (INTF). Interrupcin por cambio en los valores de los pines RB4 a RB7 del PORTB (RBIF).

INTERRUPCIONES
Se dispone de un bit de habilitacin de interrupciones global GIE (INTCON<7>) que permite deshabilitar todas las interrupciones (si est a 0). Cuando el bit GIE est a 1, si una interrupcin tiene su flag a 1 y sus bits de habilitacin a 1, el microcontrolador terminar la instruccin que se est ejecutando en ese instante y, a continuacin, pasar a ejecutar la posicin 4 de la memoria de programa que corresponde a la posicin del vector de interrupcin y que es el mismo para todas las interrupciones. Las fuentes de interrupcin pueden deshabilitarse individualmente utilizando sus mscaras o bits de habilitacin (bits acabados en E). El bit GIE se pone a 0 tras un RESET. Por tanto, al principio las interrupciones estn desactivadas. Al producirse el salto a la rutina o programa de tratamiento de la interrupcin, el bit GIE se pone a 0 deshabilitando el resto de interrupciones, salvo que por software se vuelva a poner a 1 ese bit GIE. El retorno del programa de tratamiento de interrupcin (RETFIE) coloca en la mscara global GIE el valor 1, adems de recuperar el PC de la pila hardware. Los bits de flags pueden ponerse a 1 independientemente de que sus bits de habilitacin estn o no a 1, ya que indican eventos.

Lgica de interrupciones

SALVANDO EL CONTEXTO
Cuando se produce una interrupcin slo se guarda en la pila hardware interna el valor del PC. Normalmente, se debern salvar algunos otros registros para no perder su contenido al regresar al programa principal y tras haber pasado por la rutina de interrupcin, mxime cuando se ignora cundo se va a producir el salto a ese programa de tratamiento de la interrupcin (PTI) desde el programa principal. Estos registros son al menos el W y el STATUS Tambin puede resultar interesante guardar el registro PCLATH, especialmente si en la rutina de interrupcin se cambia de pgina de memoria de programa. Como no hay pila en RAM, hay que reservar posiciones de memoria en RAM que habitualmente denominaremos W_TEMP, STATUS_TEMP y PCLATH_TEMP donde se guardan los valores de W, STATUS y PCLATH al entrar en la rutina de interrupcin para luego recuperarlos al salir.

SECUENCIA PARA SALVAR EL CONTEXTO DEL PROGRAMA PRINCIPAL


Siempre se debe hacer as o de una manera similar (si se guardan ms registros) al principio de un PTI

;Para salvar el contexto no podemos emplear la instruccin MOVF ;ya que afecta al registro STATUS (al bit Z), para evitarlo ;empleamos la instruccin SWAPF movwf W_tmp swapf STATUS,W bcf STATUS,RP0 bcf STATUS,RP1 de movwf STATUS_tmp girado movf PCLATH,W movwf PCLATH_tmp ;Salvamos el registro W ; y el registro STATUS "girado" en W ;Aseguramos el paso al banco 0 ;poniendo a 0 los dos bits de seleccin ;banco ;Guardamos en el banco 0 STATUS ;Salvamos tambin PCLATH en W ;y ahora en una posicin auxiliar del ;banco 0

SECUENCIA PARA RECUPERAR EL CONTEXTO DEL PROGRAMA PRINCIPAL


;Para recuperar los registros salvados no podemos usar MOVF ;porque modifica a STATUS, para evitarlo usamos la instruccin ;SWAPF movf PCLATH_tmp,W movwf PCLATH swapf STATUS_tmp,W movwf STATUS swapf W_tmp,F swapf W_tmp,W retfie ;Recuperamos PCLATH ;directamente ;Recuperamos el registro STATUS con ;un SWAPF ;ahora estamos en el banco de partida ;Recuperamos tambin el W con dos ;SWAPF ;para evitar la instruccin MOVF ;Ahora ya podemos retornar del PTI

Interrupciones
Hay que tener en cuenta que al principio de la interrupcin hay que salvaguardar los registros W y STATUS, a veces tambin el PCLATH. movwf W_tmp swapf STATUS,W bcf STATUS,RP0 bcf STATUS,RP1 movwf STATUS_tmp movf PCLATH,W movwf PCLATH_tmp ;Salvamos el registro W ; y el registro STATUS "girado" en W ;Aseguramos el paso al banco 0 ;poniendo a 0 los dos bits de seleccin de banco ;Guardamos en el banco 0 STATUS girado ;Salvamos tambin PCLATH en W ;y ahora en una posicin auxiliar del banco 0 PTI

Al final del PTI, antes de RETFIE hay que recuperarlos. movf PCLATH_tmp,W movwf PCLATH swapf STATUS_tmp,W movwf STATUS swapf W_tmp,F swapf W_tmp,W retfie ;Recuperamos PCLATH directamente ;Recuperamos el registro STATUS con un SWAPF ;ahora estamos en el banco de partida ;Recuperamos tambin el W con dos SWAPF ;para evitar la instruccin MOVF

TMR0
Es un registro que se encuentra en el banco 0 de la RAM. Es un temporizador que se incrementa con cada pulso del oscilador interno o con un reloj externo que se selecciona mediante el bit T0CS del registro OPTION_REG que se encuentra en el banco 1: T0CS =0 para el reloj interno. Tambin tiene la posibilidad de aplicarle un divisor de frecuencia (prescaler) de 8 bits que comparte con el WDT. El bit PSA (OPTION_REG <3>) a 0 le asigna el prescaler al TMR0 y los bits PS2-PS0 seleccionan por cunto se divide la frecuencia. Se puede leer y escribir en TMR0 y cuando se desborda puede producir una interrupcin. Ejemplo: Se pretende que cada 200ms. se produzca un determinado evento por interrupcin del TMR0 utilizando el oscilador interno de 4 MHz y sabiendo que cada ciclo de instruccin dura 4 ciclos del oscilador. Como un solo desbordamiento del TMR0 slo permite una temporizacin de aproximadamente 65ms tendremos que hacer que se desborde varias veces. Vamos a hacer que se desborde 20 veces para lo que tenemos que precargar el TMR0 para que se desborde a los 10ms
temp TMR0 = [(256 carga) PS + 2] Tinstr Elegimos PS=128 Carga = 180 Hay que cargar el reg. OPTION_REG con el binario: 00000110 Para permitir las interrupciones el registro INTCON debe cargarse con el binario 10100000. (Mirar la configuracin de ambos registros)

INTERRUPCIONES RBI
Interrupcin RBI es una interrupcin producida por el cambio de estado en alguna de las lneas RB4, RB5, RB6 o RB7. Hay que configurar esas lneas como entradas y cargar el INTCON para permitir la interrupcin. Ejemplo: Vamos a utilizar la interrupcin RBI para encender unos LEDs conectados a los bits RB0, RB1, RB2 y RB3 BSF STATUS, RP0 MOVLW 0XF0 MOVWF TRISB BCF STATUS, RP0 CLRF PORTB MOVLW b10001000 MOVWF INTCON ;volvemos al banco 0 ;para inicializar el puerto (LEDs apagados) ;habilitamos las interrupciones generales ;y la particular poniendo GIE y RBIE a 1 ORG 0x04 GOTO RSI Al principio de la RSI hay que salvar los registros W y STATUS y al final del mismo hay que recuperarlos y borrar el flag RBIF ;pasamos al banco 1 para configurar el puerto B ;RB<4,7> entradas, RB<0,3> salidas

Como en todas las interrupciones al principio del programa hay que poner:

Ejemplo de programacin de interrupcin


;************************** Encabezado *************************** LIST P = 16F877 INCLUDE 16F887.INC ; ************************* Configuracin de puertos ***************** ORG GOTO ORG BTFSS GOTO BCF BCF RETFIE BSF BCF RETFIE BSF CLRF MOVLW MOVWF BCF MOVLW MOVWF CLR MOVLW MOVWF BTFSC GOTO GOTO END 0x00 INICIO 0x04 PORTB,0 LED PORTB,0 INTCON,2

LED

Inicio

Tiempo NADA

; Atiendo la Interrupcin ; si el LED est apagado ; voy a LED y lo enciendo ; sino apago el LED ; borro la bandera TOIF ; regreso habilitando la interrupcin PORTB,0 ; enciende el LED INTCON,2 ; borro la bandera TOIF ; regreso habilitando la interrupcin STATUS,5 ; configurando puertos TRISB ; puerto B es salida 0x07 ; cargo W con 00000111 OPTION_REG ; EL Divisor = 256 STATUS,5 0xA0 ; cargo W con 10100000 INTCON ; habilitamos GIE y TOIE PORTB ; limpiamos PORTB 0xD8 ; cargo W con 216 TMR0 ; lo paso a TMR0 TMR0,7 ; me quedo haciendo nada NADA ; hasta que TMR= desborde, y entonces tiempo ; volver a cargar TMR0

Ejemplo de programacin de interrupcin


La interrupcin externa RBO/INT. Se trata de comprobar la interrupcin externa que se aplica a travs del pin RBO/INT. El programa principal est en un ciclo cerrado en modo SLEEP (standby de bajo consumo). Cada vez que se detecta un flanco descendente en RB0 se provoca una interrupcin cuyo tratamiento hace iluminar las salidas RB7-RB1 durante 1 seg. Contador equ org goto org goto Inter bcf INTCON,INTF movlw movwf movlw movwf Seguir bcf INTCON,T0IF movlw movwf INTCON,T0IF goto decfsz goto clrf retfie Delay_10ms Contador,F Seguir PORTB b195 TMR0 ;Repone el TMR0 con 195 Delay_10ms btfss ;Han transcurrido 10 mS ?? ;No, esperar ;Decrementa el contador. ;No ;Si, han pasado 1", se desconecta la salida ;Retorno de interrupcin ;Reponer flag del TMR0 b'11111110' PORTB b100 Contador ;Inicia contador de temporizaciones de 10 ms con 100 (1") ;Activa las salidas ;Repone flag de la interrupcin exetrna 0x20 0x04 Inter 0x05 Inicio ;Variable para la temporizacin ;Vector de interrupcin

Ejemplo de programacin de interrupcin


Continuacin del programa anterior Inicio clrf bsf movlw movwf movlw movwf bcf movlw movwf Loop sleep nop goto Loop end PORTB STATUS,RP0 b'00000001' TRISB b'00000111' OPTION_REG STATUS,RP0 b'10010000' INTCON ;Activa la interrupcin externa RB0/INT ;Preescaler de 256 para el TMR0 ;Selecciona banco 0 ;RB7-RB1 salidas, RB0/INT entrada ;Borra el Puerto B ;Selecciona banco 1

;Este es el cuerpo del programa principal. Se mantiene en estado SLEEP hasta que se produce interrupcin

You might also like