# Puerto serial en visual basic



## DANILO

Estoy creando algo sencillo es que soy novato, pero tengo un problema quisiera utilizar el puerto serial de la PC para controlar un RELE. El proyecto se trata de hacer una alarma que simule el timbre de mi colegio osea suene cada cierto periodo pero el problema es que no se como sacar un solo dato del puerto serial alguien sabe como funcionaria y aprovechando el mensaje para que me orienten para crear una base de datos manipulable, así poder cambiar la hora de las alarmas.

GRACIAS


----------



## Alwar

Para enviar datos desde visual basic primero tienes que utilizar una dll para que implemente esta funcion, puedes utilizar:
A) io.dll
B) inoutput.dll

con io.dll para enviar datos creo que seria asi:


		Código:
	

PortOut dirpuerto,dato

dirpuerto es la direccion del puerto de salida que vas a usar, para saber cual es, puedes mirarlo en mi pc>hardware>administrador de disp. Pincha en el puerto que quieras usar y en la pestaña de recuros te vendra algo como (un numero en hexadecimal) 0378F-037F

en dato puedes poner lo siguiente (un numero decimal del 1~255):
	
	




		Código:
	

S1=1 -> 00000001
S2=2 -> 00000010
S3=4 -> 00000100
S4=8 -> 00001000
S5=16->00010000
S6=32->00100000
S7=64->01000000
S8=128>10000000
Todas=255>11111111

Todo esto lo he sacado de mis apuntes tecnologia, no lo he probado nucna.
Saludos


----------



## tweetydj

Para activar un rele te bastará con utilizar alguna linea como la DTR, que saca  -13 volt cuando esta activa y + 13 volt cuando esta desactiva. Podrias usar en visual basic el mscomm y una vez que tengas abierto el puerto con mscomm1.open puedes usar el mscomm1.dtreneble. Y listo.
Saludos y suerte,


----------



## okcomputer

ok hola a todos, manejar el puerto serie del computador con Visual Basic no es nada complicado, ya que este posee un control previamente diseñado para esta funcion (COMM). hace poco escribi un pequeño programa para comunicar un modulo gps sirf con el pc utilizando el conocido protocolo serial rs 232, si estan interesados puedo enviarles los form para que se orienten, claro esta que deben poseer conocimientos basicos sobre visual basic y rs232,


----------



## DANILO

GRACIAS pero el proyecto ya lo tube que entregar pero aun asi les pido hayuda para poder terminarlo asi que si alguien tiene el corazon tan grande como su PANZA aver si no me paza el codigo fuente de algun programa donde aya utilizado el puerto serial asi aver si me ayudan MIL GRACIAS

es que eso de que ya lo entregue no quiere decir que me quede con la DUDA de como era


MIL GRACIAS


----------



## DANILO

bien gracias ya le atine pero en el pueto PARALELO

me baje el IO.DLL

y si saca el DATO 1 o 0 

out &H378, (dato)

pero hay que jalar un modulo

bien gracias a aquellos que me pasaron eso del COMM pero la verdad no le e entendido ni ROSCA     ops: pero pueden decirme o postear lo que va en un BOTON para VER ME GUSTARIA MUCHO      8) y se los agradeciria 

MIL GRACIAS


----------



## dcruza

Hola, me podrías ayudar con el tema, sólo necesito leer datos a través del puerto com1 y 2, de poderme enviar alguna rutina en visual basic 6 o .net te lo agradeceré, si gustas podemos intercambiar información, no sé si te interesa...

Mil gracias...



			
				okcomputer dijo:
			
		

> ok hola a todos, manejar el puerto serie del computador con Visual Basic no es nada complicado, ya que este posee un control previamente diseñado para esta funcion (COMM). hace poco escribi un pequeño programa para comunicar un modulo gps sirf con el pc utilizando el conocido protocolo serial rs 232, si estan interesados puedo enviarles los form para que se orienten, claro esta que deben poseer conocimientos basicos sobre visual basic y rs232,


----------



## Stitch

Hola todos,
utilizar el mscomm de visual basic 6.0 no es dificil
Primero se debe incluir el componente en el proyecto. Si el visual basic está en español, se va a "Proyecto -> Componentes" (o se puede presionar CTRL T) y en la ventana que se abre se selecciona "Microsoft comm control 6.0", con esto sale un icono con la forma de un telefono
en la barra de herramientas, se arrastra el control al formulario y ya está.

Configuración basica del puerto (si el control tiene por nombre MSCOMM1)

with MSCOMM1
	.CommPort = 1			'Numero del puerto
        .Settings = "9600,N,8,1"	'Rata de baudios, paridad, bits de datos, bits de parada
        .Handshaking = comNone
        .InputMode = comInputModeText
        .RThreshold = 1			'Define cada cuantos bytes recibidos se genera un evento
        .InputLen = 1			'Cuantos bytes se extraen al leer el puerto        
end with

Para abrir el puerto

MSCOMM1.PortOpen = True


Para enviar un dato por el puerto (debe estar abierto)
MSCOMM1.Output = Chr(0x31) 'Envia el numero "1" por el puerto

Para leer un dato del puerto
Inport=MSCOMM1.Input

Espero que esto le sirva a alguien


----------



## Mushito

Estimado Ricardo (u otros) necesito ayuda para poder leer el estado de 8 bits que es simulado por un dipswitch con visual basic, por ejemplo si pongo en los dip switch 11111111 y leer algo con el programa y asi para cada cambio.
ayuda please!


----------



## Stitch

Hola. Si lo único que quieres es leer el estado de los 8 bits del dipswitch creo que te convendria mas utilizar el puerto paralelo, personalmente no me gusta y no lo utilizo, pero alguna vez utilicé la libreria io.dll y funciona. En este link hay un pequeño foro que tal vez te pueda servir.
https://www.forosdeelectronica.com/about13178.html
https://www.forosdeelectronica.com/f26/entrada-datos-puerto-paralelo-7799/

Si quieres utilizar el puerto serial debes poner algo que lea el estado del dipswitch (como un pic u otro microcontrolador) y lo envie a través de un puerto de comunicación serial. En ese caso, para leerlo en VB 6.0 debes utilizar el control MSCOMM.


----------



## Mushito

Gracias por la respuesta.
Estoy experimentando en protoboard aun, mi circuito convierte ocho bits paralelo ocho bits serie con el MAX232 y el 74165, y un clok de 9600 Hz, a la salida tengo un tren de pulsos. Inicialmente pensaba en usar el puerto paralelo, veo que esta por desaparecer, especialmente en las lap top, y el proyecto que vengo realizando es para la adquisicion de datos para equipos portatiles y es por eso en que me es importante desarrollarlo para enviar por el puerto serie.


----------



## Stitch

Interesante proyecto... muy util y aparentemente simple...
El 74165 te sirve para capturar el estado de los 8 bits y generar un tren de pulsos... hasta allí lo entiendo y me lo imagino...
pero como generas el bit de parada y la paridad??? sería interesante saberlo si puedes compartirlo.


----------



## Mushito

El esquematico es de la revista elektor (me parece que es de oct 1994) te lo escaneo y te lo envio para mañana. Ayudame please


----------



## Mushito

Ricardo: Este es el esquematico que estoy pretendiendo montar, lo que me falta es el programa en Visual Basic 6.0 
Gracias de antemano.
P.D. Le hice una modifocacion para usar el MAX232.


----------



## guaro

hola  Amigo
Revisa este link....

Y tendras resuelto tu problema........

www.lawebdelprogramador.com/codigo/enlace.php?idp=59&id=93&texto=Visual+Basic


----------



## Mushito

Gracias, intentare modificando ese programa.


----------



## Stitch

Hola Mushito. Disculpa por no responder a tus mensajes anteriores pero he estado muy ocupado... solucionaste tu problema?

Nicolum, depurar con el MsComm no es fácil y menos si no puedes controlar el dispositivo que está enviando los datos para que los envie a la velocidad que quieras. En esos casos lo que yo he hecho es mostrar en la ventana de salida (comando Debug.print) lo que está llegando al puerto y con eso te puedes hacer una idea de la trama de datos.  Encontrar las letras PRT en el mensaje no es dificil, Visual Basic cuenta con funciones que hacen eso (encontrar una cadena de caracteres dentro de otra), ahora no recuerdo cuales son, pero consulta el MSDN, no es dificil encontrarlas.

 exitos.


----------



## Mushito

Gracias por responder Ricardo.
Aun no lo probe, estoy cambiando de protoboard de mas puntos, luego les comento.


----------



## Maritto

Prodias publucar el circuito que usastes?
Me interesa un  poco el tema y mas que nada tengo curiosidad superficial, no pretendo aondar mucho en el tema, pero quiero ver como es esa que plateas, podes publicar el programilla tambien?
Gracias!


----------



## jsam2008

Estimados amigos me gustaria que me ayuden a ver como hago para enviar audio o *.wav en una conexion con el mscomm y vb6


----------



## Meta

Parece que vale la pena perder el tiempo en hacer un manual de Visual Basic 6 o .net 2008

https://www.forosdeelectronica.com/...ie-rs232-pic16f84a-controlado-visual-c-17414/


----------



## Gradmaster

Bueno en Visual es mucho mas sencillo que en C# por que VB hablando de la version 6.0 por que en la net no encuentro el control, utilizas el control MSCom, cuando habras tu proyecto preciona las teclas Ctrl + T y te abrira una ventana en donde podras encontrar mucho controles extra a los que te muestra la barra de herramientas.

busca el MsComm y selecionalo, despues aparecera en la barra de herramientas, lo insertas como so fuece un boton o X control; las propiedades que usaras son la siguientes.

mscomm1.portopen=true 'si es que usas el puerto serial 1, el indicar true quiere decir que abrira el puerto cuando se ejecute la instruccion.

var1=mscomm1.input ' la variable var1 tendra el valor en ascii de la entrada que por cierto y para mala suerte solo se pueden usar 8 bits.

puedes usar un textbox para ver el caracter ascci del valor que mandes con el pic.

para pasarlo a un valor decimal de 0 a 255 usas el comoando Asc (var1) que comvertira el valor de la variable de entrada en un valor decimal.

si lo quieres hexadecimal usas hex$(var1)

el siguiente comando que usaras es MSComm1.output= var2, con este comando le das salida al numero que tengas guardado en la variable dos, si es un numero y la variable no esta declarada como integer tomara el valor ascii del numero o caracter que introduzcas en la variable 2, y si esta declarada como integer te tomara el valor numerico.

la ultima para cerrar el puerto es: MSComm1.portopen=false tienes que cerrar el puerto cada vez que terminas de usarlo por que sino te ocacionara problemas cuando quieras abrirlo nuevamente, por que no puedes abrir un puerto que ya esta abierto 

espero te sirva de algo esta pequeña referencia, exito.


----------



## Meta

En el Visual Basic .net 2008Express se llama serialPort. Lo puedes ver en la página 142 del manual de puerto serie.

http://www.pic16f84a.org/index.php?option=com_content&view=category&layout=blog&id=54&Itemid=124


----------



## Moyano Jonathan

meta una pregunta , que diferencia concreta hay entre la versión express del visual basic .net y la versión professional ?


----------



## Meta

Son muchas y te diré algunas. Si deseas saber más lo buscas en www.google.com

- La diferencia que he notado que no incluye instalador como en el profesional.
- Tiene más elementos y objetos para programar con Report y cosas para el office.
- Cosas de base de datos que no tiene el Express.
- Cosas de programación que mejor lo mires por google, son muchas y más potentes, el express si eres empresario te resultará limitado.
- Que no puede hacerlo compatible los ejecutables para que funcionen puramente a Windows de 64 bits, el profesional tiene esa opción. Así que te asegura que la aplicación de 32 bits de ahora te sirva para la s64 bits del futuro así no tendrás que volver a compilar de nuevo.

Son muchas cosas y entre ellas no las se todas. Por algo la Express es gratis y la profesional es de pago. Para cosas sensillas como hago yo hay de sobra.

El motivo porque MS lo hizo así, es para que l agente y Universidades no se pasen a Linux. hasta en instituto se enseñan Visual C# y Visual Basic .net Express.

A ver si pasamos el código a Basic


----------



## jsam2008

Gracias. por la información adicional pero me gustaria ir al punto  como hacer que el modem interno de mi PC trabaje como contestador y emita mensages de audio, y tambien estos en que formato deben ser grabados y que este programa este en VB6.

Gracias por la ayuda.


----------



## Meta

Eso si que no se hacerlo, nunca lo he intentado.

Pregunta eso aquí:
http://forums.microsoft.com/MSDN-ES/default.aspx?SiteID=11

Te contestan seguro.


----------



## jsam2008

Gracias. amigo en cuanto encuentre algo lo pongo en foro.


----------



## Meta

Encontré más información sobre puerto serie en C#.

http://www.ehu.es/mrodriguez/archivos/Articulos_alumnos/C_mo_controlar_el_puerto_serie_usando_c.pdf


----------



## RICHARD

Amigos , se ve que estan bien en el tema de la comunicacion por puerto serie, me gustaia conocer de que manera debo hacer la programacion para la salida de datos por puerto serial, diseñe una aplicacion con vb 6.0 y tengo la salidad e datos por el puerto paralelo, pero quiero hacerlo por puerto serial , y la verdad hasta ahora me estoy empapando del tema, si alguien me pudiera colaborar, se lo agradeceria... 


Richard


----------



## Meta

Utiliza el Visual Basic .net 2008. El VB 6 es una pérdida de tiempo como que ya no se actualiza y muy desfazado.

Lo puedes descargar en:
http://www.microsoft.com/express/download/


----------



## Moyano Jonathan

Aunque hay muchos que todavía lo siguen utilizando para sus aplicaciones. (yo me incluyo) la verdad no creo que sea una perdida de tiempo , pero igual hay que migrar a lenguajes más recientes debido a la compatibilidad con los nuevos OS y demás.


----------



## RICHARD

Gracias por la recomendacion. lo que sucede es que el programa ya lo tengo diseñado en vb.6 y no se que tanto me pueda tardar en pasarlo al otro vb. de igual manera necesitaria la programacion para la salida y entrada de datos por el puerto serie.


----------



## Moyano Jonathan

yo estoy en esa de migrar a otro lenguaje concretamente Visual C#


----------



## Chico3001

Duda de principiante..... Si hago un proyecto usando el Visual Basic del Visual Studio Profesional se puede importar en el Visual Basic Express? Y como se haria?


----------



## carlos1253

Hola buenos dias, les solicito su ayuda ya que llevo varios dias con el mismo problema, bueno lo que pasa es que tengo una aplicacion en vb 2005 en c# con el mscomm conectada a una bascula y a un 16f877, todo bien hasta ahi, lo que hace es mi programa es enviar un dato al micro dependiendo del peso de la bascula, por cierto la bascula y el 16f877 manejan puerto serial, lo que sucede es que algunas veces mi aplicacion se "cuelga" y no puedo hacer nada, de la bascula la tengo bien configurada no creo que valla por ahi, ya le puse un buffer mas grande, recibo 16 bytes de la bascula siempre por lo cual el rthserhold lo tengo a 16 el inpulen a 0, siempre estoy recibiendo datos de la bascula.

Estoy atorado en este problema no se si alguien ya le paso y lo pudo solucionar. Gracias por la ayuda


----------



## Meta

Quizás sean datos unos tras otros en muy poco tiempo por COM.


----------



## ServidorOPC

Nose mucho de lenguaje C, pero si regular de visual basic y microcontroller pic.

Bueno, realize una aplicacion de comunicacion entre visual basic 6.0 (ya sé algo desfasado =S) y el pic16f877.
Y creo yo, lo mejor para tener una buena comunicacion es crear tu propio protocolo en el nivel de enlace......
y esto no es nada del otro mundo. Realice un hardware basado en pic con el cual monitoreo y controlo:  4 entradas analogas, 14 entradas discretas y  11 salidas discretas; y funciona perfectamente. Por ejemplo:

Voy a mandar del PIC la información de  8 entradas discretas (de RB0  a RB7) suponiendo que tenemos en registro portB=FF hex

byte inicio: 23 hex
byte direccion: 30 hex  (direccion para mi 00 )
byte tamaño información: 32 hex (tamaño para mi 02)
byte información MSB:3F hex         ;proviene de PORTB = FF hex
byte información LSB :3F hex
byte Checksum : SUMA(dir+tama+MSB+LSB)


Y en la PC(aplicacion visual basic) 

Si recibo 23 hex entonces
.............
..........
...........
..........
.........
....
corroboras con el checksum que fue valida la transmision y muestras por pantalla.

Espero que te sirva de algo esto sino ya fue nomas.


----------



## jesus_lomor

que tal danielo... pues intentare seguirle la pista a tu tema.. bueno la comunicacion serie a travez de visual basic es muy sencilla.. te dire los pasos...
primeramente agrega a las herramientas de tu proyecto el boton del mscomm
Projects-->components.... de aqui busca y selecciona  microsoft comm control 6.0
en el tool box, te aparecera un nuevo elemento que tiene como simbolo un telefono, es la herramienta de comunicaciones, esta insertala en el formulario.
cuando la insertas en el formulario, tomara como nombre mscomm1, verificalo.

ahopra, para abrir el puerto usa las siguientes instrucciones:
    MSComm1.CommPort = 1                ------------>asigna a mscomm1 el puerto 1
    MSComm1.PortOpen = True             ------------>ordena la apertura de mscomm1 (puerto de comunicaciones 1)
    MSComm1.Settings = "9600,N,8,1"  ------------>9600 baudios, no recuerdo, paquetes de 8 bits, no recuerdo...
esto lo puedes poner en el codigo del formulario si quieres que se abra el puerto en cuanto abres la aplicacion.
para enviar un byte (0-255) usa mscomm1.outport=chr(255) o cualquier numero entero que desees.. pero como es un byte menor a 256 tendria que ser el dato a enviar
para recibir 
para checar el buffer de recepcion x=mscomm1.input

eso es lo basico del puerto serie, y con eso puedes armar muy buenos proyectos, quisiera saber si sigues al pendiente del tema, y si puero ayudarte en algo mas.. saludos!


----------



## Meta

Hola:

Más sencilla está en este manual que hice de visual basic aquí:

http://www.abcdatos.com/tutoriales/tutorial/v12.html

Saludo.


----------



## Mushito

Ese manual medio trucho se ha hecho para vender un libro, mejor es seguir desarrollando software para otros pics por ejemplo el 12F675


----------



## Meta

No, lo del libro es porque me da la gana, ajjajaja

El buen manual es el http://www.abcdatos.com/tutoriales/tutorial/z9521.html más completo.

Eres el primer _medio trucho_ que habla mal del pobre manual.  

Si quieres un 12F69/75 aquí hay algo.

http://www.micropic.es/index.php?option=com_smf&Itemid=63&topic=792.0

Hasta otra truchón.    

Hablando en serio. Los manuales que hago son conocimientos que lo pongo en PDF por si me olvido con el tiempo, no está hecho por vender un libro, como me llevo bien con el autor, aconsejo este libro y los que los tienen no se quejan, está muy bueno ara novatos y no tan novatos si quieres aprender bien ASM de verdad. Usted decide general.


----------



## Mushito

Disculpa Meta, me quito el sombrero por que no es fácil publicar algo, sinceramente disculpas!


----------



## Meta

Sólo estaba bromeando. Dejaba claro que ese manual que he hecho, no lo hice para vender un libro en el cual no gano un  €uro. Después puse lo del libro y me dejó ponerlo en su web.

www.pic16f84a.org Ahora va por la tercera edición que salió hace poco.

http://www.ra-ma.es/libros/MICROCONTROLADOR-PIC16F84/2504/978-84-7897-917-2

Saludo.


----------



## renzo

hola recien voy a empezar atrabajar en visualbasic y queria que me ayuden ya q quiero hacer una comunicacion serial de 3 pics via bus i2c y estos controlarlos por visualbasic.6 la idea es q cada pic tndra 8 sensores contra incendios y los 3 pics simbolizan los pisos de un edifio lo que quiero es q por medio del visualbasic.6 visualizar el estado de los 8 sensonres por cada piso inclusive tener control de estos sensores es decir apagarlos o prenderlos se que se utiliza el comando mscomm1 pero la evrdad es que no encuentro eese comando :/ espero me puedan ayudar gracias


----------



## robpatrick7

Saludos a todos, tengo un problema con mi programa realizado en visual basic 2005, En principio diseñe un micro con teclado y display que transmite cifras y que se comunica perfectanmente con el programa de aplicación que diseñe en visual basic 2005 a través del puerto com1 y usando un cable utp y dos conectores db9, y haciendo uso del max 232, pero tengo que realizar esta misma conexión inalámbricamente y estoy utilizando módulos zigbee. Cuando pruebo la comunicación inalámbrica entre el micro y la pc usando el hyperterminal, se transmite perfectamente pero cuando hago uso del programa de visual se cuelga y no recibe nada. Por favor necesito ayuda con este proycto, cualquier información es válida y se los agradecería enormemente.


----------



## Meta

Aquí hay manuales del Visual basic y puerto serie.

http://www.abcdatos.com/tutoriales/tutorial/v12.html

Saludo.


----------



## rodrigo1214

Hola me llamo rodrigo.. disculpa pero podrias enviarme el plano del circuito que estas implementando.. y estoy buscando mejoras en algunos proyectos.. te agradeceria porder contar contigo...

e-mail: Debo leer las Normas del Foro @ Foros de Electrónica.Com

gracias!!!


----------



## sebitronic

rodrigo1214 dijo:


> Hola me llamo rodrigo.. disculpa pero podrias enviarme el plano del circuito que estas implementando.. y estoy buscando mejoras en algunos proyectos.. te agradeceria porder contar contigo...
> 
> e-mail:Debo leer las Normas del Foro @ Foros de Electrónica.Com
> 
> gracias!!!



Hola, querias el esquema del conversor rs232 a rs 485 o del cirrcuito que tiene el pic y el lm35?


----------



## zoomg80

Private Sub MSComm1_OnComm()
Dim Com1 As Variant
Dim Contador_A As Integer
Dim Contador_B As Integer
Contador_A = 0
Contador_B = 0
If MSComm1.CommEvent = comEvReceive Then
Com1 = Com1 + MSComm1.Input
Text1.Text = Com1
Select Case Com1
Case "A"
     Contador_A = Contador_A + 1
     Label20.Caption = Contador_A

Case "B"
     Contador_B = Contador_B + uno
     Label21.Caption = Time
End Select
End If
End Sub

En el case B puedo ver la hora cada vez que el pic envia un caracter B, si se actualiza, pero cuando recibe "A" no he conseguido incrementar mi contdor y verlo en en label20. Alguin puede apoyarme

GRacias de antemano


----------



## elbrujo

*Case "A"
Contador_A = Contador_A + 1
Label20.Caption = Contador_A

Case "B"
Contador_B = Contador_B + uno*

Aca uno no es una variable definida. Alguno de los dos case esta mal.


----------



## David Rivera C

ke tal okcomputer, oie un favor, propones enviar los form del programa que hiciste, me servirian de ejemplo si los envias...por favor.
Quiero enviar la lectura de un sensor de humedad a la pc via serial y ademas de visualizar y guardar las lecturas (tomadas por decirlo asi, cada 20 min) en una interfaz en visual basic. si me puedes orientar te lo voy a agradecer


----------



## Percyman20

El evento de recepcion de datos del puerto Serial:
Private Sub MSComm1_OnComm()
debe estar antes configurado por la propiedad del puerto Serial "RThreshold", ejemplo:



		PHP:
	

MSComm1.RThreshold = 1 'al recibir un caracter se generará el evento OnComm   y  la 'propiedad CommEvent contendrá el valor comEvReceive, si le pones 2 al recibir 2 caracteres se realizara el evento, y asi susecivamente, pero para tu caso es mejor ponerle 1, ya que no envias tramas de datos.

Option Explicit

Dim Com1 As String
 Dim Contador_A As Integer
 Dim Contador_B As Integer
 Contador_A = 0
 Contador_B = 0

Private Sub Form_Load()
MSComm1.InputLen = 0
MSComm1.RThreshold = 1
**********************************************
'Aca defines las demas propiedades del Puerto, como COM1,Velocidad,paridad, etc.
**********************************************
End Sub

Private Sub MSComm1_OnComm()

If MSComm1.CommEvent = comEvReceive Then
Com1 = MSComm1.Input
Text1.Text = Com1
Select Case Com1
Case "A"
     Contador_A = Contador_A + 1
     Label20.Caption = Contador_A
    
Case "B"
     Contador_B = Contador_B + 1
     Label21.Caption = Time
End Select
End If
End Sub


----------



## zoomg80

Hola estpy con una aplicacion en visual BAsic en la que me comunico con el PIC16F873A este me reporta el estado de unas maquinas que cierran asi podemos llevar un conteo, lo que necesito en mi aplicacion es mostrar el numero de  cierres por cada hora por ejemplo 11:00:00 A=456, B=623, C=654. Ocupe un list box tengo la idea de usra un IF pero no me realiza la comparacion dejo el codigo 

Saludos cordiales

Private Sub Timer1_Timer()
Label14.Caption = Time
reloj = Time
If (reloj = 11:00:00) Then
List1.AddItem = "A=" & Label20.Caption & "; "
End If
End Sub


----------



## elbrujo

la variable reloj es un string? seria: 
If (reloj = '11:00:00') Then


----------



## teidy

Hola !!!
Como le prodre hacer para crear un programa ke en una caja de texto ingrese algunos caracteres y eso mismo aparesca pero en otra computadora por medio del cable serial
utilizando el visual basic?????


----------



## Stitch

Hole Teidy,
ps yo te recomendaría que antes de empezar con Visual Basic, uses el HyperTerminal. Tienes que hacer un cable serial cruzado, conectas ambos equipos y pruebas con el HyperTerminal, si todo va bien, entonces usas el control MSCOMM de Visual Basic y es relativamente sencillo hacer la aplicación.


----------



## ELCHES

Amigo Stitch, una pregunta como se que numero estoy enviando por le puerto!!! tienes alguna tabla???


----------



## Stitch

Hola Elches, ps la verdad no entiendo muy bn tu pregunta, te respondo lo que entiendo.
Si tienes un control MSCOMM llamado MsComm1 (por ejemplo) y haces MsComm1.Output = Chr(49) lo que se envía es el caracter ASCII asociado al número 49, que es el caracter "1". Esto sería equivalente a hacer MsComm1.Ouput = "1"


----------



## ELCHES

Si pana creo no me explique bien pero si lo que me respondes es lo que quería saber...gracias!!!


----------



## 20deoctubre

Un saludo a todos...
Estoy usando la funcion que comento Gradmaster hace tiempo Asc(variable) para convertir el dato de entrada ene l puerto serie (que vieene en un formato Ascii) y lo quiero hacer pasar or una comparacion. 
Estoy mandando desde el pic una letra A y una letra B, asignadas a dos push buttons, las cuales pude ver correctamente en Hyperterminal. El problema esta en Visual Basic, ya que utilizo la funcion Asc para determinar que valor es el que estoy recibiendo y en base a eso realizar una accion pero resulta que no me detecta el valor correcto en decimal de la letra A o B recibidas, por lo que no se realiza ninguna accion, haber si alguien me orienta sobre que hago mal este es mi codigo...

Private Sub puertnComm()
If puerto.CommEvent = comEvReceive Then
txtin = puerto.Input
equis = Asc("txtin")
    If equis = 41 Then
        lblroja.Caption = numero1 + 1
        numero1 = Val(lblroja)
    Else
        If equis = 42 Then
        lblazul.Caption = numero2 + 1
        numero2 = Val(lblazul)
        End If
    End If
End If
End Sub


----------



## elbrujo

Mostra txtin  a ver que llega y postea. Que es numero1? y numero2?  no entiendo que queres hacer. Para que le sumas 1? Donde definis numero1 y 2? lo mostras y luego lo asignas? deberia ser al reves..


----------



## 20deoctubre

gracias por su respuesta elbrujo
Ah olvide mencionar lo de numero1 y numero2 solo son variables destinadas  aincrementarse, este programa intenta realizar un contador de votos lblrojo y lblazul son las dos cuentas. 
Ya intente mostrar el valor de txtin pero no me muestra nada, tambien mostre el valor de la variable equis y me da 116 independientemente del dato que llegue, eso si se me hace rarisimo, te posteo el codigoc ompleto acontinuacion Olvide mencionar que desde el PIC estoy mandando una letra A y una letra B, las cuales corresponden a dos botones, boton A y boton B, dependiendo de que boton se presione se debe incrementar una cuenta

Dim txtin, txtout As String
Dim numero1, numero2, equis As Integer
Dim equis As Integer

Private Sub cmdenc_Click()
If cmdenc.Caption = "Inicializar" Then
    puerto.CommPort = Val(10)
    puerto.PortOpen = True
    Sistema.Visible = True
    cmdenc.Caption = "Desconectar"
Else
    If cmdenc.Caption = "Desconectar" Then
        Sistema.Visible = False
        puerto.PortOpen = False
        cmdenc.Caption = "Inicializar"
    End If
End If
End Sub

Private Sub cmdsalir_Click()
End
End Sub

Private Sub puertnComm()
If puerto.CommEvent = comEvReceive Then
    txtin = puerto.Input
    equis = Asc("txtin")
    cmdcaliz.Caption = equis
        Select Case equis
            Case 41
                lblroja.Caption = numero1 + 1
                numero1 = Val(lblroja)
            Case 42
                lblazul.Caption = numero2 + 1
                numero2 = Val(lblazul)
        End Select
End If
End Sub


----------



## elbrujo

Decis que por hyperterminal recibis los caracteres? Que puerto usas? y en BV usas el puerto com10? sino te muestra nada es que no recibe nada. proba en el mismo puerto..


----------



## 20deoctubre

Si uso el mismo puerto, de hecho con otro programa que copie de un tutorial en youtube recibo el dato en ascii sin problemas por ejemplo, mandaba un 31 del pic y recibia un numero 1 en visual basic, ese no es mi problema y si estoy utilizando el puerto 10 

El problema es el manejo de los datos una vez que me llegan al buffer de entrada, es decir no puedo manipularlos de manera de detectar que caracter me esta llegando, pero ese es problema de software. 
Se que el dato me llega en formato ASCII es decir se debe tratar como un String cierto ? okay entonces por ejemplo si me llega una "A" y esa A la paso a txtin
txtin = puerto.Input <-- puerto es el nombre de mi elemento de control de puertos
y txtin lo paso a un integer asi
equis = Asc("txtin")
entonces equis deberia ser igual a 41 cierto ? 
Pero si desplego en un label el valor de equis me da 116 independientemente de que me llegue una A o una B,
O si se te ocurre alguna otra manera de detectar que dato es el que me ha llegado es bienvenida...  tal vez me este complicando yo solo.


----------



## elbrujo

equis = Asc("txtin") ? deberia ser equis = Asc(txtin) porque sino toma el string como palabra "txtin" y no como variable. Por otro lado hasta que muestres txin y llegue algun dato ni te preocupes de como sigue el programa.

En admin de hardware cuando vas a puerto serie el com10 existe? me llama la atencion que el hyperterminal lo tengas configurado en com10.. que IRQ estas usando? porque no usas los valores reales? com1 o com2? 3f8 o 2f8? en el bios esas son las direcciones reales...


----------



## 20deoctubre

Vaaaa...  error de alguien que no sabe mucho de visual...  correji eso de Asc(txtin)  y todo funciono de maravilla ya cada boton incrementa su correspondiente cuenta..  si si fue un error babotas de mi parte jaaa
Muchisimas gracias por tu tiempo elbrujo...  (Y)


----------



## elbrujo

Bien ahi! bueno me alegro.. y eso que hace muchos años que no leeo VB. Para la proxima tene siempre en cuenta que cuando te trabes en un punto de un codigo, vuelvas hacia atras comprobando valores hasta el punto que se cortan asi es mas facil encontrar el problema.. hay un modo debug que te va mostrando el contenido de las variables.


----------



## Facundo_Bellesi

Hola amigos, veo que tienen conocimientos bastante avanzados en todo lo que es la comunicacion serial entre PIC's y PC's... Hace unos dias que estoy queriendo iniciarme en este tema y he logrado que el pic me envie los datos a la pc y los he recibido sin problemas. Pero cuando quiero enviarle los datos de la PC al PIC no logro ninguna respuesta... 
Estoy utilizando en Visual Basic 6.0 la funcion MSComm y el envio por puerto serie lo hago con siguientes instrucciones:

Private Sub cmdEnviar_Click()
Dim pepe As Variant
If comm1.PortOpen Then
comm1.Output = Trim(Asc(txtEnviar.Text))
Else
Form1.Caption = "Se debe abrir el puerto"
End If
txtEnviar.SetFocus
End Sub 

y en el pic tengo el siguiente programa

RX_DATO BCF TXSTA,TXEN ;
BCF PIR1,RCIF ; Sí: restaura flag de recepción.
MOVFW RCREG ; Lee el dato recibido.
MOVWF RECEPCION ; GUARDA EL BYTE RECIBIDO EN RECEPCION
MOVWF AUXILIAR ;
CALL LINEA_2 ; pocisiona la linea 2 de un lcd
MOVFW RECEPCION ;
MOVWF PORTD ;
MOVLW 'G' ; HEXA DE LA LETRA G
SUBWF AUXILIAR ; 
BTFSC STATUS,2 ; ¿VOLVER A MANDAR EL DATO?
GOTO VUELVE ;
MOVFW RECEPCION ;
MOVWF AUXILIAR ;
MOVLW 'B' ; HEXA DE LA LETRA B
SUBWF AUXILIAR ; 
BTFSC STATUS,2 ; ¿clave correcta?
RETURN ; NO, RETORNA
GOTO RX_DATO ;

VUELVE MOVFW CUENTA ; SI, VUELVE A MANDARLO
CALL TX_DATO ; 
GOTO RX_DATO ;

la idea es que si recibo el ascii de G vuelva a enviar el ultimo dato y si resibo B salga de la recepcion... y no ni la B ni la G... si necesitan el codigo completo avisen que lo pongo pero me parece que hay algun error en estas lineas que coloque pero no puedo descubrir donde... En el PIC la configuracion para la TX y la RX es la que se encuentra en abundancia en el foro y coincide exactamente ya que me canse de controlarlo...

Espero que me puedan ayudar... Saludos


----------



## Meta

Hoy en día, funciona mejor el Visual Basic .net 2008/2010.

Ver manual

Descargar Visual Basic Express.

Saludo.


----------



## 20deoctubre

Saludos Facundo_Bellesi....
Hasta donde recuerdo de asm (solo programe el 628 y el 877 en asm) la instruccion MOVFW no existe, creo que lo que intentas hacer es leer el registro, intenta con MOVF y postea que paso. Tambien, por lo general las banderas de cualquier interrupcion por claridad siempre se borran hasta el final de la subrutina de interrupcion, aunque no creo que sea relevante eso en este caso...

De hecho segun el datasheet del 628
"Flag bit RCIF is a read only bit which is
cleared by the hardware. It is cleared when the RCREG
register has been read and is empty." 

Por lo que no tienes que borrar la bandera...


----------



## Facundo_Bellesi

Hola 20doctubre, 

La instrucción MOVFW e lo mismo que colocar MOVF f,d; el MPLAB te lo toma indistintamente a cualquiera de las dos instrucciones. Y en cuanto a borrar el flag, como no estoy trabajando con interrupciones no me influye, lo borro por costumbre nada mas. Igualmente por las dudas probé estas modificaciones que me propusiste y sigue sin responder... 

Gracias por tu respuesta... Saludos


----------



## 20deoctubre

Pero si no estas utilizando interrupcion como llegas a la subrutina RX_DATO ? tuvieras que hacer algun tipo de poleo al bit RCIF, o como lo haces tu ?

oye Facundo_Bellesi, otra cosa que me parece rara es que apagas el transmisor para recibir el dato, lo cual esta bien, pero no lo vuelves a encender, que pasa ahi ?

Saludos...


----------



## Facundo_Bellesi

Ya logre que reciba!!!!!!!!!

Tenia unos pines cambiados en la placa... 

La programación andaba bien... Para entrar a RX_DATO fuerzo esa subrutina cuando necesito que me responda la PC y cuando la bandera me avisa que estoy por recibir...

En cuanto a la transmision, como yo fuerzo la entrada, tambien se cuando va a volver entonces al regreso de RX_DATO habilito otra vez la transmision...

Ahora estoy tratando de utilizar las interrupciones por recepcion. La idea es que si recibo en el PIC el ASCCI de F haga una subrutina, pero resulta que entra a la recepcion y va a la subrutina por mas que no le envie ningun dato. A continuacion muestro la programacion...

INTERRUP BTFSS PIR1,RCIF ;
GOTO VOLVER ;
MOVFW RCREG ; Lee el dato recibido.
MOVWF RECEPCION ; GUARDA EL BYTE RECIBIDO EN RECEPCION
MOVWF AUXILIAR ;
VOLVER CLRF RCREG ; Limpia el registro de recepción
BCF PIR1,RCIF ; 
BCF INTCON,1 ; BORRA LA BANDERA DE INTERRUP
RETFIE ;
;*************************************************
REPE MOVLW 'F' ;
SUBWF AUXILIAR ;
BTFSC STATUS,2 ;
CALL TRABA_P ;
;************************************************
TRABA_P CLRF AUXILIAR ;
CLRF RECEPCION ;
CLRF RCREG ;
BTFSC BANDERA,1 ; PUERTA CERRADA?
GOTO DESTRABA ; SI, VA A ABRIRLA
BSF PORTC,1 ; CIERRA LA PUERTA
CALL LIMPIA_LCD ; 
CALL LINEA_1 ; 
CALL MENSAJE_7 ; " PUERTA CERRADA "
BSF BANDERA,1 ;
RETURN ;
DESTRABA BCF PORTC,1 ; ABRE LA PUERTA
BCF BANDERA,1 ;
CALL LIMPIA_LCD ;
CALL LINEA_1 ;
CALL MENSAJE_8 ; " PUERTA ABIERTA "
RETURN ; 
;***********************************************

La verdad no entiendo por que pasa eso... Espero puedan ayudarme...

Algo que se me ocurre preguntar, aunque creo muy poco probable... El MAX232n tiene algun tipo de memoria interna que retenga la ultima recepcion o algo asi... Porque es lo unico que se me ocurre y aunque revise y en la hoja de datos no me dice nada, creo que ya estoy buscando algun tipo de conclucion salvadora...


----------



## Facundo_Bellesi

Problema solucionado amigos... Gracias por todo, ya se comunica sin problemas...


----------



## 20deoctubre

Alguien de ustedes sabe si se pueden correr dos timers al mismo tiempo en visual basic ?


----------



## elbrujo

20deoctubre dijo:


> Alguien de ustedes sabe si se pueden correr dos timers al mismo tiempo en visual basic ?



Si no hay problema


----------



## OZONO

Según el google la pregunta fué respondida en esta página pero no la encontre.
Mi problema es el siguiente:
Utilizo el VB 2008 y el registro Mscomm no aparece como en la versión del 2005. cambió de nombre? había que configurarlo antes utilizarlo? no me refiero a la configuración del puerto como la velocidad y demás parámetros sinó que al utilizarlo me da el error de "No se ah declarado el nombre de Mscomm1"

Gracias de antemano
Mauricio


----------



## ByAxel

OZONO dijo:


> Según el google la pregunta fué respondida en esta página pero no la encontre.
> Mi problema es el siguiente:
> Utilizo el VB 2008 y el registro Mscomm no aparece como en la versión del 2005. cambió de nombre? había que configurarlo antes utilizarlo? no me refiero a la configuración del puerto como la velocidad y demás parámetros sinó que al utilizarlo me da el error de "No se ah declarado el nombre de Mscomm1"
> 
> Gracias de antemano
> Mauricio



Ahí va un manual... 
Usando el SerialPort con Visual Basic 2008

Supongo que estas acostumbrado al VB6 que al .NET, ps hay una enorme diferencia (a buenas o malas te acostumbras de prescindir de las libs del Framework).

Saludos


----------



## OZONO

Muchas Gracias!
Ya lo estoy viendo...
Saludos a toda la comunidad
Mauricio


----------



## ElFabroDeLaGente

Gradmaster dijo:


> Bueno en Visual es mucho mas sencillo que en C# por que VB hablando de la version 6.0 por que en la net no encuentro el control, utilizas el control MSCom, cuando habras tu proyecto preciona las teclas Ctrl + T y te abrira una ventana en donde podras encontrar mucho controles extra a los que te muestra la barra de herramientas.
> 
> busca el MsComm y selecionalo, despues aparecera en la barra de herramientas, lo insertas como so fuece un boton o X control; las propiedades que usaras son la siguientes.
> 
> mscomm1.portopen=true 'si es que usas el puerto serial 1, el indicar true quiere decir que abrira el puerto cuando se ejecute la instruccion.
> 
> var1=mscomm1.input ' la variable var1 tendra el valor en ascii de la entrada que por cierto y para mala suerte solo se pueden usar 8 bits.
> 
> puedes usar un textbox para ver el caracter ascci del valor que mandes con el pic.
> 
> para pasarlo a un valor decimal de 0 a 255 usas el comoando Asc (var1) que comvertira el valor de la variable de entrada en un valor decimal.
> 
> si lo quieres hexadecimal usas hex$(var1)
> 
> el siguiente comando que usaras es MSComm1.output= var2, con este comando le das salida al numero que tengas guardado en la variable dos, si es un numero y la variable no esta declarada como integer tomara el valor ascii del numero o caracter que introduzcas en la variable 2, y si esta declarada como integer te tomara el valor numerico.
> 
> la ultima para cerrar el puerto es: MSComm1.portopen=false tienes que cerrar el puerto cada vez que terminas de usarlo por que sino te ocacionara problemas cuando quieras abrirlo nuevamente, por que no puedes abrir un puerto que ya esta abierto
> 
> espero te sirva de algo esta pequeña referencia, exito.







Hola, tengo un problema. Cuando yo pongo *asc(dato)* (previamente hice dato=mscomm1.input), siendo dato una variable del tipo *variant* el visual basic me tira error 5.
Me podrias explicar por que hace eso?
Saludos.
Chau.


----------



## lubeck

Porque no es el tipo correcto...


> ASC (funcion)
> 
> Devuelve un tipoInteger que representa elcódigo de carácter correspondiente a la primera letra de una cadena.
> 
> Sintaxis
> 
> Asc(cadena)
> 
> Elargumento obligatorio cadena es unaexpresión de cadena válida. Si cadena no contiene caracteres, se produce unerror en tiempo de ejecución.
> 
> Comentarios
> 
> El intervalo del valor de retorno es entre 0 y 255 en sistemas que no sean DBCS, y entre –32768 y 32767 en sistemasDBCS.
> 
> Nota   La función AscB se utiliza con bytes de datos contenidos en una cadena. En lugar de devolver el código de carácter para el primer carácter, AscB devuelve el primer byte. La función AscW siempre devuelve el código de carácterUnicode en plataformas donde no se admite Unicode, en cuyo caso, el comportamiento es idéntico al de la función Asc.



definela como string...


----------



## ElFabroDeLaGente

Muchisimas gracias Lubeck.
Saludos.
Chau.


----------



## ElFabroDeLaGente

Lubeck, resulta que ahora defino la variable como string y al hacer Asc(variable) me tira error 5.
Yo basicamente lo que necesito es graficar en un picture box lo que leo del puerto serie de la pc. Desde un microcontrolador mando a la pc datos provenientes de varios sensores. El microcontrolador recibe los datos de los sensores, los digitaliza y manda de a uno los datos hacia la pc. Luego en la pc con el visual basic lo que tengo que hacer es graficar en un picture los datos que llegan.
No se si me explico.
Por favor si me puedes dar una mano te agradeceria.
Por favor perdona que te moleste.
Saludos.
Chau.


----------



## lubeck

Puedes subir la rutina... para ver si encuentro algun error..
no hay otra mas que definir la variable tipo string a lo mejor no la defines en el lugar correcto...


----------



## ElFabroDeLaGente

Dim YE As String

 Esto es parte del evento load del form:

        MSComm1.CommPort = 1
        'Determina: 9600-Velocidad en Baudios, N-No utiliza ninguna paridad,
        '8-Cantidad de bits de envio y recepcion por paquete,
        '1-Determina los bits de parada
        MSComm1.Settings = "9600,N,8,1"
        'No existe control de flujo
        MSComm1.Handshaking = comNone
        'Lee todo el buffer de entrada para que quede vacio
        MSComm1.InputLen = 0
        'Cada vez que se recibe un caracter se producira el evento onComm
        MSComm1.RThreshold = 1

Este es el evento oncomm:

Private Sub MSComm1_OnComm()

    Dim valor As String
    'recoge el valor de entrada
    If MSComm1.CommEvent = comEvReceive Then
    YE = MSComm1.Input
    YE = Asc(YE)
    cuadro.PSet (EQUIS, -3 * YE + cuadro.Height / 2), vbRed
    Label2.Caption = YE & " Grados Celsius"
    t = t + 1
    Print #1, t & " minutos"
    Print #1, YE & " grados Celsius"
    'recoge el valor de entrada
    YE = MSComm1.Input
    YE = Asc(YE)
    cuadro2.PSet (EQUIS, -3 * YE + cuadro2.Height / 2), vbGreen
    Print #1, YE & " hecto pascales"
    Label6.Caption = YE & " Hecto pascales"
    EQUIS = EQUIS + 1
    End If
    If EQUIS > cuadro.Width Then
    cuadro.Cls
    cuadro2.Cls
    EQUIS = 0
    Call rejilla
    End If

Perdon, una aclaracion: leo dos veces el puerto por que tengo dos sensores conectados al microcontrolador y este (el microcontrolador) multiplexa los canales del conversor adc y envia byte por byte esos datos a la pc.


----------



## lubeck

HAber lo primero que veo...



		Código:
	

Dim valor As String, [B]YE as Integer[/B]
'recoge el valor de entrada
If MSComm1.CommEvent = comEvReceive Then
[B]Valor[/B] = MSComm1.Input
YE = Asc([B]Valo[/B]r)
cuadro.PSet (EQUIS, -3 * YE + cuadro.Height / 2), vbRed
Label2.Caption = YE & " Grados Celsius"
t = t + 1
Print #1, t & " minutos"
Print #1, YE & " grados Celsius"
'recoge el valor de entrada
[B]Valor [/B]= MSComm1.Input
YE = Asc([B]Valor[/B])
cuadro2.PSet (EQUIS, -3 * YE + cuadro2.Height / 2), vbGreen
Print #1, YE & " hecto pascales"
Label6.Caption = YE & " Hecto pascales"
EQUIS = EQUIS + 1
End If
If EQUIS > cuadro.Width Then
cuadro.Cls
cuadro2.Cls
EQUIS = 0
Call rejilla
End If


Lo mas problable es que no funcione porque defines dos msccom1.input pero ya no te va a tirar el error...
pruebalo...


----------



## ElFabroDeLaGente

Lo corregi y me sigue tirando el mismo error.
El error me lo tira despues de leer por segunda vez el puerto, el error es en YE=Asc(valor).


----------



## lubeck

Me lo suponia esta tratando de convertir en el segundo input un Null    o sea YE=Asc("") donde "" es null 
estas mal en eso el evento mscomm.event se ejecuta al recibir el puerto y con el input vacia el buffer... lo que tengas  que hacer lo tienes que hacer con un solo msccom.input...
me explico???


----------



## ElFabroDeLaGente

Hola, se me ocurrio una forma de hacer lo que quiero usando solo una vez el mscomm1.input. El codigo es el siguiente pero resulta que me grafica en los dos pictures al mismo tiempo.

Private Sub MSComm1_OnComm()

    Dim valor As String, YE As Integer
    If MSComm1.CommEvent = comEvReceive Then
    'recoge el valor de entrada
    valor = MSComm1.Input
    YE = Asc(valor)
    etiqueta.Caption = contador

    Select Case contador

    Case 0
    cuadro.PSet (EQUIS, -3 * YE + cuadro.Height / 2), vbRed
    Label2.Caption = YE & " Grados Celsius"
    t = t + 1
    Print #1, t & " minutos"
    Print #1, YE & " grados Celsius"

    Case 1
    cuadro2.PSet (EQUIS, -3 * YE + cuadro2.Height / 2), vbGreen
    t = t + 1
    Print #1, t & " minutos"
    Print #1, YE & " hecto pascales"
    Label6.Caption = YE & " Hecto pascales"

    End Select

    contador = contador + 1
    If contador = 2 Then
    contador = 0
    End If
    EQUIS = EQUIS + 1
    End If
    If EQUIS > cuadro.Width Then
    cuadro.Cls
    cuadro2.Cls
    EQUIS = 0
    Call rejilla
    End If


End Sub


----------



## ElFabroDeLaGente

Hola, ya lo solucione , el ultimo codigo que te mande es el que uso. El resto era ajustar la velocidad a la que el micro multiplexa los canales del conversor AD.
Saludos.
Chau.


----------



## ElFabroDeLaGente

Hola, estimado Lubeck, tengo un problema con un programa que usa el winsock. 
Me podrias dar una mano?
Desde ya perdona las molestias.
Saludos.


----------



## lubeck

Lo intento...

podrías subirlo y mas o menos explicar el problema...

 saludos...


----------



## ElFabroDeLaGente

Lo que estoy haciendo es una aplicacion cliente servidor. Yo tengo un microcontrolador que sensa datos, los manda a la pc por puerto serie y despues los manda a un servidor.
Cuando pruebo ambos (cliente y servidor) en mi maquina, anda bien, pero cuando pruebo el servidor en otra maquina, no recibe los datos que envia el cliente.
Te adjunto los dos codigos:

Cliente:

Option Explicit
Dim Cadena As String
Dim t As Double
Public contador As Integer, variable As Boolean, Fecha As String, Hora As String, puertos As String
Public Temperatura As Double, Presion As Double, Humedad As Double
Public Ti As Integer, Pi As Integer, Hi As Integer
Const MAX = 15

Private Sub cargar_Click()

ete:
        dialogo.Filter = "txt|*.txt"
        dialogo.DialogTitle = "Cargar un archivo"
        dialogo.ShowOpen
        If dialogo.FileName = "" Then Exit Sub
        Cadena = dialogo.FileName
        Open Cadena For Output As #1
        On Error GoTo ete
        cargar.Enabled = False
        'Abre el puerto seleccionado
         MSComm1.PortOpen = True

End Sub

Private Sub cliente_Close()

Label1.Caption = "Sin conexión"

End Sub

Private Sub cliente_Connect()

Label1.Caption = "Conectado"

End Sub

Private Sub cliente_ConnectionRequest(ByVal requestID As Long)

cliente.Close
cliente.Accept requestID

End Sub

Private Sub Command1_Click()

If Combo1.Text <> "" And (Asc(Combo1.Text) > 47 And Asc(Combo1.Text) < 58) Then
MSComm1.CommPort = Int(Combo1.Text)
Combo1.Enabled = False
Command1.Enabled = False
cargar.Enabled = True
End If

End Sub

Private Sub Command2_Click()

cliente.Protocol = sckTCPProtocol
cliente.RemoteHost = Text1.Text
cliente.LocalPort = 0
cliente.RemotePort = 7381
cliente.Connect
Text1.Enabled = False
Command2.Enabled = False

End Sub

Private Sub Form_Load()

        cargar.Enabled = False
        'Determina: 9600-Velocidad en Baudios, N-No utiliza ninguna paridad,
        '8-Cantidad de bits de envio y recepcion por paquete,
        '1-Determina los bits de parada
        MSComm1.Settings = "9600,N,8,1"
        'No existe control de flujo
        MSComm1.Handshaking = comNone
        'Lee todo el buffer de entrada para que quede vacio
        MSComm1.InputLen = 0
        'Cada vez que se recibe un caracter se producira el evento onComm
        MSComm1.RThreshold = 1
        t = 0
        contador = 10
        variable = False
        Temperatura = 0
        Presion = 0
        Humedad = 0
        Ti = 0
        Pi = 0
        Hi = 0
        'Nombre de los ejej X e Y
        GR.Axes(1).Caption = " Tiempo[seg]"
        GR2.Axes(1).Caption = " Tiempo[seg]"
        GR3.Axes(1).Caption = " Tiempo[seg]"
        GR.Axes(2).Caption = " Temperatura[ºC]"
        GR2.Axes(2).Caption = " Presión[Hp]"
        GR3.Axes(2).Caption = " Humedad[%]"
        'Color de las graficas. Por defecto GR2 es verde
        GR.Plots(1).LineColor = vbRed
        GR3.Plots(1).LineColor = vbBlue
        'Escala del eje Y
        GR.Axes(2).AutoScale = False
        GR.Axes(2).Minimum = 0
        GR.Axes(2).Maximum = 255
        GR2.Axes(2).AutoScale = False
        GR2.Axes(2).Minimum = 0
        GR2.Axes(2).Maximum = 255
        GR3.Axes(2).AutoScale = False
        GR3.Axes(2).Minimum = 0
        GR3.Axes(2).Maximum = 2.55
        With Combo1
        .AddItem 1
        .AddItem 2
        .AddItem 3
        .AddItem 4
        .AddItem 5
        .AddItem 6
        .AddItem 7
        .AddItem 8
        .AddItem 9
        .AddItem 10
        End With

End Sub

Private Sub Form_Unload(Cancel As Integer)

If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
Close #1
cliente.Close

End Sub

Private Sub MSComm1_OnComm()

    Dim valor As String, YE As Integer
    If MSComm1.CommEvent = comEvReceive Then
    valor = MSComm1.Input
    Select Case Left(valor, 1)
    Case "T"
    contador = 0
    If cliente.State = 7 Then
    cliente.SendData Left(valor, 1)
    Else: Label1.Caption = "Sin conexión"
    End If
    Case "P"
    contador = 1
    If cliente.State = 7 Then
    cliente.SendData Left(valor, 1)
    Else: Label1.Caption = "Sin conexión"
    End If
    Case "H"
    contador = 2
    If cliente.State = 7 Then
    cliente.SendData Left(valor, 1)
    Else: Label1.Caption = "Sin conexión"
    End If
    End Select
    If contador = 0 And Left(valor, 1) <> "T" And Left(valor, 1) <> "P" And Left(valor, 1) <> "H" Then
    YE = Asc(Right(valor, 1))
    Temperatura = Temperatura + YE
    Ti = Ti + 1
    If Ti = MAX Then
    Temperatura = Temperatura / Ti
    'Trunco a dos decimales
    Temperatura = FormatNumber(Temperatura, 2)
    GR.ChartXvsY t, Temperatura
    Ti = 0
    Label2.Caption = Temperatura & " Grados Celsius"
    t = t + 1
    Print #1, Temperatura & " grados Celsius"
    If cliente.State = 7 Then
    cliente.SendData Str(Temperatura)
    Else: Label1.Caption = "Sin conexión"
    End If
    Temperatura = 0
    End If
    End If
    If contador = 1 And Left(valor, 1) <> "T" And Left(valor, 1) <> "P" And Left(valor, 1) <> "H" Then
    YE = Asc(Right(valor, 1))
    Presion = Presion + YE
    Pi = Pi + 1
    If Pi = MAX Then
    Presion = Presion / Pi
    'Trunco a dos decimales
    Presion = FormatNumber(Presion, 2)
    GR2.ChartXvsY t, Presion
    Pi = 0
    Label6.Caption = Presion & " Hecto pascales"
    t = t + 1
    Print #1, Presion & " hecto pascales"
    If cliente.State = 7 Then
    cliente.SendData Str(Presion)
    Else: Label1.Caption = "Sin conexión"
    End If
    Presion = 0
    End If
    End If
    If contador = 2 And Left(valor, 1) <> "T" And Left(valor, 1) <> "P" And Left(valor, 1) <> "H" Then
    YE = Asc(Right(valor, 1))
    Humedad = Humedad + YE
    Hi = Hi + 1
    If Hi = MAX Then
    Humedad = Humedad / Hi
    Humedad = Humedad / 100
    'Trunco a dos decimales
    Humedad = FormatNumber(Humedad, 2)
    GR3.ChartXvsY t, Humedad
    Hi = 0
    Label8.Caption = Humedad & " %"
    t = t + 1
    variable = True
    Print #1, Humedad / 100 & " %"
    If cliente.State = 7 Then
    cliente.SendData Str(Humedad)
    Else: Label1.Caption = "Sin conexión"
    End If
    Humedad = 0
    End If
    End If
    If variable = True Then
    Fecha = Date$
    Hora = Time$
    Print #1, Fecha
    Print #1, Hora
    variable = False
    End If
    End If

End Sub

Private Sub acercade_Click()

AD.Show vbModal

End Sub


Programa Servidor:

Public Variable As String, tiempo As Integer, contador As Integer
Public Temperatura As String, Presion As String, Humedad As String
Public llave As Boolean
Const Lim = 75

Private Sub acercade_Click()

AD.Show vbModal

End Sub

Private Sub Form_Load()

        GR.Axes(1).Caption = " Tiempo[seg]"
        GR2.Axes(1).Caption = " Tiempo[seg]"
        GR3.Axes(1).Caption = " Tiempo[seg]"
        GR.Axes(2).Caption = " Temperatura[ºC]"
        GR2.Axes(2).Caption = " Presión[Hp]"
        GR3.Axes(2).Caption = " Humedad[%]"
        GR.Plots(1).LineColor = vbRed
        GR3.Plots(1).LineColor = vbBlue
        GR.Axes(2).AutoScale = False
        GR.Axes(2).Minimum = 0
        GR.Axes(2).Maximum = 255
        GR2.Axes(2).AutoScale = False
        GR2.Axes(2).Minimum = 0
        GR2.Axes(2).Maximum = 255
        GR3.Axes(2).AutoScale = False
        GR3.Axes(2).Minimum = 0
        GR3.Axes(2).Maximum = 2.55

        Temperatura = 0
        tiempo = 0
        contador = 0
        llave = True

        servidor.Protocol = sckTCPProtocol
        servidor.LocalPort = 7381
        servidor.RemotePort = 0
        servidor.Listen

End Sub

Private Sub Form_Unload(Cancel As Integer)

        servidor.Close

End Sub

Private Sub servidor_ConnectionRequest(ByVal requestID As Long)

        servidor.Close
        servidor.Accept requestID

End Sub

Private Sub servidor_DataArrival(ByVal bytesTotal As Long)

        servidor.GetData Variable
        Select Case Variable
        Case "T"
        contador = 1
        Case "P"
        contador = 2
        Case "H"
        contador = 3
        End Select
        If contador = 1 And Variable <> "T" And Variable <> "P" And Variable <> "H" Then
        GR.ChartXvsY tiempo, Val(Variable)
        Label2.Caption = Val(Variable) & " Grados Celsius"
        contador = 0
        List1.AddItem (Variable & " Grados Celsius")
        End If
        If contador = 2 And Variable <> "T" And Variable <> "P" And Variable <> "H" Then
        GR2.ChartXvsY tiempo, Val(Variable)
        Label3.Caption = Val(Variable) & " Hecto pascales"
        contador = 0
        List1.AddItem (Variable & " Hecto pascales")
        End If
        If contador = 3 And Variable <> "T" And Variable <> "P" And Variable <> "H" Then
        GR3.ChartXvsY tiempo, Val(Variable)
        tiempo = tiempo + 1
        Label5.Caption = Val(Variable) & " %"
        contador = 0
        List1.AddItem (Variable & " %")
        End If

End Sub

Private Sub servidor_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

        servidor.Close

End Sub


----------



## lubeck

> Cuando pruebo ambos (cliente y servidor) en mi maquina, anda bien, pero cuando pruebo el servidor en otra maquina, no recibe los datos que envia el cliente.



Empecemos por ahi mientras veo el codigo, normalmente (en un 90% de los casos) cuando es en dos equipos o via internet lo que evita que funcione es porque los firewall (o antivirus si dispone de esta opcion)  están bloqueando al puerto...

veo que utilizas el 7381 dale permiso en el firewall en donde coloques el servidor unicamente..

otra es que la direecion en el cliente no coincide con la direccion del servidor, puedes poner el nombre del equipo o su ip verificalo poniendo inicio->command-> tecleas "ipconfig" y te desplega la direccion del equipo

sigo viendo el codigo...

Edito:

parece correcto el código (un par de detalles pero no interfeiren en la conexion) te sugeriria que insertes el siguiente codigo en el cliente para verificar la conexion



		Código:
	

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
 Winsock1.Close
 msgbox "ERROR CONNECTION"
End Sub


si te aparece "error connection" si se esta bloqueando el puerto...


----------



## ElFabroDeLaGente

Ok, y con respecto al puerto 7381, me lo dejo asi o me recomendas que lo cambie por otro?
Te agradesco muchisimo que hayas visto el codigo.
CUalquier cosa te comento como funciona.
Saludos.


----------



## lubeck

> y con respecto al puerto 7381, me lo dejo asi o me recomendas que lo cambie por otro?



mira yo siempre uso el 888 por costumbre... 

hay algunos que  estan restingidos o podria causar conflictos para abrirlo...

verifica esta lista o similar...
http://www.internautas.org/archivos/port-numbers.txt


----------



## ElFabroDeLaGente

Hola, le mande el programa servidor a un amigo y cuando el lo ejecuta no le anda muy bien. Le llegan los datos pero no todos. Encambio cuando pruebo el servidor en mi maquina me anda de 10. Es un bajon esto, la verdad ya no se que pensar.


----------



## lubeck

> Hola, le mande el programa servidor a un amigo y cuando el lo ejecuta no le anda muy bien. Le llegan los datos pero no todos. Encambio cuando pruebo el servidor en mi maquina me anda de 10. Es un bajon esto, la verdad ya no se que pensar.



ese es uno de los detalles que pude observar... necesitas implimentar un buffer en el algoritmo de recepcion, no es la misma velocidad de transmision en una maquina local que una en el otro lugar...
para la recepcion y/o transmision de de datos al micro yo recomiendo se utilice el DTR y RTS del puerto serial (PC/uC)... 

solucionando ambos... solucionas la parte de los datos....

cliente.LocalPort = 0
servidor.RemotePort = 0 

estas dos lineas no son necesarias...

saludos...
Saludos


----------



## ElFabroDeLaGente

Hola Lubeck, tanto tiempo. ¿Como estas?
Con todo este codigo que te habia mostrado hace varios meses atras mas un poco de electronica pude armar el proyecto que tanto queria para presentar en la facultad. Me fue bien gracias a Dios.
Ahora quiero ver de comenzar a armar otro proyecto pero se me cruzó una gran duda: ¿Se pueden controlar los graficos de Autocad con Visual Basic 6.0?
En principio es eso lo que necesito saber para ver si voy por buen camino con lo que se me acaba de ocurrir.
Desde ya muchisimas gracias por haber respondido siempre a mis preguntas.
Un gran saludo.


----------



## elbrujo

A que le llamas controlar los graficos?


----------



## ElFabroDeLaGente

Hola, gracias por responder.
Yo quiero enlazar visual basic con autocad. Es decir hacer los graficos 2D o 3D que hacia en autocad pero desde visual basic y despues poder rotarlos trasladarlos, etc. Se que suena muy loco o muy tonto lo que digo pero en principio es eso lo que necesito hacer.
Saludos.


----------



## ByAxel

ElFabroDeLaGente dijo:


> Hola, gracias por responder.
> Yo quiero enlazar visual basic con autocad. Es decir hacer los graficos 2D o 3D que hacia en autocad pero desde visual basic y despues poder rotarlos trasladarlos, etc. Se que suena muy loco o muy tonto lo que digo pero en principio es eso lo que necesito hacer.
> Saludos.


Tonto no es!!... busca aquí http://www.codeproject.com/ que vi varias cosas relacionadas al cad con el formato .dxf el cual también lo sugiero ya que es ascii, solo que toma su tiempo el poder implementar.
DXF Format

Tengo esto, está en C#... te puede ser de guía.
salu2


----------



## ElFabroDeLaGente

ByAxel dijo:


> Tonto no es!!... busca aquí http://www.codeproject.com/ que vi varias cosas relacionadas al cad con el formato .dxf el cual también lo sugiero ya que es ascii, solo que toma su tiempo el poder implementar.
> DXF Format
> 
> Tengo esto, está en C#... te puede ser de guía.
> salu2



Muchisimas gracias.
Saludos.


----------



## fredy93

hola tengo una pregunta quiero hacer en visual basic un programa para el control de unos leds lo que pasa es que ya lo tengo en hyperterminal que cuando aprieto la letra A hace una accion y con B otra y asi lo que quiero es saber como al boton que haga en visual basic como le digo que mande por dato serial a mi pic el mismo codigo que me manda la letra A o que onda?? no soy muy bueno en visual. si alguien me pueda ayudar gracias


----------



## Unikfriend

Hi fredy,
que version de VB utilizas?


----------



## fredy93

hola gracias por responder  tengo el 6.0 o tambien el 2008 express pero la verdad estos programas los ocupe hace tiempo y solo hicimos practicas demasiado sencillas jamas vimos nada de puertos ni nada  si me pudieras explicar con paciencia te lo agradeceria bastante


----------



## Unikfriend

Ok Freddy, si utilizas VB Express 2008

- tienes que crear una ventana con los controles que quieres utilizar
- agregar el control serialport y configurarlo en la ventana de propiedades.
- agregas la instruccion Open, Write y Close donde quieras transmitir datos 

y listo.




> Public[/SIZE]Class[/SIZE] Form1Private[/SIZE]Sub[/SIZE] Button1_Click(ByVal[/SIZE] sender AsObject, ByVal e As System.EventArgs) Handles Button1.ClickMe.SerialPort1.Open()Me.SerialPort1.Write(Me.TextBox1.Text)Me.SerialPort1.Close()EndSub
> PrivateSub Button2_Click(ByVal sender AsObject, ByVal e As System.EventArgs) Handles Button2.ClickEndEndSub
> EndClass


----------



## fredy93

hola muchas gracias por responder ahora ahi va todo para que me pueda yo explicar bien
el programa que hare es sobre unos motores un puente H cuando yo envio una A entonces el motor 1 gira a la derecha cuando pongo la B el motor gira a la izquierda y con C se detiene.
ahora de visual si se como agregar el serial port y poner 9600 b etc. 
pero mi gran problema es como decirle al boton 1 que mande un dato que sea igual que la letra A?? como es ese codigo o que onda?
aqui adjunto una imagen de como va quedando el programa ya lo probe la conexion con virtual serial port y cuando conecto al COM1 o COM2 si me lo indica ahora solo me falta lo de los botones como seria el codigo??? gracias 
este es el codigo de los botones de conectar y desconectar.
 private void button19_Click(object sender, EventArgs e)
        {
            serialPort1.Open();
            button16.Enabled = false;
            button17.Enabled = true;
        }

        private void button20_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            button16.Enabled = true;
            button17.Enabled = false;
        }
y segun por lo que he buscado este deberia ser el del boton pero no funciona o que tiene de error??
 private void button1_Click(object sender, EventArgs e)
        {

                // Se envía como HEX al RS232.
                // BIN = 00000001, DEC = 97, OCT = 141.        
                byte[] mBuffer = new byte[1];
                mBuffer[0] = 41; //ASCII letra "a".
                serialPort1.Write(mBuffer, 0, mBuffer.Length);

        }


----------



## Unikfriend

Hi Freddy...
Sube el proyecto en zip, para poder ayudarte mas rapido!


----------



## fredy93

hola ya lo subí espero que si lo haya adjuntado bien para que se pueda abrir  gracias


----------



## Unikfriend

Hi Freddy,
pues no se si se la version del winrar que tengo instalda, pero yo solo pude ver el archivo .snl ; de cualquier forma haber si esto te ayuda.


----------



## fredy93

siiiiiiiiiiiiiiiiiiiiiiiiiii  esto era la que buscaba muchas gracias me ayudaste bastante  me gustaria tener tu nombre para anotarte en los agradecimientos de mi trabajo  haber si luego subo un video de como quedo gracias ;D


----------



## Unikfriend

Hi Freddy,
Que bueno que te funciono.
Es un brazo mecanico lo que estas controlando?


----------



## fredy93

si  subire fotos y videos de como quedo al final


----------



## fredy93

hola hola ya casi queda el proyecto jeje va muy bien una pregunta una vez vi en visual basic 2006 que podias meter una como voz robotizada cada vez que dabaas clic reproducia el texto que tu querias en visual basic 2008 no hay algo asi y como se hace gracias


----------



## Unikfriend

Hi fredy,
la manera mas sencilla de utilizar sonido en tu aplicacion VB 2008
es con el control Audio de windows, el archivo *.wav puedes crearlo
con el mensaje que tu quieras.



My.Computer.Audio.Play(FILE_WAV, AudioPlayMode.Background)
My.Computer.Audio.Stop()


----------



## hamster

yo realicé algo parecido en Visual Basic 2005.


----------



## andrea1708

Hola a todos! estoy trabajando con Visual Basic Express 2008. Tengo un problema, quiero enviar una variable char por puerto serial pero me sale un error cuando lo intento.
Si escribo:

MSComm.Output = "Y"

Lo envía sin nigun problema. El problema viene si escribo:

dim var as char = "Y"
MSComm.Output = var

me dice que hay error en la segunda linea. Yo pensaba que ahi mandaba lo que estuviese contenido en la variable var.

Ayudenme por favor  :'(

Gracias por anticipado

Saludos


----------



## Meta

Hola:

Manual puerto serie VB .net 2008






Saludo.


----------



## andrea1708

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


----------



## franquitoo

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


----------



## D@rkbytes

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?


----------



## franquitoo

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

---------------------------------------------------------------------------------------------------


----------



## madelsp

Mirad en esta web:

http://www.electricosonline.com/Privado/Automatas/MSComm.htm


----------



## Finskey

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.


----------



## D@rkbytes

Finskey dijo:


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


Finskey dijo:


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


----------



## Finskey

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


----------



## D@rkbytes

Finskey dijo:


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



Finskey dijo:


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


Finskey dijo:


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


Finskey dijo:


> Muchísimas gracias por su ayuda.


De nada. 
Suerte.


----------



## Finskey

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.


----------



## D@rkbytes

Finskey dijo:


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


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.​


Finskey dijo:


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

​ 
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.​


----------



## Finskey

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


----------



## D@rkbytes

Finskey dijo:


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


Finskey dijo:


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


Finskey dijo:


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


----------



## papirrin

Finskey dijo:


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


----------



## Finskey

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.


----------



## Finskey

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?


----------



## papirrin

> Ya que no uso oscilador de 4Mhz sera posible usar esos dos pines como puertos comunes?



no se entiende muy bien, ¿quisiste decir que no usas oscilador de cristal?, si no usas cristal y es un 16f628A, si... si se puede.


----------



## D@rkbytes

Finskey dijo:


> Alguna sugerencia para agrandar el proyecto será agradecida.


¿A qué te refieres con agrandar el proyecto?


Finskey dijo:


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


----------



## Finskey

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.


----------



## D@rkbytes

Finskey dijo:


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


Finskey dijo:


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


Finskey dijo:


> *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 Basi*c. 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.


Finskey dijo:


> ¿Qué cambio haría en el proyecto para  usar el USART?


Adjunto los cambios que se deben hacer para usar el módulo USART.


----------



## Finskey

Es una interfaces  para controlar desde la PC  distintas cargas entre las cuales se encuentran:

-Cargas a 220 VCA
-Cargas a 12 VCC
-Cargas a 5 VCC

No lo estoy realizando para controlar nada en especial, pero pensaba que estaría preparando para conectar  lamparas,motores,leds etc.

Pensé en hacer lo siguiente de las 11 salidas de control dedicar 6 a cargas de 220V, 3 a cargas de 12 V y 2 a cargas de 5V, pensé  colocar OPTOACOPLADORES, en cada una de las 11 salida. En las salidas de alterna colocamos el siguiente circuito con un triac (adjunto). Y en las salidas de continua pensaba excitar algún transistor de la familia TIP que soportan bastante corriente. 

En conclusión es una interface para controlar  distinto tipos de cargas desde la PC, de las 11 cargas , 4 o 8 de ellas podrán ser accionadas por radiofrecuencia (no me decidido todavía, ya que estoy buscando un decodificador de 8 bits de datos HT640-648 y quiero hacer pruebas con este mismo).
Si no me equivoco adjunte la interface en Vbasic, esa me gustaría agregarle algunos chiches pero la verdad carezco de conocimiento de lenguaje y de imaginación. Saludos y muchas gracias


----------



## D@rkbytes

Entonces si piensas controlar varios tipos de carga, lo mejor sería usar relevadores, el diseño y conexión es más fácil porque las salidas serían como un interruptor y la aislación también es completa.

Míralo desde el punto de vista práctico.
Si realizas una interfaz mixta, con transistores, para las cargas de C.D a 5V y 12V, tienes que separar y diferenciar las salidas.
Luego, por otro lado las salidas con opto-triac y triac para las cargas de C.A.

En cambio, con una sola interfaz a relevadores, puedes conectar lo que quieras sin diferencia alguna.
Pero si el tipo de control fuera para variar intensidad, entonces si tendrías que usar triacs o transistores.

Ahora, si lo haces por R.F, ya es algo diferente y tendrás que modificar todo el proyecto.


----------



## Finskey

Es verdad que usar relays  te ahorraría muchos dolores de cabezas. Pero entre las desventanas encontré las siguiente:
-Desgaste mecánico del relay
-Falta de aislamiento óptico. Esto me conllevaría a alguna desventaja??

Entrando en el tema de RF, pensaba lo mismo pero sin embargo mande una salida de micro a la entrada de un transmisor que trabaja en 433 y con un par de integrados ENCODER/DECODER, he logrado establecer comunicación inalambrica, Lo único que cambiaría es que 4 salidas estarían unidas al receptor  y no a la placa principal. Lo que me sorprendió es que por internet la gente que realizaba este proyecto lo tenia que hacer con un baudaje mas chico 1200 por ejemplo, yo estoy usando 9600 y todavía funciona.


----------



## papirrin

> -Falta de aislamiento óptico. Esto me conllevaría a alguna desventaja??



ambos estan aislados tanto el rele como el opto, la diferencia es la velocidad de conmutación, es mas rapida la optica, y el rele suele soportar mas carga (hablando del opto sin transistores o tiristores adicionales).

si quieres salidas CA o DC segun te convenga y que este aislado, otra opcion es que puedes poner ambos en un mismo puerto o sea un optoacoplador y un optotriac, si mal no recuerdo esos saturan con poco menos de 6mA, que te da 12mA por puerto y esta dentro de la capacidad., (obviamente conectas lo de CA en los optotriacs y lo de DC en los optoacopladores)

reviza las fichas tecnicas para confirmar el dato de la corriente.


----------



## Finskey

De esa forma podría  usar un puerto tanto para CA  como para CC, no es una mala idea papirrin. Pero tengo poca corriente. Habia pensando en poner un opto acoplador y luego transistorizar pero eso me serviría para cargas de CC o CA no para ambas. Me imagino que si uso relay no es necesario optoacoplar las salidas. Otra idea era usar SCR, pero estos si usamos con DC, quedan enclavados y hay que quitarle la alimentación para apagarlos.

Conclusión: la única forma de manejar cualquier tipo de cargas es como dijo Darkbytes usando relays, los cuales no me convencen por desgaste mecánico y como bien dijiste lenta velocidad de conmutación. Pero me da libertad en los puertos, seguiré investigando pero por ahora elegiré los relays.


----------



## papirrin

> Pero tengo poca corriente. Habia pensando en poner un opto acoplador y luego transistorizar pero eso me serviría para cargas de CC o CA no para ambas. Me imagino que si uso relay no es necesario optoacoplar las salidas.



Claro, por eso dije que *ambos*(optoacoplador y optotriac), y si.. pones un optoacoplador con un transistor con el colector/emisor abierto y un optotriac con un triac, ambos transistor como triac con una capacidad considerable, si son mas componentes pero tiene la ventaja que pueden conmutar mas rapido, como para controlar la velocidad de un motor o sentido de giro, no se lo que se conecte, que con un relay es un poco mas dificil.


----------



## Finskey

De esa forma podría usar la salida tanto para cc como para ca con grandes corriente y todo de estado solido me parece una buena idea... Pero porque no uso dos opto acopladores MOC3021 , porque usar un opto triac?? Este optocoplador lo excita totalmente , justo recién lo estaba probando. El costo total por salida seria de 20 pesos por salida , son 11 salidas   Pero es una excelente idea...  Gracias por tu interés papirrin!

Una pregunta que me resulto, podría  usar un solo opto acoplador y enviar las señales a la base del transistor y al gate del Triac??  obviamente usaria el triac o el transistor una a la vez-


----------



## papirrin

> podría usar un solo opto acoplador y enviar las señales a la base del transistor y al gate del Triac??



No, porque la alterna es por decirlo asi bidireccional, cuando la corriente va en un sentido no pasa nada, pero al cambiar el sentido se destruye el transistor interno del optoacoplador, si hablas del de DC., si hablas del optotriac creo que podria funcionar nunca lo he probado, el inconveniente es que para que se corte el triac interno debe pasar por cero el voltaje, y si es directa no se si detecte el 0V por un cruce, idealmente no seria posible pero en la realidad no se.

en el entendido que normalmente se nombra optoacoplador para corriente directa(unidireccional) y el optotriac que es para corriente alterna(bidirecciona), el moc3021 no es un optoacoplador es un optotriac, aunque en el sentido estricto ambos son optoacopladores y uno es para DC y el otro para AC.


----------



## Finskey

erfecto papirrin, Y que tal si uso un transistor de alto voltaje???  te adjunto la imagen que encontre.





Gracias por explicarme la diferencia, y buscando encontre uno que sirve tanto para AC como para DC LH1540 busca el datasheet , pero es muy caro sale 160 pesos argentino, el moc3021 sale 5 pesos argentinos


----------



## papirrin

> Y que tal si uso un transistor de alto voltaje???



bueno pero ahi no esta manejando cargas de AC, porque esta rectificando antes, osea son 230VDC, si quieres poner algo que no funcione con DC, como una TV o algo no va a funcionar, incluso no creo que funcione una lampara ahorradora.



> buscando encontre uno que sirve tanto para AC como para DC LH1540



ese no lo conocia, se ve bueno pero si esta caro, hay de muchos tipos los que conozco son DC/DC, DC/AC AC/DC y ese que pusiste que ya conozco XD


----------



## Finskey

Ya estoy tan cansando que ni siquiera vi que decia RECTIFER BRIDGE  bueno me dejo de molestar y mejor me ire a trabajar poniendo un opto acoplador, un opto triac, un transistor y un triac. Saludos  y cuando tenga avances porteare para que vean que sirvió que me contesten


----------



## Finskey

Aviso que buscando encontre estos integrados optoacopladores multiples (hasta 4 opto) por integrados:

-PC847
-TL627

No son muy difíciles de conseguir, Papirrin volviendo a lo nuestro, suponiendo que ponga un poto acoplador , un opto triac, y sus respectivas potencias (transistor y triac), Como seria la conexión entre el pic y las entradas de los integrados? Supongo que seria asi, adjunto la imagen corrijeme si me equivoco.


----------



## papirrin

Si asi, mas o menos, pero checa bien en la ficha tecnica cuanto es la minima corriente con lo que saturan, 

porque ahi consumen 20mA y esta muy cerca del limite..

Por otro lado y si te gustan las explosiones  se podria intentar armar un SSR con Mosfet que segun he estado leyendo maneja DC o AC...


lo estuve simulando pero aparentemente algo no le gusta al simulador y revientan...

mira el esquema que estoy simulando es este:


en ese esquema no esta aislado, pero he estado leyendo que quizas se puede aislar con unos leds....

te lo pongo para que lo analices y busque informacion (pon SSR con mosfet), no hay mucha info quizas no soporte mucho voltaje o no se... estoy investigando.


----------



## Finskey

Me fijare , el micro da 25 ma , creo y espero estar de sobra  



papirrin dijo:


> Por otro lado y si te gustan las explosiones



No tengo mucho mas para hacer así que  seguiré investigando , me imagino que son FETS de gran tamaño, Muchas gracias por tu ayuda, si encuentro algo lo posteo.

En Recommended Operating Conditions , encontre como Typ , 16ma y como maximo 20 ma estoy bien con la FORWARD CURRENT.


----------



## papirrin

> En Recommended Operating Conditions , encontre como Typ , 16ma y como maximo 20 ma estoy bien con la FORWARD CURRENT.



de cual hablas?


----------



## Finskey

Aunque ahora que lo pienso, al tener los dos conectados al micro se me irían 30 miliamper almenos, así que tendré que usar un bc547 o un 2n3904...



De el integrados con optoacopladores: necesita 16 mA de forward current , el moc3021 (optotriac):


----------



## papirrin

ahi dice 8mA, pero casi seguro con menos funciona, yo recuerdo haberle metido 6mA  pues vas probando XD


----------



## D@rkbytes

papirrin dijo:


> Ahí dice 8mA, pero casi seguro con menos funciona. Yo recuerdo haberle metido 6mA.


Yo tenía algunos MOC3010, cuando necesité más ya no los conseguí y compré MOC3011.
La diferencia más significante que noté entre estos opto-triacs, fue solo en la corriente del LED.


Al MOC3010 le puse una resistencia de 330Ω y al ver que la corriente para el MOC3011 era de 10 mA, le dejé la misma de 330Ω y funcionó sin problemas aunque para el MOC3011 debería ser de 200Ω. (220Ω la más cercana.) Y de 133.3Ω para el MOC3010 (150Ω la más cercana.)

Con un óhmetro análogo en la escala X1K conectado en los pines 4 y 6 (No importa la polaridad) se puede saber cuando se dispara el opto-triac.


----------



## papirrin

Finskey:

Acabo de darme cuenta de algo:






ahi dice que el MOC3010 es zero crossign, pero creo que esta mal, tu necesitarias uno con deteccion de cruce como el MOC3031, dale una revizada a eso.

sin deteccion del cruce normalmente se usa para controlar la fase, no en ON-OFF.


----------



## Finskey

Mira vos que picardia , yo tenia un 3021 y le encaje ese   ahora justo estaba por medirle la corriente que necesitaba para ser activado.

Con la resistencia de 470 ohmios, el puerto del pic me entrega 23 mA, no es mucho?
Hay posibilidad de quemar el micro usando el diagrama del post 154?
Voy a tratar de conseguir los otros modelos que veo que consumen menos, justo el que uso es el que mas consume.


----------



## papirrin

> Con la resistencia de 470 ohmios, el puerto del pic me entrega 23 mA, no es mucho?



pues si.. no entiendo porque deberia de dar 23mA, si son V=470*.023=10.81V deberias estar alimentado con 12V aprox, o ¿o esa medicion es de los dos optos?



> Hay posibilidad de quemar el micro usando el diagrama del post 154?



pues es probable, es que no entiendo que estas haciendo si dices que con una resistencia de 470 te da 23mA, si pones otro son 46mA y revienta... si ya estan ambos no creo que se queme, pero no es recomendable exigirle tanto o por lo menos yo no lo hago siempre dejo una tolerancia de un 20%, o sea 20mA si el puerto soporta 25mA.

pero aclara como estas haciendo.



> Voy a tratar de conseguir los otros modelos que veo que consumen menos,



creo que ahi hay algo raro, tu puedes limitar la corriente que tu quieras incrementando el valor ohmico, pero si aumentas mucho el valor no alcanza a gatillar el triac,  asi que tienes que encontrar el punto justo, en que consuma menos y gatille bien, tipicamente es lo que dice la ficha tecnica pero no es estrictisimamente ese, pues cada uno se fabrica diferente y el fabricante digamos que toma un valor promedio.


----------



## Finskey

Estoy usando uno solo (el moc 3021), si , no me verifica la ley de ohm   Verificare la resistencia el codigo de colores esta bien, quizas este dañada aunque no lo creo,  Verifique devuelta y si 23mA dc


----------



## papirrin

> No sera que el led tiene una resistencia de entrada?



Pues todo componente tiene una resistencia interna...

ya me estas haciendo dudar  creo que ahi tengo un 3021, deja verifico si me da el mismo consumo que a ti, y prueba pero sin el pic no lo vayas a quemar utiliza una fuente de 5v.


----------



## Finskey

Nos mareamos entre nosotros   La alimentación de mi pic viene del usb, entre medio hay un max232 pero eso no tiene nada que ver, Quizás mi puerto este dañado  y de cualquier cosa, lo verificare pero no creo.


----------



## papirrin

pues ya verifique el MOC que tengo y si estas haciendo algo mal, puede ser que tu amperimetro no este midiendo bien...

mira puse un moc alimentado con 5V y una resistencia de 330R y me da con mi amperimetro 11mA

en teoria serian 5-3/330=6mA, asi que la caida de voltaje de este moc no es de 3V, sino de 1,36V
o sea 5-1.36/330=11mA [5-(.011*330)=1.36V]

si yo quisiera que me de unos 8mA, tendria que poner una R de 5-1.36/.008=455R.


----------



## Dr. Zoidberg

Todos los datos del LED del MOC estan en el datasheet Y NO SON LOS QUE APARECEN EN "Absolute Maximun Ratings"!!!!.
Si le meten 20 o mas mA van a quemar el led y el pic...


----------



## Finskey

Bueno verifique la resistencia, la cual da 470 Ohmios, probé mi amperimetro el cual funciona bastante bien ( 1 o 2 ma de diferencia con respecto a lo teórico) y medí la tensión de mi USB , 4.7 voltios.

Creo que ese 1.36 volt corresponde a la imagen que te adjunto. 






Esperare a tener el integrado de optoacopladores PC847 , para poder realizar todas las pruebas, Saludos!


----------



## papirrin

> Creo que ese 1.36 volt corresponde a la imagen que te adjunto.



O si, si perdon me resbale es que me quede con la idea de 3V... entonces lo teorico concuerda con lo practico.



> Bueno verifique la resistencia, la cual da 470 Ohmios, probé mi amperimetro el cual funciona bastante bien ( 1 o 2 ma de diferencia con respecto a lo teórico) y medí la tensión de mi USB , 4.7 voltios.



no entendi, ¿te sigue dando 25mA?, si es asi seguramente ya se quemo, aunque con un resistencia de 470R no debio haberse quemado segun los calculos.

y si le mides la tension al puerto del pic, no vaya a ser que traigas filtrando 12V, con el max232. osea que este mal conectado.


----------



## Finskey

La 3era es la vencida, 6,5 mA , desconozco que estaba haciendo mal ...  Con esta corriente de seguro me sobra para conectarlo junto al opto acoplador. Disculpen las sucesivas molestias


----------



## D@rkbytes

Dr. Zoidberg dijo:


> Todos los datos del LED del MOC están en el datasheet Y NO SON LOS QUE APARECEN EN "Absolute Maximun Ratings"!!!!.


Cierto, yo también usé los valores máximos soportados. Ya me estaba durmiendo. 

En esta parte si están los valores típicos de corriente para el LED:

Para los MOC3010, 11 y 12

Para los MOC3020, 21, 22 y 23


Gracias por la corrección, Dr. 

Ahora si, a aplicar la ley de Ohm correctamente.​


----------



## Finskey

Les comento que voy a sacrificar 2 salidas. Tenia 12 salidas en total, 4 con relay a RF, 4 con potencia en CA, CC y de las otras 4 que me quedan, preferí sacrificar dos.
Éstas ponerlas como entradas digitales con 2 respectivas salidas, éstas entradas digitales estarían opto acopladas y están pensadas para sensores y cualquier circuito que brinde una salida TTL o un cambio de estado.
Esto no es complicado y tengo idea de como hacerlo.
Lo que me gustaría hacer, es meter a la PC entre medio, o sea, que la PC me  pida autorización para prender la salida.

Me gustaría hacerlo más interesante y poder poner un tiempo en que se ponga en HIGH la salida y algún chiche más.
Si no me equivoco, habría que hacer lo siguiente:
En el programa del PIC en BASIC, hacer una condición IF, si detecta HIGH en las entradas digitales del micro hacer un paquete con el comando SEROUT, sacar un dato serial, ingresarlo en la PC, y en Visual Basic realizar la programación correspondiente.
Creo que puedo hacer todo, menos lo de Visual Basic.

Agradecería ideas y consejos. Gracias de antemano.


----------



## Finskey

Compañeros, ya casi termino el proyecto, pero me surgió un problema a último momento el cual no puedo resolver.
Yo añadí dos entradas digitales, las cuales a cada una les corresponde una salida.

La condición para que se prenda la salida consta de dos cosas.
1: Que la entrada esté a "1" Lógico.
2: Que la variable serial ingrese con tal letra (la cual la comando desde un objeto en VB, el cual adjunto).

Cuando tengo las dos entradas conectadas a "1" lógico y mando individualmente cada una desde VB, todo funciona a la perfección, pero cuando desconecto una del "1" lógico, cosa que pasaría normalmente, todo va mal, se me reinicia el micro a veces y otras veces me prende otra salida, la SL1.

No encuentro el error en la programación.
Por favor, si alguien lo encuentra que me avise.
Los programas compilan a la perfección.

PD: Por ahora los 1 lógicos se los doy con una resistencia y un pulsador.
Luego usaré los optoacopladores que se ven en el diagrama.

Saludos!


----------



## papirrin

No lo compile pero fijate en la estructura para que veas una alternativa....



		Código:
	

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 10/05/2014                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
;Programa para control computarizado con Visual Basic
INCLUDE "modedefs.bas"          ;incluyen los modos de comunicación
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
@ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
@ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
@ DEVICE pic16F628A, BOD_ON
@ DEVICE pic16F628A, MCLR_ON ' Master Clear Opción interno
@ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación
@ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF
@ DEVICE pic16F628A, PROTECT_OFF' protección de código OFF

CMCON = 7
TRISA=%0
TRISB=%1100

serial VAR BYTE                 ;variable de almacenamiento de 255     
sec1  VAR BIT                    ;variable sec1 de 1 bit 0 o 1
sec2  VAR BIT                    ;variable sec2 de 1 bit 0 o 1
sec3  VAR BIT                    ;variable sec3 de 1 bit 0 o 1 
sec4  var bit
sec5  var bit
sec6  var bit
sec7  var bit
sec8  var bit
sec9  var bit 
sec10 var bit
sec11 var bit
sec12 var bit


sec1=0                         ;valores iniciales para las variables
sec2=0
sec3=0
sec4=0
sec5=0
sec6=0
sec7=0
sec8=0
sec9=0
sec10=0
sec11=0
sec12=0

  
SL1     VAR porta.6           ;nombre para los pines
SL2     VAR porta.7
SL3     VAR portb.6
SL4     var portb.7
SRF1    var porta.0
SRF2    var porta.1
SRF3    var porta.2
SRF4    var porta.3
ED1     var portb.2
ED2     var portb.3
SD1     var portb.4
SD2     var portb.5
prueba  var porta.4          


LOW prueba
PAUSE 3000
HIGH prueba
LOW prueba
pause 500
high prueba
pause 500
low prueba
pause 500
high prueba
pause 500 
low prueba
pause 1000   ;led para saber si ya arrancó el PIC

Inicio:
 SERIN portb.0,T9600,serial      ;esperar por dato serial y guardarlo
 select case serial
  case "A" 
   IF sec1=0 THEN                 ;bandera para la chicharra 1 On
    HIGH SL1                ;y 0 es OFF
    SEROUT portb.1,T9600,["A"]     ;enviar H diciendo que está prendi
   else
    LOW SL1
    SEROUT portb.1,T9600,["B"]    ;enviar I diciendo que está OFF
   ENDIF
   toggle sec1
  case "B" 
   IF sec2=0 THEN
    HIGH SL2
    SEROUT portb.1,T9600,["C"]     ;envía D diciendo q´ el led es ON
   else
    LOW SL2
    SEROUT portb.1,T9600,["D"]     ;envía E diciendo q´el led es OFF
   eNDIF
   toggle sec2
  case "C"
   IF sec3=0 THEN
    HIGH SL3
    SEROUT portb.1,T9600,["E"]     ;envía G diciendo q´ el relé es ON
   else
    LOW SL3
    SEROUT portb.1,T9600,["F"]     ;envía F diciendo q´ el relé es OFF
   ENDIF
   toggle Sec3
  case "D" 
   IF sec4=0 THEN                 ;bandera para la chicharra 1 On
    HIGH sl4 
    SEROUT portb.1,T9600,["G"]                    ;y 0 es OFF
   else
    LOW SL4
    SEROUT portb.1,T9600,["H"] 
   ENDIF
   toggle sec4
  case "E"
   IF sec5=0 THEN                 ;bandera para la chicharra 1 On
    HIGH  SRF1
    SEROUT portb.1,T9600,["I"]                     ;y 0 es OFF
   else
    LOW   SRF1
    SEROUT portb.1,T9600,["J"] 
   ENDIF
   toggle sec5
  case "F"
   IF sec6=0 THEN                 ;bandera para la chicharra 1 On
    HIGH SRF2
    SEROUT portb.1,T9600,["K"]                   ;y 0 es OFF
   else 
    LOW SRF2
    SEROUT portb.1,T9600,["L"] 
   ENDIF
   toggle sec6
  case "H" 
   IF sec7=0 THEN                 ;bandera para la chicharra 1 On
    HIGH SRF3
    SEROUT portb.1,T9600,["M"]                    ;y 0 es OFF
   else
    LOW  SRF3
    SEROUT portb.1,T9600,["N"] 
   ENDIF
   toggle sec6
  case "I"
   if portb.2 then
    IF sec9=0 THEN                 ;bandera para la chicharra 1 On
     HIGH SD1
     SEROUT portb.1,T9600,["P"]                 ;y 0 es OFF
    else
     LOW SD1
     SEROUT portb.1,T9600,["Q"] 
    ENDIF
    toggle Sec9
   endif
  case "J" 
   if Portb.3 then
    IF sec10=0 THEN                 ;bandera para la chicharra 1 On
     HIGH SD2
     SEROUT portb.1,T9600,["R"]                 ;y 0 es OFF
    else
     LOW SD2
     SEROUT portb.1,T9600,["S"] 
    ENDIF
    toggle Sec10
   endif
 end select
GOTO inicio


lo compilas y si tiene errores me dices... XD

y ponle unas resistencias pull_down a la entradas port b3 y b2


----------



## Finskey

Papirrin, ha compilado sin problemas. Te muestro la conexión que estoy usando para RB2  Y RB3.


----------



## papirrin

es esta la imagen?





si es esa esta bien, te sigue dando problemas?


----------



## Finskey

Sip esa es la imagen. 

He probado y lo de las entradas funciona A LA PERFECCIÓN. donde esta el problema? Al iniciar el circuito ademas de led de prueba, hay 1,2 o 3 salidas que inician prendidas.Varia según la vez que alimentes el circuito, no creo que sea un problema de código ni de los componentes, Sino de los modos de comunicación  en si. Asique seguramente las entradas analogicas  dispararan a las salidas solo con estar en 1 lógico, no los haré pasar por el programa porque seria muy complicado y aparte tampoco tendría mucho sentido hacerlo ... Gracias por tu código papirrin, parece mucho mas prolijo que el mio.


----------



## papirrin

pues nada mas inicializas los puertos en 0

los pones asi:



		Código:
	

CMCON = 7
TRISA=%0
TRISB=%1100

[B]PORTA=0
PORTB=0[/B]

serial VAR BYTE                 ;variable de almacenamiento de 255     
sec1  VAR BIT                    ;variable sec1 de 1 bit 0 o 1
sec2  VAR BIT                    ;variable sec2 de 1 bit 0 o 1
sec3  VAR BIT                    ;variable sec3 de 1 bit 0 o 1


oh y estos ponlos en OFF

@ DEVICE pic16F628A, WDT_OFF 
@ DEVICE pic16F628A, PWRT_OFF 
@ DEVICE pic16F628A, BOD_OFF


----------



## Finskey

Ahora si esta perfecto, espero no molestarte y quiero hacerte unas consultas:

1- TRISA=%0
    TRISB=%1100

???? Se que configura de alguna manera el puerto a y el puerto b.

2- Tienes los significados de los fuses??

3- Algun enlace,libro o documento  donde se desarrolle PBP y ejemplos??

PD: En el programa te comiste la rutina para SRF4 y eso provoco un error en SRF3, ya lo estoy implementando 

Muchas gracias y


----------



## papirrin

Si el registro tris le indica al pic como tomara cada puerto si como entrada 1 o salida 0 , con respecto a las otras preguntas dale una buscada, son temas muy extensos para explicarlos a detalle.


----------



## Finskey

Buenas. Estoy con un problema en mi optoacoplador.
No hay diferencia si conecto o no la tensión de entrada, siempre hay un 1 lógico en el PIC. Es el SHARP PC827
Quería usarlo porque era doble, (2 optos en 1 integrado.)
En la entrada lo alimento con 5 voltios y una resistencia de 330 Ω y en la salida una resistencia de 100 Ω a positivo, emisor a masa y saco señal desde el colector.

Ya que no  funciona ese, quería consultar si éste funcionaba.

Saludos.


----------



## Finskey

Papirrin he encontrado algo curioso en el código, en los casos "i" y "j" se menciona if portb2/b3 , pero no se iguala a nada, no habría que hacerlo? Saludos! mientras probare...


Edit: Ahora se me ocurre que quizás el registro tris, le indica que es una entrada y quizás no hace falta poner if portb2=1 para proseguir la condición ... pero en el caso de que yo quiera que portb2=0 , para que continué la condicion.


----------



## Finskey

Hola buenas noches. 

Sigo trabajando en las entradas. 

Estas entradas las activo con 5 voltios en la entrada de un opto acoplador con una R en serie de 220 ohmios. Pero me gustaría poder activarlas con otros niveles de voltaje, entre 5 y 24 Vdc o 5 y 12Vdc, para ampliar las prestaciones de la interface. He tenido dos ideas:

1- Poner un 7805 a la entrada del opto acoplador. Pero no se activaría con 5 voltios, entonces poner un regulador de 3,3 Voltios 7833 (sino me equivoco)

2- Hacer un estabilizador con diodo zener en la entrada del opto acoplador, usando un zener de 3,3 Votios.

La corriente que necesito es mínima, quería saber si tenían otra idea y cual me recomiendan? Creo que la del zener es mas económica. 

No adjunto esquema porque me parece innecesario, estoy usando un opto acoplador SHARP PC827.
Saludos y muchas gracias. ...


----------



## Finskey

Bueno diseñe ese estabilizador para una entrada de 12 Voltios y activar el opto, pero es imposible que el rango de entrada vaya de 5 a 24 Voltios, Seguire investigando. Saludos.


----------



## Finskey

Haciendo cálculos , poniendo solamente una resistencia de 470 ohms a la entrada del opto acoplador, pueden ingresar señales hasta de 16V. Considere que la resistencia es de 1/2 Watt. Para llegar hasta 24v , se estaría muy cerca de la corriente máxima admitida por el integrado opto acoplador y se requeriría una resistencia de 1,5 Watt. Saludos pronto compartiré  los esquema y la programación!


----------



## papirrin

¿y si pones un esquema completo? porque no se entiende que quieres hacer o por lo menos yo no entiendo.


----------



## Finskey

Ya estoy a medio armado de la placa, cuando termine y pruebe el funcionamiento, compartiré los avances. Saludos


----------

