Puerto serial en visual basic

Listo! ya resolvi el problema. Hay que hacer una conversion antes de enviar por el puerto. Asi:

dim var as char = "Y"
MSComm.Output = CStr(var)

Creo que cualquier tipo de dato que se quiera mandar por puerto serial primero hay que convertirla a String.

Saludos! =)
 
Hola a la comunidad, tengo un problemilla, estoy enviando datos serialmente desde el pic a la pc, la idea es representar los datos del TMR0 en la compu, para eso envio la informacion de segundos en modo serial, los tomo con visual basic 6 y que cada 60 segundos aumente en un Label un minuto. Los segundos los observo correctamente en la pantalla. Ahora el problema es que cuando quiero tomar esa variable y sumarle un valor, solo ocurre que al iniciar el codigo aparece el valor de 1 en el Label (cuando llega al momento indicado), luego nada mas, no sigue aumentando la variable. Tanto usando:

If seg > 59 then
minu = minu+1

O transformando el valor de ASCII, y esperando el valor del numero 6 (el contador llega al valor 60 y pense que podia captar el valor decimal para indicar el cambio en minutos) (=36) para ver si me sumaba la variable.

Gracias de antemano che!!!!
---------------------------------------------------------------------------------------------
PIC:
SEROUT portb.5,N2400,[#seg]
--------------------------------------------------------------------------------------------------
Visual Basic:

Private Sub Form_Load()
MSComm1.RThreshold = 1
MSComm1.InputLen = 2
MSComm1.Settings = "2400,N,8,1"
MSComm1.DTREnable = False
MSComm1.CommPort = 1
MSComm1.PortOpen = True
End Sub

Private Sub MSComm1_OnComm()
Dim seg As String
Dim minu As String
Dim numero1 As Integer
If MSComm1.CommEvent = comEvReceive Then
seg = MSComm1.Input
Label1.Caption = seg
minu = Asc(seg)
End If
Select Case minu
Case 36
numero1 = numero1 + 1
Label2.Caption = numero
numero1 = Val(Label2)
End Select
End Sub
 
Sube tu proyecto completo dentro de un archivo comprimido, incluyendo el código del PIC.
Y explica mejor que es lo que quieres hacer, ¿Cual es el propósito?
 
Hola D@rkbytes, gracias por la pronta respuesta. Luego de una buena tarde entre mates y foros de visual basic encontré el problema.
El error estaba en no convertir el valor String que llega del PIC a la compu en Integer, para luego si procesarlo. Dejo el código por si alguno le sirve, esta funcionando correctamente.

Por si no quedo claro en este proyecto se envían serialmente los datos del temporizador TMR0 del pic16f628a, la información correspondiente a segundos, luego Visual realiza los cálculos para minutos y horas.

Gracias!

Visual Basic:
---------------------------------------------------------------------------------------------------
Código:
Public seg2 As Integer
Public numero1 As Integer
Public hora As Integer
Public seg As String

Private Sub Command1_Click()
End
End Sub

Private Sub Form_Load()
MSComm1.RThreshold = 1
MSComm1.InputLen = 2
MSComm1.Settings = "2400,N,8,1"
MSComm1.DTREnable = False
MSComm1.CommPort = 1
MSComm1.PortOpen = True
End Sub

Private Sub MSComm1_OnComm()
If MSComm1.CommEvent = comEvReceive Then
seg = MSComm1.Input
Label1.Caption = seg
seg2 = CInt(seg)
End If
If seg2 > 59 Then
numero1 = Val(numero1) + 1
Label2.Caption = numero1
End If
If numero1 > 59 Then
numero1 = 0
hora = Val(hora) + 1
Label3.Caption = hora
End If
End Sub
--------------------------------------------------------------------------------------------------
Pic (Basic)

Código:
@ DEVICE pic16F628A, MCLR_OFF, XT_OSC
INCLUDE "modedefs.bas"
TRISA=%00000000
TRISB=%00000000
OPTION_REG = %1010110 ;setea TMR0 configurando y habilita PORTB pullups
INTCON = %10100000 ;hablilita TMR0 interrupción interna
ON INTERRUPT GOTO interrup
cuenta var byte
seg var byte
minu var byte
hora var byte
estado var bit 
x var byte
For x = 1 to 3
high porta.2
pause 500
low porta.2
next
seg=1
minu=0
hora=0
estado = 0
high porta.2
inicio:      
if hora=>24 and estado=0 then
seg=1
minu=0
hora=0
estado=1
high portb.4
else 
goto inicio
endif
if seg=>20 and estado=1 then
low portb.4
seg=1
minu=0
hora=0
estado=0
goto inicio
else 
goto inicio
endif
DISABLE ;deshabilita interrupciones durante el proceso
interrup:
cuenta = cuenta + 1 ;cuenta las interrupciones del TMR0
TMR0=4 ;resta 4 al contador de 256 del TMR0
IF cuenta < 31 THEN reset ;31 cuentas (32256ms = 999936uS)
cuenta = 0
seg = seg + 1
SEROUT portb.5,N2400,[#seg]
IF seg >= 60 THEN
seg = 0
minu = minu + 1
IF minu >= 60 THEN
minu = 0
hora = hora + 1
IF hora >= 24 THEN
hora = 0
ENDIF
ENDIF
ENDIF
reset:
INTCON.2 = 0
RESUME
END
---------------------------------------------------------------------------------------------------
 
Última edición por un moderador:
Realice un proyecto controlado por del puerto RS232. Pero tengo unos problemas y unas dudas:

1) Es necesario utilizar un oscilador externo? use el interno y no tuve problemas, pero leí que si los trae.
2) Mi proyecto falla en algún punto, es un interruptor vía pc, el cual activa salidas de micro mediante un programa en Visual Basic. El proyecto consta de 9 salidas, 6 de estas funcionan de maravilla, las ultimas 3 tienen problemas .... Son las salida aux4,5 y 6. Si activo una de estas, luego al querer activar otra de estas se apaga la primera y ni siquiera se activa la 2da que toque, solo apaga la primera. No encuentro errores en la programación ni de VB ni de MICROCODE STUDIO. Ajunto todo lo referente al proyecto, Saludos Y Muchas gracias.

PD: Las salidas del micro activan leds, los pines que se usan como SERIN y SEROUT llevan resistencia 22K y 220 respectivamente.
 

Adjuntos

  • test.rar
    246.8 KB · Visitas: 17
Realicé un proyecto controlado por el puerto RS232, pero tengo unos problemas y unas dudas:

1) Es necesario utilizar un oscilador externo? use el interno y no tuve problemas, pero leí que si los trae.
Al trabajar con 4MHz y el oscilador interno, pueden enviarse datos erróneos, sobre todo cuando se envían cadenas, en tu programa como sólo envías letras (1 Byte), no existe mucho problema.
Sin embargo, sí es recomendable usar un oscilador a cristal y una frecuencia superior a los 4MHz para trabajar con 9600Bps.
2) Mi proyecto falla en algún punto, es un interruptor vía pc, el cual activa salidas del micro mediante un programa en Visual Basic.
El proyecto consta de 9 salidas, 6 de estas funcionan de maravilla, las ultimas 3 tienen problemas.
Son las salida aux4, 5 y 6.
Si activo una de éstas, luego al querer activar otra de éstas, se apaga la primera y ni siquiera se activa la 2da que toque, sólo se apaga la primera.
No encuentro errores en la programación ni de VB ni de MICROCODE STUDIO.
Ajunto todo lo referente al proyecto, Saludos y muchas gracias.
Errores de programación no tienes, pero al programa en PICBasic le hacen falta algunas mejoras.
El uso de TRIS para definir entradas y salidas es importante para tener un mejor control.
Si bien en PBP se puede hacer uso de INPUT y OUTPUT para definir entradas o salidas, es conveniente inicializar los puertos al comienzo del programa.
También es importante inicializar el bus RS-232 para que el primer dato válido enviado salga correcto.

En el programa en VB6 estás usando una forma no recomendada para realizar el ingreso de datos vía serial.
No es recomendable hacer uso de un Timer para estar verificando cuando llegan datos.
Para eso existe el evento OnComm() del control MSCOMM y se usa conjuntamente con el evento comEvReceive
De esta forma la recepción de datos no está regida por un temporizador y los datos son captados en el momento que llegan.

Notas:
El LED que está en RA4 tiene invertida la polaridad en el esquema que muestras.
Cambié de puerto al COM3 para realizar las pruebas y debes cambiarlo por el que uses.

Adjunto ambos programas con las correcciones mencionadas.
No lo he probado físicamente, realicé una simulación.
Verifica su funcionamiento en físico y observa las modificaciones realizadas en ambos programas.

Suerte.
 

Adjuntos

  • test II.rar
    44.6 KB · Visitas: 22
Estimado DarkBytes he probado con sus programas y sucede lo mismo que en el caso anterior (he probado con dos micros), me pregunto si los puertos que "fallan" (A0,A1,A2) tienen alguna diferencia en cuanto a los demás, le comento que estoy usando un conversor USB-RS232 para la transmisión de datos. Aprovecho para hacerle unas consultas:

1-He tenido un problema con mi pickit2 , cuando toque escribir y quise grabar un micro me salio el siguiente mensaje: programming failed at program memory adress 0×000000 , ya me ha pasado anteriormente. Hay alguna solución?

2- Es posible alimentar las cargas del micro y el micro desde el puerto rs-232 que sale del usb de mi computador? Así evitamos el uso de una fuente externa , si es así , cuanta corriente puede brindarme el usb de una netbook?

Muchísimas gracias por su ayuda
 
Estimado D@rkbytes he probado con sus programas y sucede lo mismo que en el caso anterior (he probado con dos micros), me pregunto si los puertos que "fallan" (A0,A1,A2) tienen alguna diferencia en cuanto a los demás, le comento que estoy usando un conversor USB-RS232 para la transmisión de datos.
Pues lo que tienen esos pines, es que son las entradas análogas de comparadores.
Para hacerlas digitales se tiene que configurar el registro CMCON.
Cuando se usan como entradas digitales sí es muy importante configurar CMCON con el valor 7

Ahora he realizado una prueba en físico para probar el mismo proyecto del post #129
pero enviando los datos sin invertir, ya que en ese programa se mandan y se reciben invertidos.
El resultado fue positivo, no existió ningún problema de activación en RA0, RA1 y RA2, aún sin configurar el registro CMCON.
Como quiera haz una prueba colocando CMCON = 7 al inicio del programa.

¿Por qué necesitas los datos invertidos?
Yo he trabajado con el chip FT232RL y cuenta con una interfaz de configuración para definir este aspecto.
Aprovecho para hacerle unas consultas:

1-He tenido un problema con mi pickit2 , cuando toque escribir y quise grabar un micro me salió el siguiente mensaje: programming failed at program memory adress 0×000000 , ya me ha pasado anteriormente. ¿Hay alguna solución?
Posiblemente exista alguna solución en este tema:
Programador de microcontroladores PIC y memorias por puerto USB PICKIT2 CLONE
Yo no te sabría decir porque uso el PICkit 3 y nunca me ha dado problemas.
2- Es posible alimentar las cargas del micro y el micro desde el puerto rs-232 que sale del usb de mi computador? Así evitamos el uso de una fuente externa , si es así, ¿cuanta corriente puede brindarme el usb de una netbook?
Me parece que las netbook tienen unos 500mA. cómo máximo, no estoy muy seguro.
En este caso será mejor que busques en las especificaciones de tu netbook.
Muchísimas gracias por su ayuda.
De nada. (y)
Suerte.
 
Procederé a hacer la prueba declarando CMCON, la verdad no necesito los datos invertidos, me gustaría que me dijeras como hacer para no invertirlos. Muchas gracias

Edit: declarando CMCON = 7, funciona todo perfectamente, si no te molesta te hago una consulta porque 7? y que pasa si igualo a otro numero? Procederé a montar el proyecto y a agregarle una etapa de potencia. Muchas gracias por toda su ayuda.
 
Última edición:
Procederé a hacer la prueba declarando CMCON, la verdad no necesito los datos invertidos.
Me gustaría que me dijeras cómo hacer para no invertirlos.
Los modos no invertidos llevan una T al principio y los invertidos una N.

Modos SerIn - SerOut.jpg
También se puede poner su valor (Mode No.) y así se puede omitir el uso de la librería "modedefs.bas"
Esa librería cuenta con otras definiciones, pero su principal uso está en las definiciones de los modos de transmisión.
Edit: declarando CMCON = 7, funciona todo perfectamente.
Si no te molesta te hago una consulta. ¿Por qué 7? ¿Y qué pasa si igualo a otro número?
Procederé a montar el proyecto y a agregarle una etapa de potencia.
Muchas gracias por toda su ayuda.


