fbpx

Expresate

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

Avisos
Vaciar todo

Novato pide ayuda con servos

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

Buenos días, ya que este es mi primer post me presento. Me llamo Jesús y soy de barcelona, desde hace algún tiempo me compré el libro de desarrollo de proyectos pic 16f84 de RA-MA editorial y es lo mejor que he hecho hasta ahora. Pero para mi gusto tiene un punto débil, aunque no por eso es más malo, quizás sea yo el malo, le falta algo de información respecto al tema de servos. Alguien puede colgar algún programilla en ASM con servos para 16f84???? o alguna página que valga la pena.
Muchas gracias, hoy empiezo a pedir pero espero algún día ayudar a otros.

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

Hombre, es que aprender lo que es aprender no he aprendido bastante, si que he encontrado un programa de no se quien que esta todo bastante bien y se puede mejorar con más explicaciones, si eso ya haré mi aportación, pero dejadme un tiempo que me aclare primero. Pero lo tengo en mente, me gusta pedri pero siempre hay que dar algo a cambio

Responder
ranganok
Respuestas: 3875
(@ranganok)
Ardero
Registrado: hace 19 años

Lo bueno que tiene la wiki es que se puede mejorar en cualquier momento, seas tú quien lo haga o sea otra persona.

S2

Ranganok Schahzaman

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

oK Ranganok, voy a colgar un programilla de control de servos que es muy simple y creo que va muy bien para los que empiezan a programar como yo, por cierto hay dudas, pásate por la zona de assembler a ver que te parece y si lo quieres colgar donde quieras, ya sabes ...
Muchas gracias.

Responder
ranganok
Respuestas: 3875
(@ranganok)
Ardero
Registrado: hace 19 años

Hola Fulguitron ,

Lo puedes colgar directamente tú aquí:
http://wiki.webdearde.com/index.php/Actuadores_II#Servomotores

(es la guía de iniciación), así queda todo explicado de una forma más global (no sólo el código del programa).

S2

Ranganok Schahzaman

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

Buenas noches, pues después de mucho tiempo he conseguido que mi bipedo de cuatro servos empiece a andar, aquí os dejo el programa para que le echeis un ojo. Pero tengo un problema muy grave. Al ser secuencial cuando cambio de servo este pierde fueza y no conserva al ángulo hasta el próximo movimiento. Me explico cuando empieza con call_sv_1_50 este servo gira 50 grados pero cuando cambia a SV_0_110 el primer servo pierde fuerza y no sigue a 50º.
Espero noticias para que Panchito (así se llama el robot) de unos pasos más estables.

;*********************************** Panchito V1.0.asm *****************************
;
;
; ZONA DE DATOS
****************************************************************

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

CBLOCK 0x0C
ENDC

#DEFINE SV_0 PORTB,0
#DEFINE SV_1 PORTB,1
#DEFINE SV_2 PORTB,2
#DEFINE SV_3 PORTB,3
HZ EQU 0x1c
; ZONA DE CÓDIGOS *****************************************************************

ORG 0
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB ; Esta línea se configura como salida.
movlw b'00000110'
movwf OPTION_REG ; Prescaler de 2 asignado al TMR0
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal

call SV_1_50
call SV_0_110
call SV_3_110
call SV_1_90
call SV_2_110
call SV_3_70
call SV_0_70
call SV_2_90
goto Principal
;===========================================================================================

SV_0_70 movlw d'40'
movwf HZ
ALTO_70_0 bsf SV_0 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto70grados
BAJO_70_0 bcf SV_0 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo70grados
decfsz HZ,3
goto ALTO_70_0
return

SV_0_80 movlw d'40'
movwf HZ
ALTO_80_0 bsf SV_0 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto80grados
BAJO_80_0 bcf SV_0 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo80grados
decfsz HZ,3
goto ALTO_80_0
return

SV_0_90 movlw d'40'
movwf HZ
ALTO_90_0 bsf SV_0 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto90grados
BAJO_90_0 bcf SV_0 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo90grados
decfsz HZ,3
goto ALTO_90_0
return

