Ver las NORMAS de estos Foros Web ZackYFileS Chat ZackYFileS Agregar a Favoritos Contactar con Administrador
 
 

Clic aquí para comprar a los mejores precios!
Navegación
Retroceder   Foros ZackYFileS >
OTROS TEMAS DE INTERES - INTERNET:
> PROGRAMACIÓN Microcontroladores: PICs , AVRs.
Nombre de usuario
Contraseña
Configuración de UsuarioAyuda (FAQs)Nuevos PostsBuscar
Visita las secciones más activas de nuestros Foros
(click en los enlaces de abajo para ir a la sección o comprar)
QVIART UNDRO 2 ENGEL Mini o Engel EN1010 WETEK Play QVIART UNIC o Mini QVIART COMBO 2
COMPRAR con Wifi COMPRAR Mini , EngelDroid 1010 COMPRAR Aquí COMPRAR Unic , Mini COMPRAR v2 Aquí


Clic aquí para comprar a los mejores precios!

Respuesta
 
Herramientas
Antiguo 28/03/2010, 20:39   #1
Deuteros
Usuario Registrado
 
Fecha de ingreso: 28/mar/2010
Mensajes: 2
Deuteros está en el buen camino
Thumbs up Control de Servomotores en ASM

Hola, soy nuevo en el foro y navegando dentro de este foro decidi iniciar un tema; el cual a su vez de compartir tambien estoy buscando alguna sugerencia que puedan brindarme; ya que stoy apunto de iniciar un proyecto, pero primero quiero perfeccionar bien mi programa en ASM que voy a usar en la implementacion del control de servomotores, inicialmente este codigo simula el giro de 8 servos divididos en:
RA0-RA3 (Puerto A)
RB0-RB3 (Puerto B)

No utilizo ningun control que inicie tal rutina del giro de los servos; por lo que ahi esta mi duda, he simulado y corregido varios codigos pero para el control de estos motores y su giro los quiero iniciar con los otros puertos libres que quedan.

Recursos:
PIC16F84A
Proteus
MPLAB

Codigo en ASM:
[HTML]
List p=16F84A
#include
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;**** Definicion de variables ****
CBLOCK 0X20 ; CBLOCK en 20h para que valga para toda la serie 16f
PDel0 ; Contadores para demor
PDel1
W_Temp ; Registro para guardar temporalmente W
STATUS_Temp ; Registro para guardar temporalmete STATUS
CONTADOR_0 ; para repeticiones de trenes de pulsos
CONTADOR_1 ; seguramente se pueda hacer con uno solo pero no fuicapaz
CONTADOR_2
CONTADOR_3
CONTADOR_4
CONTADOR_5
CONTADOR_6
CONTADOR_7
CONTADOR_8
CONTADOR_9
CONTADOR_10
CONTADOR_11
CONTADOR_12
CONTADOR_13
CONTADOR_14
CONTADOR_15
CONTADOR_16
CONTADOR_17
CONTADOR_18
CONTADOR_19
ENDC
;**** Inicio del Micro ****
Reset org 0x00 ; Aquí comienza el micro
goto Inicio ; Salto a inicio de mi programa
;**** Vector de Interrupcion ****
org 0x04 ; Atiendo Interrupcion
goto Inicio_ISR
; **** Programa Principal ****;**** Configuracion de puertos ***
org 0x05 ; Origen del código de programa
Inicio bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1
movlw b'11110000' ; RB0 a RB3 como salida para control de servoS
movwf TRISB ;
movlw b'10000' ; PORTA, RA0>RA3 salidas
movwf PORTA
movlw b'00000110' ; Se selecciona TMR0 y preescaler de 128
movwf OPTION_REG ; para que al desbordar nos de 19,968 ms
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
clrf PORTA ; empezamos con servos en 0
clrf PORTB
movlw .100 ; Cargamos 100 en TMR0 para lograr aprox. 20ms
movwf TMR0
movlw b'10100000' ; Habilitamos GIE y T0IE (interrupción del TMR0)
movwf INTCON
clrf CONTADOR_0 ; empieza con contador_0 a 0 por ser el primero que cuenta ; los otros se iran borrando en el programa
clrf CONTADOR_1
clrf CONTADOR_2
clrf CONTADOR_3
clrf CONTADOR_4
clrf CONTADOR_5
clrf CONTADOR_6
clrf CONTADOR_7
clrf CONTADOR_8
clrf CONTADOR_9
clrf CONTADOR_10
clrf CONTADOR_11
clrf CONTADOR_12
clrf CONTADOR_13
clrf CONTADOR_14
clrf CONTADOR_15
clrf CONTADOR_16
clrf CONTADOR_17
clrf CONTADOR_18
clrf CONTADOR_19

