Ayuda con pic16f84

Quiero ver si me ayudas con algún programa para mover 2 motores paso a paso unipolares, usando el pic16f84 y el driver uln2803, este programa tiene que tener interrupciones y todo lo demás. Se supone que con este programa tengo que controlar un brazo robot.

1 respuesta

Respuesta
-1
Hay muchas formas de programar el PIC 16F84 para mover un motor paso a paso unipolar. Especifícame el tipo de interrupciones y de recursos que quieres utilizar, así como cuantas entradas tienes.
En cuanto al funcionamiento del motor y del driver te recomiendo esta dirección:
http://www.todorobot.com.ar/informacion/tutorial%20stepper/stepper-tutorial.htm
Cualquier problema no dudes en preguntarme. Krust52
Bueno la verdad que esa página ya la había visto, yo ya hice un proyecto de un motor paso a paso que giraba a la derecha y a la izquierda según que botonera presionara, pero ahora tengo que hacer un brazo con 2 motores y no se como programar el pic para que me haga el movimiento de la base y de la garra, espero haberme explicado, por esta razón te escribí para que me ayudaras con el programa más específicamente que lo hicieras, bueno si lo haces aquí te dejo unas especificaciones y si no gracias de todas formas:
1. Construya un actuador robótico de 2 grados de libertad. El diseño contempla una articulación central formado por un motor stepper (A), el cual permite el giro en 360 grados. En el otro extremo del brazo deberá tener una garra (dos dedos), cuya construcción estará basada en un segundo motor stepper (de menor peso y tamaño).
La garra debe tomar objetos que estén entre 7 cm y 0,7cm de ancho. El diseño de ésta queda a libertad.
2. El control de los motores stepper se debe efectuar por medio de botones (4 botones). Las subrutinas de tiempo asociadas a los motores stepper se deben realizar por medio del TMR0. No se aceptarán subrutinas de decremento de registros.
Estas especificaciones fueron dadas por mi profesor, si quieres te mando el programa que hice en mi primer proyecto.
Espero tu respuesta gracias
Para las subrutinas de tiempo mediante el TMR0, se realiza prácticamente igual que con el decremento de registros.
Hay dos maneras de contar tiempo con el TMR0.
1 - Decrementando el TMR0 según los pulsos de reloj y preguntando por el bit T0IF del byte INTCON (este bit se pone a 1 cuando ha ocurrido un desbordamiento del TMR0). Una vez comprobado el desbordamiento hay que poner a 0 dicho bit.(El decremento del TMR0 se configura en el registro OPTION asignándole un divisor, poniendo el bit PSA a 0 y poniendo a 1 el bit TOSC para indicar que se debe decrementar a través de los pulsos de reloj.)El valor de los tres primeros bits del registro OPTION indican el valor del divisor de frecuencia, variando este valor, se varía la temporización.
2 - Decrementando el TMR0 igual que en el caso anterior pero esta vez, el desbordamiento del TMR0 produce una interrupción. De esta forma se consigue una temporización muy precisa. Para ello los bits necesarios son:
·Del registro OPTION los mismos que en el caso anterior.
·Del registro INTCON hay que poner a 1 el bit GIE que permite que haya interrupciones, el bit T0IE que permite la interrupción al desbordarse el TMR0.
Cuando se produzca la interrupción se debe resetear el TMR0, y el flag de interrupción del TMR0.
Estas son dos formas de hacer temporizaciones por medio del TMR0. El control por medio de cuatro botones es similar (supongo), al proyecto que realizaste anteriormente. Por ello creo que quizás el problema lo tengas en la creación de las temporizaciones.
Hola gracias por responderme, mira no entendí muy bien tu explicación es que yo no llevo mucho tiempo con pic prefiero mandarte el programa y que tu, si es que puedes, me lo arregles con lo que te he pedido, ya que este programa tiene decrementacion
list p=16f84
STATUS EQU 03h ; REGISTRO ESTADO
PORTA EQU 05h ; PUERTO A
PORTB EQU 06h ; PUERTO B
Trisa equ 85h ; registro configuración puerto a
trisb equ 86h ; registro configuración puerto b
tiemp1 equ 0ch ; registros de propósito general
TIEMP2 EQU 1Ch
TIEMP3 EQU 2Ch
ORG 00h ; INDICA AL COMPILADOR DONDE COMIENZA EL PROGRAMA
GOTO INICIO ; VA A SUBRUTINA INICIO
Inicio
BSF STATUS, 5
MOVLW B'11111' ; CARGA '11111' EN EL REGISTRO DE TRABAJO 'W'
MOVWF TRISA ; CARGA 'W' EN EL PUERTO A
MOVLW B'00000000' ; CARGA '00000000' EN EL REGISTRO DE TRABAJO 'W'
MOVWF TRISB ; CARGA 'W' EN EL PUERTO B
BCF STATUS, 5 ; VUELVE A 0
GOTO GIRO ; VA A SUBRUTINA GIRO
GIRO
BTFSC PORTA,0 ; EN ESTE PUERTO DA EL GIRO A LA IZQUIERDA
GOTO IZQUIERDA
BTFSC PORTA,1 ; EN ESTE PUERTO DA EL GIRO A LA DERECHA
GOTO DERECHA
BTFSC PORTA,2 ; EN ESTE PUERTO ABRE
GOTO ABRE
BTFSC PORTA,3 ; EN ESTE PUERTO CIERRA
GOTO CIERRA
GOTO GIRO
Derecha
MOVLW B'00001100' ; PRIMER PASO.
MOVWF PORTB
CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGIENTE PASO
MOVLW B'00000110' ; SEGUNDO PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'00000011' ; TERCER PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'00001001' ; CUARTO PASO
MOVWF PORTB
CALL TIEMPO
GOTO GIRO ; SE VUELE A GIRO PARA MIRAR EL ESTADO DEL BIT
Izquierda
MOVLW B'00001001' ; PRIMER PASO
MOVWF PORTB
CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGUIENTE PASO
MOVLW B'00000011' ; SEGUNDO PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'00000110' ; TERCER PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'00001100' ; CUARTO PASO
MOVWF PORTB
CALL TIEMPO
GOTO GIRO ; SE VUELVE A GIRO PARA MIRAR EL ESTADO DEL BIT
Cierra
MOVLW B'11000000' ; PRIMER PASO.
MOVWF PORTB
CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGIENTE PASO
MOVLW B'01100000' ; SEGUNDO PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'00110000' ; TERCER PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'10010000' ; CUARTO PASO
MOVWF PORTB
CALL TIEMPO
GOTO GIRO ; SE VUELE A GIRO PARA MIRAR EL ESTADO DEL BIT
Abre
MOVLW B'10010000' ; PRIMER PASO
MOVWF PORTB
CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGUIENTE PASO
MOVLW B'00110000' ; SEGUNDO PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'01100000' ; TERCER PASO
MOVWF PORTB
CALL TIEMPO
MOVLW B'11000000' ; CUARTO PASO
MOVWF PORTB
CALL TIEMPO
GOTO GIRO ; SE VUELVE A GIRO PARA MIRAR EL ESTADO DEL BIT
Tiempo
MOVLW D'10' ; CARGA CON UN LITERAL TIEMP1
MOVWF TIEMP1
tiempo2
MOVLW D'100'
MOVWF TIEMP2
tiempo3
MOVLW D'100'
MOVWF TIEMP3
tiempo4
decfsz tiemp3, 1 ; decrementa tiemp3 y si es 0 salta
goto tiempo4 ; volver a tiempo4
decfsz tiemp2, 1 ; decrementa tiemp2 y si es 0 salta
goto tiempo3 ; volver a tiempo3
decfsz tiemp1, 1 ; decrementa tiemp1 y si es 0 salta
goto tiempo2 ; volver a tiempo2
return ; retorna de donde fue llamada
end ; fin
Gracias
Lineas de configuración para la temporización
bcf OPTION, PSA
bsf OPTION, TOSC
bsf OPTION, 0 ;Preescaler asociado al TMR0
bsf OPTION, 1 ;Preescaler asociado al TMR0
bsf OPTION, 2 ;Preescaler asociado al TMR0
Para realizar una temporización tan sólo hay que llamar a Temporiza del modo
call Temporiza
Temporiza clrf TMR0 ; Pone el TMR0 a cero.
Tiempo btfsc T0IF ; Comprueba el flag de desbordamiento
goto retorno ; Si ha habido desbordamiento
goto Tiempo ; no ha habido desbordamiento
Retorno bcf ToIF ; Pone el flag de desbordamiento a cero
return ; Retorno de la temporización
Lo primero hay que poner las líneas de configuración para la temporización justo debajo de la linea en la que accedes al banco 1.
Te queda de la siguiente manera:
Inicio
BSF STATUS, 5
Bcf OPTION, PSA
Bsf OPTION, TOSC
Bsf OPTION, 0 ;Preescaler asociado al TMR0
bsf OPTION, 1 ;Preescaler asociado al TMR0
bsf OPTION, 2 ;Preescaler asociado al TMR0
MOVLW B'11111' ; CARGA '11111' EN EL REGISTRO DE TRABAJO 'W'
MOVWF TRISA ; CARGA 'W' EN EL PUERTO A
MOVLW B'00000000' ; CARGA '00000000' EN EL REGISTRO DE TRABAJO 'W'
MOVWF TRISB ; CARGA 'W' EN EL PUERTO B
BCF STATUS, 5
El programa se realiza de la misma manera pero ahora en vez de llamar a la temporización que has creado con decrementaciones
llama a la rutina Temporiza (que son las lineas superiores)
Temporiza clrf TMR0 ; Pone el TMR0 a cero.
Tiempo btfsc T0IF ; Comprueba el flag de desbordamiento
goto retorno ; Si ha habido desbordamiento
goto Tiempo ; no ha habido desbordamiento
Retorno bcf ToIF ; Pone el flag de desbordamiento a cero
return ; Retorno de la temporización
Incluye esto en tu programa y puedes suprimir las otras rutinas de temporización.
Para obtener una temporización mayor realiza llamadas seguidas a la rutina de Temporiza.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas