TODOPIC
Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: cocibolca en 14 de Diciembre de 2007, 19:47:22
-
PROBLEMAS CON MSCOMM DE VISUAL BASIC:
Hola amigos de TODOPIC, les envio este mensaje con el propósito de pedirles su ayuda con un problema que tengo en este momento con la elaboracion de un proyecto, que hace uso de una interfaz grafica implementada en Visual Basic 6.0 para transmitir ordenes por el puerto RS-232. Esta interfaz sera capaz de controlar el apagado o encendido de 8 cargas, con ayuda de un PIC 16F84A, los integrados MAX232 y el ULN2803. Este ultimo amplificara la corriente que el PIC proporciona para activar unos reles.
Mi principal problema en este momento radica en que no se como hay que acondicionar la orden a transmitir para que sea procesada adecuadamente por el pic, por ejemplo: si quiero encender la primera y las dos ultimas cargas , y apagar el resto tendría que enviar por el puerto RS232 el siguiente dato (10000011), es decir como hay que declarar mi variable?,
Como puedo hacer para activar o desactivar una o mas cargas sin alterar el estado de las que no quiero alterar?, ya que con el programa en Visual Basic que tengo en este momento solo puedo apagar o encender una carga a la vez, es decir solo puedo tener una de las ocho carga encendida.
PARA LA INTERFAZ GRAFICA ESTOY UTILIZANDO EL MSCOMM Y OCHO BOTONES QUE SIMULAN LOS INTERRUPTORES DE LAS OCHO CARGAS.
Espero, que puedan ayudarme o aconsejarme sobre este problema, les estare muy agradecido.
MUCHAS GRACIAS!!!!
ATTE: COCIBOLCA :)
-
Cada vez que pulses un determinado botón se mandará un grupo de 8 bits con la única modificación del bit que desees cambiar. ¿Como tienes el programa?
-
Hola a todos amigos de TODOPIC, mi código fuente en visual basic para la simulación de interruptores de las cargas es el siguiente. Si notan algún error en la programación por favor haganmelo saber se los agradeceré, aunque al momento de depurarlo no obtuve errores. Adjunto también el programa ejecutable en Visual Basic 6.0 :) :?
Private Sub Carga1_Click()
If MSComm1.PortOpen = True Then
Dim a(1) As Byte
a(1) = 128
MSComm.Output = a
End If
End Sub
Private Sub Carga2_Click()
If MSComm1.PortOpen = True Then
Dim b(1) As Byte
b(1) = 64
MSComm.Output = b
End If
End Sub
Private Sub Carga3_Click()
If MSComm1.PortOpen = True Then
Dim c(1) As Byte
c(1) = 32
MSComm.Output = c
End If
End Sub
Private Sub Carga4_Click()
If MSComm1.PortOpen = True Then
Dim d(1) As Byte
d(1) = 16
MSComm.Output = d
End If
End Sub
Private Sub Carga5_Click()
If MSComm1.PortOpen = True Then
Dim e(1) As Byte
e(1) = 8
MSComm.Output = e
End If
End Sub
Private Sub Carga6_Click()
If MSComm1.PortOpen = True Then
Dim f(1) As Byte
f(1) = 4
MSComm.Output = f
End If
End Sub
Private Sub Carga7_Click()
If MSComm1.PortOpen = True Then
Dim g(1) As Byte
g(1) = 2
MSComm.Output = g
End If
End Sub
Private Sub Carga8_Click()
If MSComm1.PortOpen = True Then
Dim h(1) As Byte
h(1) = 1
MSComm.Output = h
End If
End Sub
Private Sub Check1_Click()
End Sub
Private Sub Conectar_Click()
'comprueva que el puerto este cerrado para poder abrirlo
If MSComm1.PortOpen = False Then
'determina el puerto que seleccionado
MSComm1.CommPort = 1
MSComm1.PortOpen = True
Else
MSComm1.CommPort = 2
End If
'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"
'lee todo el buffer de entrada para que quede vacio
MSComm1.InputLen = 0
'Abre el puerto seleccionado
MSComm1.PortOpen = True
Me.Caption = "Conectado por el puerto " & MSComm1.CommPort
End Sub
Private Sub Desconectar_Click()
If MSComm1.PortOpen Then
'cierra el puerto
MSComm1.PortOpen = False
Me.Caption = "Desconectado"
End If
End Sub
Private Sub parogeneral_Click()
If MSComm1.PortOpen = True Then
Dim enviar(1) As Byte
enviar(1) = 0
MSComm.Output = enviar
End If
End Sub
-
Perdona cuando dije bits, quería decir bytes.
Si quieres poner a 1 las salidas 0 y 7 podrías enviar la cadena "1******1". Si ahora quieres poner a 0 la salida 7, "0*******". El PIC receptor hará caso únicamente de aquellas posiciones que sean 0 ó 1.
Un saludo
-
es mas facil asi mira:
pones uno de estos cuadros (ya me acorde, se llaman frames) y pones 8 casillas de activacion (de esas cuadradas ( checkbox ))
y luego un boton que diga "actualizar"
Al apretar el boton actualizar revisas cada una de las casillas
quedaria algo asi
---- boton actualizar fue presionado -----
if checkbox1.value = true then
caracter_salida = 1
else
caracter_salida = 0
end if
if checkbox2.value = true then
caracter_salida = caracter_salida + 2
end if
if checkbox3.value = true then
caracter_salida = caracter_salida + 4
end if
if checkbox4.value = true then
caracter_salida = caracter_salida + 8
end if
if checkbox5.value = true then
caracter_salida = caracter_salida + 16
end if
if checkbox6.value = true then
caracter_salida = caracter_salida + 32
end if
if checkbox7.value = true then
caracter_salida = caracter_salida + 64
end if
if checkbox8.value = true then
caracter_salida = caracter_salida + 128
end if
Mscomm1.output = caracter
y listo.
no se si s entiende...
-
Gracias RODRICITY, tu idea me parece genial, empezare a programar tomando en cuenta tu util sugerencia, mas luego adjuntare en este sitio el ejecutable en visual basic haciendo uso del frame y los checkboxs. Aunque hay algo que no tengo claro con respecto a la variable caracter_salida, es decir ¿Esta variable actua como un acumulador?, ademas, al momento de que se sumen los valores en el caso de que el estado de dos o mas CHECKBOXS sean verdaderos, ¿ No enviara un valor distinto al deseado? . Espero me aclares estas dudas, de nuevo gracias por tu ayuda.
SALUDOS!!! :) :-/
-
Para los interesados, les adjunto el lenguaje ensamblador que tendra el PIC para recibir la orden del puerto serial RS-232
Cualquier sugerencia, sera bienvenida.
SALUDOS!!! :D
-
Hola. Te adjunto cómo haría yo para procesar lo que necesitás.
-
Gracias BrunoF, por molestarte y por haber dedicado una parte de tu valioso tiempo en realizar la programacion que adjuntastes, ya descargue tus utiles sugerencias y en este momento estoy realizando la simulacion con el MPLAB, de nuevo GRACIAS!!!
Luego, publicare mis resultados y los posibles problemas que surgieron en el proceso. :)
SALUDOS!!! :-/
-
Hola a todos amigos de TODOPIC, gracias a la colaboración de ustedes he avanzado mucho en la elaboracion de mi proyecto, sin sus utiles sugerencias y aclaraciones en este momento estaría perdido. En especial quiero agradecer a RODRICITY y a BrunoF, por haberse molestado en responder a mis dudas. Les adjunto el programa en Visual Basic que fue proporcionado por BrunoF, pero con unas pequeñas modificaciones, ya que este contiene el comando MSComm.
Luego les informare sobre el desarrollo final del proyecto.
SALUDOS!!! :)
-
Hola a todos, como novedad para el proyecto, es que he tenido problemas a la hora de querer enviar el dato por el puerto RS232, me manda un error, diciendo que la variable no ha sido declarada. A continuacion les muestro el codigo fuente.
Option Explicit
Dim Salida As Byte
Private Sub CmdGo_Click()
Dim i As Integer
Salida = 0
For i = Chk.LBound To Chk.UBound
Salida = Salida + Chk(i).Value * 2 ^ i
Next
'Salida contiene el valor a enviar
MsgBox Salida
End Sub
Private Sub ENVIAR_Click()
MSComm1.Settings = "9600,N,8,1"
MSComm1.CommPort = 1
MSComm1.PortOpen = True
Dim Salida As Byte
MSComm1.Output = Salida
End Sub
Private Sub conectar_Click()
'comprueva que el puerto este cerrado para poder abrirlo
If MSComm1.PortOpen = False Then
'determina el puerto que seleccionado
MSComm1.CommPort = 1
MSComm1.PortOpen = True
Else
MSComm1.CommPort = 2
End If
'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"
'lee todo el buffer de entrada para que quede vacio
'Abre el puerto seleccionado
Me.Caption = "Conectado por el puerto " & MSComm1.CommPort
End Sub
Private Sub Desconectar_Click()
If MSComm1.PortOpen = True Then
'cierra el puerto
MSComm1.PortOpen = False
Me.Caption = "Desconectado"
End If
End Sub
Private Sub Form_Load()
Dim i As Integer
'Insertar números a los pulsadores
For i = Chk.LBound To Chk.UBound
Chk(i).Caption = i
Next
End Sub
Private Sub MSComm1_OnComm()
MSComm1.Settings = "9600,N,8,1"
Select Case MSComm1.CommEvent
' Controlar cada evento o error escribiendo
' código en cada instrucción Case
' Errores
Case comBreak ' Se ha recibido una interrupción.
Case comEventFrame ' Error de trama
Case comEventOverrun ' Datos perdidos.
Case comEventRxOver ' Desbordamiento del búfer
' de recepción.
Case comEventRxParity ' Error de paridad.
Case comEventTxFull ' Búfer de transmisión lleno.
Case comEventDCB ' Error inesperado al recuperar DCB.
' Eventos
Case comEvCD ' Cambio en la línea CD.
Case comEvCTS ' Cambio en la línea CTS.
Case comEvDSR ' Cambio en la línea DSR.
Case comEvRing ' Cambio en el indicador de
' llamadas.
Case comEvReceive ' Recibido nº SThreshold de
' caracteres.
Case comEvSend ' Hay un SThreshold
' caracteres en el búfer
' de transmisión.
Case comEvEOF ' Se ha encontrado un carácter
' EOF en la entrada.
End Select
End Sub
-
Setear tantas veces la configuración y apertura del puerto no es lo óptimo. Te puede fallar....
En este sub:
Private Sub ENVIAR_Click()
MSComm1.Settings = "9600,N,8,1"
MSComm1.CommPort = 1
MSComm1.PortOpen = True
Dim Salida As Byte
MSComm1.Output = Salida
End Sub
Salida está declarada como variable global, por lo que exíste dentro de todo el Formulario. Entonces, eliminá la línea "Dim Salida As Byte"
Saludos!
-
Tenias toda la razon BrunoF, al momento de depurar el programa no hubo errores, dado que la variable Salida, ya estaba declarada previamente. Debo aclarar que al momento de enviar la variable Salida con el comando MScomm.Output, me enviaba un error, ya que, como averigue posteriormente, el MScomm, solo reconoce y envia variables del tipo Chr, por lo tanto realice una pequeñan correccion antes de enviar el dato:
Private Sub ENVIAR_Click()
MSComm1.Output = Chr(Salida)
End Sub
De esta forma el Mscomm.Output, asocia el valor en Byte de Salida con su equivalente en ASII, y listo, no hubo problemas. Gracias a la valiosa colaboracion de ustedes, he resuelto uno los principales problemas que imponia mi proyecto.
En este momentto estoy trabajando con la recepcion del PIC16F84A, hasta el momento no he tenido resultados pero sigo en el intento.
Gracias!!!
saludos.