;*************control de velocidad de los servos, variando el Nº de repeticiones ********************
;********se varia la velocidad de movimiento, cuanto menor es el Nº mas rapido va el servo***********************

MAIN btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_19
incf CONTADOR_0,f ; cuenta nº veces se desborda
TIMER0 movlw .25 ; EN 90º seran dobles por ser el centrado del movimiento
subwf CONTADOR_0,0
btfsc STATUS,Z ; mira si son 25 desbord
goto MAIN_A100 ; Z=1 va a siguiente posicion
call CENT_SERVOS ; todavia no, sigue en 90º
goto MAIN ; y vuelve para esperar desborde de TIMER0

;***********comienzo avance servos PORTA****************************************************

MAIN_A100 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_A100 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_0
incf CONTADOR_1,f ; pasaron 8 veces empieza para 100º
movlw .8 ; 25 es el numero de repeticiones para 100º
subwf CONTADOR_1,0
btfsc STATUS,Z ; van 8 veces?
goto MAIN_A110 ; si, va a siguiente posicion
call MOV_A100 ; no sigue en 100º
goto MAIN_A100

MAIN_A110 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_A110 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ; interrupcion para poder detectar en MAIN la interrupci
bsf INTCON,7
clrf CONTADOR_1
incf CONTADOR_2,f ; si, empieza en 110º
movlw .8
subwf CONTADOR_2,0
btfsc STATUS,Z ; van 8?
goto MAIN_A120 ; SI, va a siguiente posicion
call MOV_A110 ; no, sigue en 110º
goto MAIN_A110

MAIN_A120 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_A120 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la
bsf INTCON,7 ; interrupcion para poder detectar en MAIN la interrupcion
clrf CONTADOR_2
incf CONTADOR_3,f ; si, empieza en 160º
movlw .8
subwf CONTADOR_3,0
btfsc STATUS,Z ; van 8?
goto MAIN_A130 ; SI, va a siguiente posicion
call MOV_A120 ; no, sigue en 120º
goto MAIN_A120

MAIN_A130 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_A130 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_3
incf CONTADOR_4,f ; si, empieza en 130º
movlw .8 ; aqui repite doble de veces por ser final de recorrido
subwf CONTADOR_4,0 ; ya se vera si asi va bien
btfsc STATUS,Z ; van 8?
goto MAIN_A140
call MOV_A130 ; no, sigue en 130º
goto MAIN_A130

MAIN_A140 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_A140 ; sino acabo espera, aqui espera mucho tiempo entre 17.7 y 19.7ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_4
incf CONTADOR_5,f ; si, empieza cuenta en en 140º
movlw .8
subwf CONTADOR_5,0
btfsc STATUS,Z ; van 8?
goto MAIN_RA130
call MOV_A140 ; no, sigue en 140º
goto MAIN_A140
;**********retrceder servos PORTA de 140º a 90º**************************************************

MAIN_RA130 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_RA130 ; sino acabo espera, aqui espera mucho tiempo entre 17.7 y 19.7ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ;interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_5
incf CONTADOR_6,f ; si, empieza en 130º
movlw .8
subwf CONTADOR_6,0
btfsc STATUS,Z ; van 8?
goto MAIN_RA120
call MOV_A130 ; no, sigue en 130º
goto MAIN_RA130

MAIN_RA120 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_RA120 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ;interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_6
incf CONTADOR_7,f ; pasaron 50 veces empieza para 115º
movlw .8 ; 8 es el numero de repeticiones para 115º
subwf CONTADOR_7,0
btfsc STATUS,Z ; van 8 veces?
goto MAIN_RA110 ; SI, va a siguiente
call MOV_A120 ; no sigue en 120º
goto MAIN_RA120

