Autor Tema: Usart 16f628  (Leído 8826 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado peyutron1

  • PIC10
  • *
  • Mensajes: 27
    • Infotronikblog
Usart 16f628
« 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:

Código: [Seleccionar]
        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!!

Desconectado peyutron1

  • PIC10
  • *
  • Mensajes: 27
    • Infotronikblog
Re: Usart 16f628
« Respuesta #1 en: 29 de Abril de 2010, 03:18:16 »
Nadie puede darme una orientación???? solo necesito un ejemplo y lo demas ya lo ire sacando yo!!!

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: Usart 16f628
« Respuesta #2 en: 29 de Abril de 2010, 14:06:40 »
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

Desconectado peyutron1

  • PIC10
  • *
  • Mensajes: 27
    • Infotronikblog
Re: Usart 16f628
« Respuesta #3 en: 02 de Mayo de 2010, 13:34:11 »
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 :

Código: [Seleccionar]

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!!!

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: Usart 16f628
« Respuesta #4 en: 02 de Mayo de 2010, 14:41:12 »
Código: [Seleccionar]
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

Desconectado peyutron1

  • PIC10
  • *
  • Mensajes: 27
    • Infotronikblog
Re: Usart 16f628
« Respuesta #5 en: 02 de Mayo de 2010, 19:17:22 »
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!!

Desconectado peyutron1

  • PIC10
  • *
  • Mensajes: 27
    • Infotronikblog
Re: Usart 16f628
« Respuesta #6 en: 03 de Mayo de 2010, 17:53:23 »
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!!!

Código: [Seleccionar]
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

end
a ver si asi es menos lioso... gracias Xocas06!!!

Desconectado peyutron1

  • PIC10
  • *
  • Mensajes: 27
    • Infotronikblog
Re: Usart 16f628
« Respuesta #7 en: 07 de Mayo de 2010, 17:10:04 »
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 :
Citar
" 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

Código: [Seleccionar]
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"??



Desconectado peyutron1

  • PIC10
  • *
  • Mensajes: 27
    • Infotronikblog
Re: Usart 16f628
« Respuesta #8 en: 09 de Mayo de 2010, 14:24:22 »
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..

Código: [Seleccionar]
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!!!

Desconectado meledu

  • PIC12
  • **
  • Mensajes: 83
Re: Usart 16f628
« Respuesta #9 en: 31 de Mayo de 2010, 17:30:40 »
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

Desconectado peyutron1

  • PIC10
  • *
  • Mensajes: 27
    • Infotronikblog
Re: Usart 16f628
« Respuesta #10 en: 06 de Junio de 2010, 07:51:10 »
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????:

Desconectado meledu

  • PIC12
  • **
  • Mensajes: 83
Re: Usart 16f628
« Respuesta #11 en: 08 de Junio de 2010, 15:41:02 »
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.

Desconectado peyutron1

  • PIC10
  • *
  • Mensajes: 27
    • Infotronikblog
Re: Usart 16f628
« Respuesta #12 en: 10 de Junio de 2010, 20:01:52 »
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. 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 :

Código: [Seleccionar]
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 :
Código: [Seleccionar]
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!!

Desconectado meledu

  • PIC12
  • **
  • Mensajes: 83
Re: Usart 16f628
« Respuesta #13 en: 17 de Junio de 2010, 19:04:48 »
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.

Desconectado peyutron1

  • PIC10
  • *
  • Mensajes: 27
    • Infotronikblog
Re: Usart 16f628
« Respuesta #14 en: 08 de Agosto de 2010, 20:30:31 »
 :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 o estas orugas. 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!!


 

anything