RUTINA_DE_INTERRUPCION MACRO
;------------------------------------------------------------------------------
;------------------GUARDA LOS VALORES DE LOS REGISTROS PRINCIPALES-------------
MOVWF W_TEMP ;guardamos W,..
SWAPF STATUS,W ;le damos la vuelta a STATUS en w
MOVWF STATUS_TEMP ;y lo guardamos en STATUS_TEMP
SWAPF PCLATH,W ;PCLATH a W
MOVWF PCLATH_TEMP ;y de W a PCLATH_TEMP
banksel FSR ;banco de FSR
MOVF FSR,W ;FSR a W
MOVWF FSR_TEMP ;y de W a FSR_TEMP
;------------------------------------------------------------------------------
;------------------CLASIFICACION DE CUAL INTERRUPCION HA SALTADO---------------
BTFSC INTCON,INTF ;test si ha sido RB0
CALL INT_RB0 ;va a la rutina de RB0
BTFSC INTCON,RBIF
CALL INT_RB
BANKSEL PIR1
BTFSC PIR1,CCP1IF ;SALTA CUANDO COINCIDE CON EL TMR1
CALL GEN_FREC_PWM
BANKSEL PIR1
BTFSC PIR1,TMR1IF ;NO SE SI SE PONE A CERO EL TMR1 CUANDO COINCIDEN
CALL GEN_FREC_PWM_TMR1
;------------------------------------------------------------------------------
;-----------------RECARGA LOS VALORES QUE HABIA ANTES DE LA INTERRUPCION-------
FIN_INT
BANKSEL FSR
MOVF FSR_TEMP,W
MOVWF FSR
SWAPF PCLATH_TEMP,W
MOVWF PCLATH
swapf STATUS_TEMP,W
movwf STATUS
MOVF W_TEMP,W
RETFIE
;-------------------------------------------------------------------------------
;//////////////////////////////////////////////////////////////////////////////////////////////
;--------------------SERVICIO DE INTERRUPCIONES---------------------------------
;//////////////////////////////////////////////////////////////////////////////////////////////
INT_RB0
BANKSEL PORTB
BCF INTCON,INTF ;resetea la bandera
BTFSS PIN_DIRECCION ;test de direccion
GOTO ATRAS
ADELANTE
BSF PUNTEROS_DIRECCION ;SEÑALA EN QUE DIRECCION HA LLEGADO EL PULSO
GOTO ARRANCA
ATRAS
BCF PUNTEROS_DIRECCION ;IDEM
ARRANCA ;UN SISTEMA PARA SABER SI SE LE ESTA PIDIENDO DEMASIADO AL MOTOR PUEDE SER VERIFICAR SI ESTA
;- A UNO EL BIT TMR1ON, ESTO QUERRIA DECIR QUE AUN NO ALCANZO EL SIGUIENTE PASO DEL ENCODER,
;- POR LO QUE SE PUDO QUEDAR FRENADO O SIMPLEMENTE SE LE ESTA PIDIENDO DEMASIADA VELOCIDAD DESDE
;- LA CONTROLADORA
BANKSEL T1CON
BTFSC T1CON,TMR1ON
RETURN
CLRF TMR1L ;RESETEA EL TMR1
CLRF TMR1H
BSF T1CON,T1CKPS1
BSF T1CON,T1CKPS0
BSF T1CON,TMR1ON ;ENCIENDE EL TMR1 PARA GENERAR LA FRECUENCIA, CUANDO COINCIDE CON EL MODULO CCP1
;- O POR DESBORDE DEL TMR1
RETURN
;----------------------------------------------------------------------------------------------
GEN_FREC_PWM_TMR1
BCF PIR1,TMR1IF ;LIMPIA EL FLAG
GOTO GEN_FREC_PWM_TMR1_1
;----------------------------------------------------------------------------------------------
GEN_FREC_PWM
BCF PIR1,CCP1IF ;LIMPIA EL FLAG
GEN_FREC_PWM_TMR1_1
;-----------------------
BANKSEL PORTB
DECFSZ BUCLES_PWM
RETURN
MOVLW DIVISOR_FREC
MOVWF BUCLES_PWM
;CUALQUIERA DE LOS DESBORDES HACE CAMBIAR EL PWM, CUANTO MAS LARGO UNO MAS CORTO EL OTRO
; MOVF PORTD,W
; ANDLW B'11110000' ;RESPETA LOS BITS 7-4 Y 3-0 LOS PONE A CERO
; MOVWF PORTD ;Y SACA AL PUERTO
BTFSS PUNTEROS_DIRECCION ;TESTEA EN QUE DIRECCION TIENE QUE GIRAR
GOTO PWM_ADELANTE ;SEGUN EL PULSO DE DIR QUE HAYA LLEGADO POR EL PUERTO DE LA CONTROLADORA. EN LA INTERRUPCION DE
;RB0 CADA VEZ QUE LLEGA UN PULSO, GUARDA EN ESTE BIT EL ESTADO DE PORTB1=PIN_DIRRECCION
PWM_ATRAS
BTFSS PUNTEROS_PULSO ;Y TESTEA SI EL ULTIMO PULSO FUE ALTO O BAJO, PARA HACER LO CONTRARIO
GOTO A_CERO
MOVF PORTD,W
ANDLW B'11110000' ;RESPETA LOS BITS 7-4 Y 3-0 LOS PONE A CERO
MOVWF BOBINAS ;LO GUARDA EN BOBINAS
BSF BOBINA_2
BSF BOBINA_4
MOVF BOBINAS,W ;CARGA EN W
MOVWF PORTD ;Y SACA AL PUERTO
BCF PUNTEROS_PULSO ;PONE A UNO EL INDICADOR PARA EN EL SIGUIENTE PONERLO A CERO
RETURN
PWM_ADELANTE
BTFSS PUNTEROS_PULSO
GOTO A_CERO
MOVF PORTD,W
ANDLW B'11110000' ;RESPETA LOS BITS 7-4 Y 3-0 LOS PONE A CERO
MOVWF BOBINAS ;LO GUARDA EN BOBINAS
BSF BOBINA_1
BSF BOBINA_3
MOVF BOBINAS,W ;CARGA EN W
MOVWF PORTD ;Y SACA AL PUERTO
BCF PUNTEROS_PULSO
RETURN
A_CERO
MOVF PORTD,W
ANDLW B'11110000' ;RESPETA LOS BITS 7-4 Y 3-0 LOS PONE A CERO
MOVWF PORTD ;Y SACA AL PUERTO
BSF PUNTEROS_PULSO ;;PONE A CERO EL INDICADOR PARA EN EL SIGUIENTE PONERLO A UNO
RETURN
;----------------------------------------------------------------------------------------------
INT_RB
BCF INTCON,RBIF ;SI EL TIMER ESTA ENCENDIDO ES POR QUE LLEGO ALGUN PULSO POR EL CLOCK
BANKSEL T1CON
BTFSS T1CON,TMR1ON
RETURN
BCF T1CON,TMR1ON ;UNA VEZ SE APAGA EL TIMER, EL MODULO DE COMPARACION SE QUEDA ESTATICO, A LA ESPERA.
;UN MOTOR DC SE FRENA?¿? HE LEIDO QUE SE PONE A UNO UNO DE LOS CUATRO MOSFET,
REPITE_FRENO
banksel PDel0
CALL FRENO ;FRENA EL MOTOR
CALL DEMORA ;ESPERA UNOS MS
BTFSS PUNTEROS_DIRECCION ;VERIFICA EN QUE SENTIDO ESTABA ANDANDO EL MOTOR
GOTO FRENO_ATRAS
FRENO_ADELANTE ;PARA ADELANTAR
CALL PWM_ADELANTE
GOTO SALE_FRENO
FRENO_ATRAS
CALL PWM_ATRAS ;U ATRASAR
GOTO SALE_FRENO
SALE_FRENO
CALL DEMORA ;ESPERA UNOS MS CON EL PULSO ALTO, PARA QUE SE MUEVA EL MOTOR
CALL FRENO ;LO VUELVE A DEJAR FRENADO
BTFSC PORTB,6 ;TESTEA SI EL MOTOR HA TERMINADO EL PASO HASTA EL FINAL
GOTO REPITE_FRENO ;SI NO ESTA NUEVAMENTE A CERO, VUELVE A EMPEZAR PARA MOVERLO HASTA QUE TERMINE Y SE QUEDE FRENADO
BCF PUNTEROS_PULSO
RETURN
DEMORA movlw .6 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .207 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-------------------------------
FRENO
MOVF PORTD,W
ANDLW B'11110000' ;RESPETA LOS BITS 7-4 Y 3-0 LOS PONE A CERO
MOVWF BOBINAS ;LO GUARDA EN BOBINAS
BSF BOBINA_1 ;PONE A UNO LA SALIDA PARA FRENAR EN UN SENTIDO
MOVF BOBINAS,W ;CARGA EN W
MOVWF PORTD ;Y SACA AL PUERTO
RETURN
;-------------------------------------------------------------
ENDM