MAIN_RA110 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_RA110 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_7
incf CONTADOR_8,f ; si, empieza en 110º
movlw .8
subwf CONTADOR_8,0
btfsc STATUS,Z ; van 8?
goto MAIN_RA100 ; SI, va a siguiente posicion
call MOV_A110 ; no, sigue en 110º
goto MAIN_RA110
MAIN_RA100 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_RA100 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_8 ; se pone a 0 para proxima vez
incf CONTADOR_9 ; pasaron 50 veces empieza para 100º
movlw .8 ; 8 es el numero de repeticiones para 100º
subwf CONTADOR_9,0
btfsc STATUS,Z ; van 8 veces?
goto MAIN_CENT ; si, va a siguiente posicion
call MOV_A100 ; no sigue en 10º
goto MAIN_RA100
MAIN_CENT ; aqui centra servos despues de movimiento completo PORTA ; para empezar avance de PORTB
btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_CENT ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_9 ; la primera vez no es necesario pero despues si
incf CONTADOR_10,f ; cuenta nº veces se desborda TIMER0
movlw .8 ;
subwf CONTADOR_10,0
btfsc STATUS,Z ; mira si son 8 desbordes
goto MAIN_B100 ; Z=1 va a siguiente posicion
call CENT_SERVOS ; todavia no, sigue en 90º
goto MAIN_CENT ; y vuelve para esperar desborde de TIMER0

;********************movimientos avance SERVOS PORTB*****************************************

MAIN_B100 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_B100 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la
; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_10 ; se pone a 0 para proxima vez
incf CONTADOR_11,f ; pasaron 50 veces empieza para 100º
movlw .8 ; 25 es el numero de repeticiones para 100º
subwf CONTADOR_11,0
btfsc STATUS,Z ; van 8 veces?
goto MAIN_B110 ; si, va a siguiente posicion
call MOV_B100 ; no sigue en 110º
goto MAIN_B100

MAIN_B110 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_B110 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_11
incf CONTADOR_12,f ; si, empieza en 110º
movlw .8
subwf CONTADOR_12,0
btfsc STATUS,Z ; van 8?
goto MAIN_B120 ; SI, va a siguiente posicion
call MOV_B110 ; no, sigue en 110º
goto MAIN_B110

MAIN_B120 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_B120 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la
; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_12
incf CONTADOR_13,f ; si, empieza en 120º
movlw .8
subwf CONTADOR_13,0
btfsc STATUS,Z ; van 8?
goto MAIN_B130 ; SI, va a siguiente posicion
call MOV_B120 ; no, sigue en 120º
goto MAIN_B120

MAIN_B130 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_B130 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_13
incf CONTADOR_14,f ; si, empieza en 130º
movlw .8 ; aqui repite doble de veces por ser final de recorrido
subwf CONTADOR_14,0 ; ya se vera si asi va bien
btfsc STATUS,Z ; van 8?
goto MAIN_B140
call MOV_B130 ; no, sigue en 130º
goto MAIN_B130

MAIN_B140 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_B140 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_14
incf CONTADOR_15,f ; si, empieza en 140º
movlw .8
subwf CONTADOR_15,0
btfsc STATUS,Z ; van 8?
goto MAIN_RB130
call MOV_B140 ; no, sigue en 140º
goto MAIN_B140

;**********retroceder servos PORTB de 140º a 90º**************************************************

MAIN_RB130 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_RB130 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_15
incf CONTADOR_16,f ; si, empieza en 135º
movlw .8
subwf CONTADOR_16,0
btfsc STATUS,Z ; van 8?
goto MAIN_RB120
call MOV_B130 ; no, sigue en 130º
goto MAIN_RB130

MAIN_RB120
btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_RB120 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_16
incf CONTADOR_17,f ; pasaron 50 veces empieza para 115º
movlw .8 ; 25 es el numero de repeticiones para 115º
subwf CONTADOR_17,0
btfsc STATUS,Z ; van 8 veces?
goto MAIN_RB110 ; SI, va a siguiente
call MOV_B120 ; no sigue en 120º
goto MAIN_RB120

