Autor Tema: Construyendo un bipedo "RoYbot" - Nivel principiante  (Leído 4015 veces)

Fulguitron

  • PIC12F
  • **
  • Mensajes: 103
Construyendo un bipedo "RoYbot" - Nivel principiante
« en: Junio 02, 2012, 07:30:53 pm »
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.

 

   

   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.

Código: [Seleccionar]
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



           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
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

willynovi

  • PIC12F
  • **
  • Mensajes: 190
Re: Construyendo un bipedo "RoYbot" - Nivel principiante
« Respuesta #1 en: Junio 03, 2012, 04:39:11 pm »
Hola Fulguitron, muy bueno tu bipedo che, espero pronto ese video  :rolleyes2:

Ante todo, espero tomes bien mis comentarios y sean como crítica constructiva, ademas que aun ni he empezado a contruir mi bipedo  :'(
pero es como lo tengo pensado.

Lo de usar metal, por lo que se ve en las fotos es aluminio es lo mejor que podes hacer, la mejor relación peso resistencia, al menos a nuestro alcance.

Creo que estas usando 7 servos, 3 por cada pierna y uno en la cabeza y si mis calculos no fallan ya te quedaste corto con las entradas y salidas del 16f84, los bipedos que he visto no bajan de los 16 servos, así que seria bueno que pases a un micro con mas pines.

Yo primeramente habia pensado en un 16f877, pero luego descubrí la linea de los 18f4550 que tienen posibilidad de implementar USB muy rápidamente, mas que nada por la posibilidad de usar el mismo micro como programador y prescindir del programador externo.

Tambien es importante el tema de la memoria para programa, el 16f84 no creo te de para mucho mas y pronto vas a quedar limitado en ese punto.

Ahora, por la pregunta de como controlar la velocidad del servo,
el servo tiene ya un control de velocidad que lo usa para colocarse lo antes posible en la posición que le indicas con el ancho del pulso que le envias

lo que tienes que hacer tu es controlar el angulo, es decir hacer un control sobre el angulo que le indicas al servo.

mejor intento con un ejemplo, suponiendo que tienes que mover una articulación en 60° desde 0° a 60°

posicion inicial = 0°
posicion final = 60°

en ves de enviarle directamente el valor de 60° debes hacerlo en forma controlada para que la velocidad la impongas tu y no que sea a la máxima del servo.

se me ocurre,

posicion inicial = 0
posicion final = 60
final = 60
salida = 0
k = 2
hacer hasta (salida = final)
{
   salida = posicion inicial + (posicion final - posicion incial) / k
   posicion inicial = salida
}

donde salida es lo que le envias al servo.

es solo una idea, hay que darle forma, y tampoco lo he probado si funciona  ;D
lo que si tendras es una respuesta del servo mas suave.


Preparando el prototipo para la 10ma Competencia de Sumo en Bahía Blanca. - La 10ma pasó, será en la 11ra?

willynovi

  • PIC12F
  • **
  • Mensajes: 190
Re: Construyendo un bipedo "RoYbot" - Nivel principiante
« Respuesta #2 en: Junio 03, 2012, 04:51:37 pm »
con respecto a lo del USB te paso algunos enlaces que te pueden ayudar, al menos seria bueno que los vallas viendo  ;)

Bootloader HID Microchip más ejemplo, por Suky

ahora veo detenidamente el código y noto que para controlar los tiempos del pulso del servo usas llamadas a rutinas de retardo,
lo que tendrias que hacer es usar la interrupcion por tiempo del PIC.

aqui te dejo un ejemplo para controlar 8 servos, y en la misma página tenes mas info

CONTROLANDO 8 SERVOS CON UNA SOLA INTERRUPCIÓN de PicManía by RedRaven
Preparando el prototipo para la 10ma Competencia de Sumo en Bahía Blanca. - La 10ma pasó, será en la 11ra?

Fulguitron

  • PIC12F
  • **
  • Mensajes: 103
Re: Construyendo un bipedo "RoYbot" - Nivel principiante
« Respuesta #3 en: Junio 05, 2012, 06:29:13 pm »
   Las críticas siempre que sean con educación siempre son bienrecibidas por mi parte. La verdad es que aunque sea mas complicado el trabajar con aluminio (corté las piezas con caladora) el resultado es mucho mejor teniendo en cuenta el otro robot.
   Lo del micro, soy consciente de sus limitaciones, pero las mias como programador son más, asi que por el momento no voy a ir a más, aunque en un futuro pienso probar la serie 18 con conexión a USB, debe ser genial poder trabajar directamente sobre el pic.
   Lo del ejemplo que me has puesto no lo acabo de entender, puedes explicarte un poquito más??
   Creo que estoy a un paso de que Roy empiece a caminar por su propio bien.

   Seguiremos informando.
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Ariel

  • Global Moderator
  • dsPIC
  • ****
  • Mensajes: 10753
    • uControl
Re: Construyendo un bipedo "RoYbot" - Nivel principiante
« Respuesta #4 en: Junio 06, 2012, 10:00:06 am »
Hola Fulguitron, muy bueno tu bipedo che, espero pronto ese video  :rolleyes2:

+1

Muy buen proyecto. Vaya desde aquí nuestra felicitación por el logro, y el agradecimiento por compartirlo. ;)
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

willynovi

  • PIC12F
  • **
  • Mensajes: 190
Re: Construyendo un bipedo "RoYbot" - Nivel principiante
« Respuesta #5 en: Junio 06, 2012, 12:43:12 pm »
   Lo del ejemplo que me has puesto no lo acabo de entender, puedes explicarte un poquito más??
dices lo de controlar los servos con la interrupción?, creo que en la página de Picmania esta mejor de lo que podría explicarlo yo.

Por ahi te conviene empezar por algo mas simple, aqui un ejemplo
Control de un servo - Prueba 02: Control con interrupciones

esta hecho sobre un 16f628 que es similar al 16f84 que usas tu, ademas de que está en ASM  ;)
Preparando el prototipo para la 10ma Competencia de Sumo en Bahía Blanca. - La 10ma pasó, será en la 11ra?

