jueves, 20 de noviembre de 2008

Puerto serie RS232 con PIC16F84A controlado por Visual C#


Manual muy detallado que puedes aprender a manejar el puerto serie RS232 controlador por un PIC16F84A. Aprendrás no sólo controlar el PIC sino la interfaz de programación Visual C# Express.



Ver presentación:


Ver vídeo:


Autor: Ángel Acaymo M. G.

Descargar:
PDF 21.5 MB.
ZIP 15.1 MB.





29 comentarios:

OptimusTronic dijo...

que bueno que tengas tu blog.... espero puedas publicar cosas mas adelante...

sigue asi...

Saludos.

Meta dijo...

Hola:

Por supuesto, por ahora sólo manuales y quizás algún proyecto cuando acabe.

Saludo.

aldex dijo...

ola muy buen aporte de pics dime como haces pa poner videos de youtube a tu blog sin necesidad de convertir

Meta dijo...

Sólo copias el enlace para agregar cósigo en el HTML en el Blog.

Saludo.

Pablo dijo...

Hola buenos días, estoy en el mundo de la programación desde hace mas de 7 años programo en varios lenguajes principalmente c#, estuve viendo el manual, va de lo muyyyy básico, eso esta bueno para los q se quieren meter en la programación, pero en mi caso es alreves me quiero meter en la electrónica. He realizado algunas cosas, pero siempre básico, me quería meter en este tema, lo de la programación es muy sencillo, lo que no logro entender es como tengo q soldar todo y conectarlo al puerto serie. En la pagina 108 muestra cómo hacerlo, pero eso si q para mi es chino mandarín!!!
Por ejemplo q es RXD TXD RTS CTS? Que pin del puerto serie conecto al pic?
Después las patas del pic r81 r82 r83 r84 r85 r86 r87 se conectan todas a un mismo cable?

Tendrías algo mas grafico como para poder amar el circuito? Por q la verdad q lo miro y lo miro y no logro entenderlo…
Bueno desde ya Gracias!!!

Meta dijo...

Hola:

El cable que lo vez como si fuera uno sólo no se suelda, es una forma de presentarlo para que no veas tantos cables en paralelo. Son 8, míralo como si estuviera separado de principio a fin. Por norma general, los esquemas eléctricos los verás así.

Sólo en el puerto serie usa el RxD y el TxD. En el puerto serie COM RS232 se conexta el RxD en el pin 2 del COM hacia el pin 14 del MAX232. El TxD del COM que es el pin 3 al pin 13 del MAX232. (En el libro www.pic16f84a.org que explica todo en la página 319).

Las patas del PIC es un letra r, letra b y sus números. RB0, RB1, etc...

RA0 al RA4 pertenecen a las patas delPIC16F84A el puerto A o PORTA, los RB0 al RB7 corresponde al PORTB del PIC. Lo gráfico mejor visto lo puedes encontrar en el mismo libro y en buscadores por Internet. "Esquema MAX232 pic16f84a".

Un cordial saludo.

Pablo dijo...

Gracias!!! voy a buscar y leer lo que me indicas!!!
Cualquier cosa te molesto de nuevo!!!

Pablo dijo...

Hola ya tengo el libro!!! Me estoy metiendo a full en el tema, un amigo me paso como meterle unos relé así hago un ejemplo práctico!!!
Te hago una consulta, en el manual parece q usaste el proteus isis, tenes el archivo que te genera? así me armo la plaquetita para poder hacerla? Estoy tratando de hacerlo yo… pero no llegue ni a un 10% y se me complico un poco juaaaa, si lo tenes joya si no sigo dándole al isis hasta q me salga.

Meta dijo...

Buenas:

Lo puedes descargar gratis tanto el esquema que el .hex y .asm incluido en esta dirección.

http://www.pic16f84a.org/index.php?option=com_content&view=article&id=66&Itemid=87#Proteus_Capitulo_20

Saludo.

Pablo dijo...

Gracias ya lo tengo!!! otra pregunta y espero q sea la ultima!!!
al pic16f84a hay q programarlo o ya viene programado????
Gracias nuevamente!!!!

Meta dijo...

Estas preguntas vienen en el libro. Como los DVD. Unos viene grabados, otros son regrabables.

hawel dijo...

me gustaria aprender a manejar pic por el puerto serie, les agradeceria que me consiguieran un manual o algo para aprender

Meta dijo...

Hola:

Con este manual puedes aprender manejar el puerto serie y PIC con este libro http://www.pic16f84a.org

Un abrazo.

Jorge Alberto Vera Briseño dijo...

Hola! Espero que estés muy bien, tengo una duda grandísima y podrías salvar la vida de mi proyecto, cómo es que podría portar ésto a un PIC16F887, me confundí un poco cuando llegaste a la parte del codigo Assambler del PIC16F84, espero puedas ayudarme, Muchas Gracias y excelente Blog :D

Jorge Alberto Vera Briseño dijo...

sé que debi haber hecho la pregunta en una sola... pero como haría para no usar el LCD y sólo el pic... que me debería estar dando de salida... el echo que viene en el código fuente 2?, oye y de verdad de ante mano muchas gracias si respondes :)

Analy Herrea dijo...

HOLA PODRIAS DECIRME CUAL ES LA CONTRASEÑA, DEL FUERTE 1 EN ARCHIVO WINRAR PORQUE ME PIDE UNA PARA EJECUTARLO GRACIAS

Meta dijo...

Hola:

Exactamente la contraseña es:

D.P.E.

Un saludo.

Meta dijo...

Hola:

Hay personas qu eme han pedido como en el formulario principal puede acceder a los botones son usar el ratón, sino diractamente del teclado como el HyperTerminal de Windows o el Minicom de Linux.

Para hacer pruebas, introduce dos botones y un label. Aquí abajo está el código completo.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Boton_teclado
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button_A_Click(object sender, EventArgs e)
{
label1.Text = ("Has pulsado el botón A con el ratón");
}

private void button_B_Click(object sender, EventArgs e)
{
label1.Text = ("Has pulsado el botón B con el ratón");
}

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
switch (keyData)
{
case Keys.A:
button_A.PerformClick();
return true;

case Keys.B:
button_B.PerformClick();
return true;
}

return base.ProcessCmdKey(ref msg, keyData);
}
}
}

Anamarys Leon dijo...

Hola necesito programar el puerto usb conectando el mouse usb utilizando la biblioteca HID API y
Enumerar los dispositivos USB HID conectados
2. Abrir el dispositivo que corresponde al mouse para leer
3. Leer los bytes del mouse, mostrando los valores de los bytes relevantes por pantalla (crudos)

Iván dijo...

Hola amigo, esta muy bueno el manual, quisiera saber si podrías subir el mismo código para el pic que esta en lenguaje ensamblador, en otro lenguaje, por ejemplo migrarlo para el CCS .. ? Te lo agradecería mucho, estoy empezando en esto de la electrónica, y por el momento me siento cómodo usando el compilador CCS.. Soy estudiante , aun me cuesta adaptarme al lenguaje ensamblador, me dicen que es mejor y mas bonito programar en ensamblador por que todo esta hecho pedasitos y puedes mirar todo lo que sucede paso a paso.. pero me sigue causando confusion.. por favor si pudieras pasar la programación a CCS me ayudarías mucho. :/

Meta dijo...

Hola Iván:

Hay códigos en CCS para el PIC16F886 que encontraré y pondré aquí.

Haré otro manual más completo pero con Arduino.

Saludos.

EfrainMejiasC dijo...

HOLA
Desarrollo una aplicacion C# para Read/Write Tarjetas Inteligentes ya estoy bastante adelantado, pero tengo un problema al enviar los comandos al lector (No conozco la estructura del APDU para T=1 protocolo) Ud podria tener alguna sugerencia ???

Meta dijo...

Hola EfrainMejiasC:

L sugerencia de entrada puedes comentar más información técnica, código que has hecho, tipo de tarjeta que usas, etc.

Saludos.

EfrainMejiasC dijo...

Hola METACONTA !

En mi aplicacion uso Winscard.dll y la funciones que provee las ejecuto en el siguiente orden:
SCardEstablishContext()// Establece el contexto
SCardListReaders()// Obtiene nombres de los PCI conectados a el PC
SCardConnect() // Connecta con un PCI
SCardGetAttrib()// Obtiene ATR de la tarjeta
hata aqui todo bien, lo comprobe por q tengo un programa que compre que lee tarjetas inteligente nada que ver con el que estoy desarrollando, entonces.
El problema lo tengo al intentar el intercambio de datos con la tarjeta (modelo JCOP21, protocolo T1)
Con el programa que tengo yo pude LEER informacion de los APDU para trabajar con esta tarjeta , se supone que yo al enviar este comando con la funcion ScardTransmit() yo debo obtener SW1=90 SW2=00 pero esto NO es asi.
A continuacion veras lo que obtengo dede la tarjeta con el programa que compre, fijate en la segunda line la secuencia de 5 numeros hexadecimales es el comando que envio a la tarjeta.
------------------------------------------------
[Step 1] SELECT ISD using zero length AID
------------------------------------------------
00 a4 04 00 00
response hex :
6f 65 84 08 a0 00 00 00 03 00 00 00 a5 59 9f 65
01 ff 9f 6e 06 47 91 00 78 33 00 73 4a 06 07 2a
86 48 86 fc 6b 01 60 0c 06 0a 2a 86 48 86 fc 6b
02 02 01 01 63 09 06 07 2a 86 48 86 fc 6b 03 64
0b 06 09 2a 86 48 86 fc 6b 04 02 15 65 0b 06 09
2b 85 10 86 48 64 02 01 03 66 0c 06 0a 2b 06 01
04 01 2a 02 6e 01 02
response SW1SW2 : 90 00 (Success)
response ascii : oe...........Y.e...n.G..x3.sJ..*.H..k.`...*.H..k....c...*.H..k.d...*.H..k...e...+...Hd...f...+....*.n..
response parsed :

6f 65 -- File Control Information (FCI) Template
84 08 -- Dedicated File (DF) Name
a0 00 00 00 03 00 00 00 (BINARY)
a5 59 -- File Control Information (FCI) Proprietary Template
9f 65 01 -- [UNKNOWN TAG]
ff (BINARY)
9f 6e 06 -- Visa Low-Value Payment (VLP) Issuer Authorisation Code
47 91 00 78 33 00 (BINARY)
73 4a -- Directory Discretionary Template
06 07 -- Object Identifier (OID)
2a 86 48 86 fc 6b 01 (BINARY)
60 0c -- [UNKNOWN TAG]
06 0a -- Object Identifier (OID)
2a 86 48 86 fc 6b 02 02 01 01 (BINARY)
63 09 -- [UNKNOWN TAG]
06 07 -- Object Identifier (OID)
2a 86 48 86 fc 6b 03 (BINARY)
64 0b -- [UNKNOWN TAG]
06 09 -- Object Identifier (OID)
2a 86 48 86 fc 6b 04 02 15 (BINARY)
65 0b -- [UNKNOWN TAG]
06 09 -- Object Identifier (OID)
2b 85 10 86 48 64 02 01 03 (BINARY)
66 0c -- [UNKNOWN TAG]
06 0a -- Object Identifier (OID)
2b 06 01 04 01 2a 02 6e 01 02 (BINARY)
public void Trasmision()
{
Byte[] vectorSend = { 0x00, 0xA4, 0x04, 0x00, 0x00 };
UInt32 inT2 = (UInt32)vectorSend.Length;
vectorIn = new Byte[8];
UInt32 inT = (UInt32)vectorIn.Length;
IntPtr IOPCI = IntPtr.Zero;
if (PROTOCOLO == 0x01) { IOPCI = GetPciT0(); } else if (PROTOCOLO == 0x02) { IOPCI = GetPciT1(); }
this.rTransmit = SCardTransmit(this.hContext, IOPCI, vectorSend, inT2, request, vectorIn, inT);

}

Ahora creo que puede ser que el vector que envio no tiene el formato correcto(le faltarian algunos hexadecimales para completarlos segun el protocolo de comunicacion que especifica la tarjeta el cual es T1) y esos es mi duda...???

Meta dijo...

Hola:

Por lo que veo por el aire, si no tienes lo que quieres, no estás usando sistemas de codificación en las tramas de bytes tanto al recibir como enviar.

Saludos.

EfrainMejiasC dijo...

Gracias METACONTA
y como es eso o q debo hacer ??

Meta dijo...

Hola:

Aquí explica los sistemas de codificación.
https://msdn.microsoft.com/es-es/library/system.text.encoding%28v=vs.100%29.aspx

Saludos.

EfrainMejiasC dijo...

Hola METACONTA
Estuve investigando tu sugerencia en relacion a la codificacion y pude comprender mejor el contexto para la comunicacion entre Aplicacion <-> Lector <-> Tarjeta , entre algunas me hizo reflexionar si la tarjeta es nueva como es el caso , deberia perzonalizarla como establecer un PIN, para luego si establecer una comunicacion eficaz? no c si tienes algun conocimiento sobre esta duda ...

Meta dijo...

Hola EfrainMEjisC:

Los conocimientos con PIN, esas tarjetas lo he usado en la época de los 90 con PIC16F84. Lo del PIN solo es un código de acceso. Para saber su protocolo o más bien si lo sabes y deseas saber sus comandos, usar un buen analizador lógico para saber que comandos envías y cual recibes.

Saludos.