MAIN_RB110 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_RB110 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_17
incf CONTADOR_18,f ; si, empieza en 110º
movlw .8
subwf CONTADOR_18,0
btfsc STATUS,Z ; van 8?
goto MAIN_RB100 ; SI, va a siguiente posicion
call MOV_B110 ; no, sigue en 110º
goto MAIN_RB110

MAIN_RB100 btfss INTCON,2 ; chequea si acabo la interrupcion, si pasaron 20ms
goto MAIN_RB100 ; sino acabo espera, aqui espera mucho tiempo entre 17.5 y 19.5ms ; de cada 20ms, se pueden hacer otras cosas, entre un 85% y un 95% ; del tiempo esta sin hacer nada para que se puedan hacer otras cosas
bcf INTCON,2 ; aqui borra bandera interrupcion, se deja sin borrar en la ; interrupcion para poder detectar en MAIN la interrupcion
bsf INTCON,7
clrf CONTADOR_18 ; se pone a 0 para proxima vez
incf CONTADOR_19,f ; pasaron 50 veces empieza para 100º
movlw .8 ; 25 es el numero de repeticiones para 100º
subwf CONTADOR_19,0
btfsc STATUS,Z ; van 8 veces?
goto MAIN ; si, va a posicion inicial, centra y empieza siguiente paso
call MOV_B100 ; no sigue en 10º
goto MAIN_RB100
;************DUTTY DE movimiento de centrado a 90º PORTA, PORTB******************************************
CENT_SERVOS movlw 0x0F ; ponemos dutty a 1 del PORTA y PORTB los servos estan conectados
iorwf PORTA,f ; entre RA0>RA3 y RB0>RB3, el nibble bajo lo ponemos a 1111
iorwf PORTB,f ; y al alto le aplicamos mascara para dejarlo como esta
movlw .13 ; cargamos 12 para que la demora sea de 1336us>90º
call DEMORA ; durante 0.111 ms para movimientos de 10º aprox
movlw 0XF0 ; mascara para que no nos afecte al nibble alto
andwf PORTA,f ; nos pone a 0 el nibble bajo donde tenemos los servos
andwf PORTB,f ; y nos deja el valor del nibble alto como estaba
return ; retorna a esperar el final de los 20ms

;**************DUTTYS para movimientos servos PORTA de 10 en 10 grados***********************************
MOV_A100 movlw 0x0F ; ponemos dutty a 1 del PORTA y PORTB estan conectados
iorwf PORTA,f ; entre RA0>RA3 y RB0>RB3, el nibble bajo lo ponemos a 1111
iorwf PORTB,f ; y al alto le aplicamos mascara para dejarlo como esta
movlw .13 ; para 90º, 9X0.111ms de los 90º +3x0.111ms de 0º segun MPLAB 1.336ms ; "creo" que es aceptable el desfase de 36us, sino se corrige
call DEMORA ; durante 0.111 ms para movimientos de 10º aprox movlw 0XF0 ; mascara para que no nos afecte al nibble alto
; nos pone a 0 el nibble bajo donde tenemos los servos
andwf PORTB,f ; y nos deja el valor del nibble alto como estaba en PORTB
movlw .1
call DEMORA ; hacemos un retardo mas para PORTA, asi se movera a 100º
movlw 0XF0 ; mascara para PORTA
andwf PORTA,f ; nibble alto como estaba y bajo a 0
return ;