Fulguitron

  • PIC12F
  • **
  • Mensajes: 103
Re: Construyendo un bipedo "RoYbot" - Nivel principiante
« Respuesta #6 en: Junio 10, 2012, 04:54:23 am »
   Gracias willynovi por el link, creo que es exctamente lo que estaba buscando. Voy a empezar a mirármelo y a ver si pronto puedo colgar algún avance y puedo controlar la velocidad del robot, porque actualmente va muy rápido al pasar de un ángulo a otro y se cae de la inercia.

           Muchas gracias y seguiremos informando.

   Por cierto, me podeis recomendar algún acelorómetro para el robot? creo que el sensor de ultrasonidos es todavía muy complicado de programar para mi, así que empezaré por el acelorómetro que creo, será más sencillo.

                         Saludos.  :rolleyes2: :rolleyes2:
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Fulguitron

  • PIC12F
  • **
  • Mensajes: 103
Re: Construyendo un bipedo "RoYbot" - Nivel principiante
« Respuesta #7 en: Junio 19, 2012, 06:14:47 pm »
   Bueno, voy a ir exponiendo mis adelantos, primero he cogido el programa del link que ha puesto willynovi y lo he modificado para que sea lo más simple posible. Con este programa coloco un servo a 90º.

Código: [Seleccionar]
list      p=16F84A ; definir procesador

include <p16F84A.inc> ; definiciones de variables específicas del procesador


__CONFIG _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

#define SERVO1 PORTB,0 ; puerto de salida de servo 1
#define Pulsador1 PORTA,0 ; puerto de salida de servo 1

CBLOCK 0x20
Posic ; posición servo
acum_A
ENDC

;***********************************************************************************

org 0x000
goto configuracion

;***********************************************************************************
; Principal
;***********************************************************************************

configuracion

clrf PORTA ; inicia ports
clrf PORTB ; inicia ports

bsf STATUS,RP0 ; Apunta a banco 1

movlw b'11111111' ; PORTA
movwf TRISA ; entradas

MOVLW b'00000000' ; PORTB
movwf TRISB ; salidas

movlw b'00000010' ; Configuración para TMR0
movwf OPTION_REG ; preescaler 2, 1:8 con CLK interno (que es
; de 1 MHz si el oscilador es de 4 MHz).
; El contador cuenta cada 8 useg

    bcf STATUS,RP0          ; Apunta a banco 0

clrf TMR0 ; inicia registro de timer en 0

movlw d'133' ; inicia valor de posición de servo (centro)
movwf Posic

principal

; Los servos actúan con un pulso de control que va entre 0,5 ms y 2,5 ms.
; En el bloque que sigue se inicia en 1 el pulso de control y se espera un
; retardo fijo de aproximadamente 0,5 ms, que es el valor mínimo del pulso.
; Con este valor de longitud de pulso y una longitud cero en la parte variable,
; el servo está parado al máximo hacia la izquierda (sentido antihorario).

bsf SERVO1 ; pone la señal de servo en 1
bcf INTCON,T0IF ; borra el flag de timer
movlw d'192' ; (256-192 = 64) 64 * 8 us = 0,512 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf INTCON,T0IF ; borra el flag de timer

; A continuación, comienza el tiempo variable del pulso. Esto permite
; que el recorrido completo, de 180 grados (valores de pulso entre 0,5 ms
; y 2,5 ms), se divida en 256 segmentos (256 * 8 us = 2,048 ms).
; La parte variable del pulso de control varía entre 0 y 2 ms

movf Posic,w ; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf SERVO1 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer

; Retardo de 20 ms, que es el tiempo estándar que debe separar los pulsos
; de control para los servos comunes de RC

movlw d'9' ; cantidad de veces: 9 x 2 ms = 18 ms + 2 ms
movwf acum_A
retardo
bcf INTCON,T0IF ; borra el flag de timer
movlw d'6' ; (256-6 = 250) 250 * 8 us = 2 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
decfsz acum_A ; decrementa cantidad de veces
goto retardo

iniciaPos
movlw d'167' ; 256-170 = , 86 * 8 us = 688 us + 512 us
movwf Posic ; posición de 90º para un servo Futaba S3003
goto principal ;


END

   Ahora mi próximo reto será pasar de un ángulo a otro pero controlando la velocidad del servo. Ahora vienen mis dudas, que significa esto ?   
   goto   $-1

           Un saludo a todos.
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

HJ

  • Moderador
  • dsPIC
  • ******
  • Mensajes: 5713
Re: Construyendo un bipedo "RoYbot" - Nivel principiante
« Respuesta #8 en: Junio 19, 2012, 06:22:56 pm »
  Ahora vienen mis dudas, que significa esto ?    
   goto   $-1
Eso significa que salta a una posición anterior a la del Contador de programa.

en la siguiente parte del código, significa que va ha volver ha ejecutar el código en rojo.
En este caso en particular se va ha quedar en un lazo mientras T0IF sea igual a "0", al valer "1", sale del lazo

Citar
      movf   Posic,w               ; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
      movwf   TMR0               ; valor al registro de timer
      btfss   INTCON,T0IF            ; espera por timer = ff -> 00
      goto   $-1
      bcf      SERVO1               ; pone la señal de servo en 0
      bcf      INTCON,T0IF            ; borra el flag de timer

Saludos
HJ
"si te lo dicen se te olvida, si lo lees lo aprendes; pero si lo haces realmente lo entiendes"
"Cuando llegue la inspiración, que me encuentre trabajando" [Pablo Picasso]

Fulguitron

  • PIC12F
  • **
  • Mensajes: 103
Re: Construyendo un bipedo "RoYbot" - Nivel principiante
« Respuesta #9 en: Junio 20, 2012, 05:34:07 am »
   O sea, a ver si lo entiendo (es que soy un poco negado todavía) - goto $-1 -  lo que hace es volver a la línea anterior - btfss INTCON,T0IF - mientras sea 0, una vez que INTCON,T0IF sea 1 se irá bcf SERVO1.

   Sigo buscando la forma de pasar de un ángulo a otro controlando un poco la velocidad, alguien me puede dar alguna pista de como hacerlo?? seguiremos informando de mis avances.


          Un saludo a todos.
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

