TODOPIC
Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: smartpic1.2 en 12 de Junio de 2013, 19:52:03
-
Buenas tardes, he realizado una interface muy elemental en VB.Net para probar el funcionamiento del circuito (16F877A y en MikroC) lo que hace volcar el dato recibido en buffer del PIC al puerto D, lo he probado en la tierra prometida virtual(PROTEUS) y me funciona sin incovenientes pero al implementarlo en fisico funciona bien pero de manera aleatoria la interfaz me envía caracteres que no he programado, es decir si pulso un boton "GIRAR 0°" segun lo programado debe enviar por el puerto serial el caracter "1" contenida en la variable servo y luego el PIC lo recibe lo compara y ejecuta la acción programada para esto si son iguales , por el momento tengo conectado un LCD para poder visualizar lo que estoy recibiendo y fue ahi donde me di cuenta que la presionar varias veces el boton"GIRAR 0°" recibo en el PIC los valores ASCII 49 (lo que es correcto para el caracter 1 programado en la interfaz) pero tambien recibo 190, 250, 240 de forma aleatoria, lo curioso es que si envio los datos de control "GIRAR 0°" (1), GIRAR 90°(2), GIRAR 180°(3) desde el hyperterminal funciona sin errores de igual manera si lo ejecuto del monitor serial del mismo MikroC, si me pudieran orientar en la resolución de este problema. Adjunto el programa en VB.NET y la programacion en MikroC
PD: La idea es controlar unos 4 servomotores, lo estoy haciendo por partes y verificando el correcto funcionamiento de cada una de ellas y despues agregarle un control por RF.
Por que todo lo referente a VB siempre esta en VB.6 y en .NET
Programacion en VB.NET
Imports System.IO
Imports System.IO.Ports
Imports System.Threading
Public Class Form1
Dim a As Boolean
Dim servo As Byte
Dim manual As Byte
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SerialPort1.Close()
SerialPort1.PortName = "com14" ' Cambia el Puerto por que el este disponible según el COM libre
SerialPort1.BaudRate = 9600
SerialPort1.DataBits = 8
SerialPort1.Parity = Parity.None
SerialPort1.StopBits = StopBits.One
SerialPort1.Handshake = Handshake.None
SerialPort1.Encoding = System.Text.Encoding.Default
End Sub
Private Sub GroupBox1_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox1.Enter
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
a = False
SerialPort1.Open()
servo = 1
SerialPort1.Write(servo)
TextBox1.Text = (" GIRO A LA IZQUIERDA")
SerialPort1.Close()
manual = 7
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
a = False
SerialPort1.Open()
servo = 3
SerialPort1.Write(servo)
TextBox1.Text = " GIRO A LA DERECHA" '
SerialPort1.Close()
manual = 25
End Sub
Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
If a = True Then
SerialPort1.Open()
SerialPort1.Write(manual)
SerialPort1.Close()
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
a = False
SerialPort1.Open()
servo = 2
SerialPort1.Write(servo)
TextBox1.Text = " EJE EL CENTRO"
SerialPort1.Close()
manual = 16
End Sub
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
End Sub
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
If manual > 7 Then
manual = manual - 1
TextBox1.Text = manual * 10
a = True
End If
End Sub
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
If manual < 25 Then
manual = manual + 1
TextBox1.Text = manual * 10
a = True
End If
End Sub
End Class
programacion en mikroC
//declarar variables del funcionamiento de la LCD
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
unsigned DATO_RECIBIDO; // dimension del variable donde se almacenara lo que lea del puerto serial
char txt1[] = "DATO RECIBIDO:";
char txt2[8];
void main() {
portd=0;
trisd= 0; //puerto D como salida
//delay_ms(500);
portd=0;
Lcd_Init(); // Inicializo la LCD
Lcd_Cmd(_LCD_CLEAR); // borro la LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // apago cursor
Lcd_Out(1,1, txt1); //escribo DATO RECIBIDO
//inicio de la comunicacion serial
UART1_Init(9600); // Inicializo la UART 9600 bps
Delay_ms(100); //tiempo de la estabilizacion
while (1) { // ciclo de lectura de datos
if (UART1_Data_Ready()) { // si hay datos en el buffer del pic
DATO_RECIBIDO = UART1_Read(); // los leeo y los guardo en la variable DATO_RECIBIDO
}
switch (DATO_RECIBIDO){
case 49: portd=60; break; //evaluo si el DATO_RECIBIDO es igual a 65 y si es true ejecuto portd=60
case 50: portd=125; break; //evaluo si el DATO_RECIBIDO es igual a 66 y si es true ejecuto portd=125
case 51: portd=255; break; //evaluo si el DATO_RECIBIDO es igual a 67 y si es true ejecuto portd=255
}
wordToStr(DATO_RECIBIDO, txt2); //convierto a string los datos recibidos para mostrarlo en la LCD
Lcd_Out(2,3,txt2);
}
}
-
Hola Smartpic
¿Podrias poner lo que tenes (codigo del PIC, codigo en Visual Basic, esquema, etc.) en un archivo comprimido (RAR, ZIP) y subirlo?
Fijate tambien que cuando escribis en el editor del site (donde estan los iconos, los tipos de letras, etc) hay un control con un simbolo # que es para insertar codigo (mas o menos debajo de la A roja.
Aca va tu codigo
Yo prefiero bajar los archivos y verlos, en lugar de andar subiendo y bajando (porque si es muy largo el codigo, el control te pone una barra de desplazamiento) ;-)
Antes que te rete algun moderador, te lo cuento yo. :smiley:
Saludos.
-
Darkman_A , gracias por la recomendación, adjunto los archivos.
-
Darkman_A , gracias por la recomendación, adjunto los archivos.
Hola smartpic. Buenos dias.
Estoy mirando los archivos.
Si tengo novedades te aviso.
Saludosl
-
Hola smartpic.
Por lo que interprete de tu primer mensaje es que probaste con el hiperterminal, en reemplazo de tu programa, y el PIC. No se si lo hiciste, pero porque no probas con tu programa y el hiperterminal en reemplazo del PIC. O sea:
"Programa en VB" <-------> "Hiperterminal"
Para ver que recibis. Para esta prueba vas a necesitar un cable null modem (RS232 cruzado).
Saludos.
-
hola Darkman_A gracias por el apoyo, he probado lo que me comentas pero de manera virtual, es decir realizo la conexion VB.NET con el HYPERTERMINAL mediante el VSPE (virtual serial) y me funciona bien, recibo los caracteres programados sin problemas. Lo que no me queda muy claro es si el HYPERTERMINAL tiene predeterminado alguna configuracion que desconzco es decir en mi programa en VB no envio cararteres como CL y CR, la falta de esto afectará en el funcionamiento del circuito otra cosa se me ocurre es cuando lo simulo en PROTEUS tampoco me falla cuando lo pruebo con mi interfaz en VB, en PROTEUS como es que configura por defecto la comunicación con el COMPIM o algún detalle que no logro todavía vislumbrar :cry:.
-
hola Darkman_A gracias por el apoyo, he probado lo que me comentas pero de manera virtual, es decir realizo la conexion VB.NET con el HYPERTERMINAL mediante el VSPE (virtual serial) y me funciona bien, recibo los caracteres programados sin problemas. Lo que no me queda muy claro es si el HYPERTERMINAL tiene predeterminado alguna configuracion que desconzco es decir en mi programa en VB no envio cararteres como CL y CR, la falta de esto afectará en el funcionamiento del circuito otra cosa se me ocurre es cuando lo simulo en PROTEUS tampoco me falla cuando lo pruebo con mi interfaz en VB, en PROTEUS como es que configura por defecto la comunicación con el COMPIM o algún detalle que no logro todavía vislumbrar :cry:.
Hola smartpic.
Ya habias comentado que en el simulador te andaba, pero que en "la vida real" no funcionaba, entonces ....... tenes que probar en la "vida real", porque sino siempre vas a estar en la misma. Me a pasado de tirar 2 cables exactamente iguales, uno al lado del otro (para unas terminales que usaban coneccion serie), uno me andaba y el otro no.
Asi que amigo, a arremangarse y a luchar con circuitos y cables, no te queda otra. Por mas que sea un error en tu programa vas a tener que probarlo con el circuito real, salvo que no lo quieras implementar (metes todo en un DVD y a otra cosa).
Te cambio el tema. No creo que sea el LF y CR (salto de line, retorno de carro). Si tu programa no lo envia Hiperterminal no lo interpreta. Por ejemplo, si vos le envias 3 veces seguido la palabra HOLA desde tu programa, Hiperterminal mostraria HOLAHOLAHOLA. Solo eso. No hace el salto de carro.
Yo te dije que probaras con eso y no sabia si contabas con 2 equipos. Luego de postear lo pense. Fijate si algun amigo o familiar te puede prestar alguno para hacer las pruebas. De paso te cuento que hay algunos programas terminales mejor que Hiperterminal porque te muestra mas informacion. Por ejemplo si le mandas caracteres no imprimibles como LF y CR te los muestra con un simbolo o una palabra. No recuerdo el nombre de ninguno, pero si buscas en la red seguro que encontras varios. El ultimo que use era en DOS. Estan buenos para depurar, yo lo he utilizado para ver el protocolo entre 2 equipos series.
Hasta ahora no he visto nada extraño en tu programa. Lo unico que encotre, que no creo que haga nada y es solo un detalle de programacion es que abris el puesto, luego definis variables o generas un mensaje (que no tiene nada que ver con lo que vas a hacer ) y luego seguis con el puerto. Esas cosas las podes hacer antes o despues. Abris el puesto, envias lo que tengas que enviar, cerras el puerto. Hace como mas te guste, es una mania mia. Creo que es mas ordenado.
Saludos.
Edito:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
a = False
servo = 2
TextBox1.Text = " EJE EL CENTRO"
SerialPort1.Open()
servo = 2
SerialPort1.Write(servo)
TextBox1.Text = " EJE EL CENTRO"
SerialPort1.Close()
manual = 16
Es cuestion de gustos.
-
Hola Darkman_A, te cuento que realice el mismo programa en VB6.0 y funciono sin problemas, todavía no me queda claro que puede estar fallando en mi programa en VB.NET, ahora buscando en internet y algunos libros que tengo actuales de programación (2012 y 2011) la interfaz con el micro lo hacen siempre en VB 6.0, mi pregunta es por que no lo hacen en VB.NET si es mas moderno. Gracias por el apoyo.
-
He estado trabajando con Visual Basic .net y va de maravilla mucho mas facil que con VB6 a mi parecer los equipos nuevos ya no corren VB6, saludos