MOV_A110 movlw 0x0F ; ponemos dutty a 1 del PORTA y PORTB estan conectados
iorwf PORTA,f ; entre RA0>RA3 y RB0>RB3, el nibble bajo lo ponemos a 1111
iorwf PORTB,f ; y al alto le aplicamos mascara para dejarlo como esta
movlw .13 ; para 90º
call DEMORA ; durante 0.110 ms para movimientos de 10º aprox movlw 0XF0 ; mascara para que no nos afecte al nibble alto
; nos pone a 0 el nibble bajo donde tenemos los servos
andwf PORTB,f ; y nos deja el valor del nibble alto como estaba en PORTB
movlw .2 ; cargamos 2 en w para tiempo adicional de PORTA de 0.222ms>20º
call DEMORA ; hacemos 2 retardoS mas para PORTA, asi se movera a 100º
movlw 0XF0 ; mascara para PORTA
andwf PORTA,f ; nibble alto como estaba y bajo a 0
return ;
MOV_A120 movlw 0x0F ; ponemos dutty a 1 del PORTA y PORTB estan conectados
iorwf PORTA,f ; entre RA0>RA3 y RB0>RB3, el nibble bajo lo ponemos a 1111
iorwf PORTB,f ; y al alto le aplicamos mascara para dejarlo como esta
movlw .13 ; para 90º
call DEMORA ; durante 0.111 ms para movimientos de 10º aprox movlw 0XF0 ; mascara para que no nos afecte al nibble alto
; nos pone a 0 el nibble bajo donde tenemos los servos
andwf PORTB,f ; y nos deja el valor del nibble alto como estaba en PORTB
movlw .3 ; cargamos 3 en w para tiempo adicional de PORTA de 0.333ms>30º
call DEMORA ; hacemos un retardo mas para PORTA, asi se movera a 120º
movlw 0XF0 ; mascara para PORTA
andwf PORTA,f ; nibble alto como estaba y bajo a 0
return ;

MOV_A130 movlw 0x0F ; ponemos dutty a 1 del PORTA y PORTB estan conectados
iorwf PORTA,f ; entre RA0>RA3 y RB0>RB3, el nibble bajo lo ponemos a 1111
iorwf PORTB,f ; y al alto le aplicamos mascara para dejarlo como esta
movlw .13 ; para 90º
call DEMORA ; durante 0.111 ms para movimientos de 10º aprox movlw 0XF0 ; mascara para que no nos afecte al nibble alto
; nos pone a 0 el nibble bajo donde tenemos los servos
andwf PORTB,f ; y nos deja el valor del nibble alto como estaba en PORTB
movlw .4 ; cargamos 4 en w para tiempo adicional de PORTA de 0.444ms>40º
call DEMORA ; hacemos un retardo mas para PORTA, asi se movera a 130º
movlw 0XF0 ; mascara para PORTA
andwf PORTA,f ; nibble alto como estaba y bajo a 0
return ;

MOV_A140 movlw 0x0F ; ponemos dutty a 1 del PORTA y PORTB estan conectados
iorwf PORTA,f ; entre RA0>RA3 y RB0>RB3, el nibble bajo lo ponemos a 1111
iorwf PORTB,f ; y al alto le aplicamos mascara para dejarlo como esta
movlw .13 ; para 90º
call DEMORA ; durante 0.111 ms para movimientos de 10º aprox movlw 0xF0 ; mascara para que no nos afecte al nibble alto
; nos pone a 0 el nibble bajo donde tenemos los servos
andwf PORTB,f ; y nos deja el valor del nibble alto como estaba en PORTB
movlw .5 ; cargamos 5 en w para tiempo adicional de PORTA de 0.555ms>50º
call DEMORA ; hacemos un retardo mas para PORTA, asi se movera a 140º
movlw 0XF0 ; mascara para PORTA
andwf PORTA,f ; nibble alto como estaba y bajo a 0
return ;
;*****************DUTTYS para movimientos servos PORTB de 10 en 10 grados**********************************

MOV_B100 movlw 0x0F ; ponemos dutty a 1 del PORTA y PORTB estan conectados
iorwf PORTA,f ; entre RA0>RA3 y RB0>RB3, el nibble bajo lo ponemos a 1111
iorwf PORTB,f ; y al alto le aplicamos mascara para dejarlo como esta
movlw .13 ; para 90º
call DEMORA ; durante 0.111 ms para movimientos de 10º aprox movlw 0XF0 ; mascara para que no nos afecte al nibble alto
; nos pone a 0 el nibble bajo donde tenemos los servos
andwf PORTA,f ; y nos deja el valor del nibble alto como estaba en PORTA
movlw .1 ; aunque solo es una repeticion hay que cargar W porque tiene otro valor call DEMORA ; hacemos un retardo mas para PORTB, asi se movera a 100º
movlw 0XF0 ; mascara para PORTB
andwf PORTB,f ; nibble alto como estaba y bajo a 0
return ;
MOV_B110 movlw 0x0F ; ponemos dutty a 1 del PORTA y PORTB estan conectados
iorwf PORTA,f ; entre RA0>RA3 y RB0>RB3, el nibble bajo lo ponemos a 1111
iorwf PORTB,f ; y al alto le aplicamos mascara para dejarlo como esta
movlw .13 ; para 90º
call DEMORA ; durante 0.111 ms para movimientos de 10º aprox movlw 0XF0 ; mascara para que no nos afecte al nibble alto
; nos pone a 0 el nibble bajo donde tenemos los servos
andwf PORTA,f ; y nos deja el valor del nibble alto como estaba en PORTA
movlw .2 ; cargamos 2 en w para tiempo adicional de PORTA de 0.222ms>20º
call DEMORA ; hacemos 2 retardoS mas para PORTB, asi se movera a 110º
movlw 0XF0 ; mascara para PORTA
andwf PORTB,f ; nibble alto como estaba y bajo a 0
return ;