HJ

  • Moderador
  • dsPIC
  • ******
  • Mensajes: 5713
Re: Construyendo un bipedo "RoYbot" - Nivel principiante
« Respuesta #10 en: Junio 20, 2012, 09:30:15 am »
   O sea, a ver si lo entiendo (es que soy un poco negado todavía) - goto $-1 -  lo que hace es volver a la línea anterior - btfss INTCON,T0IF - mientras sea 0, una vez que INTCON,T0IF sea 1 se irá bcf SERVO1.

goto - 1 siempre salta a la linea anterior.

Con respecto al uso de la instrucción btfss, en algún lado del foro hay unos hilos escritos por Leon Pic, que además están en las Revistas uControl, te sugiero que las busques y leas un poco de las instrucciones den ASM para saber como se utilizan.

Saludos
HJ
"si te lo dicen se te olvida, si lo lees lo aprendes; pero si lo haces realmente lo entiendes"
"Cuando llegue la inspiración, que me encuentre trabajando" [Pablo Picasso]

Fulguitron

  • PIC12F
  • **
  • Mensajes: 103
Re: Construyendo un bipedo "RoYbot" - Nivel principiante - Programando
« Respuesta #11 en: Junio 22, 2012, 12:18:16 pm »
   Gracias HJ por la explicación, practicaré con la instrucción para entenderla mejor. La instrucción BTFSS la tengo más o menos clara y ya voy haciendo mis primeros progresos.He logrado que un servo vaya de un ángulo a otro muy despacio, lo cual ya es para mi un buen progreso.
   Pero ahora tengo un problema, quiero pasar de un ángulo a otro, pero no sé como hacerlo, cuando va a SegundoMov, vuelve a princpial y lo que yo quiero es que luego vaya a SegundoMov sin pasar por PrimerMov. Estoy un poco atascado y no sé como salir.

         Me podeis echar una mano???  os cuelgo el código.

Código: [Seleccionar]
list      p=16F84A ; definir procesador

include <p16F84A.inc> ; definiciones de variables específicas del procesador


__CONFIG _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

#define SERVO1 PORTB,0 ; puerto de salida de servo 1
#define Pulsador1 PORTA,0 ; puerto de salida de servo 1

CBLOCK 0x20
Posic ; posición servo
Posic_A
Posic_B
acum_A
ENDC

;***********************************************************************************

org 0x000
goto configuracion

;***********************************************************************************
; Principal
;***********************************************************************************

configuracion

clrf PORTA ; inicia ports
clrf PORTB ; inicia ports

bsf STATUS,RP0 ; Apunta a banco 1

movlw b'11111111' ; PORTA
movwf TRISA ; entradas

MOVLW b'00000000' ; PORTB
movwf TRISB ; salidas

movlw b'00000010' ; Configuración para TMR0
movwf OPTION_REG ; preescaler 2, 1:8 con CLK interno (que es
; de 1 MHz si el oscilador es de 4 MHz).
; El contador cuenta cada 8 useg

    bcf STATUS,RP0          ; Apunta a banco 0

clrf TMR0 ; inicia registro de timer en 0

movlw d'167' ; inicia valor de posición de servo (centro)
movwf Posic

movlw d'226' ; posición del servo a los 45º
movwf Posic_A

movlw d'167' ; posición del servo a los 90º
movwf Posic_B



principal

; Los servos actúan con un pulso de control que va entre 0,5 ms y 2,5 ms.
; En el bloque que sigue se inicia en 1 el pulso de control y se espera un
; retardo fijo de aproximadamente 0,5 ms, que es el valor mínimo del pulso.
; Con este valor de longitud de pulso y una longitud cero en la parte variable,
; el servo está parado al máximo hacia la izquierda (sentido antihorario).

bsf SERVO1 ; pone la señal de servo en 1
bcf INTCON,T0IF ; borra el flag de timer
movlw d'192' ; (256-192 = 64) 64 * 8 us = 0,512 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf INTCON,T0IF ; borra el flag de timer

; A continuación, comienza el tiempo variable del pulso. Esto permite
; que el recorrido completo, de 180 grados (valores de pulso entre 0,5 ms
; y 2,5 ms), se divida en 256 segmentos (256 * 8 us = 2,048 ms).
; La parte variable del pulso de control varía entre 0 y 2 ms

movf Posic,w ; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf SERVO1 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer

; Retardo de 20 ms, que es el tiempo estándar que debe separar los pulsos
; de control para los servos comunes de RC

movlw d'9' ; cantidad de veces: 9 x 2 ms = 18 ms + 2 ms
movwf acum_A
retardo
bcf INTCON,T0IF ; borra el flag de timer
movlw d'6' ; (256-6 = 250) 250 * 8 us = 2 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
decfsz acum_A ; decrementa cantidad de veces
goto retardo

PrimerMov
incf Posic
movf Posic
movf Posic,W
subwf Posic_A,W ;revisa el valor entre ContB y W (SOLO MIRA EN W NO EN F)
btfsc STATUS,Z
goto SegundoMov
goto principal

SegundoMov
decf Posic
movf Posic
movf Posic,W
subwf Posic_B,W ;revisa el valor entre ContB y W (SOLO MIRA EN W NO EN F)
btfsc STATUS,Z
goto Fin
goto principal
Fin

END

   Seguiremos practicando a ver si salgo de este lío.
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Fulguitron

  • PIC12F
  • **
  • Mensajes: 103
Re: Construyendo un bipedo "RoYbot" - Nivel principiante
« Respuesta #12 en: Junio 28, 2012, 11:23:52 am »
  La oscuridad se cierna sobre mi, tengo un problemón con la programación. He conseguido que dos servos se muevan suavemente, pero por alguna razón los dos siempre giran con el mismo ángulo. Si cambio el ángulo en cont_167 o cont_226, aunque solo lo haga en un servo, el movimiento se repite. Por lo que no puedo hacer que dos servos giren en diferentes ángulos.

   Ayuda

   Como siempre, os paso el código.
Código: [Seleccionar]
list      p=16F84A ; definir procesador

include <p16F84A.inc> ; definiciones de variables específicas del procesador


__CONFIG _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

#define SERVO0 PORTB,0 ; puerto de salida de servo 0
#define SERVO1 PORTB,1 ; puerto de salida de servo 1
CBLOCK 0x20
Posic ; posición servo
acum_A
cont_A
cont_B
cont_C
cont_167
cont_226
cont_110
contA
MemServ_0
MemServ_1
FinMemServ_0
FinMemServ_1
ENDC

;***********************************************************************************

org 0x000
goto configuracion

;***********************************************************************************
; Principal
;***********************************************************************************

configuracion

clrf PORTA ; inicia ports
clrf PORTB ; inicia ports

bsf STATUS,RP0 ; Apunta a banco 1

movlw b'11111111' ; PORTA
movwf TRISA ; entradas

MOVLW b'00000000' ; PORTB
movwf TRISB ; salidas

movlw b'00000010' ; Configuración para TMR0
movwf OPTION_REG ; preescaler 2, 1:8 con CLK interno (que es
; de 1 MHz si el oscilador es de 4 MHz).
; El contador cuenta cada 8 useg

   bcf STATUS,RP0        ; Apunta a banco 0

clrf TMR0 ; inicia registro de timer en 0

movlw d'133' ; inicia valor de posición de servo (centro)
movwf MemServ_0

movlw d'133' ; inicia valor de posición de servo (centro)
movwf MemServ_1

movlw d'226' ; Tiempo de duración del Movimiento_2
movwf cont_226

movlw d'167' ; Tiempo de duración del Movimiento_2
movwf cont_167

movlw d'110' ; Tiempo de duración del Movimiento_2
movwf cont_110

movlw d'2' ; Tiempo de duración del Movimiento_2
movwf cont_A

movlw d'1' ; Tiempo de duración del Movimiento_2
movwf cont_C

movlw d'2' ; Tiempo de duración del Movimiento_2
movwf FinMemServ_0

movlw d'2' ; Tiempo de duración del Movimiento_2
movwf FinMemServ_1


principal

; Los servos actúan con un pulso de control que va entre 0,5 ms y 2,5 ms.
; En el bloque que sigue se inicia en 1 el pulso de control y se espera un
; retardo fijo de aproximadamente 0,5 ms, que es el valor mínimo del pulso.
; Con este valor de longitud de pulso y una longitud cero en la parte variable,
; el servo está parado al máximo hacia la izquierda (sentido antihorario).

bsf SERVO0 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer
movlw d'192' ; (256-192 = 64) 64 * 8 us = 0,512 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf INTCON,T0IF ; borra el flag de timer

movf MemServ_0,w ; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf SERVO0 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer

bsf SERVO1 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer
movlw d'192' ; (256-192 = 64) 64 * 8 us = 0,512 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf INTCON,T0IF ; borra el flag de timer

movf MemServ_1,w ; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf SERVO1 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer

; ============================================================================


; Retardo de 20 ms, que es el tiempo estándar que debe separar los pulsos
; de control para los servos comunes de RC

movlw d'9' ; cantidad de veces: 9 x 2 ms = 18 ms + 2 ms
movwf acum_A
retardo
bcf INTCON,T0IF ; borra el flag de timer
movlw d'6' ; (256-6 = 250) 250 * 8 us = 2 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
decfsz acum_A ; decrementa cantidad de veces
goto retardo

Condicion

movf cont_A,W ;pasa el valor de F a W
subwf cont_C,W ;revisa el valor entre ContB y W (SOLO MIRA EN W NO EN F)
btfsc STATUS,Z ;STATUS "Z" si son iguales va a la siguiente línea, si ContB y
;no son iguales se salta la siguiente línea.
goto Movimiento_2
goto Movimiento_1

Movimiento_1

incf MemServ_0 ;se incrementa MemServ_0
movf MemServ_0
movf MemServ_0,W
subwf cont_226,W ;revisa el valor entre MemServ_0 y cont_226
btfsc STATUS,Z ;si son iguales ves a decfsz, sino salta la línea
decfsz FinMemServ_0 ;decrementa en uno FinMemServ_0

incf MemServ_1
movf MemServ_1
movf MemServ_1,W
subwf cont_226,W ;
btfsc STATUS,Z
decfsz FinMemServ_1 ;decrementa en uno cuando MemServ_1 haya llegado al final del recorrido

; ------------ Condicion fin del movimiento uno --------------------
; se comprueba que ambos servos han llegado al final de recorrido para pasar al segundo movimiento.

movf FinMemServ_0,W
subwf cont_C,W
btfss STATUS,Z ;revisa ambos valores, si son iguales salta goto.
goto principal
movf FinMemServ_1,W
subwf cont_C,W
btfss STATUS,Z
goto principal
goto InMovimiento_2 ;

; volvemos a cargar las tres memorias.

InMovimiento_2

decfsz cont_A ; Cuenta a contA y sigue en la línea de abajo
movlw d'2' ; Tiempo de duración del Movimiento_2
movwf FinMemServ_0
movlw d'2' ; Tiempo de duración del Movimiento_2
movwf FinMemServ_1

Movimiento_2

decf MemServ_1
movf MemServ_1
movf MemServ_1,W
subwf cont_167,W ;revisa el valor entre ContB y W (SOLO MIRA EN W NO EN F)
btfsc STATUS,Z
decfsz FinMemServ_1


decf MemServ_0
movf MemServ_0
movf MemServ_0,W
subwf cont_167,W ;revisa el valor entre ContB y W (SOLO MIRA EN W NO EN F)
btfsc STATUS,Z
decfsz FinMemServ_0


; ------------ Condicion fin del movimiento dos --------------------

movf FinMemServ_0,W
subwf cont_C,W
btfss STATUS,Z
goto principal
movf FinMemServ_1,W
subwf cont_C,W
btfss STATUS,Z
goto principal
goto Fin

Fin
movlw d'2'
movwf cont_A
movlw d'2'
movwf FinMemServ_0
movlw d'2'
movwf FinMemServ_1
goto principal

END


