TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: MarioMM en 28 de Septiembre de 2012, 02:04:27
-
Esto sí que es nuevo para mí.
Ya pude controlar el PIC con la PC a voluntad (¡bravo!). Pero ahora tengo un nuevo inconveniente.
Leí por aquí varias cosas al respecto y me ayudaron a solucionar como variar la velocidad, así lo pude hacer pero tengo un problema.
Tenemos un par de motores a un PIC, y un RS232 a una terminal virtual (en proteus).
Desde la terminal, al pulsar cierta tecla los motores hacen cosas:
se encienden
se apagan
giran a la derecha
giran a la izquierda
giran uno por un lado y el otro por otro
se mueven a su velocidad máxima
y se mueven a la mitad de su velocidad.
Todo es pan comido, excepto el último. Ahí, al poner un PWN, logro hacer que el condenado motor se mueva a la mitad de la velocidad, pero después de eso ya no puedo hacer nada, pues tengo
que iterar el ciclo para que el motor se mueva. Si no lo hago, el motor simplemente no se mueve.
Mi resolución fue poner un decfsz a una constante x y a partir de eso definir cuando el motor deja de girar a la mitad de su velocidad, pero luego se detiene.
Adjunto mi código, a ver si alguien me puede ayudar.
Saludos.
-
pero después de eso ya no puedo hacer nada, pues tengo
que iterar el ciclo para que el motor se mueva. Si no lo hago, el motor simplemente no se mueve.
Claro, tienes que repetir el ciclo todo el tiempo que quieres que se mueva al 50%, ¿Que problema tienes?
Mi resolución fue poner un decfsz a una constante x y a partir de eso definir cuando el motor deja de girar a la mitad de su velocidad, pero luego se detiene.
Es que esa constante es 10, por tanto se repite 10 veces a 10ms cada vez, a los 100ms para de repetir el ciclo, se para y va a inicio.
-
pero después de eso ya no puedo hacer nada, pues tengo
que iterar el ciclo para que el motor se mueva. Si no lo hago, el motor simplemente no se mueve.
Claro, tienes que repetir el ciclo todo el tiempo que quieres que se mueva al 50%, ¿Que problema tienes?
Mi resolución fue poner un decfsz a una constante x y a partir de eso definir cuando el motor deja de girar a la mitad de su velocidad, pero luego se detiene.
Es que esa constante es 10, por tanto se repite 10 veces a 10ms cada vez, a los 100ms para de repetir el ciclo, se para y va a inicio.
Si, eso lo entiendo perfectamente.
La cosa es que, al pulsar alguna otra tecla mientras el motor está en el ciclo a la mitad de su velocidad debería poder cambiar su dirección, o su velocidad, o hasta detenerse. Me está dando muchos problemas, pues incluso si leo algún dato de la terminal, el ciclo ya no se itera, o comienza a hacer cosas raras.
-
La cosa es que, al pulsar alguna otra tecla mientras el motor está en el ciclo a la mitad de su velocidad debería poder cambiar su dirección, o su velocidad, o hasta detenerse. Me está dando muchos problemas, pues incluso si leo algún dato de la terminal, el ciclo ya no se itera, o comienza a hacer cosas raras.
Tienes que leer las teclas en mitad del ciclo y leer tambien el rs232, podrias poner en lugar de un call retardo_1ms un call inicio y que haga la recepcion del rs232 y lea las teclas, no se si en hacer todo esto consumira mas de 1ms.
DC_50PorCiento ; Potencia del motor a 50%
bsf PORTB,0 ; Hace un PWN básico prendiendo los motores a la derecha
bcf PORTB,1 ; Luego ejecuta 5 retardos de 1ms y apaga los motores
bsf PORTB,2 ; Ejecuta otros 5 retardos y los vuelve a encender.
bcf PORTB,3
bcf PORTB,4
bsf PORTB,5
bsf PORTB,6
bcf PORTB,7
call Retardo_1ms
call Retardo_1ms
call Retardo_1ms
call Retardo_1ms
call Retardo_1ms
bcf PORTB,0 ; Pone 0 en cada uno de los bits
bcf PORTB,1 ; del puerto B
bcf PORTB,2
bcf PORTB,3
bcf PORTB,4
bcf PORTB,5
bcf PORTB,6
bcf PORTB,7
call Retardo_1ms
call Retardo_1ms
call inicio ;para chequear si hubo cambios
call Retardo_1ms
call Retardo_1ms
goto DC_50PorCiento
Creo que inicio tendra que incluir tambien la llamada a inicializa:
Inicio
call RS232_Inicializa ; Inicializa el MAX232
clrf PORTB ; Limpia el Puerto B
; Subrutina principal
call RS232_LeeDato ; Lee dato desde la terminal y lo almacena en w
call Teclado ; Llama a la subrutina Teclado
goto Inicio ; Crea bucle
Prueba asi a ver que hace, es una solucion "de circunstancias" no la verdadera solucion. Pero para la de verdad habria que hacer la temporizacion con el TIMER0 por interrupcion y asi tener el procesador libre para leer el rs232 y el teclado.
-
MarioMM No has pensado en utilizar una interrupción para saber cuando llega un dato via RS232 parar dar prioridad a la orden a ejecutar?
Saludos!!!
-
Como te habia indicado en el mensaje anterior NO FUNCIONA, porque de Teclado no vuelve con RETURN, esto te dara problemas ya que lo llamas con un CALL y despues retornas con GOTO.
El problema del 50% creo que se soluciona asi, pruebalo a ver si va bien:
DC_50PorCiento ; Potencia del motor a 50%
;bsf PORTB,0 ; Hace un PWN básico prendiendo los motores a la derecha
;bcf PORTB,1 ; Luego ejecuta 5 retardos de 1ms y apaga los motores
;bsf PORTB,2 ; Ejecuta otros 5 retardos y los vuelve a encender.
;bcf PORTB,3
;bcf PORTB,4
;bsf PORTB,5
;bsf PORTB,6
;bcf PORTB,7
movlw 0x65 ;esto hace lo mismo que lo que elimine
movwf PORTB
call Retardo_1ms
call Retardo_1ms
call Retardo_1ms
call Retardo_1ms
call Retardo_1ms
;bcf PORTB,0 ; Pone 0 en cada uno de los bits
;bcf PORTB,1 ; del puerto B
;bcf PORTB,2
;bcf PORTB,3
;bcf PORTB,4
;bcf PORTB,5
;bcf PORTB,6
;bcf PORTB,7
clrf PORTB ;pone a 0 PORTB
[b]call Retardo_1ms
call RS232_Inicializa
call RS232_LeeDato
movwf Apachurrada
movf Apachurrada,w
xorlw Teclal ;si sigue pulsada la misma tecla
btfsc STATUS,Z ;continua en 50%
goto $+5
movf Apachurrada,w
xorlw .0 ;si a traves del terminal llega 0
btfss STATUS,Z ;tambien sigue en 50%
goto Teclado[/b]
call Retardo_1ms
call Retardo_1ms
call Retardo_1ms
goto DC_50PorCiento
goto Fin
Como ves lo que hago es mirar que dato llega por el RS232 y si es el del 50% (.108) sigue ahi y si es .0 tambien (estoy suponiendo que cuando no se pulsa ninguna tecla llega un 0) si es otro numero, con cambiarlo listo.
-
Gracias a todos por las respuestas, y disculpen la tardanza, pero salí a prácticas de astronomía observacional;)
En fin, no se soluciona ni temporalmente el problema. Probaré lo de las interrupciones, aunque en eso no soy muy bueno ;)
Seguiré intentando, y comentaré como me va.
Gracias.
-
En fin, no se soluciona ni temporalmente el problema.
Bien eso quiere decir que vas bien, no iba a funcionar a la primera. :lol: :lol:
¿Que te hace? ¿Sabes que codigo manda el PC cuando no se pulsa ninguna tecla, si es que manda alguno?.
Prueba si pulsando la tecla de 50% manteniendola pulsada se queda en el 50%
-
no haz probado en usar el ciclo pero solo mirar puras banderas? de esa forma no se alenta en nada tu codigo
o sea entras al ciclo y vas probando bandera por bandera
por ejemplo ¿bandera de teclas? si si vas a la rutina de teclas,
¿bandera de pwm de motor? si si actualisas pwm,
¿bandera de rs232? si si recibes el dato, etc
saludos