Вы находитесь на странице: 1из 19

CURSO DE MICROCONTROLADORES PIC16F877A

INTERRUPCIONES

Mdulo 3: INTERRUPCIONES
Las interrupciones son rutinas provocadas por eventos internos o externos del microcontrolador, interrumpen la ejecucin de un programa y pasan a la rutina de servicio del evento que provoca la interrupcin. El vector de interrupcin se encuentra en la direccin 04H de la memoria de programa. Al terminar la rutina de servicio (RETFIE) se retoma el programa en el punto de ruptura. El PIC16F877A posee 15 fuentes de interrupcin. Fuentes de interrupcin: 1. Cambio en el pin RB0 (INT). 2. Cambio en los terminales del puerto B (RB7:RB4). 3. Overflow en el temporizador TMR0. 4. Overflow en el temporizador TMR1. 5. Overflow en el temporizador TMR2. 6. Cambio en el modulo comparador CM. 7. Fin de escritura en la memoria EEPROM de datos. 8. Relacionada con el Puerto Paralelo Esclavo PSP. 9. Transmisin exitosa de dato USART. 10. Recepcin de dato USART. 11. Generada por el mdulo de comunicacin maestro-esclavo SSP. 12. Fin de conversin A/D. 13. Generada por CCP1. 14. Generada por CCP2. 15. Generada por el BCL. La gestin de las interrupciones se hace mediante el registro: - INTCON(0Bh,8Bh,10Bh,18Bh): registro general de control y estado. En funcin de los perifricos disponibles por un MCU: - PIE1(8Ch),PIE2(8Dh) (Peripheal Interrupt Enable) habilitan las interrupciones de cada perifrico - PIR1(0Ch),PIR2(0Dh)(Peripheal Interrupt Flag Registers) identifican el perifrico que interrumpe

Profesor: Mishell Sanchez

Pgina 1

CURSO DE MICROCONTROLADORES PIC16F877A


Registro de Control de Interrupciones (INTCON)

INTERRUPCIONES

Es un registro que podemos leer o escribir y lo encontramos en cualquiera de los cuatro bancos, ocupando las direcciones 0x0Bh, 0x8Bh, 0x10Bh, 0x18Bh, respectivamente. Tiene la misin de controlar las interrupciones provocadas por el TMR0, cambio de estado en las cuatro lneas de ms peso del puerto B y activacin de la patita RB0/INT. El bit PEIE acta como una segunda llave parcial de permiso o prohibicin de las causas de interrupcin que nos estn contenidas en INTCON y que las provocan los restantes perifricos del microcontrolador. GIE es el bit de permiso global de todas las interrupciones.

bit 7

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

GIE: Bit de permiso global de interrupciones 1 = Habilita todas las interrupciones no enmascaradas. 0 = Deshabilita todas las interrupciones. PEIE: Bit de permiso de los perifricos que no se controlan con INTCON. 1 = Habilita todas las interrupciones perifricas no enmascaradas. 0 = Deshabilita todas las interrupciones perifricas. TMR0IE: Bit de permiso de interrupcin del TMR0. 1 = Habilita la interrupcin del TMR0. 0 = Deshabilita la interrupcin del TMR0. INTE : Bit de permiso de la interrupcin externa por RB0/INT 1 = Habilita la interrupcin externa RB0/INT. 0 =Deshabilita la interrupcin externa RB0/INT. RBIE: Bit de permiso de interrupcin por cambio en RB4-RB7. 1 = Habilita la interrupcin por cambio en el PORTB. 0 = Deshabilita la interrupcin por cambio en el PORTB. T0IF: Sealizador de desbordamiento en TMR0 1 = Registro TMR0 se ha desbordado (debe ser limpiado por software). 0 = Registro TMR0 no se ha desbordado. INTF: Sealizador de activacin de la patita RB0/INT. 1 = La interrupcin externa RB0/INT ha ocurrido (debe ser limpiado por software). 0 = La interrupcin externa RB0/INT no ocurri. RBIF: Sealizador de cambio en RB4 - RB7 1 = Al menos uno de los pines RB7: RB4 ha cambiado de estado, una condicin de conflicto continuar estableciendo el bit. Lectura del PORTB pondr fin a la condicin de conflicto y permitir que el bit se borre (debe ser limpiado por software). 0 = Ninguno de los pines RB7: RB4 han cambiado de estado.