El registro CMCON se configura con el valor 7 por este motivo:

Bits 2-0 Registro CMCON.jpg

Entonces si pones otro número cambiarías el modo de operación de los comparadores.
Esto lo puedes entender mejor en la hoja de datos.

Saludos.
 
Última edición:
La verdad que sus explicaciones son muy didácticas, forosdeelectronica tiene grandes moderadores.
El proyecto esta funcionando a la perfección, mi ultima consulta es acerca de la fuente de alimentación, como bien me dijo el puerto usb suministra 0.5 amperios , pero al hacer la conversión USB-RS232, sigue manteniendo este valor?. He realizado mediciones en la ficha DB9 y he encontrado 4.6-4.8 voltios entre un terminal y masa (Pin 4 con respecto a masa) mi pregunta es si con esta tensión puedo alimentar al micro controlador y al menos 1 o 2 leds, No quise probarlo físicamente por miedo a dañar el puerto. Esto me permitiría controlar pequeñas cargas sin necesidad de una fuente externa y una rápida prueba de funcionamiento. Saludos

UC-701_RS-232_Pinout.jpg
 
La verdad que sus explicaciones son muy didácticas.
www.forosdeelectronica.com tiene grandes moderadores.
Gracias. F.D.E. Por suerte, también cuenta con miembros muy capacitados. (y)
El proyecto está funcionando a la perfección.
Mi última consulta es acerca de la fuente de alimentación.
Cómo bien me dijo, el puerto usb suministra 0.5 amperios.
¿Pero al hacer la conversión USB-RS232, sigue manteniendo este valor?
El voltaje lo tienes que tomar de los pines 1 (VCC) y 4 (GND) del conector USB.
Entonces podrás alimentar a tu circuito con la corriente máxima que entregue el puerto USB.
He realizado mediciones en la ficha DB9 y he encontrado 4.6-4.8 voltios entre un terminal y masa (Pin 4 con respecto a masa)
¿Mi pregunta es, si con esta tensión puedo alimentar al micro controlador y al menos 1 o 2 leds?
No quise probarlo físicamente por miedo a dañar el puerto.
Esto me permitiría controlar pequeñas cargas sin necesidad de una fuente externa y una rápida prueba de funcionamiento.
Saludos
Esa caída de tensión en las salidas de chip es normal y ese voltaje es suficiente para que el microcontrolador lo interprete como un 1 lógico.
Me parece que por arriba de los 2.5V ya lo toma como 1 lógico.

Pero te repito, debes alimentar al circuito con el voltaje de +5V que entrega el conector USB y el circuito tomará la corriente necesaria suministrada por el puerto.
La corriente por pin de un PIC es del orden de 25mA. Entonces tienes corriente suficiente para controlar LED's comunes de alrededor de 10mA.
 
Última edición:
La verdad que sus explicaciones son muy didácticas, forosdeelectronica tiene grandes moderadores.
El proyecto esta funcionando a la perfección, mi ultima consulta es acerca de la fuente de alimentación, como bien me dijo el puerto usb suministra 0.5 amperios , pero al hacer la conversión USB-RS232, sigue manteniendo este valor?. He realizado mediciones en la ficha DB9 y he encontrado 4.6-4.8 voltios entre un terminal y masa (Pin 4 con respecto a masa) mi pregunta es si con esta tensión puedo alimentar al micro controlador y al menos 1 o 2 leds, No quise probarlo físicamente por miedo a dañar el puerto. Esto me permitiría controlar pequeñas cargas sin necesidad de una fuente externa y una rápida prueba de funcionamiento. Saludos

http://www.brainboxes.com/files/catalog/product/UC/UC-701/img/UC-701_RS-232_Pinout.jpg
La mayoría de los puertos USB tienen protección de cortos/sobrecargas aunque es mejor no tentar a la suerte, y con respecto a la corriente que necesitas lo mejor es que midas con un amperímetro el consumo y si estas muy pegado a limite del máximo que da tu puerto puedes "tomar" mas corriente si usas dos puertos. Cada mother board es diferente unos son de 500mA otros de 1A dependiendo del fabricante.

CABLE_USB_DOUBLE.jpg
 
Última edición:
Bueno muchas gracias por contestar a ambos. Debido a que tengo un puerto ocupado con el conversor usb/rs232 usare el otro para alimentar al circuito, me fijare en la netbook que corriente entrega el puerto.
Si tengo avances avisare.
 
Bueno, el usb alimenta bien a mi circuito, les cuento que le agregado un juego de Tx/Rx para activar inhalambricamente. Alguna sugerencia para agrandar el proyecto sera agradecida.

Consulta Técnica: Ya que no uso oscilador de 4Mhz sera posible usar esos dos pines como puertos comunes?
 
Alguna sugerencia para agrandar el proyecto será agradecida.
¿A qué te refieres con agrandar el proyecto?
Consulta Técnica: Ya que no uso oscilador de 4Mhz. ¿Será posible usar esos dos pines como puertos comunes?
Si es posible cuando no usarás un cristal y así es como está en el proyecto modificado del post #129
Ahí se encuentran libres los pines del oscilador porque se está usando el oscilador interno.

Algo que podrías hacer para mejorar el desempeño, es haciendo uso del módulo USART, pero se tiene que modificar un poco el programa y el diseño para usar los pines RB2 (Tx) y RB1 (Rx)
 
Ok muchas gracias, exacto al no usar cristal, aprovechar esos dos pines para usarlo como salidas.

Me refiero a agregarle funciones, así le saco todo el jugo posible al micro, pero si hay que agregar algo mas externo no hay problema! Que cambio haría en el proyecto usar USART?? Gracias!


Les hago otra consulta, para la etapa de potencia que iría después del pic , que es lo mas recomendable?? He hecho etapas con salida a relay, con salida a transistor. Ahora se me ocurre usar opto acopladores, para evitar posible ruido, Que me recomiendan ustedes que use?? O también podría hacer todas opto aisladas, algunas con salida a transistor que se alimente con la fuente IN BOARD, y otras a relay para alimentar desde la carga. Saludos.
 
Última edición:
Me refiero a agregarle funciones, así le saco todo el jugo posible al micro, pero si hay que agregar algo mas externo no hay problema!
Pues eso depende de qué pienses hacer, y no has explicado en qué consiste tu proyecto.
Les hago otra consulta: ¿Para la etapa de potencia que iría después del PIC?
¿Qué es lo más recomendable? He hecho etapas con salida a relay y con salida a transistor.
Ahora se me ocurre usar opto acopladores, para evitar posible ruido.
¿Qué me recomiendan ustedes que use? O también podría hacer todas opto aisladas, algunas con salida a transistor que se alimente con la fuente IN BOARD y otras a relay para alimentar desde la carga.
Esto ahora depende de lo que pienses controlar.
Por eso es mejor que nos expliques qué es lo que piensas hacer, pues nada más tenemos éstos datos:
Realicé un proyecto controlado por el puerto RS232. Pero tengo unos problemas y unas dudas:

1) ¿Es necesario utilizar un oscilador externo? usé el interno y no tuve problemas, pero leí que si los trae.
2) Mi proyecto falla en algún punto, es un interruptor vía pc, el cual activa salidas de micro mediante un programa en Visual Basic. El proyecto consta de 9 salidas, 6 de estas funcionan de maravilla, las ultimas 3 tienen problemas .... Son las salida aux4,5 y 6. Si activo una de estas, luego al querer activar otra de estas se apaga la primera y ni siquiera se activa la 2da que toque, solo apaga la primera. No encuentro errores en la programación ni de VB ni de MICROCODE STUDIO. Adjunto todo lo referente al proyecto.
Saludos y muchas gracias.

PD: Las salidas del micro activan leds, los pines que se usan como SERIN y SEROUT llevan resistencia 22K y 220 respectivamente.
Ahí mencionas: Adjunto todo lo referente al proyecto.
Pero en el archivo adjunto de ese post, no explicas en concreto cual será el objetivo fundamental del proyecto.
¿Para qué sirve? ¿Qué vas controlar? ¿En qué lo piensas usar? Etcétera.
¿Qué cambio haría en el proyecto para usar el USART?
Adjunto los cambios que se deben hacer para usar el módulo USART.
 

Adjuntos

  • finksey test III.rar
    28 KB · Visitas: 8
Atrás
Arriba