;***************************************************
;*primer programa de control 2 motores paso a paso *
;*en directo e inversa CON 16F877 *
;**************************************************
PCL EQU 02H
STATUS EQU 03H
PORTA EQU 05H
TRISA EQU 05H
PORTB EQU 06H
TRISB EQU 06H
PORTC EQU 07H
TRISC EQU 07H
CUENTA EQU 0CH ;CONFIGURACION DE PINES I/O DE PUERTOS Y VARIABLES
CUENTA2 EQU 0DH
ORG 00H
GOTO INICIO
TABLA MOVWF PCL ;MUEVE EL CONTENIDO DEL ACUMULADOR AL REGISTRO PCL
MOTOR RETLW 0CH ;VALORES DE SALIDAS SEGUN BOBINA DEL MOTOR
RETLW 06H
RETLW 03H
RETLW 09H
TABLA2 MOVWF PCL
MOTOR2 RETLW 0CH
RETLW 06H
RETLW 03H
RETLW 06H
RETLW 09H
INICIO BSF STATUS,5 ;DEFINICION DE BANCO1
MOVLW 0FFH
MOVWF TRISA ;CONFIGURO PUERTO A COMO ENTRA
MOVLW 00H
MOVWF TRISB ;CONFIGURO PUERTO B COMO SALIDA
MOVLW 00H
MOVWF TRISC ;CONFIGURO PUERTO C COMO SALIDA
BCF STATUS,5 ;DEFINICION DE BANCO 0
CLRF PORTB ;SE PONE A 0 EL PUERTO B
CLRF PORTC ;SE PONE A 0 PUERTO C
CLRF PORTA ; SE PONE A 0 EL PUERTA
CLRF CUENTA ;SE PONE A 0 LA CUENTA
CLRF CUENTA2 ; SE PONE A 0 CUENTA1
ACA BTFSS PORTA,0 ;SE TESTEA A0 SI ESTA A 0 VA GOTO AQUI SI ESTA A 1 VA CALL SUMA 1
GOTO AQUI
CALL SUMA1
AQUI BTFSS PORTA,1 ;SE TESTEA A1 SI ESTA A 0 VA A GOTO ACA SI ESTA A 1 VA A GOTO RETRO
GOTO ALLI
GOTO RETRO
ALLI BTFSS PORTA,2 ; TESTEA A2 SI ESTA A 0 VA A GOTO ALLA, SI ESTA A 1 VA A GOTO A CALL SUMA2
GOTO ALLA
CALL SUMA2
ALLA BTFSS PORTA,3 ;TESTEA A3 SI ESTA A 0 VA A GOTO RETRO2
GOTO ACA
GOTO RETRO2
AVANCE MOVLW MOTOR ;COPIA EN EL ACUMULADOR EL PRIMER VALOR DE LA TABLA
ADDWF CUENTA,W ; SE SUMA EL VALOR DEPOSITADO EN LA CUENTA
CALL TABLA ;SE LLAMA A TABLA CARGAR EN EL ACUMULADOR EL VALOR CORRESPONDIENTE DE LA BOBINA
MOVWF PORTB ;SE DESCARGA EL ACUMULADOR EN EL PUERTO B PARA EXITAR LA O LAS BOBINAS CORRESPONDIENTE
GOTO ACA ;RETORNA AL TESTEO DE LOS PINES A0 BO, B1, Y B2C
AVANCE2 MOVLW MOTOR2
ADDWF CUENTA2,W
CALL TABLA2
MOVWF PORTC
GOTO ACA
RETRO MOVLW 00H ; RUTINA INVERTIR EL GIRO DEL MOTOR, SI LA CUENTA ESTUBIESE EN CERO NO SE PODRIA RETROCEDER
SUBWF CUENTA,W ;POR ESO PARA COMPROBARLO COLOCAMOS EN W 00H Y LE RESTAMOS LA CUENTA PONIENDO EL RESULTADO EN W
BTFSC STATUS,2 ; SI EL RESULTADO DA 0 CARGAMOS W CON 04H VALOR MAXIMO DE LA CUENTA
MOVLW 04H ; Y LO DEPOSITAMOS EN LA CUENTA PARA EMPEZAR A RESTAR DE ESA MANERA INVERTIMOS EL GIRO DEL MOTOR
MOVWF CUENTA ;AL IR LA CUENTA ASIA ATRAS
CALL RESTA1 ; SE LLAMA A RUTINA DE RESTA1;
GOTO AVANCE ;VA AVANCE PARA QUE SAQUE EL VALOR DE BOBINA UENTACORRESPONDIENTE
RETRO2 MOVLW 00H
ADDWF CUENTA2,W
BTFSC STATUS,2
MOVLW CUENTA2
CALL RESTA2
GOTO AVANCE2
SUMA1 INCF CUENTA,F ;INCREMENTA LA CUENTA EN 1;
MOVLW 04H ;PARA COMPROBAR SI LA CUENTA HA LLEGADO AL MAXIMO (04h), SE COLOCA EN EL W 04H
SUBWF CUENTA,W ; Y SE LE RESTA EL VALOR DE LA CUENTA, DEPOSITANDO EL RESULTADO EN W
BTFSC STATUS,2 ;SI EL RESULTADO DA 0 SIGNIFICA QUE SE HA LLEGADO AL MAXIMO DE LA CUENTA
CLRF CUENTA ;SI A LLEGADO AL MAXIMO SE PONE LA CUENTA A CERO
GOTO AVANCE ;SI NO HA LLEGADO A 0 VA MOVER OTRA VEZ EL MOTOR
RETURN
SUMA2 INCF CUENTA2,F
MOVLW 04H
SUBWF CUENTA2,W
BTFSC STATUS,2
CLRF CUENTA2
GOTO AVANCE2
RETURN
RESTA1 DECF CUENTA,F ; RUTINA DE RESTAR 1 A LA CUENTA
RETURN
RESTA2 DECF CUENTA,F
RETURN
END