Editado, no cumplía las reglas del foro.
HJ
« Última modificación: Junio 28, 2012, 01:18:53 pm por HJ »
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Fulguitron

  • PIC12F
  • **
  • Mensajes: 103
Re: Construyendo un bipedo "RoYbot" - Nivel principiante
« Respuesta #13 en: Agosto 30, 2012, 06:33:57 pm »
   Después de un tiempo sigo con lo mío, y casi lo tengo. Ahora mi problema es que quiero ir sumando los FinAngServ (que su valor es uno) a FinMovUno. Con lo cual si cada FinAngServ es 1 al final FinMovUno debería ser 7. Yo lo he hecho así pero no funiona y voy algo perdido.

   Como siempre os paso el código, un saludo a todos y muchas gracias.

Código: [Seleccionar]
Movimiento_1_1

addwf FinAngServ0
movwf FinMovUno
addwf FinAngServ1
movwf FinMovUno
addwf FinAngServ2
movwf FinMovUno
addwf FinAngServ3
movwf FinMovUno
addwf FinAngServ4
movwf FinMovUno
addwf FinAngServ5
movwf FinMovUno
addwf FinAngServ6
movwf FinMovUno
movf FinMovUno,W
subwf cont_C,W
btfss STATUS,Z
goto principal
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Fulguitron

  • PIC12F
  • **
  • Mensajes: 103
Re: Construyendo un bipedo "RoYbot" - Nivel principiante
« Respuesta #14 en: Septiembre 06, 2012, 04:17:17 pm »
Por fin, ya ha dado sus primeros pasos, bueno más o menos, aquí os dejo el video para criticas (por cierto, se ha subido al revés, otro día lo pongo del derecho).

http://www.youtube.com/watch?v=B6H76jbE0Dg&feature=youtu.be

   Como podéis ver en el video, RoYbot hace dos cosas, primero hace unos movimientos suaves y luego en cada movimiento para unos cuantos segundos (demasiados teniendo en cuenta que no hay esperas en el programa). A ver si me podéis echar una mano para descubrir porque estos paros y hacer los movimientos mucho más fluidos.
   Si os acordais hace un tiempo hice otro y andaba más fluido y la verdad es que por más que mire el código no encuentro porque tarda tanto en decirdirse en dar otro paso, quizás el micro vaya muy lento??? no tengo ni idea. El anterior robot iba algo más rápido.

http://www.youtube.com/watch?v=nmLD8M1SleE&feature=relmfu

   Como siempre dejo el código a disposición para el que quiera ayudarme o quiera usarlo.

   Muchas gracias a todos de antemano.

Código: [Seleccionar]
list      p=16F84A ; definir procesador

include <p16F84A.inc> ; definiciones de variables específicas del procesador


__CONFIG _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

#define SERVO0 PORTB,0 ; puerto de salida de servo 0
#define SERVO1 PORTB,1 ; puerto de salida de servo 1
#define SERVO2 PORTB,2 ; puerto de salida de servo 2
#define SERVO3 PORTB,3 ; puerto de salida de servo 3
#define SERVO4 PORTB,4 ; puerto de salida de servo 4
#define SERVO5 PORTB,5 ; puerto de salida de servo 5
#define SERVO6 PORTB,6 ; puerto de salida de servo 6

CBLOCK 0x20
Posic ; posición servo
AngServ0 ; memoria del ángulo del servo 0
AngServ1 ; memoria del ángulo del servo 1
AngServ2
AngServ3
AngServ4
AngServ5
AngServ6
FinAngServ0
FinAngServ1
FinAngServ2
FinAngServ3
FinAngServ4
FinAngServ5
FinAngServ6
FinMovimiento
TotalFinMov
grad_50
grad_65
grad_70
grad_75
grad_90
grad_95
grad_105
grad_110
grad_115
grad_120
grad_140
acum_A
cont_0
cont_1
cont_2
cont_3
cont_4
cont_5
cont_A
cont_B
cont_C
contA
ENDC

;***********************************************************************************

org 0x000
goto configuracion

;***********************************************************************************
; Principal
;***********************************************************************************

configuracion

clrf PORTA ; inicia ports
clrf PORTB ; inicia ports

bsf STATUS,RP0 ; Apunta a banco 1

movlw b'11111111' ; PORTA
movwf TRISA ; entradas

MOVLW b'00000000' ; PORTB
movwf TRISB ; salidas

movlw b'00000010' ; Configuración para TMR0
movwf OPTION_REG ; preescaler 2, 1:8 con CLK interno (que es
; de 1 MHz si el oscilador es de 4 MHz).
; El contador cuenta cada 8 useg

   bcf STATUS,RP0        ; Apunta a banco 0

clrf TMR0 ; inicia registro de timer en 0
; ======================= CARGA DE LOS TIEMPOS PARA LOS DIFERENTES ANGULOS ==================

movlw d'156' ; 50 grados son 800 ms.
movwf grad_50
movlw d'137' ; 65 grados son 950 ms.
movwf grad_65
movlw d'131' ; 70 grados son 1000 ms.
movwf grad_70
movlw d'125' ; 75 grados son 1050 ms.
movwf grad_75
movlw d'106' ; 90 grados son 1200 ms.
movwf grad_90
movlw d'100' ; 90 grados son 1200 ms.
movwf grad_95
movlw d'87' ; 105 grados son 1350 ms.
movwf grad_105
movlw d'81' ; 110 grados son 1400 ms.
movwf grad_110
movlw d'75' ; 110 grados son 1400 ms.
movwf grad_115
movlw d'68' ; 120 grados son 1500 ms.
movwf grad_120


; =====================================================================================

movlw d'106' ; inicia valor de posición de servo (centro)
movwf AngServ0
movlw d'106' ; inicia valor de posición de servo (centro)
movwf AngServ1
movlw d'106' ; inicia valor de posición de servo (centro)
movwf AngServ2
movlw d'106' ; inicia valor de posición de servo (centro)
movwf AngServ3
movlw d'106' ; inicia valor de posición de servo (centro)
movwf AngServ4
movlw d'106' ; inicia valor de posición de servo (centro)
movwf AngServ5
movlw d'106' ; inicia valor de posición de servo (centro)
movwf AngServ6


