TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: peyutron1 en 24 de Abril de 2010, 20:48:05
-
Hola!!
Tengo el siguiente problemilla:
Quiero comunicar mi pc con un pic 16f628a utilizando el serial communicator de microcode y he intentado esto sin nigun exito:
chr Var Byte ' Storage for serial character
cont Var Byte ' Storage for character counter
TRISB = %11001010 ' defino los puertos b4 y b5 como leds y el puerto b1 como entrada
PORTB = 0 ' todo el puerto b a 0
cont = 0 ' contador a 0
loop:
Hserin 10000, allon, [chr] 'recibe el dato
Hserout [chr] 'manda chr
cont = cont + 1 ' Increment character count
PORTB = cnt ' Send count to LED
Goto loop
allon:
PORTB = %00000001 ' Error por no recibir nada
Pause 500
PORTB = 0
Pause 500
Goto allon
End
en serial communicator lo tengo configurado de esta manera:
Com2
2400baud
No parity
Byte size is 8
1 stop bit
Tengo que comentar que con Serin y Serout no he tenido nunca ningun problema y siempre me han funcionado muy bien, pero tampoco me gustaria estancarme ahi "porque funcione bien" me gustaria aprender otras maneras de mandar datos por puerto serial y depues pasar al USB, asi poquito a poco ;) Tambien decir que he leido mucho sobre la usart, pero casi todo demasiado lioso, sobre otros pic y tal y la verdad estoy hecho un lio alguien me podria explicar de manera sencilla como se configura el 16f628 para poder usar la usart de manera sencilla?
Gracias!!
-
Nadie puede darme una orientación???? solo necesito un ejemplo y lo demas ya lo ire sacando yo!!!
-
hola
no veo que tengas definida la velocidad para HSERIN / HSEROUT y diría que es necesario.
HSERIN lo tienes establecido de forma que si no sucede nada durante un tiempo se va a la etiqueta 'allon', pero tal como lo tienes una vez ahí ya no sale del bucle.
¿no te da un error a la altura de 'loop'? juraría que hay un comando Do Loop... de todas formas hace mucho que no uso picbasic y puedo estar engañado...
haz una búsqueda en el Foro sobre estos comandos, que seguro que hay bastantes cosas.
un saludo
-
Gracias por responder Xocas06!!
pues si tambien tengo por aqui un par de configuraciones pero con todas me hace lo mismo entra en el bucle "allon" te pongo un ejemplo por si fuera algo de la configuracion :
include "modedefs.bas"
CMCON=7
@ device XT_OSC
DEFINE OSC 4
DEFINE HSER_RCSTA 90h ' Defino el receptor como habilitado
DEFINE HSER_TSTA 20H 'Defino el registro de tranmision habilitada
DEFINE HSER_BAUD 2400 'Defino la velocidad
chr Var Byte ' Storage for serial character
cont Var Byte ' Storage for character counter
TRISB = %11001010 ' defino los puertos b4 y b5 como leds y el puerto b1 como entrada
PORTB = 0 ' todo el puerto b a 0
cont = 0 ' contador a 0
loop:
Hserin 10000, allon, [chr] 'recibe el dato
Hserout [chr] 'manda chr
cont = cont + 1 ' Increment character count
PORTB = cnt ' Send count to LED
Goto loop
allon:
PORTB = %00000001 ' Error por no recibir nada
Pause 500
PORTB = 0
Pause 500
Goto allon
End
He intentado directamente desde el PC e intercalando un max232 y con el mismo resultado, nada de nada.
Manual PBP en mano, no hay ningun comando "do loop".
Tambien he pensado que mi 16f628 este "cascao" la usart, aunque no me da ningun problema ni al compilar ni al grabar el .HEX al pic.
Tmb se me ha ocurrido que como en PBP puedes meter codigo ASM configurar la usart en ASM, pero no se si eso es posible porque yo ASM.. na de na..
Gracias!!!
-
DEVICE pic16F628A, 0x3f21 'Osc_XT, MCLR_ON, Power-up_ON - este valor puedes verlo al configurar los fuses en Winpic800 por ejemplo
DEFINE OSC 4
DEFINE HSER_BAUD 2400
CMCON = 7
TRISA = valor 'establece pines no usados como salidas
TRISB = valor 'establece pines no usados como salidas
PORTA = 0
PORTB = 0
---include "modedefs.bas"--- no es necesario en comunicación por hardware
establecemos variables, tipos y valores...
inicio:
...
...
HSERIN {tiempo}, {etiqueta}, [variable] - si no se recibe nada en el {tiempo} indicado salta a {etiqueta}, de lo contrario continúa en la siguiente línea. tiempo y etiqueta son opcionales, de manera que esto es válido: HSERIN [variable].
según parece, salta a 'allon' y al final se encuentra un 'GOTO allon' que le impide salir de ahí. envíalo a 'loop' después de señalar el error...
me equivoco de basic... creí que había un DO..LOOP o algo así en picbasic.
no creo que sea problema del pic... ¿cómo lo estás probando?
un saludo
-
No pasa nada con la de lenguajes que hay... bueno los fuses los configuro en el icprog1.06b los tengo configurados asi :
WDT_OFF
PWRT_ON
MCLR_OFF (no tengo puesto el reset)
BODEN_ON
LVP_OFF
CPD_OFF
CP_OFF
Lo del include "mode.." no lo sabia, pensaba que si se tenia que poner, gracias por el apunte!
lo del bucle en "allon" es poco comodo, pero como este era de prueba pues tampoco lo vi mal... no pensaba que me fuera a dar tanto lio, normalmente me van saliendo las cosillas, poco a poco, pero me van saliendo... asi que lo deje asi.. para saber que el pic estaba trabajando
TRISA Y TRISB no los tengo muy claros...
TRISA se refiere al puerto A no? yo no los he puesto pensando que como no iba a usarlos pues no hacia falta establecerlos
TRISB lo puse asi TRISB = %11001010 poniendo los puertos B7 y B6 como salida a los led mmmm... ahora que lo leo... no tendria que ser asi:
TRISB =%11000100????
con como lo estoy probando te refieres a las configuraciones del ordenador? o al circuito donde lo tengo montado?
VDD= +5.1V
los dos led con una resistencia de 4,7K cada led conectados a B6 y B7
la salida del pc con cable serie rs232 con TX en el pin 3 y una resistencia de 22K y RX en el pin2 con una resistencia de 330ohm...
Mañana seguire probando a ver si veo ya la luz con esto que me lleva frito desde hace unas semanas!! ahora a descansar para mañana tener la mente agil!!
Gracias Xocas06!!! mañana te sigo contando la evolucion, si se te ocurre algun ejemplo para hacer que funcione, tengo LCD y demas por si se te ocurre alguna prueba. Chao!!
-
Despues de los consejos de Xocas06 he intentado hacer esto un poco más claro (o al menos eso espero)
Y bueno aunque el resultado sigue siendo negativo.. no pasa nada yo lo intento hasta que se me encienda una de estas condenadas lucecitas!!!
DEFINE OSC 4
DEFINE HSER_BAUD 2400
CMCON=7
'--------------------
char var byte
TRISB= %11000100 'esto no lo tengo muy claro.. y cuando lo he probado no ha funcionado
Portb= 0 'Las salidas del puerto B a 0
inicio:
Hserin 10000, allon, [char] ' si en 10seg Hserin no recibe nada va a la etiqueta allon si recibe se carga en la variable "char"
hserout [char] 'Manda el caracter de vuelta a la pantalla del pc
if char= "b" then rojo 'si la letra que introduzco es la "a" va a rojo
if char = "a" then verde 'si la letra es "b" va a verde
goto inicio 'vuelve a la etiqueta inicio
rojo:
high portb.6 'Led rojo en B6 encendido
pause 1000 'pausa de 1seg
low portb.6 'Led rojo en B6 apagado
goto inicio 'vuelve a la etiqueta inicio
verde:
high portb.7 'Led verde en B7 encendido
pause 1000 'pausa de 1seg
low portb.7 'Led verde en B6 encendido
goto inicio 'vuelve a la etiqueta inicio
allon:
portb = %11000000 'todos los Led encendidos
pause 500 'pause de 1/2seg
portb=0 'todas las salidas del puerto B a 0
pause 500 'pausa de 1/2seg
goto inicio 'vuelve a la etiqueta inicio
enda ver si asi es menos lioso... gracias Xocas06!!!
-
FUNCIONAAAA!!!!!
Bueno CASI funciona.. o funciona a medias como le quieras decir. Primero he probado con el cable serial directo al PIC con unas resistencias de 22k y 220ohm y no ha dado señal alguna y como tenia un MAX232 ya montado he probado a intercalarlo E VOILA!! ha funcionado!! bueno no se me ha ocurrido asi porque si, no soy un iluminado... pero el el manual de PBP dice :" Dado que la recepción serial se realiza por hardware, no es posible invertir los niveles para eliminar un driver RS-232. Por esto debe usarse un driver adecuado.
Pues eso le he enchufado el MAX232 con el programita anterior modificado
DEFINE OSC 4
CMCON=7
TRISB=%00000010 'Esta linea ha sido modificada
DEFINE HSER_TXSTA 24H 'Esta linea ha sido añadida. Coloca el registro de transmision en transmision habilitada
DEFINE HSER_RCSTA 90H 'Esta linea ha sido añadida. Registro de receptor, receptor habilitado
DEFINE HSER_BAUD 2400
Portb=0
char var byte
inicio:
Hserin 10000,allon,[char]
pause 100
hserout [char]
if char="b" then rojo
if char="a" then verde
goto inicio
rojo:
high portb.5
pause 1000
low portb.5
goto inicio
verde:
high portb.4
pause 1000
low portb.4
goto inicio
allon:
portb = %11000000
pause 500
portb=0
pause 500
goto INICIO
end
y muy bien.. me recibe y enciende el led que yo quiero si le doy a la "a" enciende el verde y si le doy a la "b" enciende el rojo..
ahora el problema, esque cuando mando por serial comunicator, "aba", hace la secuencia verde/rojo/verde y ya no vuelve a recibir nada más...
Que tendir que poner para poder hacer la secuencia y que no se quede "colgado"??
-
Bueno haciendo más cosas y aplicando lo que he conseguido hacer, he hecho este programita y no va mal (podria ir mejor) pero sigo con el mismo problema, al dejar pulsada una de las teclas en el teclado (una cualquiera de las teclas de direccion) el pic se queda en pillao y no vuelve ha hacer nada... he probado con todas las teclas independientemente (alante,atras,izquierda y derecha) y funciona bien, pero solo si las pulso de uno en uno, o pulsando la misma pero en intervaluos de 1segundo si le doy menos se queda pillado tambien..
DEFINE OSC 4
CMCON=7
TRISB=%00000010 'habilita el pin RB1 como entrada de datos
DEFINE HSER_TXSTA 24H 'Esta linea ha sido añadida. Coloca el registro de transmision en transmision habilitada
DEFINE HSER_RCSTA 90H 'Esta linea ha sido añadida. Registro de receptor, receptor habilitado
DEFINE HSER_BAUD 2400
serial var byte 'variable para dato introducido por serial
cont var byte 'variable para servo
b1 var byte
b1=149
marcha var portb.4
atras var portb.3
servo var portb.5
luces var portb.6
cam var portb.7
'------------------------------------------
main:
portb=%00000010
Hserin [serial]
if serial="U" then avance
if serial="D" then retroceso
if serial="L" then left
if serial="R" then right
goto main
avance:
low atras
high marcha
for cont = 0 to 50
pulsout servo,b1
pause 15
next cont
goto main
retroceso:
low marcha
high atras
for cont = 0 to 50
pulsout servo,b1
pause 15
next cont
goto main
left:
for cont = 0 to 50
pulsout servo,220
pause 15
next cont
goto main
right:
for cont = 0 to 50
pulsout servo,105
pause 15
next cont
goto main
end
deberia de poner un WAIT al Hserin?? O en vez de mandar un caracter como "U" "D"... deberia de mandar un decimal... Se que = os parece una tonteria, pero esque lo tengo casiiii, ya hace todo lo que quiero... solo falta que no se quede pillado....
Gracias por vuestro tiempo!!!
-
hola amigo,lo que te debe esatr pasando es que tienes un herror en el usart devido a que el bufer se llena ,lo que pasa esque al omento de prender los led estas haciendo una pausa,mientra tienes pausado al pic ,este mismo no puede atender las interrupciones hasta que termine la pausa y por consiguiente al tener presionado cualquier tecla se estan enviando datos al usart y este se llena dandote el herror ,lo que debes de hacer es usa uno de los timer para conttola la pausa de modo que el pic se encuentre apto para recibir la interrupcion en cualquier momento del programa.
saludos
-
Gracias por responder meledu!
Algo de eso intuia yo... pero la verdad mis conocimientos no llegan a eso de las interrupcione... pillo el concepto, es decir que si le digo pause, pausa TODO el micro y el buffer se llena y se queda colgao. Mi unica referencia a las interrupciones es un pequeño programa que aparece en el libro de microcontroladores pic de Carlos A. Reyes y ya te digo que no lo logro entender para poder adaptarlo a lo que yo quiero hacer, asi que entre que no lo entiendo y que ahora con el calorcito a mi jefe le da por hechar más horas de trabajo no tengo tiempo para mirarlo con más tranquilidad. Ademas de que seguramente del programa inicial que hice no me servira practicamente para nada...
tan dificil es hacer algo como esto????:
-
La verdad esque si es dificil si hablamos entre novatos mi amigo,yo mismo recien llevo algo de tiempo tratando de enviar datos por rf y te digo que vaz a tener que tener un poco de calma ya que al igual que tu comence por construir el 5 piso del edificio sin haver empesado el primero y eso es lo que no debes hacer al final despues de mucha frustracion he tenido que volver al comienzo y leer mucho para porder hacerlo ya qe puedes copiar trozos de vario codigo que hay por aQUI y al final no te funciona nada , no es porque esten mal sino esque para que logres hacer algo a tu medida debes conoces muy bien el tema yo ya estoy terminando mimproyecto faltan algunos detalles y a penas lo tengo lo cuelgo para que le heches un vistaso,otra cosa a tener en cuenta es que la comunicacion serie por cables es solo el comienso porque al tratar de transmitir por rf empiesa el verdadero dolor de cabeza.
-
Ya ves compy nos dejan solos ante el peligro, yo esto lo tengo como "hobby", pero claro un hobby que no veas los quebraderos de cabeza que da!!!
bueno el tanque del video si va con motores de CC es mas facil de hacer, yo creo que el problema principal que tengo es el servo y las pausas, pero no soy capaz de solucionarlo..
En lo del RF alomejor te puedo ayudar, ¿que modulos usas? yo uso unos aurel de 433mhz y al principio no habia manera de que funcionaran solo pillaba ruido hasta que encontre esto http://www.todopic.com.ar/foros/index.php?topic=14917.360 (http://www.todopic.com.ar/foros/index.php?topic=14917.360). Fue estabilizar la corriente y se pusieron a funcionar de lo lindo!!
Esque me quema el que no me salga algo y hago otras cosas para desestresarme jejeje
AH! por cierto ya no se me cuelga!!! sigue lento por eso de los pauses en el servo pero ya no se queda pillado puse esto :
DEFINE OSC 4
CMCON=7
TRISB=%00000010 'habilita el pin RB1 como entrada de datos
DEFINE HSER_TXSTA 24H 'Esta linea ha sido añadida. Coloca el registro de transmision en transmision habilitada
DEFINE HSER_RCSTA 90H 'Esta linea ha sido añadida. Registro de receptor, receptor habilitado
DEFINE HSER_BAUD 2400
DEFINE HSER_CLROERR 1
RCIF var PIR1.5
FERR VAR RCSTA.2
OERR VAR RCSTA.1
inicio:
portb=%00000010
if RCif =1 then
Hserin [serial]
endif
resto de programa....
y ahora borra el buffer cuando se llena.
no te pongo la fuente porque lo tengo en marcadores del otro ordenador, ya pondre el link.
Tambien he mirado para poner lo del timer que me comentaste, pero no he encontrado nada para pbp, solo en asm... no se si he mirado donde debia, pero me he recorrido por lo menos las 20 primeras paginas de todo lo que he estado buscando en google: "servo con interrupciones pbp" pic basic interrupciones para servo" y no logro entender nada, no se si esque solo se puede hacer en asm o esque hay que hacerlo en asm e intercalarlo en en pbp. Total que ahora no se cuelga pero sigue como antes en cuanto a la velocidad de respuesta.. ahora mismo el programa completo esta asi :
DEFINE OSC 4
CMCON=7
TRISB=%00000010 'habilita el pin RB1 como entrada de datos
DEFINE HSER_TXSTA 24H 'Esta linea ha sido añadida. Coloca el registro de transmision en transmision habilitada
DEFINE HSER_RCSTA 90H 'Esta linea ha sido añadida. Registro de receptor, receptor habilitado
DEFINE HSER_BAUD 2400
DEFINE HSER_CLROERR 1
RCIF var PIR1.5
FERR VAR RCSTA.2
OERR VAR RCSTA.1
serial var byte 'variable para dato introducido por serial
cont var byte 'variable para servo
b1 var byte
b1=149
marcha var portb.4
atras var portb.3
servo var portb.5
luces var portb.6
cam var portb.7
'------------------------------------------
main:
low atras
low marcha
portb=%00000010
if RCif =1 then
Hserin [serial]
endif
if serial="U" then gosub avance
if serial="D" then gosub retroceso
if serial="L" then left
if serial="R" then right
if serial="A" then upzR
if serial="B" then upzL
If serial="C" then downzR
if serial="E" then downzL
if serial="F" then camon
if serial="f" then camoff
goto main
camon:
high cam
goto main
camoff:
low cam
goto main
upzR:
high marcha
for cont = 0 to 50
pulsout servo,105
pause 10
next
goto main
upzL:
high marcha
for cont = 0 to 50
pulsout servo,210
pause 10
next
goto main
downzR:
high atras
for cont = 0 to 50
pulsout servo,105
pause 10
next
goto main
downzL:
high atras
for cont = 0 to 50
pulsout servo,210
pause 10
next
goto main
avance:
low atras
high marcha
return
retroceso:
low marcha
high atras
return
left:
for cont = 0 to 50
pulsout servo,210
PAUSE 5
next
goto main
right:
for cont = 0 to 50
pulsout servo,105
PAUSE 5
next
goto main
end
con PWM podria hacer algo parecido? o seguiria necesitando las pausas?
tambien tengo que mirar si puedo enviar valores numericos por hserout para mandar la posición desde el pc, para centrar la dirección si se va hacia algun lado el vehiculo, pero bueno como bien dices poco a poco.. Gracias por el apoyo!! y a seguir investigando!!
SALUDOS!!
-
Hola amigo aqui tengo un programa que he cambiado un tantito como para entenderlo mejor pero esta un poco desordenado es el primero que me funciono y con el cual logre porovar mis modulos rf esta listo para que lo puedas simular en roteus y enciende un led cada 0.5 seg sin tener que usar el waitms sino que he usado una rutina del timer 1 para asi permitir que el micro este siempre ateto a todo lo que pasa esta un poco desordenado pero lo arreglare y pondre mejores explicaciones para los novatos como nosotros.
-
:shock: :shock: un poco desordenado si... tambien esque he mirado solo el txt. Pues la verdad ahora tengo un poco aparcado esto, queme 2 micro en un dia y me estoy dando un respiro jejeje ademas de que es verano y bueno hay más horas pero menos tiempo.. y eso que lo tengo todo un poco desatendido. Bueno he hecho cositas mientras como este programador (http://infotronikblog.blogspot.com/2010/07/programador-micro-jdm-16f628-y-16f84.html) o estas orugas (http://infotronikblog.blogspot.com/2010/07/oruga-con-cebek-6083-y-microservos.html). El programador no he podido probar aun y las orugas van muy bien, ahora a ver si consigo hacer que se muevan por RF, que la ultima prueba que hice el micro si funcionaba pero si le conectaba el los motores se reseteaba... a ver si me pongo las pilas antes de septiembre jejeje
Un saludo!!
-
Hola de nuevo amigo sabes yp tambien he esatdo muy ocupado y no he podido avanzar mi en mi proyecto de comunicacion por rf pero tengo un proyecto terminado en el cual comunico un pic cob el pc por rs232 el cual consiste en que en el hiperterminal escribo texto y el mismo es esnviado al pic y este ultimo lo muestra en una lcd 2x16 me ha quedado bien chevere el programa ,no la aplicacion pero lo que si he logrado esque la comunicacion OK y sobre todo que el pic siempre esta atento a todo lo que pasa sin bloquearse por ruido (al desconectar el uerto por ejem.)y tambien que muestra todos los carateres y no se come ninguno por mas que los teclee muy rapido ,creo que este es un buen comienso para comensar a trabajar con rf como debe de ser, si te interesa te lo envio men ,me envias un mp
-
HUMMMM... Que bien que no te pierda... yo he conseguido hacer que funcione tambien con un tanque que he montado con un kit de Cebek, pero solo he conseguido que funcione con serin, y la verdad no va muy bien, hace lo que tiene que hacer pero pierde datos ( y adquiere que aveces hace un poco lo que quiere). No va mal, pero debe ir mejor. Pasa que me quede sin trabajo y me he tenido que cortar un poco el grifo de los Hobbys... en fin esperemos que no dure mucho.... te dejo el enlce del tanque por RF con max232 a a salida del PC
Este es el enlace al video (http://www.youtube.com/watch?v=l-dBr1Wdy50)
Y este es el codigo en PBP:
'Este es el programa que funciona en el tanque con modulo de RF cebek
include "modedefs.bas"
CMCON=7 'Puerto a en modo digital
RX var portb.1 'El puerto B1 pasa a llamarte RX
Serial var byte 'variable para dato introducido por serial
TRISB=%00000010 'todos los puertosB como salida menos el B1
PAUSE 100
Portb=%01010000 'test de los puertos
pause 200 'B4 y B6
portb=%00000000 'Vuelve a ponerlos todos a 0
main: 'Etiqueta principal
serin RX,T1200,serial 'Serin en modo T para max232, recibe el dato y lo
if serial="A" then avance 'carga en la variable de tipo byte "serial"
if serial="B" then retroceso
if serial="C" then left
if serial="D" then right
If serial="P" then Parar
goto main
avance: 'Etiqueta avance
portb=%00101000
goto main
retroceso: 'Etiqueta para retroceder
portb=%01010000
goto main
left: 'Etiqueta para izquerda
portb=%00110000
goto MAIN
right: 'Etiqueta para derececha
portb=%01001000
goto MAIN
parar: 'Etiqueta para parar
portb=%00000000
goto main
end
-
Hola amigo lo que pasa esque tu usas la instruccion serin , que es una uart emulada por sofware y que solo actua cuando el micro va a esa rutina , miestras el micro se encuentre haciendo otra cosa no leerá los datos que llegeuen por el pin que designas como rx, para que no pierdas datos tendrias que usar el modulo usart del pic de tal manera que cuando reciba un dato te genere la interrupcion y el pic deje de hacer loq eu se encuentra hacendo y lea el dato que ingresa por el bufer , esto tambien necesita que tengas en cuenta el ruido que va a llegar por el modulo rf asi que tendrias que hacer un codigo mas complejo.
-
Ya ya, si esto ha sido una prueba para probar el tanque rf, que tenia ganas de verlo funcionar :D
Hoy empezare a aver si me sale algo con Hserin, lo de la trama es lo que no tengo muy claro, normalmente mando un dato "A" y en VB y lo recibo por Hserin... normalmente bien.... bueno a ver si hoy sale algo!!