Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

Construyendo un bipedo "RoYbot" - Nivel principiante -Ayuda

17 Respuestas
5 Usuarios
0 Reactions
9,680 Visitas
fulguitron
Respuestas: 50
Topic starter
(@fulguitron)
Trusted Member
Registrado: hace 16 años

Buenas noches, después de un buen tiempo desconectado vuelvo a la carga con otro robocillo. El primero tuve que dejarlo porque al hacer las piezas en plastico y Loctite era un dolor pegarlo otra vez antes de que se moviera. Ahora he hecho uno de metal y más a conciencia. Se parece mucho al BRAT pero prefiero empezar con algo que funciona que aventurarme en cosas nuevas.
Buenos os dejo unas fotillos para que las critiqueis y de paso unas dudas para seguir adelante con mi proyecto.

thump 7742645img0777 medium thump 7742654img0778 medium

thump 7742656img0779 medium thump 7742662img0780 medium

También os paso el código que como vereis es bastante cutre salchichero pero ahí entrais vosotros. En breve (cuando consiga caminar sin que se caiga) colgaré un video que ya tengo ganas de enseñar mi pqueña obra maestra.

LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

cblock 0x0c
contA

ENDC

ORG 0 ; El programa comienza en la dirección 0.
Inicio
bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B configuradas como salidas.
movlw b'00011111' ; Las 5 líneas del Puerto A configuradas como entradas.
movwf TRISA
bcf STATUS,RP0
movlw d'30'
movwf contA

Saludo
bsf PORTB,0 ; Activa el PORTB1
call Retardo_50micros ; la suma de los call genera el tiempo
call Retardo_400micros ; en alto para un ángulo de 60º
bcf PORTB,0 ; Desactiva el PORTB1
call Retardo_10ms ; la suma de los call genera el tiempo
call Retardo_5ms ; la suma de los call genera el tiempo
call Retardo_2ms ; la suma de los call genera el tiempo
call Retardo_2ms ; la suma de los call genera el tiempo
decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Saludo ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del saludo
movwf contA
Saludo_2
bsf PORTB,0 ; Activa el PORTB1
call Retardo_1ms ; la suma de los call genera el tiempo
call Retardo_500micros ; la suma de los call genera el tiempo
call Retardo_400micros ; en alto para un ángulo de 60º
bcf PORTB,0 ; Desactiva el PORTB1
call Retardo_10ms ; la suma de los call genera el tiempo
call Retardo_5ms ; la suma de los call genera el tiempo
call Retardo_2ms ; la suma de los call genera el tiempo
decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Saludo_2 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del saludo_2
movwf contA

Paso_1
bsf PORTB,1
call Retardo_500micros ; la suma de los call genera el tiempo de 30º
call Retardo_100micros
bcf PORTB,1
bsf PORTB,2
call Retardo_500micros ; la suma de los call genera el tiempo de 30º
call Retardo_100micros
bcf PORTB,2
bsf PORTB,3
call Retardo_1ms ; la suma de los call genera el tiempo de 105º
call Retardo_500micros ;
call Retardo_100micros ;
call Retardo_50micros ;
bcf PORTB,3
bsf PORTB,4
call Retardo_1ms ; la suma de los call genera el tiempo de 105º
call Retardo_200micros ;
call Retardo_100micros ;
call Retardo_50micros ;
bcf PORTB,4
bsf PORTB,5
call Retardo_1ms ; la suma de los call genera el tiempo de 75º
call Retardo_50micros ;
bcf PORTB,5
bsf PORTB,6
call Retardo_1ms ; la suma de los call genera el tiempo de 75º
call Retardo_50micros ;
bcf PORTB,6
bsf PORTB,7
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,7
call Retardo_10ms ; la suma de los call genera el tiempo

decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Paso_1 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del Paso_1
movwf contA

Paso_2
bsf PORTB,1
call Retardo_500micros ; la suma de los call genera el tiempo de 30º
call Retardo_100micros
bcf PORTB,1
bsf PORTB,2
call Retardo_500micros ; la suma de los call genera el tiempo de 45º
call Retardo_200micros
call Retardo_50micros
bcf PORTB,2
bsf PORTB,3
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,3
bsf PORTB,4
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,4
bsf PORTB,5
call Retardo_500micros ; la suma de los call genera el tiempo de 45º
call Retardo_200micros ;
call Retardo_50micros ;
bcf PORTB,5
bsf PORTB,6
call Retardo_500micros ; la suma de los call genera el tiempo de 30º
call Retardo_100micros ;
bcf PORTB,6
bsf PORTB,7
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,7
call Retardo_10ms ; la suma de los call genera el tiempo

decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Paso_2 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del Paso_1
movwf contA

Paso_3
bsf PORTB,1
call Retardo_500micros ; la suma de los call genera el tiempo de 30º
call Retardo_100micros
bcf PORTB,1
bsf PORTB,2
call Retardo_500micros ; la suma de los call genera el tiempo de 45º
call Retardo_200micros
call Retardo_50micros
bcf PORTB,2
bsf PORTB,3
call Retardo_1ms ; la suma de los call genera el tiempo de 105º
call Retardo_50micros ;
bcf PORTB,3
bsf PORTB,4
call Retardo_1ms ; la suma de los call genera el tiempo de 105º
call Retardo_50micros ;
bcf PORTB,4
bsf PORTB,5
call Retardo_500micros ; la suma de los call genera el tiempo de 45º
call Retardo_200micros ;
call Retardo_50micros ;
bcf PORTB,5
bsf PORTB,6
call Retardo_500micros ; la suma de los call genera el tiempo de 30º
call Retardo_100micros ;
bcf PORTB,6
bsf PORTB,7
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,7
call Retardo_10ms ; la suma de los call genera el tiempo

decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Paso_3 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del Paso_1
movwf contA

Paso_4
bsf PORTB,1
call Retardo_1ms ; la suma de los call genera el tiempo de 150º
call Retardo_200micros
bcf PORTB,1
bsf PORTB,2
call Retardo_1ms ; la suma de los call genera el tiempo de 135º
call Retardo_200micros
bcf PORTB,2
bsf PORTB,3
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_50micros ;
bcf PORTB,3
bsf PORTB,4
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_50micros ;
bcf PORTB,4
bsf PORTB,5
call Retardo_1ms ; la suma de los call genera el tiempo de 135º
call Retardo_500micros
call Retardo_100micros
call Retardo_50micros
bcf PORTB,5
bsf PORTB,6
call Retardo_1ms ; la suma de los call genera el tiempo de 150º
call Retardo_500micros
call Retardo_200micros
call Retardo_100micros
bcf PORTB,6
bsf PORTB,7
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,7
call Retardo_10ms ; la suma de los call genera el tiempo

decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Paso_4 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del Paso_1
movwf contA

Paso_5
bsf PORTB,1
call Retardo_1ms ; la suma de los call genera el tiempo de 135º
call Retardo_500micros
call Retardo_100micros
call Retardo_200micros
bcf PORTB,1
bsf PORTB,2
call Retardo_1ms ; la suma de los call genera el tiempo de 150º
call Retardo_500micros
call Retardo_50micros
call Retardo_100micros
bcf PORTB,2
bsf PORTB,3
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,3
bsf PORTB,4
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,4
bsf PORTB,5
call Retardo_1ms ; la suma de los call genera el tiempo de 135º
call Retardo_500micros
call Retardo_100micros
call Retardo_50micros
bcf PORTB,5
bsf PORTB,6
call Retardo_1ms ; la suma de los call genera el tiempo de 150º
call Retardo_500micros
call Retardo_200micros
call Retardo_100micros
bcf PORTB,6
bsf PORTB,7
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,7
call Retardo_10ms ; la suma de los call genera el tiempo

decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Paso_5 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del Paso_1
movwf contA

Paso_6
bsf PORTB,1
call Retardo_1ms ; la suma de los call genera el tiempo de 135º
call Retardo_500micros
call Retardo_200micros
call Retardo_100micros
bcf PORTB,1
bsf PORTB,2
call Retardo_1ms ; la suma de los call genera el tiempo de 150º
call Retardo_500micros
call Retardo_100micros
call Retardo_50micros
bcf PORTB,2
bsf PORTB,3
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
call Retardo_100micros
call Retardo_50micros

bcf PORTB,3
bsf PORTB,4
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
call Retardo_100micros
call Retardo_50micros

bcf PORTB,4
bsf PORTB,5
call Retardo_1ms ; la suma de los call genera el tiempo de 150º
call Retardo_500micros
call Retardo_100micros
call Retardo_50micros
bcf PORTB,5
bsf PORTB,6
call Retardo_1ms ; la suma de los call genera el tiempo de 135º
call Retardo_500micros
call Retardo_200micros
call Retardo_100micros
bcf PORTB,6
bsf PORTB,7
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,7
call Retardo_10ms ; la suma de los call genera el tiempo

decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Paso_6 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del Paso_1
movwf contA

Paso_7
bsf PORTB,1
call Retardo_500micros ; la suma de los call genera el tiempo de 30º
call Retardo_100micros
bcf PORTB,1
bsf PORTB,2
call Retardo_500micros ; la suma de los call genera el tiempo de 45º
call Retardo_200micros
call Retardo_50micros
bcf PORTB,2
bsf PORTB,3
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
call Retardo_100micros ;
call Retardo_50micros ;
bcf PORTB,3
bsf PORTB,4
call Retardo_1ms ; la suma de los call genera el tiempo de 105º
call Retardo_200micros ;
call Retardo_100micros ;
call Retardo_50micros ;
bcf PORTB,4
bsf PORTB,5
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,5
bsf PORTB,6
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,6
bsf PORTB,7
call Retardo_1ms ; la suma de los call genera el tiempo de 90º
call Retardo_200micros ;
bcf PORTB,7
call Retardo_10ms ; la suma de los call genera el tiempo

decfsz contA ; Cuenta a contA y sigue en la línea de abajo
goto Paso_7 ; Cuando contA sea = 0 omite la línea siguiente.
clrf contA
movlw d'80' ; Tiempo de duración del Paso_1
movwf contA

goto Paso_2

INCLUDE<LIBSERVOS.INC>

End

No os fijeis en los comentarios de los ángulos porque quizás no estén todos arreglados, porque lo voy cambiando sobre la marcha.

Y ahora es cuando necesito toda vuestra ayuda para seguir adelante. Tengo tres frentes a atacar y no se como empezar.

Frente 1 - Actualmente puedo controlar los ángulos, pero no la velocidad de los motores, como lo consigo??? alguien tiene algún ejemplo sencillo en ASM??

Frente 2 - Quiero montarle un sensor de infrarrojos el GP2DXX, que os parece?? es sencillo de usar?? me conformo que pueda detectar obstaculos a cierta distancia y si pudiera medir la distancia para un futuro mejor que mejor.

Frente 3 - También sé que con los conectores del programador de PICS lo puedo conectar al PIC16F84A para no tener que estar montando y desmontando el micro. Es cierto?? es solamente conectar los cables y listo?? sabeis el orden?? Os dejo fotillo de lo que os digo por sino me explico bien

thump 7742692img0781 medium

Pues nada, espero vuestras respuestas y a ver si llego más lejos con RoYbot que con el anterior Panchito jejejeje.

Un saludo a todos y muchas gracias

Responder
16 respuestas
thoron
Respuestas: 33
(@thoron)
Eminent Member
Registrado: hace 15 años

Imagino por la imagen del programador que no puedes depurar. ¿Tampoco tienes leds o lo que sea para señalizar eventos?

Yo hace como un par de años que no toco ensamblador, y además lo usaba para los 18, que eran más agradecidos sobre todo para el tema de la memoria, pero le he pegado un ojo y no hay nada que salte a la vista... De todos modos, ¿No tienes hechos flujogramas o algún esquema que haga más sencillo seguir el hilo "general"?

Por otro lado, ¿Cómo haces exactamente el "relleno" de los 20ms? No ando muy puesto en servos, pero si no recuerdo mal, la señal ha de ser siempre de 20ms de periodo, y lo que varías es el ciclo de trabajo (Entre 0.5 y 2.5ms). Sin embargo, si lo he entendido bien, tu "relleno" es independiente de la longitud del pulso, ¿no? Los 18ms que indicabas, con lo que te queda un período variable entre 18.5 y 20.5ms

De hecho, igual te digo una tontería (Cosas de ir con prisas y no mirarlo en profundidad) pero... ¿Podría ser que los valores que controlan el tiempo en alto te desborden y por eso haga esa pausa hasta que lleguen a un umbral "correcto"?

Responder
fulguitron
Respuestas: 50
Topic starter
(@fulguitron)
Trusted Member
Registrado: hace 16 años

A ver, he mirado el código y según lo que dice Thoron, creo que lleva razón, hay un follón de tiempos que hay algo que no cuadra. Estoy mirando los tiempos de nuevo y me encuentro que aún poniendo un preescaler al TMR0 no hay manera de tener los tiempos correctos. Si pongo un preescaler de dos acabo poniendo el TMR0 a 300 o sí lo pongo con un preescaler de 4 tampoco me va bien.
Como debo actuar??? no encuentro los tiempos, una ayudaaaaaaaaaaaaaaaaaaaaa

Responder
Página 4 / 4
Compartir: