TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: luisko01 en 07 de Julio de 2009, 01:04:20
-
Hola Amigos del Foro..
no saben cuanto me agrada haber encontrado este lugar... la verdad estoy como loco con un problema el cual necesito solucionar Urgente... :shock:
Disculpen si el tema esta posteado, pero es mi primera vez en el foro y de paso con los pics. Soy estudiante de Ingenieria de sistemas y tengo el siguiente problema.
Llevo cuatro dias haciendo un curso intensivo de pics y asm. En estos cuatro dias he dormido solo 8 horas... pero han sido provechosos.
Ahora si al grano:
Necesito controlar un Motor paso a paso y debe tener control de velocidad Digital. asi que aqui esta el resultado de mi programacion:
el cuento es que en simulador funciona perfecto, tengo dos pulsadores para manejar la velocidad de giro, y otros dos para el sentido del giro.. hasta alli todo perfecto, el problema es cuando lo llevo al circuito.
algunas veces funciona bien, algunas otras no. alimento y quito la alimentacion diez o mas veces y de las 10 veces funciona bien solo cuatro o tres... :x
Please help help help...
alguna idea??? por cierto he probado con varios PICS y con todos pasa lo mismo... estoy de muerte, las ojeras ya me tapan la cara...
ultima nota: el circuito lo monto en protoboard... aun no he hecho la placa. sera por eso???
Agradeciendo con todo lo que puedo...
luisko desde Colombia
Aqui esta mi ASM
LIST p=16F628 ;tell assembler what chip we are using
include "P16F628.inc" ;include the defaults for the chip
__CONFIG _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _LVP_OFF & _INTRC_OSC_NOCLKOUT
cblock 0x20 ;start of general purpose registers
PDel0 ;used in delay routine
PDel1 ;used in delay routine
PDel2
var
PDel02 ;used in delay routine
PDel12 ;used in delay routine
var2 ;used in delay routine
endc
STATUS equ 03h ;Address of the STATUS register
TRISA equ 85h ;Address of the tristate register for port A
TRISB equ 86h
org 0x0000 ;org sets the origin, 0x0000 for the 16F628,
;this is where the program starts running
movlw 0x07
movwf CMCON ;turn comparators off (make it like a 16F84)
bsf STATUS, RP0 ;select bank 1
movlw b'00000000' ;set PortB all outputs
movwf TRISB
movlw b'11110000'
movwf TRISA ;set PortA all outputs
bcf STATUS, RP0 ;select bank 0
movlw .10
movwf var
movwf PORTB
goto Bucle
ini movlw d'0'
movwf var2
bCf STATUS,2
goto Bucle
tablita movfw var2
call Tabla ;Llamo a la tabla
movwf PORTA
;call PDelay3
;movlw d'0'
movwf PORTA
call PDelay
incf var2
movlw d'4'
subwf var2,w
btfsc STATUS,2
goto ini
goto Bucle
tablita2 movfw var2
call Tabla2 ;Llamo a la tabla
movwf PORTA
;call PDelay3
;movlw d'0'
movwf PORTA
call PDelay
incf var2
movlw d'4'
subwf var2,w
btfsc STATUS,2
goto ini
goto Bucle
;******* TABLA DE NUMEROS DERECHA***********
Tabla addwf PCL,F ;Desplazamiento sobre la tabla
retlw b'00000001' ;Dígito 0 11111100
retlw b'00000010' ;Dígito 0 11111100
retlw b'00000100' ;Dígito 0 11111100
retlw b'00001000' ;Dígito 0 11111100
;******* TABLA DE NUMEROS IZQUIERDA***********
Tabla2 addwf PCL,F ;Desplazamiento sobre la tabla
retlw b'00001000' ;Dígito 0 11111100
retlw b'00000100' ;Dígito 0 11111100
retlw b'00000010' ;Dígito 0 11111100
retlw b'00000001' ;Dígito 0 11111100
Bucle btfss PORTA,4
goto tablita
btfss PORTA,5
goto tablita2
btfss PORTA,6
goto tim
btfss PORTA,7
goto tim2
goto Bucle
tim decf var
movfw var
movwf PORTB
call PDelay2
goto Bucle
tim2 incf var
movfw var
movwf PORTB
call PDelay2
goto Bucle
PDelay clrw
movfw var ; 1 set number of repetitions (C)
movwf PDel0 ; 1 |
PLoop0 movlw .20 ; 1 set number of repetitions (B)
movwf PDel1 ; 1 |
PLoop1 movlw .80 ; 1 set number of repetitions (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) is the time over? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) is the time over? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 cycles delay
PDelL2 clrwdt ; 1 cycle delay
return ; 2+2 Done
PDelay2 movlw .50 ; 1 set number of repetitions (B)
movwf PDel02 ; 1 |
PLoop12 movlw .181 ; 1 set number of repetitions (A)
movwf PDel12 ; 1 |
PLoop22 clrwdt ; 1 clear watchdog
clrwdt ; 1 cycle delay
decfsz PDel12, 1 ; 1 + (1) is the time over? (A)
goto PLoop22 ; 2 no, loop
decfsz PDel02, 1 ; 1 + (1) is the time over? (B)
goto PLoop12 ; 2 no, loop
PDelL12 goto PDelL22 ; 2 cycles delay
PDelL22 goto PDelL32 ; 2 cycles delay
PDelL32 clrwdt ; 1 cycle delay
return ; 2+2 Done
end
-
El motor PAP lo conectas directamente al PIC?
-
Nop....
por ahora solo simulo el motor con LEDS, ademas pienso usar transistores darligtons...
gracias por responder tan pronto.
El problema es que cuando le aplico la tension al circuito no ocurre lo que yo esperaba ver, pero en la simulacion si. Inicia mostrando cualquier cosa, aunque deberia iniciar en cero todas las salidas... como dije antes algunas veces si funciona, estoy usando una fuente de poder de un PC.
-
Hola, Algunos consejillos:
Debes considerar que un motor paso a paso tiene una combinacion binaria que polariza las bobinas en secuencia y que si no ocupas la secuncias correcta el motor se traba. Para probar esa parte, no lo hagas con pic, polariza directamente el motor en la secuencia que corresponde y verifica que se mueva, si no funciona cambia la secuencia. Una vez que hayas encontrado la secuencia "manualmente" pasalo al pic. Lo mas logico es que este ahi el error.
Ademas, hay un factor que no recuerdo el nombre, pero que dice que los campos magneticos demoran un tiempo en desaparecer, es como si un condensador quedara cargado, si cambias el estado binario y por lo tanto la polarizacion en un periodo muy corto, la polarizacion electrica tendra que luchar contra el estado magnetico remanente anterior y eso traba el motor, por lo que debes buscar el retardo preciso para tu motor.
Prueba con eso, ojala se solucione el problema.
Atte.
Jose
-
Hola, Algunos consejillos:
Debes considerar que un motor paso a paso tiene una combinacion binaria que polariza las bobinas en secuencia y que si no ocupas la secuncias correcta el motor se traba. Para probar esa parte, no lo hagas con pic, polariza directamente el motor en la secuencia que corresponde y verifica que se mueva, si no funciona cambia la secuencia. Una vez que hayas encontrado la secuencia "manualmente" pasalo al pic. Lo mas logico es que este ahi el error.
Ademas, hay un factor que no recuerdo el nombre, pero que dice que los campos magneticos demoran un tiempo en desaparecer, es como si un condensador quedara cargado, si cambias el estado binario y por lo tanto la polarizacion en un periodo muy corto, la polarizacion electrica tendra que luchar contra el estado magnetico remanente anterior y eso traba el motor, por lo que debes buscar el retardo preciso para tu motor.
Prueba con eso, ojala se solucione el problema.
Atte.
Jose
Noooo noo aun no he colocado el motor... es que ni siquiera me funciona con leds.
creo que son problemas de voltaje, pero no se... a donde van los pines no usados????
alguien sabe???
-
:shock:
El pin 5 va a GND= 0 Volts.
El pin 14 va a Vcc= 5 Volts.
-
Si ya tienes todos los pines conectados (VCC a +5, VSS a masa , MCLRE a +5 con una R de 10k) entonces prueba a hacer
BSF PORTB,0 ; (donde se supone que tienes conectado un led)
GOTO $-1 (para hacer un bucle infinito)
Con esto comprobarás si enciende el led, que está bien conectado, que el led no está invertido (me ha ocurrido :P) y que las directivas iniciales son correctas.
Y luego es cuestión que sigas comprobando con las mismas 2 lineas, moviéndolas a travez de tu programa para ver (cuando el led no encienda) donde se queda pillado el programa.
También podrías hacer
BSF PORTB,0
DELAY de 500ms
RUTINA DUDOSA A TESTEAR (que no te apague puerto B!)
BCF PORTB,0
Si el led enciende y apaga entonces es correcta, pero si enciende y nunca apaga es que se ha quedado pillado en esa rutina.
Parece infantil, pero es una forma fácil de depurar el programa cuando no quiere arrancar y no sabes donde está el error.
-
Hola, por lo que comentas, al emplear oscilador interno, y al quitar el reset, seguramente se "tilda" de entrada... te recomendaría que coloques el "power on reset" en ON
así se resetéa en el inicio de programa ( en tu palabra de configuración lo tienes en off )
He leído tu programa, tendrias que "ordenarlo" un poco más empleando subrutinas...
Nos mantienes informado de la situación....
Norberto
-
Por lo que veo del programa, ele registro "var2" es el indice de las tablas utilizadas, y debiera moverse entre 0x00 y 0x03.
Pero al inicio del programa, no se le asigna ningun valor..... :S
Presumo que el simulador lo inicializa en 0x00, pero en el PIC la cosa cambia, ya que puede inicializar en cualquier valor entre 0x00 y 0xFF, y cualquier valor mayor que 0x03 al inicio del programa en el registro "var2" te llevará a comportamientos erráticos, ya que estas cargando al PCL con valores que pueden estar fuera del espacio que ocupa tu programa. Esto generalmente se refleja como un funcionamiento con reiterados "reset" inexplicables (comprobado por experiencia propia)
visto en el codigo, en este momento tienes esto:
org 0x0000 ;org sets the origin, 0x0000 for the 16F628,
;this is where the program starts running
movlw 0x07
movwf CMCON ;turn comparators off (make it like a 16F84)
bsf STATUS, RP0 ;select bank 1
movlw b'00000000' ;set PortB all outputs
movwf TRISB
movlw b'11110000'
movwf TRISA ;set PortA all outputs
bcf STATUS, RP0 ;select bank 0
movlw .10
movwf var
movwf PORTB
goto Bucle ; Aquí vas al bucle principal sin haber inicializado "var2"...
ini movlw d'0'
movwf var2
bCf STATUS,2
goto Bucle
.......
Pero deberías tener algo como esto:
org 0x0000 ;org sets the origin, 0x0000 for the 16F628,
;this is where the program starts running
movlw 0x07
movwf CMCON ;turn comparators off (make it like a 16F84)
bsf STATUS, RP0 ;select bank 1
movlw b'00000000' ;set PortB all outputs
movwf TRISB
movlw b'11110000'
movwf TRISA ;set PortA all outputs
bcf STATUS, RP0 ;select bank 0
movlw .10
movwf var
movwf PORTB
ini movlw d'0'
movwf var2
bCf STATUS,2
goto Bucle ; Vas al bucle con el registro "var2" inicializado con 0x00
.......
Con esta leve modificación deberías tener una operación más estable.
Espero te sirva mi aporte, y saludos a quienes nos leen.
-
Hola, por lo que comentas, al emplear oscilador interno, y al quitar el reset, seguramente se "tilda" de entrada... te recomendaría que coloques el "power on reset" en ON
así se resetéa en el inicio de programa ( en tu palabra de configuración lo tienes en off )
He leído tu programa, tendrias que "ordenarlo" un poco más empleando subrutinas...
Nos mantienes informado de la situación....
Norberto
Amigo Muchas gracias por responder, ya estaba casí al borde de la desilución... ahora estoy en el trabajo, pero llegará a casa a probar lo que me dices..
sin embargo no entiendo muy bien lo que propones por que como te dije soy nuevo en esto de los PICS donde habilito el "power on Resest"?????
probaste la Simulación???
la simulación en mi PC funciona perfecto, pero no en el circuito... incluso cambié de protoboard y nada aún... estoy al borde de la locura... se me agota el tiempo y aún no encuentro solución.
:shock:
aún sin probar lo que me dices voy feliz a mi casa por que tengo la esperanza que al cambiar eso me funcione bien..
como dije antes algunas veces funciona, algunas otras no.
te juro que creí estar usando subrutinas...
tons estoy mal.
un abrazo desde Colombia y de nuevo muchas gracias...
-
Para habilitar el Power on reset, cambia el fuse de la siguiente manera: _PWRTE_ON
-
:-/ :-/ :-/ :mrgreen: :mrgreen:
Amigossss parece que todo ok.
Joder se supone que soy programador y olvide asignar una variable despues de declararla, y una variable critica además...
bueno siempre se está aprendiendo..
Gracias, pero muchas gracias a todos los que leyeron, a todos los que colaboraron..
Ahora se supone que debo cerrar el tema???? ¿¿¿¿cómo lo hago???
Un abrazo Gigante desde Colombia
-
sansanoloko
!Que Solución amigo eres grande¡