TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Moyin en 19 de Octubre de 2006, 02:12:02
-
Hola buenos amigos del foro, estoy tratando de realizar el control de un PAP pero revisando ejemplos con PIC'S encuentro que para invertir la secuencia o giro del motor todos los programas terminan el ciclo antes de invertir el giro, esto hasta cierto punto no es tan grave ya que 4 pasos no son nada para ciertas aplicaciones y es tolerable este pequeño avance, yo he realizado con PLD(Gal) secuencias para steeper y como los manejo por estados puedo invertir el giro en cualquier momento y no tengo qu esperar a que se cunplan todos los estado para que cambie la secuencia, mi duda es como puedo hacer esto con un PIC, imagino que tengo que cargar el paso en alguna memoria para después leerla y ver hacia donde avanzo atrás o adelante, supongo esto, no tengo idea de como llevarlo con PIC, estoy manejando todo con MKB y es como pretendo hacerlo, si me dan una idea de como hacerlo se los agradeceré....Gracias :mrgreen:
-
Hola MOYIN, pues podiras usar un driver, aunque no he usado nunca uno, no se si te sirva el L293D, en BASIC para usar motores paso a paso podrias usar las recomendaciones de amigos del foro como son los vectores, yo alguna vez en PBP use LOW y HIGH aunque si es un desperdicio. Lord me comento esto de los vectores
Hola:
pues efectivamente no puedes hacer eso... pero puedes sustituirlo por un vector y asignar cada secuencia a un indece y luego asignar al puerto el valor coreespondiente del subindice del vector:
Algo asi:
vec var byte [10]
i var byte
vec[0]=%00000001
vec[1]=%00000010
-
-
-
-
loop:
for i=0 to 10
-
-
-
portc=vec[ i ]
-
-
-
next i
goto loop
end
Algo como eso... o tambien utilizando la funcion LOOKUP....
Suerte....!
O este otro
Hola:
Pues para comandar motores de pasos....
Tambien podrias hacerlo asi
loop:
PORTC=%01010101
pause 50
PORTC=%01010110
pause 50
goto loop
Con las secuencias correspondientes y el numero de veces que sea necesario para mover el motor.... yo lo he hecho con vectores como en el ejemplo de arriba para comandar motores PAP....
Lo hacia dentro de un bucle repeat - until... hasta una condicion deseada....
Espero te sirva de algo o que te de una idea
-
Hola a todos , soy nuevo en el foro, pero lo mejor es que me encanta el mundo de los pic, y me gustaría hacer una pregunta a navaismo si no tiene inconveniente en responderme.
Navaismo estoy haciendo un pequeño esperimento con un motor PaP bipolar, usando un Driver L293B y in PIC 16f84A, y estoy aprendiendo como puedo, entre lo que veo en el foro y algunos manuales de internet a programar con protón, de momento todo me funciona, pero mi problema es que necesito hacer andar dicho motor hacia delante y cuando pulse un Button que el motor gire al contrario pero solo el tiempo que yo le asigne, no se si me explico.
En realidad mi código lo que hace es poner en funcionamiento el motor haciadelante y cuando pulso el Button lo hace hacia atras, pero no lo puedo parar aún pulsando de nuevo el Button ,tengo que interrumpir la animación en proteus.
Te muestro el código a ver que piensas
Es éste:
DEVICE 16F84a 'PIC que voy a usar
XTAL 4 'frecuencia del crystal
clear ' si no hay variables despues de esta instrucción aclaro la RAM del PIC
TRISB=%00000000 ' dirección de datos donde configuro los pin del Puerto B como salida
inicio: ' etiqueta donde volvere con goto
if porta.0=0 then 'compruebo si el pin 0 del puerto A es pulsado
portb=%00000110 : delayms 25 ____
portb=%00000100 : delayms 25 '
portb=%00001000 : delayms 25 ----- asignación de pasos y pausas a los pin del port b (salida hacia el motor)
portb=%00001010 : delayms 25 ____'
else ' si no es pulsado ocurre lo siguiente
portb=%00001010 : delayms 25 ____
portb=%00001001 : delayms 25 '
portb=%00000101 : delayms 25 ----- asignación de pasos y pausas a los pin del port b (salida hacia el motor)
portb=%00000011 : delayms 25 ____'
endif ' fin de la instrucción if then
goto inicio ' nos vamos de nuevo ala etiqueta inicio
end. ' y terminamos
navaismo corrije este desastre porfa, como te dije lo que quiero hacer es que cuando se pulse el button el motor gire al contrario el tiempo que yo determine y luego vuelva a girar hacia delante hasta una nueva pulsación y asi sucesivamente.
gracias y un Saludo
-
Hola segun veo el codigo solo usas un boton, Y supongo que cuando esta en alto quieres que vaya hacia atras, entonces creo que lo que te falta declarar es es TRISA.0=1 asi le dices que ese pin sera entrada y te evaluara sus estados.
Si lo que quieres hacer es usar un solo boton y cada que lo presiones gire en un sentido haz que el boton incremente una variable y despues evalua esta variabla algo como
c=0
If c>=3 then
c=0
endif
if porta.0 = 1 then
pause 150 'antirebote
if porta.0 = 1 then
c=c+1
endif
endif
select case c
case 1 gosub adelante
case 2 gosub atras
end select
y tus rutinas....
Espero me explique cualquier cosa nos avisas
-
Hola de nuevo, no sabes la alegria que me da poder entrar en el foro y ver que me responden, de esa manera me siento participe, aunque carezco de esperiencia y soy un profano en la programación pero intentare compartir todo lo que este en mis manos ,gracias
Ante todo decirte que tengo declarado el TRISA=%11111 , solo que en el ejemplo anterior no lo inclui, aún no he probado el código que tu expones, lo de incrementar la variable , primero, por que como te he dicho no tengo muy claro lo de la programación y no entra en mis principios hacer algo que no entiendo, de todas formas voy a probar ese trozo de código, y luego te comento.
Ahora comprueba aver si he comprendido tu código
C=0 ' declaramos c con el valor de 0
IF C>=3 THEN ' si C es igual o mayor a 3 entonces
C=0 'C sigue teniendo el valor de 0
ENDIF ' terminamos la comparación
(no comprendo por que si porta.0=1 que se haga una pausa, sigo)
IF PORTA.0=1 THEN ' si el pin 0 del PuertoA es igual a entrada( pulsado) entonces
DELAYMS 150 ' pausamos 150 milisegundos, ( nose que quieres decir con antirebote, he leido algo pero no recuerdo)
IF PORTA.0=1 THEN ' si el pin 0 del PuertoA es igual a entrada(pulsado) entonces
C=C+1 ' el valor de C se incrementa a 1
ENDIF ' fin del 1º IF THEN
ENDIF 'fin del 2º IF THEN
SELEC CASE C ' no tengo ni idea de su significado
CASE 1 GOSUB ADELANTE ' creo que quiere decir que en caso de que el valor de C sea 1 vaya ha la etiqueta ADELANTE y
'ejecute lo que encierre la misma ,en este caso los PORTB=%XXXXXXXX de mi código no?
CASE 2 GOSUB ADELANTE ' creo que quiere decir que en caso de que el valor de C sea 2 vaya ha la etiqueta ATRAS y
'ejecute lo que encierre la misma ,en este caso los PORTB=%XXXXXXXX tambien
END SELECT ' ni idea me lo tienes que explicar
Vueno aver que te parece, no se si lo he interpretado bien o no me he enterao de na
ya me cuentas luego, quisiera decirte que lo que necesito es un codigo el cual me haga andar el motor hacia la derecha y que cuando se presione un pulsador botón haga que el motor gire hacia la izquierda un intervalo de tiempo por ejemplo (250ms) y transcurrido ese intervalo de tiempo vuelva automaticamente de nuevo a girar hacia la derecha otra vez.
Que cada vez que se pulse gire ala izquierda esos 250ml.
Espero haberme esplicado, no quiero agobiar con tantas preguntas, ahora voy a probar con tu código, en cuestión de minutos te contesto con el resurtado.
Gracias y saludos
-
hola , estoy aqui de nuevo hace nada he probado el codigo, asi es como lo interprete,
device 16f84A ' PIC a usar
xtal 4 'frecuencia a usar
'TRISA.0=1
TRISB=%00000000
'PORTB=0
dim c as Byte
c=0
if c>=3 then
c=0
endif
if porta.0=1 then
delayms 150
if porta.0=1 then
c=c+1
endif
endif
select Case c
case 1
gosub adelante
case 2
gosub atras
end select
adelante:
portb=%00000110:delayms 25
portb=%00000101:delayms 25
portb=%00001001:delayms 25
portb=%00001010:delayms 25
return
atras:
portb=%00001010:delayms 25
portb=%00001001:delayms 25
portb=%00000101:delayms 25
portb=%00000110:delayms 25
return
no se si lo he correcto, el caso es que el motor en la simulación de proteus solo funciona durante unos segundos y luego se queda completamente parado, e lpulsador queda bloqueado osea no hace nada, cambie el pulsador por un SWITCH (interruptor) pero tampoco responde, que piensas que puede ser navaismo??
-
Bien el antirrebote es para que el pic solo detecte un solo 1 cuando aprietas el switch; los switchs al ser de contactos mecanicos tardan algunos Milisegundos en acloparse lo cual genera rebotes entre los estados 1 y 0 logicos, los PICs son capaces de detectar estos saltos por eso ponemos esas pausas para que efectivamente lea ese estado y no se confunda con ruido.
La instruccion SELECT CASE lo que hace es evaluar la variable o puerto depende lo que quiera que este delante de la instruccion esta se basa en casos los casos como puedes ver pueden tener un valor el que tu quieras incluso una letra ya que tomaria su valor ascii. Puede tener tantos casos quieras -solo no abusar- en cada caso puedes meter las instrucciones que desees, en este caso lo enviamos a esas etiquetas. Y su sintaxis es:
Select case variable
casos...
....
end select
Mas informacion en la ayuda.
Sobre tu programa yo lo que haria seria algo como esto:
Main:
Gosub Adelante
if porta=0 then atras
goto Main:
Adelante:
tus rutinas de manejo de motor
Return 'regresa a la ultima linea despues del gosub
Atras
for i=0 to 25
rutina de atras
pause 100
next i
goto main ' aqui no usa return ya que no fue un gosub
Algo asi mas o menos seria para mi lo mas practico.
-
Hola navaismo, ante todo muchas gracias por tu ayuda y ofrecimiento, decirte que he compilado el codigo pero sigue sin responder a lo que yo realmente deseo con esto me refiero a proteus en la simulación, puesto que la primera reacción del motor ante el código compilado que propusiste es: Un par de vueltas hacia la derecha y luego vueltas pausadas hacia la izquierda, en las cuales hay en cada ciclo de no se exactamente cuantas vueltas, una nueva vuelta ala derecha y de nuevo otra vez hacia la izquierda, vueltas como ya te digo alternas entre vuelta y pausa.
Luego cuando pulso el botón tarda unos segundos en reaccionar y entonces comienza a girar hacia la derecha, estos si son giros e progresivos y sin pausa alguna, pero vuelvo a pulsar el botón y no ocurre nada, te dejo una imagen del circuito a ver si notas algo contrario a lo correcto..
Decirte en un momento dado es casi lo que necesito, eso si, que no durara tanto tiempo el giro hacia la izquierda.
saludos de nuevo y gracias.
este es el código por si ves algo anormal:
device 16f84A
xtal 4
TRISA.0=1
TRISB=&00000000
DIM I AS BYTE
main:
Gosub adelante
if porta=0 then atras
goto main
adelante:
portb=%00000110 : delayms 25
portb=%00000100 : delayms 25
portb=%00001001 : delayms 25
portb=%00001010 : delayms 25
return
atras:
for I=0 to 25
portb=%00001010 : delayms 25
portb=%00001001 : delayms 25
portb=%00000101 : delayms 25
portb=%00000110 : delayms 25
Delayms 25
Next i
Goto main
-
La imagen no la puedo subir, el motivo es que la salve muy pesada y no se admiten mayor peso de 250k
Estoy intentando adelgasar la imagen en breve la subo.
Saludos
-
A es verdad mete esta parte if porta=0 then atras en la subrutina de Adelante para que se corte sin retardos, Sobre las pausas es por el PAUSE dentro del for esto lo puedes quitar el for esra para darte una idea de como crear una rutina de tiempo.
Y no veo el circuito
-
Haber intenta asi:
device 16f84A
xtal 4
TRISA.0=1
TRISB=&00000000
DIM I AS BYTE
main:
Gosub adelante
if porta=0 then atras
goto main
adelante:
if porta=0 then atras
portb=%00000110 : delayms 25
portb=%00000100 : delayms 25
portb=%00001001 : delayms 25
portb=%00001010 : delayms 25
return
atras:
for I=0 to 250
portb=%00001010 : delayms 25
portb=%00001001 : delayms 25
portb=%00000101 : delayms 25
portb=%00000110 : delayms 25
Next i
Goto main
-
Navaismo con estos cambios que efectuo en los IF THEN el motor comienza a girar hacia la derecha y cuando pulso el button lo hace hacia la izquierda, pero no un tiempo determinado como deseo sino que sigue girando sin parar.
Que se puede hacer al respecto.
Este es el código, aver si se logra parar el dichoso motor
device 16f84A
xtal 4
TRISA.0=1
TRISB=&00000000
DIM I AS BYTE
main:
Gosub adelante
if porta=1 then atras ' en vez de salida 0 un 1 entrada
goto main
adelante:
if porta=1 then atras ' aqui igual 1 en vez de 0
portb=%00000110 : delayms 25
portb=%00000100 : delayms 25
portb=%00001001 : delayms 25
portb=%00001010 : delayms 25
return
atras:
for I=0 to 3
portb=%00001010 : delayms 25
portb=%00001001 : delayms 25
portb=%00000101 : delayms 25
portb=%00000110 : delayms 25
Next i
Goto main
-
mira el tiempo depende de los ciclos del for sumados a las pausas que esten dentro de este mismo. Por ejemplo en tu codigo tienes un for que se repite 4 veces y cada ciclo por las pausas dura 100mS por los delay de 25mS por lo que yo deduzco que girara durante 400mS o lo que seria lo mismo 4 pasos. Me captas?
-
No quiero ser pesaito, pero incluso si lo fuese es algo emocionante descubrir que algo comienza a funcionar
Siento las molestias que te causo, pero eres mi unica salvación, estoy ilusionado con esta web, mi proyecto y tus conocimiento de manera que te agradezco todo el esfuerzo, a ver si se bate el record i se consigue parar el motor y que despues de unos instante vuelva a girar en el sentido en que comienza.
-
Osea 25 milisegundos del delay por 4 del FOR asi por 4 veces correcto??
Quieres decir que transcurrido ese tiempo devería de parar???.
¡ha estoy ejecutando paso a paso el codigo en proteus y veo que cuando se termina el ciclo d 4 veces del FOR salta al GOSUB empezar, en vez de pasar por el GOTO main que va despues del NEXT, no lo entiendo, pienso que si no se fuese al GOSUB y pasara por el GOTO comenzaría a girar basado en la subrutina ADELANTE, no se si me explico?
-
No te preocupes todos empezamos desde cero o al menos yo empece igual, nunca hay preguntas tontas ni desesperantes, creo que la ignorancia es un derecho que se puede corregir y veo con agrado que eres de esos que lo intentan hasta que queda eso es muy bueno.
Con respecto al FOR casi le atinas son 100 porque dentro del for existen 4 pausas de 25mS si agregas una mas ya serian 125mS eso dura cada ciclo, lo que un FOR hace es repetir el codigo dentro de el las veces indicadas en los pasos indicados, en tu ejemplo el FOR hace 4 ciclos pues va de 0 a 3 el primer paso la i es igual a 0 ahi hara lo que tiene dentro osea tus pasos y lo repetira hasta que i tenga el valor de 3 una vez que se cumple el ciclo de 3 se sale y continua con el programa en este caso salta a MAIN.
Y si todo lo que se te imagine hacer con tu motor es posible, solo ayudanos a aterrizarlo.
-
Gracias por tus palabras avaismo, quería decirte que he observado lo siguiente
estoy ejecutando paso a paso el codigo en proteus y veo que cuando se termina el ciclo d 4 veces del FOR salta al GOSUB ADELANTE, en vez de pasar por el GOTO main que va despues del NEXT, no lo entiendo, pienso que si no se fuese al GOSUB y pasara por el GOTO el problema estaría resuelto, que puede suceder para que salte al gosub??
-
A cual Gosub Salta??? Al de adelante si hace eso es que esta bien, creo que no se ve las etiquetas o mas bien el debuggeo de las etiquetas en la depuracion.
-
SI salta al ( GOSUB adelante ) pero luego se detiene en la comparación del (IF porta=1 then atras ) y al comprobar que el botón sigue pulsado vuelve a saltar ala etiqueta( atras: ) asi sucesivamente.
Creo que el problema radica en el botón no entiende cuando esta activado y cuando no lo está
-
Bueno voy a descansar un poco mañana te seguire dando el coñazo, al meno se ha descubierto que el salto es erroneo ya que comprueba con IF THEN y en dicha comprobación el button esta pulsado lo que obliga a saltar ala subrutina de la etiqueta atras:.
no se si me explico, de todas formas mañana si dios quiere seguimos con el tema, vuelvo a agradecer tu paciencia.
hasta mañana y un cordial saludo.
-
Oye el error esta en que no definimos que porta es solo tenemos PORTA=1 eso evalua todo el PORTA creo que era el RA0 no?? ups es lo mismo pero por si las dudas pon porta.0=1.
Esperemos que sea eso.
-
Hola Amigos! Manupri, reemplaza el ultimo goto main por RETURN
creo que alli esta el error, luego nos comentas...
Suerte!
Norberto
-
Hola de nuevo y gracias tanto a navaismo como Norberto.
Siento mucho no haber contestado antes estube de vacaciones y no pude entrar al foro, solo decir que efectivamente el motor si que realiza la función deseada, pero encuentro un pequeño inconveniente , y es que el motor cuando esta haciendo el giro normal hacia la derecha antes de pulsar el button, me gira como tartamudeando, osea dos vueltas un pequeño giro hacia detras, dos vueltas, un pequeño giro hacia detras etc.. y asi sucesivamente, que creeis que pueda ser??
a! si soys tan amable me gustaría que me pasaseis un esquema para un detector de obstaculos que no fuese tan complejo, tengo el emisor y receptor, un tip 41 ,resistencias, etc, bueno mejor os muestro un esquema que baje de la red el cual no logro hacer funcionar comentadme algo al respecto porfa
un cordial saludo
-
Hola , he rectificado según vuestras observaciones, como bien decia Norberto cambiando el goto por return iría mejor, pero he comprobado que me da errores en proteus..( Stack underflow executing RETURN intstruction ), y con el goto no los da, de manera que he dejao el goto main, lo de los saltos del motor eso que comente anteriormente sobre el tartamudeo del motor lo he soluciondado , se devia a las demoras, unas eran más cortas que otra de ahí el problema, quiero decir los pause o delayms dentro de la variable adelante: tenian un valor distinto que los que están dentro de la variable atras:.
Y bueno ese era el error del motorcillo, otra cosita? existe alguna forma de conectar en el L293B dos motores bipolares???, o tengo que usar obligatoriamente dos L293B? ydos L293B?? puedo conectarlos a un pic? o tengo que usar dos pic pa dicho cometido?? gracias de antemano maestros y un cordial saludo, !! no olvideis lo del esquemita para dectectar obstaculos porfa..
-
Hola Manupri, sobre lo que comentas del RETURN y GOTO te explico porque: Cuando usas un RETURN estas obligado a usar previo a este un GOSUB para que el return sepa a donde regresar, como en el programa usas directamente el salto condicional del IF el return hace que se trabe el programa por ello use el GOTO que te manda de regreso ya que no usamos un GOSUB.
Sobre los L293 que yo sepa sopoortaban 2 motores y si estos los puedes conectar a un PIC, usa el buscador y notaras la cantidad de post sobre ese integrado y sobre sus conexiones.
Para un detector de obstaculos puedes usar el sensor IS471F
SENSOR INFRAROJO SHARP IS471F.
Este sensor da a los robots la capacidad de detectar objetos que se encuentren en un rango aproximado de 1 a 15 cm.
Es parecido al PNA4602 en que recibe solamente luz infraroja modulada a 38khz rechazando cualquier otra fuente de luz externa, pero con la ventaja de que ya tiene intregrado el oscilador, simplemente tenemos que conectarle un diodo infrarojo de 940NM en uno de sus pines, una resistencia de 280ohms y un capacitor de 0.33uf.
Cuando detecte un objeto la salida tendrá un estado bajo "0", en caso contrario un estado alto "1". Esta salida puedes enviarla directamente a la entrada de algún micro, circuito integrado o transistor.
Puede ser utilizado en robots evasores de obstáculos mediante infrarojo, robots sumo para detectar oponentes,etc.