SV_0_100 movlw d'40'
movwf HZ
ALTO_100_0 bsf SV_0 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto100grados
BAJO_100_0 bcf SV_0 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo100grados
decfsz HZ,3
goto ALTO_100_0
return

SV_0_110 movlw d'40'
movwf HZ
ALTO_110_0 bsf SV_0 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto110grados
BAJO_110_0 bcf SV_0 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo110grados
decfsz HZ,3
goto ALTO_110_0
return

;____________________________________________________________________

SV_1_50 movlw d'40'
movwf HZ
ALTO_50_1 bsf SV_1 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto50grados
BAJO_50_1 bcf SV_1 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo50grados
decfsz HZ,3
goto ALTO_50_1
return

SV_1_70 movlw d'40'
movwf HZ
ALTO_70_1 bsf SV_1 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto70grados
BAJO_70_1 bcf SV_1 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo70grados
decfsz HZ,3
goto ALTO_70_1
return

SV_1_80 movlw d'40'
movwf HZ
ALTO_80_1 bsf SV_1 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto80grados
BAJO_80_1 bcf SV_1 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo80grados
decfsz HZ,3
goto ALTO_80_1
return

SV_1_90 movlw d'40'
movwf HZ
ALTO_90_1 bsf SV_1 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto90grados
BAJO_90_1 bcf SV_1 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo90grados
decfsz HZ,3
goto ALTO_90_1
return

SV_1_100 movlw d'40'
movwf HZ
ALTO_100_1 bsf SV_1 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto100grados
BAJO_100_1 bcf SV_1 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo100grados
decfsz HZ,3
goto ALTO_100_1
return

SV_1_110 movlw d'40'
movwf HZ
ALTO_110_1 bsf SV_1 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto110grados
BAJO_110_1 bcf SV_1 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo110grados
decfsz HZ,3
goto ALTO_110_1
return
;_____________________________________________________________________________

SV_2_50 movlw d'40'
movwf HZ
ALTO_50_2 bsf SV_2 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto50grados
BAJO_50_2 bcf SV_2 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo50grados
decfsz HZ,3
goto ALTO_50_2
return

SV_2_70 movlw d'40'
movwf HZ
ALTO_70_2 bsf SV_2 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto70grados
BAJO_70_2 bcf SV_2 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo70grados
decfsz HZ,3
goto ALTO_70_2
return

SV_2_80 movlw d'40'
movwf HZ
ALTO_80_2 bsf SV_2 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto80grados
BAJO_80_2 bcf SV_2 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo80grados
decfsz HZ,3
goto ALTO_80_2
return

SV_2_90 movlw d'40'
movwf HZ
ALTO_90_2 bsf SV_2 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto90grados
BAJO_90_2 bcf SV_2 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo90grados
decfsz HZ,3
goto ALTO_90_2
return

SV_2_100 movlw d'40'
movwf HZ
ALTO_100_2 bsf SV_2 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto100grados
BAJO_100_2 bcf SV_2 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo100grados
decfsz HZ,3
goto ALTO_100_2
return

SV_2_110 movlw d'40'
movwf HZ
ALTO_110_2 bsf SV_2 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto110grados
BAJO_110_2 bcf SV_2 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo110grados
decfsz HZ,3
goto ALTO_110_2
return

SV_2_130 movlw d'40'
movwf HZ
ALTO_130_2 bsf SV_2 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto130grados
BAJO_130_2 bcf SV_2 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo130grados
decfsz HZ,3
goto ALTO_130_2
return
;________________________________________________________________
SV_3_70 movlw d'40'
movwf HZ
ALTO_70_3 bsf SV_3 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto70grados
BAJO_70_3 bcf SV_3 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo70grados
decfsz HZ,3
goto ALTO_70_3
return

SV_3_80 movlw d'40'
movwf HZ
ALTO_80_3 bsf SV_3 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto80grados
BAJO_80_3 bcf SV_3 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo80grados
decfsz HZ,3
goto ALTO_80_3
return