; =============================== CARGA DE LAS MEMORIAS INICIALES ====================================

movlw d'2'
movwf cont_1
movlw d'2'
movwf cont_2
movlw d'2'
movwf cont_3
movlw d'2'
movwf cont_4
movlw d'2'
movwf cont_5
movlw d'2'
movwf cont_A
movlw d'1'
movwf cont_C
movlw d'2'
movwf FinAngServ0
movlw d'2'
movwf FinAngServ1
movlw d'2'
movwf FinAngServ2
movlw d'2'
movwf FinAngServ3
movlw d'2'
movwf FinAngServ4
movlw d'2'
movwf FinAngServ5
movlw d'2'
movwf FinAngServ6
movlw d'1'
movwf FinMovimiento
movlw d'8'
movwf TotalFinMov

principal

; Los servos actúan con un pulso de control que va entre 0,5 ms y 2,5 ms.
; En el bloque que sigue se inicia en 1 el pulso de control y se espera un
; retardo fijo de aproximadamente 0,5 ms, que es el valor mínimo del pulso.
; Con este valor de longitud de pulso y una longitud cero en la parte variable,
; el servo está parado al máximo hacia la izquierda (sentido antihorario).

bsf SERVO0 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer
movlw d'192' ; (256-192 = 64) 64 * 8 us = 0,512 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf INTCON,T0IF ; borra el flag de timer

movf AngServ0,w ; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf SERVO0 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer

bsf SERVO1 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer
movlw d'192' ; (256-192 = 64) 64 * 8 us = 0,512 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf INTCON,T0IF ; borra el flag de timer

movf AngServ1,w ; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf SERVO1 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer

bsf SERVO2 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer
movlw d'192' ; (256-192 = 64) 64 * 8 us = 0,512 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf INTCON,T0IF ; borra el flag de timer

movf AngServ2,w ; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf SERVO2 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer

bsf SERVO3 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer
movlw d'192' ; (256-192 = 64) 64 * 8 us = 0,512 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf INTCON,T0IF ; borra el flag de timer

movf AngServ3,w ; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf SERVO3 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer

bsf SERVO4 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer
movlw d'192' ; (256-192 = 64) 64 * 8 us = 0,512 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf INTCON,T0IF ; borra el flag de timer

movf AngServ4,w ; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf SERVO4 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer

bsf SERVO5 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer
movlw d'192' ; (256-192 = 64) 64 * 8 us = 0,512 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf INTCON,T0IF ; borra el flag de timer

movf AngServ5,w ; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf SERVO5 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer

bsf SERVO6 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer
movlw d'192' ; (256-192 = 64) 64 * 8 us = 0,512 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf INTCON,T0IF ; borra el flag de timer

movf AngServ6,w ; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
bcf SERVO6 ; pone la señal de servo en 0
bcf INTCON,T0IF ; borra el flag de timer

; ============================================================================


; Retardo de 20 ms, que es el tiempo estándar que debe separar los pulsos
; de control para los servos comunes de RC

movlw d'9' ; cantidad de veces: 9 x 2 ms = 18 ms + 2 ms
movwf acum_A
retardo

bcf INTCON,T0IF ; borra el flag de timer
movlw d'6' ; (256-6 = 250) 250 * 8 us = 2 ms
movwf TMR0 ; valor al registro de timer
btfss INTCON,T0IF ; espera por timer = ff -> 00
goto $-1
decfsz acum_A ; decrementa cantidad de veces
goto retardo

; En este paso iremos seleccionando la posción a seguir, cuando acaba un movimiento los cont_1, cont_2, ...
; estos son diferentes a cont_C y por lo tanto va al siguiente movimiento.

Condicion

movf cont_1,W ;pasa el valor de F a W
subwf cont_C,W ;revisa el valor entre ContC y W (SOLO MIRA EN W NO EN F)
btfss STATUS,Z ;STATUS "Z" si son iguales va a la siguiente línea, si ContC y
goto Movimiento_1 ;y cont_1 no son iguales se salta la siguiente línea.
movf cont_2,W ;pasa el valor de F a W
subwf cont_C,W ;revisa el valor entre ContC y W (SOLO MIRA EN W NO EN F)
btfss STATUS,Z
goto Movimiento_2
movf cont_3,W ;pasa el valor de F a W
subwf cont_C,W ;revisa el valor entre ContC y W (SOLO MIRA EN W NO EN F)
btfss STATUS,Z
goto Movimiento_3
movf cont_4,W ;pasa el valor de F a W
subwf cont_C,W ;revisa el valor entre ContC y W (SOLO MIRA EN W NO EN F)
btfss STATUS,Z
goto Movimiento_4
movf cont_5,W ;pasa el valor de F a W
subwf cont_C,W ;revisa el valor entre ContC y W (SOLO MIRA EN W NO EN F)
btfss STATUS,Z
goto Movimiento_5
goto CargaMemoria

Movimiento_1

movf AngServ0,W
subwf grad_90,W ;revisa el valor entre AngServo_0 y grad_90
btfss STATUS,Z ;si no son iguales ves a incf, si lo son salta la línea
incf AngServ0 ;incrementa AngServ0 hasta que llegue a grad_90, o sea hasta que
;AngServ0 llegue a 90 grados.
movf AngServ1,W
subwf grad_90,W
btfss STATUS,Z
incf AngServ1

movf AngServ2,W
subwf grad_90,W
btfss STATUS,Z
incf AngServ2

movf AngServ3,W
subwf grad_90,W
btfss STATUS,Z
incf AngServ3

movf AngServ4,W
subwf grad_90,W
btfss STATUS,Z
incf AngServ4

movf AngServ5,W
subwf grad_90,W
btfss STATUS,Z
incf AngServ5

movf AngServ6,W
subwf grad_90,W
btfss STATUS,Z
incf AngServ6



movf AngServ0,W
subwf grad_90,W ;revisa el valor entre AngSer0 y grad90, si ha llegado y son iguales
btfsc STATUS,Z ;decrementa FinAngServ0 para que no se siga movimendo el servo.
decf FinAngServ0

movf AngServ1,W
subwf grad_90,W
btfsc STATUS,Z
decf FinAngServ1

movf AngServ2,W
subwf grad_90,W
btfsc STATUS,Z
decf FinAngServ2

movf AngServ3,W
subwf grad_90,W
btfsc STATUS,Z
decf FinAngServ3

movf AngServ4,W
subwf grad_90,W
btfsc STATUS,Z
decf FinAngServ4

movf AngServ5,W
subwf grad_90,W
btfsc STATUS,Z
decf FinAngServ5

movf AngServ6,W
subwf grad_90,W
btfsc STATUS,Z
decf FinAngServ6

; ------------ Condicion fin del movimiento uno --------------------
; se comprueba que todos los  servos han llegado al final de recorrido para pasar al segundo movimiento.
; si alguno no ha llegado volverá al princpio hasta que lleguen todos. Una vez llegados

Movimiento_1_1

movf FinAngServ0,W
addwf FinMovimiento,F
movf FinAngServ1,W
addwf FinMovimiento,F
movf FinAngServ2,W
addwf FinMovimiento,F
movf FinAngServ3,W
addwf FinMovimiento,F
movf FinAngServ4,W
addwf FinMovimiento,F
movf FinAngServ5,W
addwf FinMovimiento,F
movf FinAngServ6,W
addwf FinMovimiento,F

movf FinMovimiento,W
subwf TotalFinMov,W
btfss STATUS,Z
goto principal
; ---------------------- COMIENZO EL MOVIMIENTO DOS --------------------------------------------
; volvemos a cargar todas las memorias, decrementamos cont_1, de esta forma cuando se vuelva a principal
; ya no pasaremos al movimiento uno y empezará el movimiento 2.

CargaMovimiento_2
movlw d'1'
movwf cont_1
movlw d'2'
movwf FinAngServ0
movlw d'2'
movwf FinAngServ1
movlw d'2'
movwf FinAngServ2
movlw d'2'
movwf FinAngServ3
movlw d'2'
movwf FinAngServ4
movlw d'2'
movwf FinAngServ5
movlw d'2'
movwf FinAngServ6


Movimiento_2

movf AngServ0,W
subwf grad_90,W
btfss STATUS,Z
decf AngServ0

movf AngServ1,W
subwf grad_65,W
btfss STATUS,Z
incf AngServ1

movf AngServ2,W
subwf grad_65,W
btfss STATUS,Z
incf AngServ2

movf AngServ3,W
subwf grad_115,W
btfss STATUS,Z
decf AngServ3

movf AngServ4,W
subwf grad_115,W
btfss STATUS,Z
decf AngServ4

movf AngServ5,W
subwf grad_65,W
btfss STATUS,Z
incf AngServ5

movf AngServ6,W
subwf grad_65,W
btfss STATUS,Z
incf AngServ6




movf AngServ0,W
subwf grad_90,W
btfsc STATUS,Z
decf FinAngServ0

movf AngServ1,W
subwf grad_65,W
btfsc STATUS,Z
decf FinAngServ1

movf AngServ2,W
subwf grad_65,W
btfsc STATUS,Z
decf FinAngServ2

movf AngServ3,W
subwf grad_115,W
btfsc STATUS,Z
decf FinAngServ3

movf AngServ4,W
subwf grad_115,W
btfsc STATUS,Z
decf FinAngServ4

movf AngServ5,W
subwf grad_65,W
btfsc STATUS,Z
decf FinAngServ5

movf AngServ6,W
subwf grad_65,W
btfsc STATUS,Z
decf FinAngServ6

Movimiento_2_1

movf FinAngServ0,W
addwf FinMovimiento,F
movf FinAngServ1,W
addwf FinMovimiento,F
movf FinAngServ2,W
addwf FinMovimiento,F
movf FinAngServ3,W
addwf FinMovimiento,F
movf FinAngServ4,W
addwf FinMovimiento,F
movf FinAngServ5,W
addwf FinMovimiento,F
movf FinAngServ6,W
addwf FinMovimiento,F
movf FinMovimiento,W
subwf TotalFinMov,W
btfss STATUS,Z
goto principal


; ------------ Condicion fin del movimiento dos --------------------

; _______________________________________________________________________________________
; _______________________________________________________________________________________


CargaMovimiento_3
movlw d'1'
movwf cont_2
movlw d'2'
movwf FinAngServ0
movlw d'2'
movwf FinAngServ1
movlw d'2'
movwf FinAngServ2
movlw d'2'
movwf FinAngServ3
movlw d'2'
movwf FinAngServ4
movlw d'2'
movwf FinAngServ5
movlw d'2'
movwf FinAngServ6


Movimiento_3

movf AngServ0,W
subwf grad_90,W
btfss STATUS,Z
decf AngServ0

movf AngServ1,W
subwf grad_65,W
btfss STATUS,Z
incf AngServ1

movf AngServ2,W
subwf grad_65,W
btfss STATUS,Z
incf AngServ2

movf AngServ3,W
subwf grad_65,W
btfss STATUS,Z
incf AngServ3

movf AngServ4,W
subwf grad_65,W
btfss STATUS,Z
incf AngServ4

movf AngServ5,W
subwf grad_65,W
btfss STATUS,Z
incf AngServ5

movf AngServ6,W
subwf grad_65,W
btfss STATUS,Z
incf AngServ6




movf AngServ0,W
subwf grad_90 ,W
btfsc STATUS,Z
decf FinAngServ0

movf AngServ1,W
subwf grad_65,W
btfsc STATUS,Z
decf FinAngServ1

movf AngServ2,W
subwf grad_65,W
btfsc STATUS,Z
decf FinAngServ2

movf AngServ3,W
subwf grad_65,W
btfsc STATUS,Z
decf FinAngServ3

movf AngServ4,W
subwf grad_65,W
btfsc STATUS,Z
decf FinAngServ4

movf AngServ5,W
subwf grad_65,W
btfsc STATUS,Z
decf FinAngServ5

movf AngServ6,W
subwf grad_65,W
btfsc STATUS,Z
decf FinAngServ6

Movimiento_3_1