Registro de permiso de interrupciones 1 (PIE1) Contiene los bits que permiten (1) o prohben (0) las interrupciones provocadas por los perifricos internos del microcontrolador y que no estaban contempladas en INTCON. Ocupa la direccin 8Ch y para que cumplan su funcin los bits de PIE1 es necesario que PEIE=1 en INTCON <6>. El bit PSPIE solo es vlido en los modelos de 40 pines, mantenindose a 0 en los PIC que tienen 28 pines.

Profesor: Mishell Sanchez

Pgina 2

CURSO DE MICROCONTROLADORES PIC16F877A


bit 7

INTERRUPCIONES

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

PSPIE: Bit de habilitacin de interrupcin del Puerto Paralelo Esclavo de lectura / escritura 1 = Habilita la interrupcin de lectura/escritura PSP. 0 = Deshabilita la interrupcin de lectura/escritura PSP. Note 1: PSPIE es reservado en los dispositivos PIC16F873A/876A; siempre mantener este bit=0. ADIE : Bit de habilitacin de interrupcin del convertidor A/D. 1 = Habilita la interrupcin del convertidor A/D. 0 = Deshabilita la interrupcin del convertidor A/D. RCIE : Bit de habilitacin de interrupcin por recepcin USART. 1 = Habilita la interrupcin por recepcin USART. 0 = Deshabilita la interrupcin por recepcin USART. TXIE : Bit de habilitacin de interrupcin por transmisin USART. 1 = Habilita la interrupcin por transmisin USART. 0 = Deshabilita la interrupcin por transmisin USART. SSPIE: Bit de habilitacin de interrupcin del Puerto Serial Sncrono. 1 = Habilita la interrupcin SSP. 0 = Deshabilita la interrupcin SSP. CCP1IE: Bit de habilitacin de interrupcin CCP1 1 = Habilita la interrupcin CCP1. 0 = Deshabilita la interrupcin CCP1. TMR2IE: Bit de habilitacin de interrupcin por igualdad del TMR2 al PR2. 1 = Habilita la interrupcin por igualdad del TMR2 al PR2. 0 = Deshabilita la interrupcin por igualdad del TMR2 al PR2. TMR1IE: Bit de habilitacin de interrupcin por desbordamiento del TMR1 . 1 = Habilita la interrupcin por desbordamiento del TMR1. 0 = Deshabilita la interrupcin por desbordamiento del TMR1.

Registro de permiso de interrupciones 2 (PIE2) Contiene los bits de permiso de interrupcin de las tres causas que no figuran en PIE1. La de fin de escritura en la EEPROM, colisin de bus en el modo SSP y produccin de una captura o una comparacin en el mdulo CCP2.

bit 7 bit 6

Bit no implementado: Ledo como 0 CMIE: Bit de habilitacin de interrupcin del Comparador 1 = Habilita la interrupcin del Comparador 0 = Deshabilita la interrupcin del Comparador bit 5 Bit no implementado: Ledo como 0 bit 4 EEIE: Bit de habilitacin de interrupcin por operacin de escritura en la EEPROM 1 = Habilita interrupcin por escritura en la EEPROM 0 = Deshabilita interrupcin por escritura en la EEPROM bit 3 BCLIE: Bit de habilitacin de interrupcin por Colisin en el Bus 1 = Habilita la interrupcin por Colisin en el Bus 0 = Deshabilita la interrupcin por Colisin en el Bus bit 2-1 Bits no implementados: Ledos como 0 bit 0 CCP2IE : Bit de habilitacin de interrupcin CCP2 1 = Habilita la interrupcin CCP2 0 = Deshabilita la interrupcin CCP2

Profesor: Mishell Sanchez

Pgina 3

CURSO DE MICROCONTROLADORES PIC16F877A


Registros de los sealizadores de interrupciones 1 y 2 (PIR1 y PIR2)

INTERRUPCIONES

