16f84A con servos

Hola, disponemos de un PIC 16f84A, y lo utilizamos junto con un oscilador de 4MHz y un servo Futaba S3003.
El problema es que hemos probado con varios montajes que hemos visto en distintas webs, copiando literalmente el código en ensamblador del PIC y el montaje de la circuitería; pero el pic normalmente se sitúa en 180º y no somos capaces de hacerle girar hacia el lado contrario; sin embargo, con otros programas directamente el PIC no hace nada.
Hemos utilizado también algunos montajes que hemos encontrado en este foro, pero tampoco hemos obtenido el resultado esperado.
En el código hemos hecho varios cambios, como probar a cambiar la configuration word (hemos puesto 3ff9h), no esperar a que pasen 20ms para volver a enviar un pulso,etc., pero sigue sin darnos resultados.
Además, hemos probado a cambiar el PIC, el oscilador, e incluso el motor, por si alguno estuviese estropeado, pero sigue sin funcionar.
Pensamos que podría tratarse de un problema relacionado con las corrientes del servo.
¿Alguien nos podría echar una mano?¿Cuáles son las corrientes y tensiones adecuadas para las entradas de alimentación y de control del servo?
Muchas gracias
 
El amigo ionitron tiene uno que funciona

www.x-robotics.com

pinchas en mecanica y despues en motorizacion. descargate servocrt.asm
Funciona correctamente. Lo que tienes que hacer es variar el valor de la temporización para poder ir ajustando.

Tienes los tiempos aproximados que tienes que poner para que funcione dependiendo de los grados que quieras.
Puedes colocar pulsadores y segun los actives (binario) varias la posición
Tienes miles de formas de hacerlo. Que pena que no tenga conversor ad
 
Ya, si el de x-robotics fue uno de los esquemas que probé, pero nada. No hay manera de echarlo a andar. Además, el motor es un Futaba S3003 como el de x-robotics, por lo que en teoría las rutinas de tiempos no deberían cambiar, ¿no? Y el circuito lo he montado igual y todo, pero ni por esas.
También me dijeron que podría funcionar si no dejamos que espere los 20 ms, pero así tampoco funciona.
¿Sabéis qué puede ser? A mi me da que puede ser un tema de corrientes o de tensiones, porque ya no se me ocurre nada más. ¿Qué pensais?
Gracias
 
Hola de nuevo. He visto en una web en la que montan el proyecto que hay en x-robotics, pero en la foto real del montaje se ve que ha conectado las patas del pic que no utiliza, llevandolas a una resistencia que va a 5v.
¿Es necesario que se conecten todas las patas del 16f84, o pueden quedarse algunas sin conectar?
 
En la web de la asociación subí un programilla que manejaba de 0 a 8 servos con un pic y casualmente inicié el programa basandome en el que te indico.

¿Sabes como funciona el programa para poder ir variando los parámetros de giro?
 
Nada, ya se solucionó el problema.
Al final, lo que pasaba es que utilizábamos dos fuentes de alimentación distintas, pero las tierras del PIC y del servo no las uníamos.

Muchas gracias por las respuestas.
 
Hola de nuevo.
Conseguimos que el servo se moviese el número de grados que le indicábamos con las rutinas de retardo. El problema es que ahora no consigo mover el servo por ejemplo a 0º y luego a 180º (un movimiento tras otro). Lo que hago es una rutina que lo situa en 0º, seguidamente se ejecuta una rutina de un segundo para que de tiempo a realizar el movimiento y posteriormente lo situo en 180º. El resultado es que el servo vibra como si quisiese girar a ambos lados a la vez (esta accion la realiza cada segundo). El proceso esta programado para que se haga una única vez, pero el resultado esque se realiza continuamente y encima sin sentido.
Sin embargo, con el montaje de x-robotics (con el interruptor) sí funciona bien.
Además, hemos probado a hacer un programita en un PIC12f683 que haga lo mismo que queremos hacer con el 16f84, pero el resultado es el mismo: con un interruptor, conseguimos que el servo funcione correctamente, pero si hacemos dos movimientos consecutivos el servo tiene un comportamiento anómalo.
¿alguien sabe a qué es debido? Gracias.
 
¿Nadie sabe a qué puede ser debido el hecho de que tanto con el pic 12f683 como el 16f84a dos movimientos seguidos con el servo futaba s3003 de un comportamiento incorrecto? , es decir, que produce vibraciones. A través de un interruptor podemos mover el servo correctamente. Gracias.
 
Hola de nuevo. Como dije en los posts anteriores, el programa de x-robotics sí funciona correctamente. El problema es al intentar girar primero en un sentido, y a continuación en el sentido contrario.
También he probado a hacerlo con un PIC 12f683, y sucede lo mismo.
Pongo los códigos del 12f683 a ver si alguien sabe dónde falla.
Gracias

Código:
	list      p=12F683        ; list directive to define processor
	#include <p12F683.inc>    ; processor specific variable definitions
	errorlevel  -302          ; suppress message 302 from list file
	
     __CONFIG   _FCMEN_ON & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
	 
	
	ORG	0X00
	BANCO1
	MOVLW b'01100001' ; Carga el acumulador, Ponemos el oscilador a 4Mhz
	MOVWF OSCCON ; Copia de acumulador a OSCCON 
	GOTO	INICIO
	
	