movf FinAngServ0,W
addwf FinMovimiento,F
movf FinAngServ1,W
addwf FinMovimiento,F
movf FinAngServ2,W
addwf FinMovimiento,F
movf FinAngServ3,W
addwf FinMovimiento,F
movf FinAngServ4,W
addwf FinMovimiento,F
movf FinAngServ5,W
addwf FinMovimiento,F
movf FinAngServ6,W
addwf FinMovimiento,F
movf FinMovimiento,W
subwf TotalFinMov,W
btfss STATUS,Z
goto principal

; ----------------------- COMIENZO DEL MOVIMIENTO CUATRO -------------------------------


CargaMovimiento_4
movlw d'1'
movwf cont_3
movlw d'2'
movwf FinAngServ0
movlw d'2'
movwf FinAngServ1
movlw d'2'
movwf FinAngServ2
movlw d'2'
movwf FinAngServ3
movlw d'2'
movwf FinAngServ4
movlw d'2'
movwf FinAngServ5
movlw d'2'
movwf FinAngServ6


Movimiento_4

movf AngServ0,W
subwf grad_90,W
btfss STATUS,Z
decf AngServ0

movf AngServ1,W
subwf grad_115,W
btfss STATUS,Z
decf AngServ1

movf AngServ2,W
subwf grad_115,W
btfss STATUS,Z
decf AngServ2

movf AngServ3,W
subwf grad_65,W
btfss STATUS,Z
decf AngServ3

movf AngServ4,W
subwf grad_65,W
btfss STATUS,Z
decf AngServ4

movf AngServ5,W
subwf grad_115,W
btfss STATUS,Z
decf AngServ5

movf AngServ6,W
subwf grad_115,W
btfss STATUS,Z
decf AngServ6




movf AngServ0,W
subwf grad_90 ,W
btfsc STATUS,Z
decf FinAngServ0

movf AngServ1,W
subwf grad_115,W
btfsc STATUS,Z
decf FinAngServ1

movf AngServ2,W
subwf grad_115,W
btfsc STATUS,Z
decf FinAngServ2

movf AngServ3,W
subwf grad_65,W
btfsc STATUS,Z
decf FinAngServ3

movf AngServ4,W
subwf grad_65,W
btfsc STATUS,Z
decf FinAngServ4

movf AngServ5,W
subwf grad_115,W
btfsc STATUS,Z
decf FinAngServ5

movf AngServ6,W
subwf grad_115,W
btfsc STATUS,Z
decf FinAngServ6

Movimiento_4_1

movf FinAngServ0,W
addwf FinMovimiento,F
movf FinAngServ1,W
addwf FinMovimiento,F
movf FinAngServ2,W
addwf FinMovimiento,F
movf FinAngServ3,W
addwf FinMovimiento,F
movf FinAngServ4,W
addwf FinMovimiento,F
movf FinAngServ5,W
addwf FinMovimiento,F
movf FinAngServ6,W
addwf FinMovimiento,F
movf FinMovimiento,W
subwf TotalFinMov,W
btfss STATUS,Z
goto principal
; ----------------------- COMIENZO DEL MOVIMIENTO CINCO -------------------------------


CargaMovimiento_5
movlw d'1'
movwf cont_4
movlw d'2'
movwf FinAngServ0
movlw d'2'
movwf FinAngServ1
movlw d'2'
movwf FinAngServ2
movlw d'2'
movwf FinAngServ3
movlw d'2'
movwf FinAngServ4
movlw d'2'
movwf FinAngServ5
movlw d'2'
movwf FinAngServ6


Movimiento_5

movf AngServ0,W
subwf grad_90,W
btfss STATUS,Z
decf AngServ0

movf AngServ1,W
subwf grad_115,W
btfss STATUS,Z
decf AngServ1

movf AngServ2,W
subwf grad_115,W
btfss STATUS,Z
decf AngServ2

movf AngServ3,W
subwf grad_115,W
btfss STATUS,Z
decf AngServ3

movf AngServ4,W
subwf grad_115,W
btfss STATUS,Z
decf AngServ4

movf AngServ5,W
subwf grad_115,W
btfss STATUS,Z
decf AngServ5

movf AngServ6,W
subwf grad_115,W
btfss STATUS,Z
decf AngServ6




movf AngServ0,W
subwf grad_90 ,W
btfsc STATUS,Z
decf FinAngServ0

movf AngServ1,W
subwf grad_115,W
btfsc STATUS,Z
decf FinAngServ1

movf AngServ2,W
subwf grad_115,W
btfsc STATUS,Z
decf FinAngServ2

movf AngServ3,W
subwf grad_115,W
btfsc STATUS,Z
decf FinAngServ3

movf AngServ4,W
subwf grad_115,W
btfsc STATUS,Z
decf FinAngServ4

movf AngServ5,W
subwf grad_115,W
btfsc STATUS,Z
decf FinAngServ5

movf AngServ6,W
subwf grad_115,W
btfsc STATUS,Z
decf FinAngServ6

Movimiento_5_1

movf FinAngServ0,W
addwf FinMovimiento,F
movf FinAngServ1,W
addwf FinMovimiento,F
movf FinAngServ2,W
addwf FinMovimiento,F
movf FinAngServ3,W
addwf FinMovimiento,F
movf FinAngServ4,W
addwf FinMovimiento,F
movf FinAngServ5,W
addwf FinMovimiento,F
movf FinAngServ6,W
addwf FinMovimiento,F
movf FinMovimiento,W
subwf TotalFinMov,W
btfss STATUS,Z
goto principal

CargaMemoria

movlw d'2'
movwf cont_2
movlw d'2'
movwf cont_3
movlw d'2'
movwf cont_4
movlw d'2'
movwf cont_5
movlw d'2'
movwf FinAngServ0
movlw d'2'
movwf FinAngServ1
movlw d'2'
movwf FinAngServ2
movlw d'2'
movwf FinAngServ3
movlw d'2'
movwf FinAngServ4
movlw d'2'
movwf FinAngServ5
movlw d'2'
movwf FinAngServ6
goto principal


END
« Última modificación: Septiembre 06, 2012, 04:26:46 pm por Fulguitron »
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

 

anything