En correspondencia con los bits de permiso/prohibicin de las causas de interrupcin recogidas en los registros PIE1 y PIE2, existen otros dos registros, PIR1 y PIR2, cuyos bits actan de sealizadores del momento en el que se origina la causa que provoca la interrupcin, independientemente de si est permitida o prohibida. Ocupan las direcciones 0Ch y 0Dh, respectivamente.

bit 7

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

PSPIF: Bit indicador de interrupcin del Puerto Paralelo Esclavo por Lectura/Escritura. 1 = Una operacin de lectura o escritura ha tenido lugar (debe ser limpiado por software). 0 = Ni lectura, ni escritura ha ocurrido. Nota 1: PSPIF est reservado en los dispositivos PIC16F873A/876A; siempre mantener este bit borrado. ADIF : Bit indicador de interrupcin del Convertidor A/D 1 = Una conversin A/D completada 0 = La conversin A/D no est completada RCIF : USART Receive Interrupt Flag bit 1 = El bfer de recepcin USART est lleno 0 = El bfer de recepcin USART est vacio TXIF : USART Transmit Interrupt Flag bit 1 = El bfer de transmisin USART est vaco 0 = El bfer de transmisin USART est lleno SSPIF: Puerto serie sncrono (SSP) Un indicador de interrupcin 1 = la condicin de interrupcin SSP se ha producido, y debe ser despejado en software antes de volver de la rutina de servicio de interrupcin. Las condiciones que se establezca este bit son: SPI - Una transmisin / recepcin ha tenido lugar. Esclavo I2C - Una transmisin / recepcin ha tenido lugar. MaestroI2C - Una transmisin / recepcin ha tenido lugar. - La condicin de START iniciado fue completada por el mdulo SSP. - La condicin STOP iniciado fue completada por el mdulo SSP. - La condicin de reinicio iniciado fue completada por el mdulo SSP. - La condicin de RESTART iniciado fue completad por el mdulo SSP. - Una condicin START ocurri mientras el mdulo SSP estaba desocupado (Multi-Maestro del sistema). - Un estado STOP ocurri mientras el mdulo SSP estaba desocupado (Multi-Maestro del sistema). 0 = Ninguna condicin de interrupcin SSP se ha producido CCP1IF: Bit indicador de interrupcin CCP1 Modo Captura: 1 = A ocurrido la captura en el registro TMR1 (debe ser limpiado por software) 0 = No ha ocurrido la captura en el registro TMR1 Modo Comparador: 1 = A ocurrido una comparacin en el TMR1 (debe ser limpiado por software) 0 = No a ocurrido una comparacin en el TMR1 Modo PWM: No se usa en este modo TMR2IF : Bit indicador de comparacin TMR2 a PR2 1 = A ocurrido comparacinTMR2 a PR2 (debe ser limpiado por software 0 = No ha ocurrido comparacinTMR2 a PR2 TMR1IF: Bit indicador de desbordamiento del TMR1 1 = Desbordamiento del registro TMR1 (debe ser limpiado por software) 0 = No ha ocurido desbordamiento del registro TMR1

Profesor: Mishell Sanchez

Pgina 4

CURSO DE MICROCONTROLADORES PIC16F877A

INTERRUPCIONES

bit 7 bit 6

Bit No Implementado: Ledo como '0' CMIF: Bit Indicador de Interrupcin del Comparador 1 = La entrada del comparador ha cambiado (debe ser limpiado por software) 0 = La entrada del Comparador no ha cambiado bit 5 Bit No Implementado: Ledo como '0' bit 4 EEIF: Bit Indicador de Interrupcin de escritura de EEPROM 1 = La Operacin de Escritura ha sido completada (debe ser limpiado por software) 0 = La Operacin de Escritura no ha sido completada o no ha sido iniciada. bit 3 BCLIF: Bit indicador de Colisin de BUS 1 = Una colisin de BUS ha ocurrido en el SSP, cuando estaba configurado en Modo Maestro I2C 0 = No ha ocurrido colisin de BUS. bit 2-1 Bit No Implementado: Ledo como '0' bit 0 CCP2IF: Bit indicador de Interrupcin CCP2 Modo Captura: 1 = Ha ocurrido una captura en el registro TMR1 (debe ser limpiado por software) 0 = No ha ocurrido una captura en el registro TMR1 Modo Compara: 1 = Ha ocurrido una comparacin en el registro TMR1 (debe ser limpiado por software) 0 = No ha ocurrido una comparacin en el registroTMR1 Modo PWM: No se usa en este modo Esquema General de una interrupcin:

Profesor: Mishell Sanchez

Pgina 5

CURSO DE MICROCONTROLADORES PIC16F877A

INTERRUPCIONES

Ahora mostraremos un cdigo ejemplo para darnos idea de todas las partes despus de haberse generado el salto de interrupcin.

Profesor: Mishell Sanchez

Pgina 6

CURSO DE MICROCONTROLADORES PIC16F877A

INTERRUPCIONES

Ejercicio1: Disear y simular un programa para ir acumulando los flancos de subida que vayan ingresando por el pin RB0 y mostrar la cuenta por el puerto D. Usar la interrupcin RB0/INT. Para este ejemplo no ser necesario salvar los valores de W y STATUS, pues en el LAZO CONTINUO no se hace alguna rutina importante, no hace nada ms que quedarse en un bucle infinito de no operacin. El programa en ASM seria:

Profesor: Mishell Sanchez

Pgina 7

CURSO DE MICROCONTROLADORES PIC16F877A

INTERRUPCIONES

Ejercicio2: Realizar un programa que controle 4 leds de diferente color. Cada led tendr su botn respectivo que har que el led indicado prenda y apague cada 1seg. Use las interrupciones de los pines RB4-RB7. El Programa en ASM seria: __CONFIG _CP_OFF & _PWRTE_ON & _LVP_OFF & _WDT_OFF & _HS_OSC list P=16F877A include<p16f877a.inc> cblock 20H MEMORIA TEMP_1s TEMP_250us SALVA_W SALVA_S endc ORG 0 goto INICIO ORG 4 movwf SALVA_W swapf STATUS,W bcf STATUS,RP0 movwf SALVA_S PORTB,W b'00001111' MEMORIA PORTB,W b'11110000' STATUS,Z REBOTE_RB INTCON,RBIF SALVA_S,W STATUS SALVA_W,F SALVA_W,W ; Vector de RESET ; Vector de INTERRUPCION

PUSH

ISR_RB swapf andlw movwf REBOTE_RB movf andlw btfss goto bcf POP swapf movwf swapf swapf retfie INICIO bsf movlw movwf bcf clrf bsf bsf LOOP movf movwf call clrf call goto

STATUS,RP0 b'11110000' TRISD STATUS,RP0 PORTD INTCON,RBIE INTCON,GIE MEMORIA,W PORTD retardo_1s PORTD retardo_1s LOOP

; banco 1 ; 4 Leds ; banco 0 ; habilitamos int_RB ; habilitamos int_GLOBAL

Profesor: Mishell Sanchez

Pgina 8

CURSO DE MICROCONTROLADORES PIC16F877A


retardo_1s movlw movwf call call call call decfsz goto return retardo_1ms call call call retardo_250us movlw movwf nop nop decfsz goto return END

INTERRUPCIONES

.250 TEMP_1s retardo_1ms retardo_1ms retardo_1ms retardo_1ms TEMP_1s $-5

retardo_250us retardo_250us retardo_250us .250 TEMP_250us

TEMP_250us $-3

Un vistazo a nuestro circuito:

Profesor: Mishell Sanchez

Pgina 9

CURSO DE MICROCONTROLADORES PIC16F877A

INTERRUPCIONES

Ejercicio3: Realizar un programa donde el PIC trabaja como un semforo en ciclo continuo. ROJO 4seg(RB0), AMBAR 1seg(RB1) y VERDE 3seg(RB2). Adems este mismo PIC deber estar llevando la cuenta de pulsos que ingresan por el pin RA4, cuando el numero de pulsos sea 1000 provocara una interrupcin que encender una alarma (RB3) por el tiempo de 1seg. Despus de este tiempo continuara con la rutina del ciclo continuo, la alarma podr ser encendida despus de otros 1000 pulsos. Usar un cristal de 20MHz. 1- Diseemos primeramente la configuracin de la interrupcin del TMR0 en Modo Contador:

2- Ahora vamos a disear el retardo de 1seg que usaremos para las rutinas del semforo, este mismo segundo tambin se usara en la rutina para encender la lmpara. Usaremos la tcnica de retardos anidados, comenzaremos con un retardo de 250us:

El cdigo en ASM seria: __CONFIG _CP_OFF & _PWRTE_ON & _LVP_OFF & _WDT_OFF & _HS_OSC list P=16F877A include<p16f877a.inc> cblock 20H SALVA_W SALVA_S TEMP_1s TEMP_10ms TEMP_250us SALVA_TEMP_1s SALVA_TEMP_10ms SALVA_TEMP_250us Endc

Profesor: Mishell Sanchez

Pgina 10

CURSO DE MICROCONTROLADORES PIC16F877A


ORG goto ORG PUSH movwf swapf bcf movwf movf movwf movf movwf movf movwf TEST btfsc call POP movf movwf movf movwf movf movwf swapf movwf swapf swapf retfie INICIO bsf STATUS,RP0 movlw b'11110000' movwf TRISB movlw b'00100010' movwf OPTION_REG bcf STATUS,RP0 clrf PORTB movlw .131 movwf TMR0 clrf INTCON bsf INTCON,T0IE bsf INTCON,GIE CICLO_CONTINUO bsf PORTB,0 call retardo_1s call retardo_1s call retardo_1s call retardo_1s bcf PORTB,0 bsf PORTB,1 call retardo_1s bcf PORTB,1 bsf PORTB,2 call retardo_1s call retardo_1s ; banco 1 SALVA_TEMP_1s,W TEMP_1s SALVA_TEMP_10ms,W TEMP_10ms SALVA_TEMP_250us,W TEMP_250us SALVA_S,W STATUS SALVA_W,F SALVA_W,W ; Regresamos valores ; a los registros salvados INTCON,T0IF ISR_TMR0 0x000 INICIO 0x004 SALVA_W STATUS,W STATUS,RP0 STATUS TEMP_1s,W SALVA_TEMP_1s TEMP_10ms,W SALVA_TEMP_10ms TEMP_250us,W SALVA_TEMP_250us ; Salvamos WREG ; banco 0 ; Salvamos STATUS ; Salvamos otros Registros ; que se modificaran en la ; Interrupcin

INTERRUPCIONES

; Regresamos STATUS ; Regresamos WREG

; RB0-RB3: Salidas ; Pre=x8 Modo: Contador Flanco: Subida ; banco 0 ; Limpiamos el PORTB ; Cuenta Inicial TMR0 ; Habilitamos Interrupcin del Timer0 ; Habilitamos Interrupcin GLOBAL ; ROJO: Prendido

; ROJO: Apagado ; AMBAR: Prendido ; AMBAR: Apagado ; VERDE: Prendido

Profesor: Mishell Sanchez

Pgina 11

CURSO DE MICROCONTROLADORES PIC16F877A


call bcf goto ISR_TMR0 movlw movwf bsf call bcf bcf return retardo_1s movlw movwf call decfsz goto return retardo_10ms movlw movwf call decfsz goto return retardo_250us movlw movwf nop nop decfsz goto return END retardo_1s PORTB,2 CICLO_CONTINUO .131 TMR0 PORTB,3 retardo_1s PORTB,3 INTCON,T0IF

INTERRUPCIONES

; VERDE: Apagado

; LAMPARA: Prendido ; LAMPARA: Apagado

.100 TEMP_1s retardo_10ms TEMP_1s $-2

.40 TEMP_10ms retardo_250us TEMP_10ms $-2

.250 TEMP_250us

TEMP_250us $-3

Profesor: Mishell Sanchez

Pgina 12

CURSO DE MICROCONTROLADORES PIC16F877A

INTERRUPCIONES

Ejercicio4: Realizar un programa que mueva un Servomotor de 0 hasta 180 y viceversa continuamente usando la interrupcin del Timer1 para el Periodo y el Timer2 para el duty. La seal PWM saldr por el pin RC0. Usar un cristal de 20MHz. Para este problema tendremos en cuenta:

Para este problema usaremos el timer1 en modo temporizador para generar el periodo de la seal PWM de 20ms, tambin usaremos el timer 2 en modo temporizador el cual se encargara de controlar el dutyla duracin del pulso. 1- Calculemos la configuracin del Timer1 para que genere interrupcin cada 20ms

El cdigo en ASM para este primer punto seria: movlw movwf movlw movwf movlw movwf b'00010000' T1CON 0x3C TMR1H 0xB0 TMR1L ; Pre: x2 Timer1: OFF ; 65536-50000=15536=0x3CB0

2- Para poder generar los ngulos respectivos con el Timer2, es decir 0 para 1ms y 180 para 2ms, usaremos el registro PR2, teniendo en cuenta la resolucin. Con RESOLUCION nos referimos al tiempo que demora el TIMER2 en incrementar una unidad en su cuenta.

Profesor: Mishell Sanchez

Pgina 13

CURSO DE MICROCONTROLADORES PIC16F877A

INTERRUPCIONES

Ahora, por cada 2 de ngulo del servo el contador deber incrementar en UNO y generar el respectivo ancho de pulso de duracin T_timer2 , es decir:

La resolucin se calculara de la siguiente manera:

Tambin recordemos que:

De la formula obtenida se ve el porqu se dijo en el inicio que el ngulo iba a ser dividido entre dos, y que esto provocara que el incremento iba a ser de 2 en 2. Si no dividiramos a la variable ngulo entre 2, cuando tome su mximo valor, es decir 180, el valor de PR2 tomara269 lo cual es imposible en nivel de hardware, pues el PR2 es un registro de 8 bits, por tanto el mximo valor que puede tomar es de 256. Caso contrario si la variable ngulo es dividida entre 2, cuando tome su mximo valor, es decir 180/2=90 el registro PR2 ser 179, con lo cual no habra ningn problema. 3- Calcularemos la configuracin del timer2 para el valor hallado de Resolucin:

El Cdigo en ASM para este segundo punto seria: bsf movlw movwf bcf movlw movwf STATUS,RP0 .89 PR2 STATUS,RP0 b'01101001' T2CON ; banco 1 ; PR2=89 => Duty_inicial=1ms ; banco 0 ; Pre=x4 Post=x14 Timer2: OFF

Profesor: Mishell Sanchez

Pgina 14

CURSO DE MICROCONTROLADORES PIC16F877A

INTERRUPCIONES

4- Para que las interrupciones comiencen deberemos setear todos los habilitadores: TMR1IE, TMR2IE, PEIE, GIE, TMR1ON, TMR2ON. El cdigo siguiente en ASM resume este punto: bsf bcf bsf bsf bcf bsf bsf bsf bsf STATUS,RP0 TRISC,0 PIE1,TMR1IE PIE1,TMR2IE STATUS,RP0 INTCON,PEIE INTCON,GIE T1CON,TMR1ON T2CON,TMR2ON ; banco 1 ; RC0: Salida de PWM ; Habilitamos int_TMR1 ; Habilitamos int_TMR2 ; banco 0 ; Habilitamos las int_PERIFERICOS ; Habilitamos las int_GLOBALES ; Prendemos el TMR1 ; Prendemos el TMR2

5- Vamos a definir la rutina que se encargara de convertir nuestro ngulo en ancho de pulso, la matemtica para este punto ya la desarrollamos en el punto 2:

Sabemos que el PIC es un microcontrolador que trabaja con datos de 8 bits enteros, por tanto nuestro ngulo en la formula al ser dividido por 2 perder precisin, pues la operacin de divisin por 2 es equivalente a rotar el dato a la derecha, debemos tener en cuenta que si el ngulo es impar obtendremos un resultado redondeado perdiendo el residuo de la divisin. El Cdigo en ASM que hace lo expresado en la ecuacin en el siguiente: My_Servo movwf bcf rrf movlw addwf return

TEMP_DUTY_PWM STATUS,C TEMP_DUTY_PWM,F .89 TEMP_DUTY_PWM

; Aqu se guarda el valor de Angulo previamente cargado a W ; Rotamos a la derecha (division entre 2) ; Conteo = PR2 + 1 = (89+ANCHO_PULSO)+1 ; Conteo = 90 + ANCHO_PULSO

Ntese que este valor que tenemos en el registro TEMP_DUTY_PWM ser cargado en PR2 luego que se haya ejecutado la interrupcin por desbordamiento del TMR1 (20ms), adems se harn otras cosas en este ISR_TMR1 como inicializar los contadores TMR1H, TMR1L, y otras cosas ms como lo describe el cdigo en ASM: ISR_TMR1 bcf movlw movwf movlw movwf bsf bcf bsf movf bsf movwf bcf bsf return

T1CON,TMR1ON 0x3C TMR1H 0xB0 TMR1L PORTC,0 PIR1,TMR1IF T1CON,TMR1ON TEMP_DUTY_PWM,W STATUS,RP0 PR2 STATUS,RP0 T2CON,TMR2ON

; Apagamos el Timer1

; pin RC0: Alto ; Limpiamos el Indicador de Desbordamiento ; Prendemos el Timer1 ; Banco 1 ; PR2 <= TEMP_DUTY_PWM ; Banco 0 ; Prendemos el Timer2

Profesor: Mishell Sanchez

Pgina 15

CURSO DE MICROCONTROLADORES PIC16F877A

INTERRUPCIONES

La interrupcin del TMR2 no indicara la duracin del ancho del pulso, este TMR2 comenzara otra vez la cuenta cuando haya terminado de contar el TMR1, es por eso que en el ISR_TMR1 se vuelve a prender la cuenta del TMR2. Veamos ahora el ISR_TMR2: ISR_TMR2 bcf T2CON,TMR2ON ; Apagamos el Timer2 hasta que TMR1 finalice bcf PORTC,0 ; Apagamos el Pulso bcf PIR1,TMR2IF ; Limpiamos el Indicador de Desbordamiento return Como tenemos dos diferentes interrupciones, necesitamos un TEST que indique quien fue la causa de la interrupcin, por tanto creamos la rutina ISR_My_Servo donde hace un test al TMR1 y si no fue el salta y ejecuta ISR_TMR2. Veamos el cdigo en ASM: ISR_My_Servo btfsc goto goto

PIR1,TMR1IF ISR_TMR1 ISR_TMR2

; Fue el TMR1? Salta si es NO

6- Ahora haremos una rutina de retardo de 200ms, para darle respiro al servo y ver un movimiento ms suave en el ngulo: retardo_200ms movlw movwf call call call call decfsz goto return retardo_250us movlw movwf nop nop decfsz goto return

.200 TEMP_200ms retardo_250us retardo_250us retardo_250us retardo_250us TEMP_200ms $-5

.250 TEMP_250us

TEMP_250us $-3

7- Finalmente, ya pasado lo ms difcil tendremos que hacer el esqueleto de la interrupcin, es decir: ORG PUSH 0x004 SALVA_W STATUS,W STATUS,RP0 SALVA_S ISR_My_Servo SALVA_S,W STATUS SALVA_W,F SALVA_W,W

movwf swapf bcf movwf INTERRUPCION call POP swapf movwf swapf swapf retfie

; Banco 0

Profesor: Mishell Sanchez

Pgina 16

CURSO DE MICROCONTROLADORES PIC16F877A


El cdigo completo de este ejemplo es el siguiente: __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _HS_OSC list P=16f877a include<p16f877a.inc> cblock 0x20 SALVA_S SALVA_W ANGULO TEMP_200ms TEMP_250us TEMP_DUTY_PWM endc ORG goto ORG PUSH 0x000 INICIO 0x004

INTERRUPCIONES

movwf SALVA_W swapf STATUS,W bcf STATUS,RP0 ; Banco 0 movwf SALVA_S INTERRUPCION call ISR_My_Servo POP swapf SALVA_S,W movwf STATUS swapf SALVA_W,F swapf SALVA_W,W retfie INICIO ;-- Configuracion del TMR1 movlw b'00010000' ; Pre: x2 Timer1: OFF movwf T1CON movlw 0x3C ; 65536-50000=15536=0x3CB0 movwf TMR1H movlw 0xB0 movwf TMR1L ;-- Configuracion del TMR2 bsf STATUS,RP0 ; banco 1 movlw .89 movwf PR2 ; PR2=89 => Duty=1ms bcf STATUS,RP0 ; banco 0 movlw b'01101001' movwf T2CON ;-- Configuracion de la Salida RC0 y habilitamos interreupciones bsf STATUS,RP0 ; banco 1 bcf TRISC,0 ; RC0: Salida de PWM bsf PIE1,TMR1IE ; Habilitamos int_TMR1 bsf PIE1,TMR2IE ; Habilitamos int_TMR2 bcf STATUS,RP0 ; banco 0 ;-- Prendemos las interrupciones e iniciamos la cuenta de los timers bsf INTCON,PEIE ; Habilitamos las int_PERIFERICOS bsf INTCON,GIE ; Habilitamos las int_GLOBALES bsf T1CON,TMR1ON ; Prendemos el TMR1 bsf T2CON,TMR2ON ; Prendemos el TMR2

Profesor: Mishell Sanchez

Pgina 17

CURSO DE MICROCONTROLADORES PIC16F877A

INTERRUPCIONES

;-- Angulo Inicial del Servo movlw .0 movwf ANGULO call My_Servo LOOP call call goto CERO_TO_NOVENTA NOVENTA_TO_CERO LOOP

; Inicializacion del PWM ; Conversion de Angulo a Ancho de Pulso

CERO_TO_NOVENTA incf ANGULO,F movf ANGULO,W call My_Servo call retardo_200ms movlw .180 subwf ANGULO,W btfss STATUS,Z goto CERO_TO_NOVENTA return NOVENTA_TO_CERO decf ANGULO,F movf ANGULO,W call My_Servo call retardo_200ms movlw .0 subwf ANGULO,W btfss STATUS,Z goto NOVENTA_TO_CERO return

; Angulo final

; Angulo Inicial

;************* Rutina de Conversion Angulo - Ancho de Pulso ************** My_Servo movwf TEMP_DUTY_PWM bcf STATUS,C rrf TEMP_DUTY_PWM,F movlw .89 ; Conteo = PR2 + 1 = (89+ANCHO_PULSO)+1 addwf TEMP_DUTY_PWM ; Conteo = 90 + ANCHO_PULSO return ;********************* Servicio de interrupcion ********************* ISR_My_Servo btfsc PIR1,TMR1IF ; Fue el TMR1? Salta si es NO goto ISR_TMR1 goto ISR_TMR2 ISR_TMR2 bcf bcf bcf return

T2CON,TMR2ON PORTC,0 PIR1,TMR2IF

; Apagamos el Timer2 ; Limpiamos el Indicador de Desbordamiento

Profesor: Mishell Sanchez

Pgina 18

CURSO DE MICROCONTROLADORES PIC16F877A

INTERRUPCIONES

ISR_TMR1 bcf T1CON,TMR1ON ; Apagamos el Timer1 movlw 0x3C movwf TMR1H movlw 0xB0 movwf TMR1L bsf PORTC,0 ; pin RC0: Alto bcf PIR1,TMR1IF ; Limpiamos el Indicador de Desbordamiento bsf T1CON,TMR1ON ; Prendemos el Timer1 movf TEMP_DUTY_PWM,W bsf STATUS,RP0 ; Banco 1 movwf PR2 bcf STATUS,RP0 ; Banco 0 bsf T2CON,TMR2ON ; Prendemos el Timer2 return ;********************* Rutinas de Retardo************************ retardo_200ms movlw .200 movwf TEMP_200ms call retardo_250us call retardo_250us call retardo_250us call retardo_250us decfsz TEMP_200ms goto $-5 return retardo_250us movlw .250 movwf TEMP_250us nop nop decfsz TEMP_250us goto $-3 return END

Profesor: Mishell Sanchez

Pgina 19

Вам также может понравиться