SV_3_90 movlw d'40'
movwf HZ
ALTO_90_3 bsf SV_3 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto90grados
BAJO_90_3 bcf SV_3 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo90grados
decfsz HZ,3
goto ALTO_90_3
return

SV_3_100 movlw d'40'
movwf HZ
ALTO_100_3 bsf SV_3 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto100grados
BAJO_100_3 bcf SV_3 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo100grados
decfsz HZ,3
goto ALTO_100_3
return

SV_3_110 movlw d'40'
movwf HZ
ALTO_110_3 bsf SV_3 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto110grados
BAJO_110_3 bcf SV_3 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo110grados
decfsz HZ,3
goto ALTO_110_3
return

SV_3_130 movlw d'40'
movwf HZ
ALTO_130_3 bsf SV_3 ;Pone a 1 el bit 0 de la puerta A
call Timer0_Alto130grados
BAJO_130_3 bcf SV_3 ;Pone a 0 el bit 0 de la puerta A
call Timer0_Bajo130grados
decfsz HZ,3
goto ALTO_130_3
return
;______________________________________________________

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

TMR0_Alto50grados EQU d'250'

Timer0_Alto50grados
movlw TMR0_Alto50grados ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_RebosamientoA50
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_RebosamientoA50 ; Todavía no. Repite.
return

TMR0_Bajo50grados EQU d'104'

Timer0_Bajo50grados
movlw TMR0_Bajo50grados ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_RebosamientoB50
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_RebosamientoB50 ; Todavía no. Repite.
return

TMR0_Alto70grados EQU d'248'

Timer0_Alto70grados
movlw TMR0_Alto70grados ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_RebosamientoA70
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_RebosamientoA70 ; Todavía no. Repite.
return

TMR0_Bajo70grados EQU d'107'

Timer0_Bajo70grados
movlw TMR0_Bajo70grados ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_RebosamientoB70
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_RebosamientoB70 ; Todavía no. Repite.
return

TMR0_Alto80grados EQU d'247'

Timer0_Alto80grados
movlw TMR0_Alto80grados ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_RebosamientoA80
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_RebosamientoA80 ; Todavía no. Repite.
return

TMR0_Bajo80grados EQU d'108'

Timer0_Bajo80grados
movlw TMR0_Bajo80grados ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_RebosamientoB80
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_RebosamientoB80 ; Todavía no. Repite.
return

TMR0_Alto90grados EQU d'246'

Timer0_Alto90grados
movlw TMR0_Alto90grados ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_RebosamientoA90
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_RebosamientoA90 ; Todavía no. Repite.
return

TMR0_Bajo90grados EQU d'109'

Timer0_Bajo90grados
movlw TMR0_Bajo90grados ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_RebosamientoB90
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_RebosamientoB90 ; Todavía no. Repite.
return

TMR0_Alto100grados EQU d'245'

Timer0_Alto100grados
movlw TMR0_Alto100grados ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_RebosamientoA100
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_RebosamientoA100 ; Todavía no. Repite.
return

TMR0_Bajo100grados EQU d'110'

Timer0_Bajo100grados
movlw TMR0_Bajo100grados ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_RebosamientoB100
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_RebosamientoB100 ; Todavía no. Repite.
return

TMR0_Alto110grados EQU d'244'

Timer0_Alto110grados
movlw TMR0_Alto110grados ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_Rebosamiento110
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_Rebosamiento110 ; Todavía no. Repite.
return

TMR0_Bajo110grados EQU d'111'

Timer0_Bajo110grados
movlw TMR0_Bajo110grados ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_RebosamientoB110
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_RebosamientoB110 ; Todavía no. Repite.
return

TMR0_Alto130grados EQU d'242'

Timer0_Alto130grados
movlw TMR0_Alto130grados ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_RebosamientoA130
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_RebosamientoA130 ; Todavía no. Repite.
return

TMR0_Bajo130grados EQU d'113'

Timer0_Bajo130grados
movlw TMR0_Bajo130grados ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_RebosamientoB130
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_RebosamientoB130 ; Todavía no. Repite.
return

INCLUDE<RETARDOS.INC>
END

Responder
Página 2 / 4
Compartir: