Beruflich Dokumente
Kultur Dokumente
Ampliacin de contenidos
Introduccin
En este tema se desarrollan varios proyectos de comunicacin por el puerto
serie COM RS232 de un PC y un PIC16F84A. El PIC se programa en ASM con
MPLAB. Los programas de comunicacin en el PC se desarrollan bajo Windows
con Borland C++ Builder 6 Enterprise y el componente TComPort.
Para comprobar los proyectos mediante simulacin en el PC necesitamos:
Aplicaciones que utilicen el puerto serie, en nuestro caso en C++.
2 pares de puertos serie virtuales interconectados.
Proteus 7.7 SP2 con el componente COMPIM.
http://perso.wanadoo.es/pictob/picrs232cpp.htm
1/25
30/5/2015
Podemos ejecutar ELTIMA VSP desde el men Inicio / Eltima Software / Virtual
Serial Port Driver / Configure Virtual Serial Port Driver.
2/25
30/5/2015
Archivos necesarios
Los archivos necesarios se descargan de:
picpcrs232cpp/01.rar
picpcrs232cpp/02.rar
picpcrs232cpp/03.rar
picpcrs232cpp/picmonitor.rar
Los descargamos y creamos un directorio de trabajo, por ejemplo, c:\picpc\,
dentro descomprimimos los archivos.
Cada proyecto contiene, al menos:
Archivos fuente y ejecutables para Borland C++ Builder 6. Es necesario
tener instalado Borland C++ Builder 6 si se desea trabajar con los
ejemplos. En Borland debe incluirse el componente TComport. A destacar
que en las ltimas versiones de Borland parece que no puede utilizarse el
componente TComport.
Un archivo DSN de Proteus con el PIC y el programa HEX listo para su
simulacin. Es necesario tener instalado Proteus 7.7 SP2.
El proyecto en MPLAB con el ASM del PIC. Es necesario tener instalada
MPLAB 8.5 o superior.
La estructura de directorios de prg/picpcrs232cpp es:
picpcrs232cpp\
\01\("Hola mundo" del PIC al PC)
\cpp_a\
\cpp_b\
\cpp_c\
\mplab\
\proteus\
\02\(Salida PIC 1 bit de 8)
\cpp_a\
\cpp_b\
\mplab\
\proteus_a\
\proteus_b\
\03\(Salida PIC 8 bits)
\cpp_a\
\cpp_b\ (Con DTR/DSR)
\cpp_c\
\mplab\
http://perso.wanadoo.es/pictob/picrs232cpp.htm
3/25
30/5/2015
\proteus_a\
\04\(Entrada PIC 4 bits)
por terminar
01cpp_a
El PIC enva un "Hola mundo" al PC. Se trata de un programa en C++ para
recibir por el puerto de comunicaciones serie COM de un PC el mensaje ASCII
"Hola mundo" desde un PIC cada vez que este se reinicia, basado en el
"Ejemplo 1. Enviar un mensaje del PIC al PC". Los archivos de este proyecto
son: 01\cpp_a\, 01\mplab\ y 01\proteus\.
Interface del programa:
4/25
30/5/2015
Programar botones
Doble click en botn "Configurar":
//-------------------------------------------------------------------------void __fastcall TForm1::ButtonConfigurarClick(TObject *Sender)
{
ComPort1->ShowSetupDialog();
}
//-------------------------------------------------------------------------Doble click en botn "Abrir":
//-------------------------------------------------------------------------void __fastcall TForm1::ButtonAbrirClick(TObject *Sender)
{
ComPort1->Open();
}
http://perso.wanadoo.es/pictob/picrs232cpp.htm
5/25
30/5/2015
}
//-------------------------------------------------------------------------Prueba del programa
Salvamos todo con
Compilamos con F9 o
http://perso.wanadoo.es/pictob/picrs232cpp.htm
6/25
30/5/2015
http://perso.wanadoo.es/pictob/picrs232cpp.htm
7/25
30/5/2015
Al iniciar el PIC o cada vez que se pulse el pulsador de reset se enviar el texto
"Hola mundo".
Al simular el esquema debe aparecer el componente COMPIM as:
http://perso.wanadoo.es/pictob/picrs232cpp.htm
8/25
30/5/2015
Si hay algn problema, como que el puerto est abierto por otra aplicacin, el
COMPIM aparece as:
Podemos ejecutar ELTIMA VSP desde el men Inicio / Eltima Software / Virtual
Serial Port Driver / Configure Virtual Serial Port Driver para comprobar que
aplicacin tiene abierto el puerto:
http://perso.wanadoo.es/pictob/picrs232cpp.htm
9/25
30/5/2015
10/25
30/5/2015
01cpp_b
Si en el programa desarrollado en "01cpp_a" pulsamos el botn Abrir antes de
configurar el puerto puede aparecer un error:
01\cpp_a_prac
lo
renombraremos
como
11/25
30/5/2015
12/25
30/5/2015
Conviene incluir un LED que indique que el puerto est abierto. Para ello
insertamos un
. Y en FormCreate ponemos:
13/25
30/5/2015
01cpp_c
En este caso vamos a utilizar un nico botn para abrir y cerrar el puerto.
Copiamos la carpeta 01\cpp_b_prac y la renombramos como 01\cpp_c_prac.
Primero borramos el cdigo asociado a ButtonCerrar. Despus borramos el
botn seleccionndolo y dndole a la tecla suprimir (seguir este orden o
quedarn referncia del botn que deberemos borrar a mano en el cdigo de
cabecera (.h) asociado a la unidad que estamos programando.
En ButtonAbrir ponemos:
//-------------------------------------------------------------------------void __fastcall TForm1::ButtonAbrirClick(TObject *Sender)
{
if (ComPort1->Connected)
{
ComPort1->Close();
}else
{
try {
ComPort1->Open();
}
catch( ... ) {
ShowMessage("Error al abrir puerto. Comprueba la
configuracin y que est disponible");
ButtonAbrir->Enabled = false;
}
}
}
//-------------------------------------------------------------------------En FormCreate eliminamos ButtonCerrar->Enabled = false;
Vamos a utilizar los eventos ComPort1AfterOpen y ComPort1AfterClose para
controlar el botn Abrir y Configurar:
//-------------------------------------------------------------------------void __fastcall TForm1::ComPort1AfterOpen(TObject *Sender)
{
ButtonAbrir->Caption = "Cerrar";
ButtonConfigurar->Enabled = false;
}
http://perso.wanadoo.es/pictob/picrs232cpp.htm
14/25
30/5/2015
15/25
30/5/2015
16/25
30/5/2015
try {
ButtonAbrir->Caption = "Abrir";
ButtonConfigurar->Enabled = true;
}
catch ( ... )
{
}
}
//-------------------------------------------------------------------------Recordemos que slo podremos ver el efecto ejecutando el .exe fuera del
Debugger de Borland o configurando Borland para que no interceppte los
errores.
02cpp_a
El siguiente proyecto consiste en controlar desde el PC 8 salidas del PIC (el
puerto B) . Desde el programa en el PC podemos activar/desactivar mediante un
botn una salida del PIC. Slo se activa una salida cada vez (o ninguna) y el
PIC responde enviando un texto de estado. El programa esta basado en el
Ejemplo 2. Control desde PC. Los archivos de este proyecto son: 02\mplab\,
02\proteus_a\ y 02\cpp_a\.
El programa puede quedar as:
Uso del programa:
Configurar: Permite configurar el puerto.
Abrir Puerto/Cerrar Puerto: Abre o cierra el puerto.
Borrar salidas: Pone a 0 el puerto B del PIC.
Botones 0 a 7: Pone a 1 la salida del PIC correspondiente, RB0 a RB7.
En el campo de texto se recibe una confirmacin desde el PIC del estado
del puerto B.
Crear la interface grfica
Vamos a c:\picpc\picpcrs232cpp\02\ y creamos la carpeta cpp_a_prac\,
donde desarrollaremos el programa en C++. Para aprender, conviene dejar tal
cual el contenido de cpp_a\ y que desarrollemos el programa de C++ desde
cero en cpp_a_prac\. Iniciamos Borland y establecemos sus propiedades. En
el Object Inspector, Properties del form:
Caption = PIC RS232 Salidas
ClientHeight = 73
ClientWidth = 329
BorderStyle = bsSingle
BorderIcons: biMaximize = false
Colocamos un TComport, 11 botones y un campo de texto. Conviene colocarlos
http://perso.wanadoo.es/pictob/picrs232cpp.htm
17/25
30/5/2015
segn el TabOrder.
En el Object Inspector, Properties:
Botn Configurar:
Name = ButtonConfigurar
ButtonConfigurar->Caption = "Configurar"
TabOrder = 0
Botn Abrir Puerto:
Name = ButtonAbrir
ButtonAbrir->Caption = "Abrir Puerto"
TabOrder = 1
Botn Borrar salidas:
Name = ButtonBorrar
ButtonBorrar->Caption = "Borrar salidas"
TabOrder = 2
Botones 0 a 7:
Name = Button0 a Button7
Caption = "0" a "7"
TabOrder = 3 a 10
Cuadro de texto:
Edit1->Text = "" (nada)
TabOrder = 11
Este es un buen momento para salvar el proyecto (File / Save Project as) en
02\cpp_a_prac\
Unit = Unit1.cpp
Project = picrs232sal.bpr
Compilamos con F9 o
Programa completo
El cdigo lo podemos ver en 02\cpp_a\.
Prueba del programa
Salvamos todo con
Compilamos con F9 o
18/25
30/5/2015
de Proteus debe configurarse como COM5, 9600 baudios, 8 bits, sin paridad, 2
bits de stop y sin control de flujo.
En el programa en C++ pulsamos el botn Configurar y ponemos la misma
configuracin que en Proteus pero para el COM5:
Pulsamos OK y abrimos el puerto con el botn Abrir.
Simulamos el archivo de Proteus.
El resultado debe ser:
Aparece un error al seguir esta secuencia ejecutando el EXE sin Borland:
1.
2.
3.
4.
5.
6.
Iniciar EXE.
Configurar puerto.
Abrir puerto.
Pulsar botn (pulsar 2 o 3). Si no se pulsa ningn botn, no hay error.
Cerrar programa.
Aqu se genera el ERROR.
En una mquina con Windows XP sin Borland funciona sin errores. A veces
aparece un error al pulsar un segundo bot. En el siguiente proyecto se d una
solucin.
02cpp_b
Este proyecto en una modificacin del anterior para solucionar el problema del
error al cierre del programa. Los archivos de este proyecto son: 02\mplab\,
02\proteus_b\ o 02\proteus_b\ y 02\cpp_b\.
Sabemos que el problema aparecer despus de utilizar el cdigo asignado a
cada botn:
//-------------------------------------------------------------------------void __fastcall TForm1::Button0Click(TObject *Sender)
{
AnsiString Str;
Edit1->Text=""; //Borra el texto para luego recibir y presentar
el nuevo
Str = "0";
ComPort1->WriteStr(Str); // Se enva el caracter "0" al puerto
}
//-------------------------------------------------------------------------Puesto que no es un string lo que debemos enviar sino un caracter, podemos
cambiar al siguiente cdigo, que funciona y no genera problemas:
//--------------------------------------------------------------http://perso.wanadoo.es/pictob/picrs232cpp.htm
19/25
30/5/2015
02cpp_c
Modificacin de 02\cpp_b para incluir leds de estado. Los archivos de este
proyecto son: 02\mplab\, 02\proteus_c\ y 02\cpp_c\.
El programa puede quedar as:
Uso del programa:
Configurar: Permite configurar el puerto.
Abrir Puerto/Cerrar Puerto: Abre o cierra el puerto.
Borrar salidas: Pone a 0 el puerto B del PIC.
Botones 0 a 7: Pone a 1 la salida del PIC correspondiente, RB0 a RB7.
En el campo de texto se recibe una confirmacin desde el PIC del estado
del puerto B.
Los leds indican el estado del puerto, conectado, transmitiendo y
recibiendo.
Crear la interface grfica
Vamos a c:\picpc\picpcrs232cpp\02\. Para aprender, conviene dejar tal cual
el contenido de cpp_c\ y desarrollar el programa de C++ a partir de cpp_b\,
copiando esta carpeta y renombrndola como cpp_c_prac\.
http://perso.wanadoo.es/pictob/picrs232cpp.htm
20/25
30/5/2015
Programa completo
Ver 02\mplab\, 02\proteus_c\ y 02\cpp_c\.
Prueba del programa
Abrimos el archivo de Proteus 02\proteus_c. El PIC tiene que estar asociado al
archivo .hex de 02\mplab. El componente COMPIM de Proteus debe
configurarse como COM5, 9600 baudios, 8 bits, sin paridad, 2 bits de stop y sin
control de flujo.
Pulsamos el botn Configurar de nuestro programa y ponemos la misma
configuracin pero para COM5, pulsamos OK y abrimos el puerto con el botn
Abrir.
Simulamos el archivo de Proteus 02\proteus_c\.
Hasta ahora solo hemos hecho uso de las seales TXD(salida, pat3) y
RXD(entrada, pat2), tal que la comunicacin sera:
http://perso.wanadoo.es/pictob/picrs232cpp.htm
21/25
30/5/2015
Ahora vamos a utilizar mas seales, as que abrimos Virtual Serial Port y nos
vamos a la solapa Custom Pinout. Pulsamos sobre COM4 (a la izquierda). Aqu
se establece que pines estn unidos entre los puertos en un "cable virtual":
Aparte de TXD y RXD, el puerto RS232 DB9 tiene 2 salidas (RTS y DTR) y 4
entradas (CTS, DSR, DCD y RI). Aqu configuramos que entradas se unen a que
salidas.
Podemos preseleccionar 3 pinout (Custom pinout presets):
Estndar (Standard): cableado de lneas de seal por defecto.
Modo de bucle (Loopback Mode): el principal objetivo de esta
preseleccin es dejar que el programa del PC crea que hay handshaking
disponible, til con una conexin null-modem. Simplificando, handshaking
(protocolo de enlace) es un proceso que "negocia" la comunicacin antes
de que comience normalmente.
Personalizado (Custom): con esta seleccin podemos hacer nuestra propia
disposicin de conexin de lneas de seal, y guardarlo en un pinout preset
propio.
Elegimos la configuracin Custom.
La unin ideal entre PC y PIC sera a travs de un cable no cruzado, algo as
como un cable hembra-macho para "alargar" la conexin del PC hasta el PIC.
Esto tambin es util si no va a utilizarse control de flujo, que es nuestro caso.
Sin embargo Virtual Serial Port utiliza un "cable" con dos hembras y las lneas
de seal estn unidas de un conector a otro segn se configure una salida (RTS
y DTR)con una o varias entradas (DCD, DSR, CTS y RI). No puede modificarse la
configuracin entre TXD y RXD. La conexin es simtrica, es decir si unimos RTS
con DCD de un lado, quedara del otro unida DCD con RTS. Las seales OUT1 y
OUT2 se utilizan slo con hardware especfico, como el Hayes SmartModem
internal board, que no es nuestro caso.
Teniendo en cuenta lo anterior, primero probaremos con esta configuracin:
Conector Conector
1
2
Funcin
RXD12
TXD23
TXD13
RXD22
DTR14
DSR26 Conector
http://perso.wanadoo.es/pictob/picrs232cpp.htm
22/25
30/5/2015
Tierra de seal
DSR16
DTR24
RTS17
CTS18
CTS18
RTS27
macho
del PC
Funcin: SEALconector-patilla
El resultado debe ser:
A continuacin probaremos con esta otra configuracin:
Conector Conector
1
2
Funcin
DCD11
RTS27
RXD12
TXD23
TXD13
RXD22
DTR14
RI29
Conector
macho
del PC
Tierra de seal
RTS17
DCD21
RI19
DTR24
Funcin: SEALconector-patilla
El resultado debe ser:
Ntese como RI se detecta en los flancos de subida o bajada de DTR.
03cpp_a
El siguiente proyecto consiste en controlar desde el PC 8 salidas del PIC (el
puerto B) bit a bit. Adems se controlan DSR y DTR. Se basa en Ejemplo 2.
Control desde PC y sera un desarrollo de 02\cpp_a. Los archivos de este
proyecto son: 03\mplab\, 03\proteus_a\ y 03\cpp_a\.
El programa queda as:
Uso del programa:
Configurar: Permite configurar el puerto.
Abrir Puerto/Cerrar Puerto: Abre o cierra el puerto.
Borrar salidas: Pone a 0 el puerto B del PIC.
http://perso.wanadoo.es/pictob/picrs232cpp.htm
23/25
30/5/2015
Compilamos con F9 o
03cpp_b
Variante del anterior, con la interface modificada, que, entre otros aadidos,
recoge del registro de Windows los puertos del sistema instalados. Tiene un
problema, y es que debe ejecutarse como administrador en Windows Vista y
Windows 7 para tener acceso al registro.
http://perso.wanadoo.es/pictob/picrs232cpp.htm
24/25
30/5/2015
Programa completo
Ver 03\mplab\, 03\proteus_b\ y 03\cpp_b\.
03cpp_c
Variante del anterior pero que no necesita utilizar el registro.
Programa completo
Ver 03\mplab\, 03\proteus_b\ y 03\cpp_c\.
Pruebas reales
Debe tenerse en cuenta que en la simulacin se utilizan dos puertos virtuales
con un cable cruzado mientras que en el montaje real se utiliza un cable de
extensin.
Midiendo en el PC con un polmetro funciona la activacin de RTS y DTR como
salidas, obtenindose:
Pulsando 1 = +11,98v
Pulsando 0 = -11,26v
En el c.i. MAX232:
Patilla 2 = +9,39v
Patilla 6 = -8,7v
Las entradas del programa DSR a RI funcionan, activndose tanto con +10v del
MAX232en (patilla 2) como a +5v (Vcc de alimentacin). Entienden un 0 cuando
estn al aire (0v).
Funcionan todas las entradas incluida RI aunque en este caso solo se detecta
la activacin.
A resaltar que funciona todo con un conversor USB-RS232.
04cpp_a
El siguiente proyecto consiste en leer desde el PC 4 entradas del PIC. Funciona
como el Ejemplo 3. Monitorizacin de datos.
Por terminar, ver Ejemplo 3. Monitorizacin de datos..
http://perso.wanadoo.es/pictob/picrs232cpp.htm
25/25