Este es el codigo de tratamiento de la interrupción.
Solo me interesan dos interrupciones, la producida al acabar una recepción del puerto USART y la que me lanze el TMR0 ya que es el temporizador que uso para generarme el PWM que le falta al 873. Uso 3 PWM dos de Hard y el del TMR0 por soft, ya hablaremos más adelante de ello.
El registro FLURI es un registro apuntador que me he creado simplemente para poder llevar la cuenta de lo que ha hecho el programa. Para determinar los estados que ha generado.
Para determinar el numero de canal, al restar el contador con el numero del canal hay tres soluciones posibles que me interesan, puesto que controlo tres canales con el receptor. De esa resta me interesan 0, 1 y 2 ya que será el canal en el que estoy, el siguiente y el tercero que uso. Esos son los 3 canales que he de guardar para su posterior tratemiento.
Ahi va el codigo, a ver que os parece.
;*****************************************RUTINAS DE TRATAMIENTO DE LA INTERRUPCION******
;**INTERRUPCION USART*****ACTUALIZACION DE DUTY DE MODULACION DE ANCHURA DE PULSOS******
;_____________________________________
BCF STATUS,RP0 ;CAMBIO AL BANCO 0
;_____________________________________
INTER BTFSC PIR1,RCIF ;INTERRUPCION POR RECEPCION?
GOTO TMR0PWM ;NO, MIRA SI LO HA INTERRUMPIDO EL TMR0
BCF PIR1,RCIF ;SI, REPONER EL FLAG DE LA RECEPCION DE DATOS
BTFSC RCSTA,FERR ;ERROR DE TRAMA? SIGNIFICA QUE EL STOP BIT NO ES 1
GOTO FIN2 ;SI HAY FERR ES QUE HAY BREAK, SAL DE LA INTERRUPCION
BTFSC FLURI,.7 ;SE HAN LEIDO LOS 3 DATOS ?
GOTO FIN ;SI LOS HE LEIDO, ME PIRO DE LA INTERRUPCION HASTA QUE ENTRE EN EL BREAK
MOVF RCREG,W ;LECTURA DEL DATO RECIBIDO
; Si CTRAMA-SWITCH = 0 ->RCREG a dato1 (00)
; Si CTRAMA-SWITCH = 1 ->RCREG a dato2 (01)
; Si CTRAMA-SWITCH = 2 ->RCREG a dato3 (10)
; INCREMENTO EL CONTADOR UNA VEZ HE COMPARADO EL CANAL.
BTFSC FLURI,.2 ;SI AUN NO SE HA LEIDO EL DATO 0, MIRALO
GOTO LEERDATOS ;SI YA TENGO EL DATO 0, VAMOS A LEER DATOS
MOVF .0,.0
SUBWF RCREG ;RESTO EL BYTE RECIBIDO A 0
BTFSS STATUS,C ;MIRO EL CARRY DE LA RESTA, SI ES 0 ES QUE ES EL DATO 0
BSF FLURI,.2
GOTO FIN
LEERDATOS ;SOLO SE ACCEDE SI EL FLAG DEL BREAK Y DEL DATO0 ESTAN A ON
INCF CTRAMA ;INCREMENTO EL CONTADOR DE DATOS ORIGINALMENTE A 0
MOVF SWITCH,.0
SUBWF CTRAMA
BTFSC W,.2
GOTO FIN ;ME SALE DE LA INTERRUPCION
BTFSC W,.0 ;SALTA SI (X0)
CALL GDATO2 ;GUARDA EL DATO 2
BTFSS W,.1 ;SALTA SI(10), NO SALTA(00)
CALL GDATO1 ;GUARDA EL DATO 1
CALL GDATO3 ;GUARDA EL DATO 3
;****************************************INTERRUPCION DEL TMR0*************************
TMR0PWM
;_____________________________________
BSF STATUS,RP0 ;CAMBIO AL BANCO 1
;_____________________________________
BTFSC INTCON,T0IF ;SI INTERRUPCION DEL TMR0, ACTIVA FLURI.3
BSF FLURI,.3 ;FLAG PARA ACTIVAR EL TRATAMIENTO DEL PWMSOFT
FIN RETFIE ;ME SALE DE LA INTERRUPCION
FIN2 BCF FLURI,.7 ;ME PONGO EL FLAG DE NO HE RECIBIDO LOS 3 DATOS
CLRF CTRAMA ;ME PONGO A 0 EL CONTADOR DE DATOS RECIBIDOS
GOTO FIN
;***********************************************FIN DE RUTINAS*************************