MOV_B120 movlw 0x0F ; ponemos dutty a 1 del PORTA y PORTB estan conectados
iorwf PORTA,f ; entre RA0>RA3 y RB0>RB3, el nibble bajo lo ponemos a 1111
iorwf PORTB,f ; y al alto le aplicamos mascara para dejarlo como esta
movlw .13 ; para 90º
call DEMORA ; durante 0.111 ms para movimientos de 10º aprox movlw 0XF0 ; mascara para que no nos afecte al nibble alto
; nos pone a 0 el nibble bajo donde tenemos los servos
andwf PORTA,f ; y nos deja el valor del nibble alto como estaba en PORTA
movlw .3 ; cargamos 3 en w para tiempo adicional de PORTA de 0.330ms>30º
call DEMORA ; hacemos un retardo mas para PORTB, asi se movera a 120º
movlw 0XF0 ; mascara para PORTA
andwf PORTB,f ; nibble alto como estaba y bajo a 0
return ;

MOV_B130 movlw 0x0F ; ponemos dutty a 1 del PORTA y PORTB estan conectados
iorwf PORTA,f ; entre RA0>RA3 y RB0>RB3, el nibble bajo lo ponemos a 1111
iorwf PORTB,f ; y al alto le aplicamos mascara para dejarlo como esta
movlw .13 ; para 90º
call DEMORA ; durante 0.111 ms para movimientos de 10º aprox movlw 0XF0 ; mascara para que no nos afecte al nibble alto
; nos pone a 0 el nibble bajo donde tenemos los servos
andwf PORTA,f ; y nos deja el valor del nibble alto como estaba en PORTA
movlw .4 ; cargamos 4 en w para tiempo adicional de PORTA de 0.444ms>40º
call DEMORA ; hacemos un retardo mas para PORTA, asi se movera a 130º
movlw 0XF0 ; mascara para PORTB
andwf PORTB,f ; nibble alto como estaba y bajo a 0
return ;
MOV_B140 movlw 0x0F ; ponemos dutty a 1 del PORTA y PORTB estan conectados
iorwf PORTA,f ; entre RA0>RA3 y RB0>RB3, el nibble bajo lo ponemos a 1111
iorwf PORTB,f ; y al alto le aplicamos mascara para dejarlo como esta
movlw .13 ; para 90º
call DEMORA ; durante 0.111 ms para movimientos de 10º aprox movlw 0XF0 ; mascara para que no nos afecte al nibble alto
; nos pone a 0 el nibble bajo donde tenemos los servos
andwf PORTA,f ; y nos deja el valor del nibble alto como estaba en PORTA
movlw .5 ; cargamos 5 en w para tiempo adicional de PORTA de 0.555ms>50º
call DEMORA ; hacemos un retardo mas para PORTA, asi se movera a 140º
movlw 0XF0 ; mascara para PORTB
andwf PORTB,f ; nibble alto como estaba y bajo a 0
return ;
;************ Rutina de servicio de Interrupcion ************************
;********Aqui haremos copia de respaldo porque este programa ira integrado*********
;*****************en otro mayor y puede afectar a dicho programa********************
;copia de registro W y STATUS

