RobotyPic son proyectos básicos de electrónica con microcontroladores PIC, de aplicación en el mundo de la robótica didáctica, con archivos fuente creados mediante el compilador CCS PIC C COMPILER en lenguajeC.

Control de un PIC desde el PC por el puerto serie con una aplicación Visual Basic

Esta es una variante del artículo publicado para comunicación serie entre PC y PIC. En aquel caso se empleaba el HyperTerminal de windows como software de comunicación.  En este se va a emplear una aplicación exclusiva desarrollada bajo Visual Basic para la comunicación con el PIC. Dispondrá de una serie de botones para encender los led, y otro para la lectura de las entradas en lugar de escribir un comando como se hacía con el HyperTerminal. Todos los conceptos desarrollados en aquel artículo van a ser aplicados aquí, con lo cual remitiré a aquel proyecto para su comprensión.
El programa del PIC sufrirá ligeras variaciones, simplemente porque al tratarse de una aplicación con controles propios, no será necesario escribir comandos, sino pulsar ordenes. En cualquier caso, las funciones del programa funcionarían igualmente, pero los mensajes de texto de comunicación del PIC  con el usuario no serian del todo claros.


Software control PIC por puerto serie


El  programa adaptado a la aplicación para el PIC será entonces el siguiente:

[+/-] Ver / Ocultar programa completo en C


La aplicación Visual Basic es un único archivo ejecutable .exe, con lo cual no requiere de instalación en Windows, sino tan solo ejecutarlo directamente.

Para la ejecución, tras la conexión física entre PC y PIC por uno de los puertos , hay que abrir el programa para Windows. Se deberá elegir el puerto de comunicaciones COM correspondiente. Si el puerto elegido es el correcto, en el momento de poner en marcha el PIC, deberá responder éste con un mesaje de bienvenida visible en la aplicación Windows. Será el testigo de que la comunicación se ha establecido. Tras esto, ya se podrá interactuar entre PIC y PC.

En el otro artículo dedicado a la comunicación serie se mostraba un video de la simulación. En este caso se va a mostrar un video del proyecto físico.  Circuito que, por otro lado, seria el mismo para ambas variantes.







El código Visual Basic está desarrollado bajo vb6. En esta imagen se muestra el formulario de edición con los nombres de los controles para la comprensión del código mostrado más abajo.




[+/-] Ver / Ocultar código Visual Basic



El proyecto contenido en el artículo ha sido diseñado y probado con éxito utilizando las siguientes versiones de software:
- Windows xp y windows 7
- Proteus V7.7 SP2
- CCS PIC C COMPILER v4.084








14 comentarios:

Unknown dijo...

hola buen dia te felicito por tu programa esta genial, quisiera saber si me pudieras asesorar tengo un proyecto de alarmas pero tengo problemas al mandar mi dato del pic a visual basic lo que necesito es que al presionar un boton me encienda un led en visual basic pero no se como hacerlo ojala y me pudieras ayudar y felicidades por tu blog

Robotypic dijo...

Debes mandar un carácter o una cadena de caracteres desde el PIC mediante la sentencia printf. Por ejemplo:
Printf(“%c”, caracter);
El dato contenido en “caracter” lo envía al PC por el puerto serie. Puedes enviar datos enteros, decimales, etc., pero el PC los reconocerá como cadenas de caracteres.
En el visual Basic, cada vez que se reciba alguna información procedente del PIC por el puerto serie ejecutará la función; Private sub MScomm1_OnCom().
Dentro de esta función debes obtener la información enviada por el PIC mediante recibido = MsComm1.Input. En la variable “recibido” se te almacenará la información enviada por el PIC y debe estar dimensionada como string. Si se trataba de un número deberás pasarlo de nuevo a un valor numérico con val( ).
Si lo que quieres es reconocer un botón pulsado puedes hacer que cuando éste cambie su estado envíe su nuevo estado como 1 ó 0 al PC.

Unknown dijo...

muchas gracias por tu respuesta me ha servido de mucho y afortunadamente ya pude hacerlo ahora solo tengo problemas en el montaje físico ya que al conectarme no me manda nada de señal virtual todo funciona al 100 pero físico no alguna recomendación que me pudieses dar. si gustas te adjunto mi archivo pero no se como gracias por tu tiempo.

Robotypic dijo...

¿Has configurado la conexión RS232 en visual basic? En el momento de conectar o al cargar el formulario visual basic:

With Mscomm1
.CommPort = 1
.Handshaking = 2 - comRTS
.RThreshold = 1
.RTSEnable = True
.Settings = "9600,n,8,1"
.SThreshold = 1
End With

Unknown dijo...

te paso mi codigo de basic y si tienes alguna forma de mandarte mis archivos te los paso, el codigo es este:

Dim a As Integer

Private Sub Form_Load()

MSComm1.RThreshold = 1
MSComm1.InputLen = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.DTREnable = False
End Sub

Private Sub Command1_Click()
MSComm1.CommPort = Text2.Text
MSComm1.PortOpen = True
End Sub


Private Sub MSComm1_OnComm()
Dim Data As String

If MSComm1.CommEvent = comEvReceive Then
Data = MSComm1.Input
End If

If Data = "A" Then
Picture1 = LoadPicture(VB.App.Path & "\pics\2.jpg")
End If
If Data = "B" Then
Picture1 = LoadPicture(VB.App.Path & "\pics\1.jpg")
End If

Unknown dijo...

hola de nuevo otra vez molestándote una duda ya revise mi código de visual y cambie la configuración como me lo propones pero sigo igual crees que pueda ser la config. de mi programa? te dejo el código a ver si lo pudieses revisar y ayudarme.

#include <18f4550.h>
#fuses XT,NOLVP, NOCPD,NOPROTECT,NOWDT
#use delay(crystal=10000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


#use standard_io(a)
#use standard_io(b)
#use standard_io(c)
#use standard_io(d)

#define ENTRADA1 PIN_A0
#define ENTRADA2 PIN_A1
#define ENTRADA3 PIN_A2
#define ENTRADA4 PIN_A3
#define ENTRADA5 PIN_A4
#define ENTRADA6 PIN_A5
#define ENTRADA7 PIN_B0
#define ENTRADA8 PIN_B1
#define ENTRADA9 PIN_B2
#define ENTRADA10 PIN_B3
#define ENTRADA11 PIN_B4
#define ENTRADA12 PIN_B5
#define ENTRADA13 PIN_B6
#define ENTRADA14 PIN_B7


void BOTON1() //este prende un led aparte
{
IF(INPUT(PIN_A0)==1)
{
OUTPUT_HIGH(PIN_D0);}
ELSE{
OUTPUT_LOW(PIN_D0);
}
}

void BOTON2(){ //este es para visual

IF(input(ENTRADA2)){

puts("C");
}
ELSE {

puts("D");
}
}

void BOTON3(){

IF(input(ENTRADA3)){

puts("E");
}
ELSE {

puts("F");
}
}

void BOTON4(){

IF(input(ENTRADA4)){

puts("G");
}
ELSE {

puts("H");
}
}

void BOTON5(){

IF(input(ENTRADA5)){

puts("I");
}
ELSE {

puts("J");
}
}

void BOTON6(){

IF(input(ENTRADA6)){

puts("K");
}
ELSE {

puts("L");
}
}

void BOTON7(){

IF(input(ENTRADA7)){

puts("M");
}
ELSE {

puts("N");
}
}

void BOTON8(){

IF(input(ENTRADA8)){

puts("O");
}
ELSE {

puts("P");
}
}

void BOTON9(){

IF(input(ENTRADA9)){

puts("Q");
}
ELSE {

puts("R");
}
}

void BOTON10(){

IF(input(ENTRADA10)){

puts("S");
}
ELSE {

puts("T");
}
}

void BOTON11(){

IF(input(ENTRADA11)){

puts("U");
}
ELSE {

puts("V");
}
}

void BOTON12(){

IF(input(ENTRADA12)){

puts("W");
}
ELSE {

puts("X");
}
}

void BOTON13(){

IF(input(ENTRADA13)){

puts("Y");
}
ELSE {

puts("Z");
}
}

void BOTON14(){

IF(input(ENTRADA14)){

puts("Ñ");
}
ELSE {

puts("a");
}
}


void main(void)
{

For(;;){
DELAY_MS(500);
BOTON1();
BOTON2();
BOTON3();
BOTON4();
BOTON5();
BOTON6();
BOTON7();
BOTON8();
BOTON9();
BOTON10();
BOTON11();
BOTON12();
BOTON13();
BOTON14();
}
}

Robotypic dijo...

Si la simulación te funciona es que los programas te funcionan. Lo que debes revisar es el montaje físico.

Unknown dijo...

disculpa me podrias ayudar, a la hora de correr el programa en el pic solo manda esto ?????????, sabras que causa esto, ya revise todo

Robotypic dijo...

Iván.
Debes asegurarte que la velocidad de transmisión entre PIC y PC es la misma.
Tambien puede ocurrir si la frecuencia indicada en
#use delay(clock=4000000)
no corresponda con la utilizada con el cristal oscilador, o en el caso de una simulación en proteus no hayas configurado la velocidad correcta de este.

En cualquier caso, tu problema creo viene originada por una no correspondencia de velocidades en la transmisión-recepción de los dispositivos o mala configuración del dispositivo visor de puerto serie.

Unknown dijo...

Gracias por tu rapida respuesta, de hecho la simulación corre muy bien, el problema es el fisico, ya revise las conexiones y estoy utilizando un convertidor y ya lo he utilizado antes y funciona correctamente ya comprobe el cristal y es de 4 mhz, aun asi sigo recibiendo los signos de interrogación ????? , tambien ya lo probe en diferentes velocidades para ver si recibía respuesta pero nada. Gracias por ayudar :D

Ruben's Bloggers dijo...

Hola, podrias subir un archivo comprimido con principalmente la interfaz en vb por favor.
thanks :)

MaNu dijo...

Hola, te felicito por el trabajo que haces. Quisiera que expliques como hiciste para que mediante el ComboBox puedas escoger el numero de puerto serial correspondiente para la comunicación. Gracias

Robotypic dijo...

Manu. La conexión del valor elegido por el combobox la tienes en el artículo, en el procedimiento conectar_click. Y en las propiedades del combobox, en la propiedad list, debes poner la lista de puertos que quieras que te aparezcan durante la ejecución del programa al desplegar la lista.

Kike dijo...

Alguien lo hizo en netbeans?

Related Posts Plugin for WordPress, Blogger...

CONTACTA - (Haz referencia del artículo sobre el que trata la consulta o comentario)