;-------------------------------- programa principal------------------------------------------	
	
INICIO:


START	BANCO0
		MOVLW 07H
		
		MOVWF CMCON0	
		CLRF GPIO 			; Inicializamos GPIO (el registro gp3 es solo de entrada)	
		BANCO1
		BCF TRISIO,5 		;Ponemos GP5 como salida			
		BANCO0
		BCF GPIO,5
		BANCO0
			
	
		BANCO1
		MOVLW B'01110000' 	;Ponemos AN3, AN2, AN1 Y AN0 como salida digital
		MOVWF ANSEL
		
		BANCO0

LeerEntrada	CALL	Servo_pos_1	
		CALL	Servo_pos_2	
		GOTO 	Fin	                
	
;--------------------------------------------------------------------
Servo_pos_1 BSF GPIO,5 
        movlw     .248      ; 1 set number of repetitions
        movwf     PDel0     ; 1 |
PLoop01  clrwdt              ; 1 clear watchdog
        decfsz    PDel0, 1  ; 1 + (1) is the time over?
        goto      PLoop01    ; 2 no, loop
PDelL11  goto PDelL21         ; 2 cycles delay
PDelL21  clrwdt              ; 1 cycle delay

        BCF GPIO,5

PDelay19  movlw     .29       ; 1 set number of repetitions (B)
        movwf     PDel0     ; 1 |
PLoop119  movlw     .93       ; 1 set number of repetitions (A)
        movwf     PDel1     ; 1 |
PLoop219  clrwdt              ; 1 clear watchdog
PDelL119  goto PDelL219         ; 2 cycles delay
PDelL219  clrwdt              ; 1 cycle delay
        decfsz    PDel1, 1  ; 1 + (1) is the time over? (A)
        goto      PLoop219    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) is the time over? (B)
        goto      PLoop119    ; 2 no, loop
		return
;------------------------------------------------------------------

;------------------------------------------------------------------
Servo_pos_2 BSF GPIO,5 
        movlw     .249      ; 1 set number of repetitions
        movwf     PDel0     ; 1 |
PLoop02  clrwdt              ; 1 clear watchdog
PDelL12  goto PDelL22         ; 2 cycles delay
PDelL22  goto PDelL32         ; 2 cycles delay
PDelL32  
        decfsz    PDel0, 1  ; 1 + (1) is the time over?
        goto      PLoop02    ; 2 no, loop
PDelL42  goto PDelL52         ; 2 cycles delay
PDelL52  clrwdt              ; 1 cycle delay

        BCF GPIO,5

PDelay18  movlw     .26       ; 1 set number of repetitions (B)
        movwf     PDel0     ; 1 |
PLoop118  movlw     .172      ; 1 set number of repetitions (A)
        movwf     PDel1     ; 1 |
PLoop218  clrwdt              ; 1 clear watchdog
        decfsz    PDel1, 1  ; 1 + (1) is the time over? (A);
        goto      PLoop218    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) is the time over? (B)
        goto      PLoop118    ; 2 no, loop
PDelL118  goto PDelL218         ; 2 cycles delay
PDelL218  clrwdt              ; 1 cycle delay
		return
;------------------------------------------------------------------
			
Fin			END
	
;------------------------------------------ fin programa principal------------------------------------
 
jo jo jo

Yo si

Mira un sitio que escribo mis tonterías y veras este extracto.

http://blog.iespana.es/bactering


¡¡Me vibra el servo! No se está quieto.



Claro, es que soy novato (date un cachete).

Cuando se programan interrupciones y el programa trabaja, no está en un bucle, hay que salvar los registros importantes. Los principales son el acumulador (W) y el estado de las operaciones (STATUS).

Hay que realizar esta función, guardar, sin alterar el registro de estado. Esto se hace usando la palabra swapf.



Al entrar en la interrupción:



Inter.: movwf Wbak ; guarda W

swapf STATUS,W ; intercambia nibbles

movwf STATUSBAK ; guarda el estado



Al salir de la interrupción:



Salir: swapf STATUSBAK,W ; Intercambia nibbles

movwf STATUS ; saca valor

swapf Wbak,f ; intercambia dos veces para

swapf Wbak,w ; dejar el valor como estaba

retfie



Ahora ha dejado de vibrar, que cosas.
 
Hola bactering, muchas gracias por responder. Pero tengo una duda, creo que no utilizo interrupciones por lo que me hace perderme con tu respuesta.

¿debo utilizar obligatoriamente interrupciones para trabajar con el servo?

¿o se puede trabajar con rutinas?

Gracias.
 
Si trabajas con un solo servo casi no vale la pena. Al trabajar con dos se hace casi obligado si quieres evitar la vibración. Los 20ms no son criticos pero el tiempo activo si lo es. ¿Puedes conseguir que las rutinas te duren lo mismo siempre? para ello se hace imprescindible la interrupción. Tampoco es tan dificil usarla. Con el sistema que propongo puedes llevar una muy buena resolución sin vibrar.
Saludos
 
Atrás
Arriba