aquí esta el código asm
Código:
_ ;CONFIG _ CP_ OFF & _ W DT_ OFF & _ BODEN_ ON & _ PW RTE_ ON &_ HS_ OSC & _ DATA_ CP_ OFF & _ LVP_ OFF & _ MCLRE_ ON
llave EQU 0x20 ;Registros de propósito general.
llave2 EQU 0x21
POSSIG_DER EQU 0x22
POSSIG_IZQ EQU 0x23
POSSIG_DER2 EQU 0x24
POSSIG_IZQ2 EQU 0x25
llave3 EQU 0x26
POSSIG_DER3 EQU 0x27
POSSIG_IZQ3 EQU 0x28
CONTADOR EQU 0x29
; Asignacion de pines de entrada con las señales del LPT
STEP SET 0x00
DIR SET 0x04
STEP2 SET 0x03
DIR2 SET 0x02
STEP3 SET 0x01
DIR3 SET 0x00
;Asignacion de pines de salida con los motores
M1A SET 0x01
M1B SET 0x02
M2A SET 0x03
M2B SET 0x04
M3A SET 0x05
M3B SET 0x06
ENABLE SET 0x07
org 0x00 ; Aquí comienza el micro
goto INICIO ; Salto a inicio de mi programa
;**** Vector de Interrupcion ****
org 0x04 ; Atiendo Interrupcion
goto ISR
; **** Programa Principal ****
org 0x05 ; Origen del código de programa
;**********************************************************************************************
;PROGRAMA PRINCIPAL.
INICIO:
bsf STATUS, RP0 ; Pasamos de Banco 0 a Banco 1
movlw b\'11111111\' ;PORTA como Entrada
movwf TRISA
movlw b\'00000001\' ;Se configura PORTB (B1-B7) como SALIDA; B0 entrada
movwf TRISB
bcf STATUS, RP0 ;De regreso al banco 0
movlw 0x07 ;Se configura los comparadores como salidas
movwf cmcon
movlw b\'00110001\' ; Se selecciona TMR1, preescaler de 1/8, modo temporizador
movwf T1CON
movlw 0x00 ; Cargamos 0 en TMR1 para lograr 87.38 ms con frec.osc=24MHz
movwf TMR1H ; Byte alto de TMR1
movlw 0x00
movwf TMR1L ; Byte bajo de TMR1
bsf STATUS,RP0 ; Banco 1
bsf PIE1,TMR1IE ; Activar interrupción por TMR1
bsf INTCON,GIE ; Habilitacion general de interrupciones
bsf INTCON,PEIE ; Habilitacion de Interrupcion por perifericos
bcf STATUS,RP0 ; Banco 0
clrf PORTB ;Pongo en cero el puerto B
bsf PORTB, ENABLE ; Se activan los motores
clrf POSSIG_DER ;Iniciamos las variables en 0
clrf POSSIG_IZQ
clrf POSSIG_DER2
clrf POSSIG_IZQ2
clrf POSSIG_DER3
clrf POSSIG_IZQ3
movlw 0x56 ;Se carga la variable que servira como contador de desbordamiento de timer1
movwf CONTADOR ;Con 0x56 (86) unidades se logra un tiempo de 7.51 s (se apagan motores, si en este tiempo no llega una senal de step)
BUCLE:
; btfss PORTB, ENABLE ;Testea el enable
; call DESACTIVAR
; lo siguiente es para asegurar que se a puesto en bajo el pin y evitar multiples pasos con un solo pulso
btfss PORTB, STEP ; si Step esta en 0 ejecuta la siguiente linea si no se omite
bsf llave, 0 ; pone en alto el primer bit de llave
btfss PORTB, STEP ;Se mira el estado de STEP, y si esta en 0 brinco a motor 2 para a revisart el pulso de step2
;si esta en 1 se comprueba que el pulso anterior a terminado con el valor de la variable llave en 1
goto motor2
btfss llave, 0
goto motor2
btfss PORTA, DIR ;este paso indica que el pulso anterio a terminado y ha llegado un pulso nuevo, aqui reviso la direccion seleccionada
goto DERECHA ;paso a la izquierda
goto IZQUIERDA ;paso a la derecha
motor2:
; lo siguiente es para asegurar que se a puesto en bajo el pin y evitar multiples pasos con un solo pulso
btfss PORTA, STEP2 ; si Step2 esta en 0 ejecuta la siguiente linea si no se omite
bsf llave2, 0 ; pone en alto el primer bit de llave
btfss PORTA, STEP2 ;Se mira el estado de STEP2, y si esta en 0 brinco a motor 3 para a revisart el pulso de step3
;si esta en 1 se comprueba que el pulso anterior a terminado con el valor de la variable llave2 en 1
goto motor3
btfss llave2, 0
goto motor3
btfss PORTA, DIR2
goto DERECHA2 ;paso a la izquierda
goto IZQUIERDA2 ;paso a la derecha
motor3:
; lo siguiente es para asegurar que se a puesto en bajo el pin y evitar multiples pasos con un solo pulso
btfss PORTA, STEP3 ; si Step3 esta en 0 ejecuta la siguiente linea si no se omite
bsf llave3, 0 ; pone en alto el primer bit de llave
btfss PORTA, STEP3 ;Se mira el estado de STEP2, y si esta en 0 prosigo a revisart el pulso de step
;si esta en 1 se comprueba que el pulso anterior a terminado con el valor de la variable llave2 en 1
goto BUCLE
btfss llave3, 0
goto BUCLE
btfss PORTA, DIR3
goto DERECHA3 ;paso a la izquierda
goto IZQUIERDA3 ;paso a la derecha
;**********************************************************************************************
;DESACTIVAR:
; bcf PORTB, 0x06 ;desactivo el LB1845 poniendoo en 1 RB6
;BUCLE_2:
; btfss PORTB, ENABLE ;permanece en esta sobrutina
; goto BUCLE_2 ;mientras el enable este en 0
; bsf PORTB, 0x06
; RETURN
;**********************************************************************************************
; en las sig tablas deduzco el paso siguiente a realizar
; segun los contadores de paso POSSIG_IZQ y POSSIG_IZQ
IZQUIERDA:
bsf PORTB, ENABLE ; Se habilitan motores
movlw 0x56 ;Se carga la variable que servira como contador de desbordamiento de timer1
movwf CONTADOR ;Con 0x56 (86) unidades se logra un tiempo de 7.51 s (se apagan motores, si en este tiempo no llega una senal de step)
bcf llave, 0
movf POSSIG_IZQ, W
addwf PCL, F
goto PASO1 ;POS 0
goto PASO2 ;POS 1
goto PASO3 ;POS 2
goto PASO4 ;POS 3
DERECHA:
bsf PORTB, ENABLE ; Se habilitan motores
movlw 0x56 ;Se carga la variable que servira como contador de desbordamiento de timer1
movwf CONTADOR ;Con 0x56 (86) unidades se logra un tiempo de 7.51 s (se apagan motores, si en este tiempo no llega una senal de step)
bcf llave, 0
movf POSSIG_DER, W
addwf PCL, F
goto PASO1 ;POS 0
goto PASO2 ;POS 1
goto PASO3 ;POS 2
goto PASO4 ;POS 3
IZQUIERDA2:
bsf PORTB, ENABLE ; Se habilitan motores
movlw 0x56 ;Se carga la variable que servira como contador de desbordamiento de timer1
movwf CONTADOR ;Con 0x56 (86) unidades se logra un tiempo de 7.51 s (se apagan motores, si en este tiempo no llega una senal de step)
bcf llave2, 0
movf POSSIG_IZQ2, W
addwf PCL, F
goto PASO1b ;POS 0
goto PASO2b ;POS 1
goto PASO3b ;POS 2
goto PASO4b ;POS 3
DERECHA2:
bsf PORTB, ENABLE ; Se habilitan motores
movlw 0x56 ;Se carga la variable que servira como contador de desbordamiento de timer1
movwf CONTADOR ;Con 0x56 (86) unidades se logra un tiempo de 7.51 s (se apagan motores, si en este tiempo no llega una senal de step)
bcf llave2, 0
movf POSSIG_DER2, W
addwf PCL, F
goto PASO1b ;POS 0
goto PASO2b ;POS 1
goto PASO3b ;POS 2
goto PASO4b ;POS 3
IZQUIERDA3:
bsf PORTB, ENABLE ; Se habilitan motores
movlw 0x56 ;Se carga la variable que servira como contador de desbordamiento de timer1
movwf CONTADOR ;Con 0x56 (86) unidades se logra un tiempo de 7.51 s (se apagan motores, si en este tiempo no llega una senal de step)
bcf llave3, 0
movf POSSIG_IZQ3, W
addwf PCL, F
goto PASO1c ;POS 0
goto PASO2c ;POS 1
goto PASO3c ;POS 2
goto PASO4c ;POS 3
DERECHA3:
bsf PORTB, ENABLE ; Se habilitan motores
movlw 0x56 ;Se carga la variable que servira como contador de desbordamiento de timer1
movwf CONTADOR ;Con 0x56 (86) unidades se logra un tiempo de 7.51 s (se apagan motores, si en este tiempo no llega una senal de step)
bcf llave3, 0
movf POSSIG_DER3, W
addwf PCL, F
goto PASO1c ;POS 0
goto PASO2c ;POS 1
goto PASO3c ;POS 2
goto PASO4c ;POS 3
;*********************************************************************************************************
PASO1:
bsf PORTB, M1A ;realiso el paso 1 (b\'11\')
bsf PORTB, M1B
movlw 0x03
movwf POSSIG_IZQ
movlw 0x01
movwf POSSIG_DER
goto motor2
PASO2:
bsf PORTB, M1A ;realiso el paso 2 (b\'01\')
bcf PORTB, M1B
movlw 0x00
movwf POSSIG_IZQ
movlw 0x02
movwf POSSIG_DER
goto motor2
PASO3:
bcf PORTB, M1A ;realiso el paso 3 (b\'00\')
bcf PORTB, M1B
movlw 0x01
movwf POSSIG_IZQ
movlw 0x03
movwf POSSIG_DER
goto motor2
PASO4:
bcf PORTB, M1A ;realiso el paso 4 (b\'10\')
bsf PORTB, M1B
movlw 0x02
movwf POSSIG_IZQ
movlw 0x00
movwf POSSIG_DER
goto motor2
PASO1b:
bsf PORTB, M2A ;realiso el paso 1 (b\'11\')
bsf PORTB, M2B
movlw 0x03
movwf POSSIG_IZQ2
movlw 0x01
movwf POSSIG_DER2
goto motor3
PASO2b:
bsf PORTB, M2A ;realiso el paso 2 (b\'01\')
bcf PORTB, M2B
movlw 0x00
movwf POSSIG_IZQ2
movlw 0x02
movwf POSSIG_DER2
goto motor3
PASO3b:
bcf PORTB, M2A ;realiso el paso 3 (b\'00\')
bcf PORTB, M2B
movlw 0x01
movwf POSSIG_IZQ2
movlw 0x03
movwf POSSIG_DER2
goto motor3
PASO4b:
bcf PORTB, M2A ;realiso el paso 4 (b\'10\')
bsf PORTB, M2B
movlw 0x02
movwf POSSIG_IZQ2
movlw 0x00
movwf POSSIG_DER2
goto motor3
PASO1c:
bsf PORTB, M3A ;realiso el paso 1 (b\'11\')
bsf PORTB, M3B
movlw 0x03
movwf POSSIG_IZQ3
movlw 0x01
movwf POSSIG_DER3
goto BUCLE
PASO2c:
bsf PORTB, M3A ;realiso el paso 2 (b\'01\')
bcf PORTB, M3B
movlw 0x00
movwf POSSIG_IZQ3
movlw 0x02
movwf POSSIG_DER3
goto BUCLE
PASO3c:
bcf PORTB, M3A ;realiso el paso 3 (b\'00\')
bcf PORTB, M3B
movlw 0x01
movwf POSSIG_IZQ3
movlw 0x03
movwf POSSIG_DER3
goto BUCLE
PASO4c:
bcf PORTB, M3A ;realiso el paso 4 (b\'10\')
bsf PORTB, M3B
movlw 0x02
movwf POSSIG_IZQ3
movlw 0x00
movwf POSSIG_DER3
goto BUCLE
;**** Interrupcion por TMR1 ****
ISR
btfss PIR1,TMR1IF ; Consultamos si es por TMR1
retfie ; No lo es,entonces salimos de interrupcion
decfsz CONTADOR
goto Actualizo_TMR1
bcf PORTB, ENABLE ; Si el contador llega a 0 se pone en nivel bajo el pin RB7 para desabilitar motores
Actualizo_TMR1 ; Actualizo TMR1, no es necesario cargarlo con cero pues por defecto lo hace
; Restauro valores
bcf PIR1,TMR1IF ; Borro bandera de control de Interrupcion
retfie ; Salimos de interrupción
END
;********************************************************************************************************* ...
Última edición por un moderador: