Академический Документы
Профессиональный Документы
Культура Документы
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
Pgina 1
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.
Pgina 2
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
Pgina 3
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
Pgina 4
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:
Pgina 5
INTERRUPCIONES
Ahora mostraremos un cdigo ejemplo para darnos idea de todas las partes despus de haberse generado el salto de interrupcin.
Pgina 6
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:
Pgina 7
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
Pgina 8
INTERRUPCIONES
TEMP_250us $-3
Pgina 9
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
Pgina 10
INTERRUPCIONES
; 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
Pgina 11
INTERRUPCIONES
; VERDE: Apagado
.250 TEMP_250us
TEMP_250us $-3
Pgina 12
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.
Pgina 13
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:
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
Pgina 14
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
; 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
Pgina 15
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
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
.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
Pgina 16
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
Pgina 17
INTERRUPCIONES
;-- Angulo Inicial del Servo movlw .0 movwf ANGULO call My_Servo LOOP call call goto CERO_TO_NOVENTA NOVENTA_TO_CERO LOOP
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
Pgina 18
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
Pgina 19