Inicio_ISR movwf W_Temp ; Copiamos W a un registro Temporal.
swapf STATUS, W
; Invertimos los nibles del registro STATUS.
movwf STATUS_Temp ; Guardamos STATUS en un registro temporal.
;**** Interrupcion por TMR0 ****
ISR btfss INTCON,T0IF ; Consultamos si es por TMR0
goto Fin_ISR ; No, entonces restauramos valores
Actualizo_TMR0 ; Actualizo TMR0 para obtener una temporizacion de 20 ms.
movlw .100 ; d'100'
movwf TMR0
goto Fin_ISR ; Restauro valores
; Restauramos los valores de W y STATUS
Fin_ISR swapf STATUS_Temp,W ; Invertimos lo nibles de STATUS_Temp
movwf STATUS
swapf W_Temp, f ; Invertimos los nibles y lo guardamos en el mismo registro
swapf W_Temp,W ; Invertimos los nibles nuevamente y lo guardamos en W
return ; Salimos de interrupción
;..........................................
DEMORA
; haremos demoras de 0.111ms equivalentes 10º del servo aprox
movwf PDel1 ; la demora multiplicara 0.111 por el numero que traiga w
TOP1 movlw .23 ; 1 set numero de repeticion
movwf PDel0 ; 1 |
PLoop0 clrwdt ; 1 clear watchdog
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ?
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
decfsz PDel1,1
goto TOP1
return ; 2+2 Fin.

END

[/HTML]

Aqui les adjunto una imagen de la implementacion que estoy realizando en el proteus xD



Ademas del Hexadecimal generado en el MPLAB:

[URL="http://www.multiupload.com/?d=WOBHS9P0"]http://www.multiupload.com/?d=WOBHS9P0[/URL]

Esperando sus sugerencias para terminar este proyecto, gracias

Última edición por Deuteros; 28/03/2010 a las 20:41.
Deuteros está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Publicidad: Conoce las ofertas de www.ElectronicaSuiza.com
Respuesta


Usuarios viendo actualmente este tema: 1 (0 usuarios registrados y 1 visitantes)
 
Herramientas

Permisos para publicar mensajes
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los BB code están Activado
Los Emoticones están Activado
El código [IMG] está Activado
El Código HTML está Activado

Ir al foro

Temas similares
Tema Autor Foro Resp. Último mensaje
Software Control Remoto de Pc´s Byztor HARDWARE y SOFTWARE del PC 4 07/04/2009 10:51
control parental hildor IllusionSAT COMBO & Cristor Atlas COMBO 1 01/09/2007 17:58
Control ActiveX para servidor de Telnet jmam2 PROGRAMACIÓN Lenguajes: Visual Basic, C++, etc 0 21/05/2007 14:46
Control parental por buquetes mira93 DREAMBOX 5 28/11/2006 16:58
Vulnerabilidad remota en control ActiveX de Windows sabito SOFTWARE del PC - PROGRAMAS y S.O. 0 29/09/2006 17:48


!! ADVERTENCIAS !!: Las informaciones aquí publicadas NO CONTIENEN KEYS para la decodificación de ningún sistema: NO SON OPERATIVOS en sistemas SAT que precisen de su correspondiente suscripción.

ESTA TOTALMENTE PROHIBIDO EL USO DE ESTAS INFORMACIONES PARA LA MODIFICACIÓN O  DEFRAUDACIÓN DE SISTEMAS DE ACCESO CONDICIONAL.

ESTOS FOROS SON MODERADOS Y NO SE PERMITE LA PUBLICACIÓN DE INFORMACIONES ILEGALES POR PARTE DE LOS USUARIOS. EN CASO DE DETECTARSE ESTE TIPO DE INFORMACIONES, LOS USUARIOS SERÁN EXCLUIDOS DE ESTAS PÁGINAS.

USO DE COOKIES: Utilizamos COOKIES y de terceros para mejorar nuestros servicios y navegación por la web. Si continua navegando, consideramos que acepta su uso.  


La franja horaria es GMT +2. Ahora son las 15:42.

Powered por vBulletin™ Version 3.8.10
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.
Traducido por vBsoporte - vBulletin en español
Resolución óptima: 1024x768 pixels.

Foros Patrocinados por www.ElectronicaSUIZA.com
 

Foros ZackYFileS 2001-2016

 

Copyright © 2007 Zackyfiles.com & Jelsoft Enterprises Ltd.
Todos los derechos reservados.
Prohibida cualquier reproducion total o parcial.