0% encontró este documento útil (0 votos)
165 vistas67 páginas

Pic Con Teclado Matricial

Pic
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
165 vistas67 páginas

Pic Con Teclado Matricial

Pic
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

UNIVERSIDAD MAYOR DE SAN ANDRES

FACULTAD TECNICA
ELECTRONICA Y TELECOMUNICACIONES

NIVEL LICENCIATURA

PROYECTO DE APLICACION

“DISEÑO Y CONSTRUCCION DE UN SISTEMA DE CONTROL DE


ASISTENCIA CON EL PIC 18F4550 Y VB6”

POSTULANTE: Adolfo Soliz Calle

LA PAZ – BOLIVIA

2011
DEDICATORIA

A Dios por haberme bendecido con una familia


que constituye el pilar que me sostiene en el camino. A
mis docentes, por su empeño en formar profesionales
con valor que permitan un mejor futuro. A mis amigos y
amigas porque han ofrecido alegría y sobre todo su
amistad incondicional. A todos ellos, GRACIAS…
RESUMEN

El presente proyecto de aplicación usa un micro controlador (pic 18f4550) para la


comunicación con la pc (host) vía USB, el hardware consta del pic, teclado
hexadecimal, una pantalla de cristal liquido (LCD) y conector USB tipo B. Se
introduce en el teclado hexadecimal (123A456B789C*0#D) solo cuatro dígitos los
cuales están pre establecido en la programación tanto en el microcontrolador
como en Visual Basic 6.
Para la programación del pic (Firmware) se usó el compilador CCS (Pic C) en
lenguaje C el cual ya tiene el descriptor entre sus librerías. Se utilizó HID (Human
Interface Device) en vez de CDC (Communications Device Class) porque el diseño
considera que no requiere instalación de drivers en especifico para emular un
puerto Serial, como un mouse o teclado USB que pertenece a la clase HID, para
esto se utilizo las librerías; <18f4550.h> que es el archivo de cabecera,
<lcd.c>,"kbd4X4.c",<pic18_usb.h>,"usb_desc_hid.h" es el descriptor donde se
personaliza el proyecto, vendor id (0x04D8 Microchip) product id y <usb.c>.
Para la base de datos se utilizo dos tablas los cuales se denominan contactos y
registros la tabla contactos costa de campos; ID, APE_PA, APE_MA, NOMBRE,
SEXO, FECHA_NAC, LUGAR_NAC, DIRECCION, FONO CELULAR, EMAIL,
FECHA_IN, etc. La tabla registro de ID de campos COD_P, HORA Y FECHA, en
esta tabla es donde se registra la hora y fecha de ingreso que es capturado del
sistema operativo.
Para la aplicación de Visual Basic 6 se uso ADO para la conexión con la base de
datos. Para la comunicación vía USB se utilizó el programa EasyHID al cual se le
introduce vendor ID product Id (nombre de la compañía y producto), la corriente
máxima por el bus power, tamaño de bytes máximo 64 y el compilador Visual
Basic 5, este nos genera el modulo para el uso de USB en función a un DLL.
DISEÑO Y CONSTRUCCION DE UN SISTEMA DE CONTROL DE
ASISTENCIA CON EL PIC 18F4550 Y VB6

ÍNDICE

Pág.

PORTADA

DEDICATORIA

RESUMEN

ÍNDICE

CAPITULO I
GENERALIDADES
1.1.-PLANTEAMIENTO DEL PROBLEMA………………………………………... 01
1.2.- JUSTIFICACION……………………………………………………………….. 01
1.3.0.- OBJETIVO……………………………………………………..……………... 01
1.3.1.- OBJETIVO GENERAL……………………………………..………………... 01
1.3.2.- OBJETIVO ESPECIFICO…………………………………………………... 01
1.4.- DELIMITACION …………………………………………………………..…... 01
CAPITULO II
FUNDAMENTO TEORICO
2.0.- PIC 18F4550 configuraciones del oscilador…………..…………………... 02
2.1.- Información general …………………………………………………………… 02
2.2.- Tipos de oscilador ……………………………………………………………… 02
2.2.1.- Modos del oscilador y funcionamiento de USB ……………………….. 04
2.2.2.- Oscilador de cristal / resonadores de cerámica ………………………. 05
2.2.3.- Multiplicador de frecuencia PLL …………………………………………. 06
2.3.- Configuración del oscilador para USB …………………………………… 07
2.3.1.- Baja velocidad ………………………………………………………………. 07
2.3.2.- Funcionamiento del microcontrolador y USB a diferentes relojes …. 08
2.4.- Organización de la memoria …………………………………………………. 08
2.4.1.- Programa de Organización de la memoria ………………………………. 08
2.4.2.- Organización de la memoria de datos ……………………………………. 09
2.4.3.- USB RAM ……………………………………………………………………… 11
2.4.4.- REGISTRO de selección de banco (BSR)………………………………… 11
2.4.5.- Interrupciones USB ………………………………………………………….. 13
2.5.- Visual Basic 6……………………………………………………………………. 13
2.5.1.- Introducción …………………………………………………………………... 13
2.5.2.- Características Generales de Visual-Basic ……………………………… 13
2.5.3.- Tipos de variables …………………………………………………………… 14
2.5.4.- Tipos de declaración de variables…………………………………………. 15
[Link].- Sentencia DIM……………………………………………………………… 15
[Link].- Sentencia PRIVATE ………………………………………………………... 15
[Link].- Sentencia PUBLIC …………………………………………………………. 16
[Link].- Sentencia STATIC ………………………………………………………….. 16
2.5.5.- Sentencias condicionales ………………………………………………….. 16
2.5.6.- Funciones de cadenas ………………………………………………………. 17
2.5.7.- Formulario y controles ……………………………………………………… 18
2.5.8.- Operadores …………………………………………………………………… 19
2.5.9.- Introducción a Ado …………………………………………………………... 19
2.5.10.- Propiedades del Objeto Recordset ……………………………………… 20
[Link].- Propiedad AbsolutePosition (ADO) …………………………………… 20
[Link].- Propiedades BOF y EOF ………………………………………………… 20
[Link].- Propiedad RecordCount ………………………………………………… 20
[Link].- Propiedad Source ………………………………………………………… 20
[Link].- Propiedad EditMode ……………………………………………………... 21
2.5.11.- Métodos del objeto Recordset de ADO ………………………………… 21
[Link].- Método Open ……………………………………………………………… 21
[Link].- Método Update ……………………………………………………………. 21
[Link].- Método UpdateBatch …………………………………………………….. 22
[Link].- Método Delete …………………………………………………………….. 22
2.6.- LCD ……………………………………………………………………………….. 22
2.6.1.- Caracteres del LCD ………………………………………………………….. 22
2.6.2.- La memoria del LCD …………………………………………………………. 23
[Link].- DD RAM (Display Data Ram) ………..…………………………………… 23
[Link].- CG RAM (Character Generator RAM) ………………………………….. 23
2.7.- Teclado hexadecimal ………………………………………………………….. 23
2.7.1.- Estructura interna …………………………………………………………… 23
CAPITULO III
DESARROLLO DE TEMA
3.0.- Descripción del proyecto. ………………………………….………………… 25
3.1.- Diseño de la base de datos en Access 2007 ……………………………… 26
3.2.- EasyHID USB Wizard …………...……………………………………………… 28
3.3.- Módulo generado por EasyHID USB Wizard en función a [Link] …. 30
3.4.- Diseño de los formularios en VB6 ……………………………………...…… 34
3.4.1.- Conexión con la base de datos y la tabla ………………………….……. 34
3.4.2.- Conectando las cajas de texto con AdoContactos …………………… 36
3.5.- Código de VB6 ………………………………………………………………….. 38
3.6.- Compilador CCS (PIC C) ……………………………………………………… 45
3.6.1.- Desarrollo en el compilador PIC C paso a paso ……………………….. 47
3.5.2.- Código fuente del pic 18f4550 …………………………………………….. 54
3.6.3.- Diseño de la placa en proteus …………………………………………...... 57
Conclusiones…………………………………………………………..………………. 61
BIBLIOGRAFIA……………………………………………...…………………………. 62
CAPITULO I
GENERALIDADES

1.1.- PLANTEAMIENTO DEL PROBLEMA

En la actualidad existe la creación de micro y pequeñas empresas (MYPE) los


cuales aún no cuentan con un sistema de control de ingreso del personal, como
las grandes empresas que utilizan; marcación de tarjetas, código de barras,
equipos ópticos o biométricos.

1.2.- JUSTIFICACION

Este proyecto surge de la necesidad de tener un control de asistencia de los


trabajadores o personal de una empresa, de manera que podrá reducir costos y
aumentar la productividad y coadyuvar al crecimiento de las mismas.

1.3.0.- OBJETIVO

1.3.1.- OBJETIVO GENERAL

- Diseñar un sistema de control de asistencia el cual se registre en una base de


datos.

1.3.2.- OBJETIVO ESPECIFICO

-Diseñar el código fuente para el micro controlador pic 18f4550.


- Diseñar el código fuente en Visual Basic 6.0.
- Diseñar la base de datos en Access.
- Diseñar y construir la placa en Proteus7 (ISIS-ARES).

1.4.- DELIMITACION

El sistema de control de asistencia nos servirá específicamente para la micro y


pequeñas empresas, que aun estén en vías de desarrollo.

1
CAPITULO II
FUNDAMENTO TEORICO

2.0.- PIC 18F4550 CONFIGURACIONES DEL OSCILADOR

2.1.- Información general


Dispositivos de la familia PIC18F2455/2550/4455/4550 incorporan un oscilador
diferente y el sistema de reloj del microcontrolador que los anteriores dispositivos
PIC18F. La adición del módulo USB, con sus necesidades específicas de una
fuente de reloj estable, hacen que sea necesario para proporcionar una fuente de
reloj independiente que es compatible tanto con USB de baja velocidad y
velocidad completa, las especificaciones para adaptarse a estos requisitos
incluyen una rama de un nuevo reloj para proporcionar un reloj de 48 MHz para la
operación de alta velocidad USB.
Ya que se controla desde la fuente del reloj principal, un sistema adicional de
Prescalers y postscalers se ha añadido para dar cabida a una amplia gama de
frecuencias del oscilador. Una visión general de la estructura del oscilador se
muestra en la Figura 2-1.

2.2.- Tipos de oscilador


Pueden funcionar en doce modos de oscilador diferentes. En contraste con los
anteriores microcontroladores PIC18 mejorado, cuatro de estos modos de implicar
el uso de dos tipos de oscilador a la vez.
Los usuarios pueden programar la FOSC3: FOSC0 Bits de configuración para
seleccionar uno de estos modos:
1. XT Cristal / Resonador.
2. XTPLL Cristal / Resonador con PLL activado.
3. HS de alta velocidad de Cristal / Resonador.
4. HSPLL de alta velocidad de Cristal / Resonador con PLL activado.
5. EC reloj externo con FOSC / 4 salidas.
6. ECIO reloj externo con E / S en RA6.

2
7. ECPLL reloj externo de con PLL activado y FOSC / 4 salidas en RA6.
8. ECPIO reloj externo con PLL activado, E / S en RA6.
9. INTHS Oscilador interno utilizados como fuente de reloj del microcontrolador,
HS oscilador utilizado como fuente de reloj USB.
10. INTXT Oscilador interno utilizados como fuente de reloj del microcontrolador,
XT oscilador utilizado como fuente de reloj USB.
11. INTIO Oscilador interno utilizados como fuente de reloj del microcontrolador,
EC el oscilador utilizado como fuente de reloj USB, E / S digitales en RA6.
12. INTCKO Oscilador interno utilizados como fuente de reloj del microcontrolador,
CE el oscilador utilizado como fuente de reloj USB, FOSC / 4 salidas en RA6.

3
FIGURA 2-1 Orígenes del reloj USB

2.2.1.- MODOS del oscilador y funcionamiento de USB


Debido a los requisitos específicos del módulo USB, un enfoque diferente para el
funcionamiento del reloj es necesario. En los anteriores dispositivos PICmicro ®,
todos los relojes centrales y periféricos fueron impulsados por una fuente de
oscilador, las fuentes habituales son primaria, secundaria o el oscilador interno.
Con PIC 18F2455/2550/4455/4550, el oscilador principal se convierte en parte del

4
módulo de USB y no se puede asociar a cualquier otra fuente de reloj. Por lo tanto,
el módulo USB debe ser ajustado a partir de la fuente del reloj principal, sin
embargo, el núcleo del microcontrolador puede ser separado de los osciladores
de reloj secundario o interno. Debido a los requerimientos de tiempo impuestas
por USB, un reloj interno de cualquiera de 6 MHz o 48 se requiere mientras que el
módulo USB está activado. Afortunadamente, el microcontrolador y otros
periféricos no están obligados a correr a esta velocidad de reloj cuando se utiliza
el oscilador principal como muestra la tabla 2-1. Hay numerosas opciones para
lograr el módulo USB requerido de reloj y todavía proporcionan la flexibilidad para
el resto de los dispositivos de la fuente de oscilador principal.

Tabla 2-1 "Configuración del oscilador de USB"

2.2.2.- Oscilador de cristal / resonadores de cerámica


En los modos de oscilador HS, HSPLL, XT y XTPLL, un resonador de cristal o
cerámica está conectada a los pines OSC1 y OSC2 para establecer la oscilación.

Figura 2-2 muestra las conexiones de pin.

5
El diseño del oscilador requiere el uso de un cristal de corte paralelo.

Tabla 2-2

Nota1: - Véase la Tabla para los valores iniciales de C1 y C2.


- Una resistencia en serie (RS) puede ser requerido para AT cristales tira cortada.
- RF varía con el modo de oscilador elegido.

Nota 2: -Mayor capacidad aumenta la estabilidad del oscilador, pero también


aumenta el tiempo de puesta en marcha.
- Cuando se opera por debajo de 3V VDD, o cuando se utilizan ciertos
resonadores de cerámica a cualquier voltaje, puede ser necesario utilizar el modo
HS o cambiar a un oscilador de cristal.
- Dado que cada resonador / cristal tiene sus propias características, el usuario
debe consultar al fabricante del resonador de cristal / para los valores adecuados
de los componentes externos.
- R puede ser necesaria para evitar sobrecargas de cristales con la especificación
de bajo nivel de excitación.
- Siempre verificar el funcionamiento del oscilador en el VDD y rango de
temperatura que se espera para la aplicación.
Un interno postscaler permite al usuario seleccionar una frecuencia de reloj que no
sea la de los cristales o resonadores.
2.2.3.- Multiplicador de frecuencia PLL
PIC18F4550 incluyen un Phase Locked Loop (PLL) del circuito. Esto es
especialmente para aplicaciones USB con osciladores de baja velocidad y también
se puede utilizar como una fuente de reloj del microcontrolador.

6
El PLL está habilitado en HSPLL, XTPLL, ECPLL y modos ECPIO oscilador. Está
diseñado para producir un reloj de referencia fijo 96 MHz a partir de una entrada
fija 4MHz. La salida puede dividirse y utilizarse tanto para el USB y el reloj
principal del microcontrolador. Debido a que el PLL tiene una frecuencia de
entrada y salida fijos, hay ocho opciones prescalado para que coincida con la
frecuencia de entrada del oscilador del PLL.
También hay una opción postscaler separadas para derivar el reloj del
microcontrolador de la PLL. Esto permite que el periférico USB y el
microcontrolador a utilizar operen en reloj de diferentes velocidades. En contraste
con la postscaler de XT, HS y los modos de la EC, las opciones disponibles son 1 /
2, 1 / 3, 1 / 4 y 1 / 6 de la salida del PLL.
Los modos de HSPLL, ECPLL ECPIO y hacer uso del oscilador modo HS para
frecuencias de hasta 48 MHz.
El prescaler divide la entrada del oscilador por un máximo de 12 para producir la
unidad de 4 MHz para el PLL. El modo de XTPLL sólo se puede utilizar una
frecuencia de entrada de 4 MHz, lo que impulsa el PLL directamente.

2.3.- Configuración del oscilador para USB


Cuando el PIC18F4550 se utiliza para la conectividad USB, se debe tener una de
6 MHz o 48 MHz de reloj para la operación USB, dependiendo de si el modo de
poca velocidad o de velocidad completa, se está utilizando. Esto podría requerir un
poco de previsión en la selección de una frecuencia del oscilador y la
programación del dispositivo.

2.3.1.- Baja velocidad


El reloj USB de modo de baja velocidad se deriva de la cadena de oscilador
principal y no directamente de la PLL. Se divide en 4 para producir el actual 6 MHz
de reloj. Debido a esto, el microcontrolador sólo se puede utilizar una frecuencia
de reloj de 24 MHz en el módulo USB está activo y la fuente de reloj del
controlador es una de las modos principales del oscilador (XT, HS o EC, con o sin
el PLL).

7
Esta restricción no se aplica si la fuente de reloj del microcontrolador es el
oscilador secundario o bloque oscilador interno.
2.3.2.- Funcionamiento del microcontrolador y USB a diferentes relojes
El módulo USB, en cualquier modo, se pueden ejecutar de forma asíncrona con
respecto al núcleo microcontrolador y otros periféricos. Esto significa que las
aplicaciones puedan utilizar el oscilador principal para el reloj USB, mientras que
el microcontrolador se ejecuta desde una fuente de reloj por separado a una
velocidad inferior. Si es necesario ejecutar la aplicación, desde la fuente de reloj
único, a plena velocidad proporciona una mayor selección de las frecuencias de
reloj del microcontrolador.

2.4.- Organización de la memoria


Hay tres tipos de memoria en los dispositivos PIC18 microcontrolador mejoradas:
• Programa de la Memoria
• RAM de datos
• Los datos EEPROM
Como en la arquitectura Harvard los datos y memorias de buses separados,
permite el acceso simultáneo de los dos espacios de memoria. La EEPROM de
datos, a efectos prácticos, puede considerarse como un dispositivo periférico, ya
que se trata y se accede a través de un conjunto de registros de control.

2.4.1.- Programa de Organización de la memoria


PIC18 microcontroladores implementa un contador de programa de 21 bits que es
capaz de dirigir 2 MB programa de espacio de memoria. Acceso a una ubicación
entre el límite superior físicamente aplicada la memoria y la dirección de 2 Mbytes
devolverá todos '0 's (una instrucción NOP).
El PIC18F2455 y PIC18F4455 cada uno con 24 Kbytes de memoria Flash y puede
almacenar hasta 12.288 instrucciones de solo palabra. El PIC18F2550 y
PIC18F4550 tienen cada uno 32 Kbytes de memoria Flash y puede almacenar
hasta 16.384 instrucciones de una sola palabra. Dispositivos PIC18 tienen dos
vectores de interrupción. La dirección del vector de reset se encuentra en 0000h y

8
las direcciones de vectores de interrupción están en 0008h y 0018h.
Los mapas de la memoria del programa para PIC18FX455 y PIC18FX550 se
muestran en la Figura 2-3.

FIGURA 2 -3: Mapa de la memoria y el programa de la pila de dispositivos 4550

2.4.2.- Organización de la memoria de datos


Nota: El funcionamiento de algunos aspectos de la memoria los datos cambian
cuando el conjunto de instrucciones PIC18 extendida está activada. La memoria
de datos en dispositivos PIC18 se implementa como RAM estática. Cada registro
en la memoria tiene una dirección de 12 bits, permitiendo que hasta 4096 bytes de
memoria de datos. El espacio de memoria se divide en un máximo de 16 bancos
que contienen 256 bytes cada uno. PIC18F2455/2550/4455/4550 dispositivos de
aplicación de ocho bancos completo, para un total de 2048 bytes figura 2-4.

9
La Figura 2-4 Muestra la organización de la memoria de datos

La memoria de datos contiene registros de funciones especiales (SFR) y registros


de propósito general (GPR). La SFR se utilizan para el control y el estado del
controlador y periféricas, mientras que GPRS se utiliza para los datos de alma-
cenamiento y bloc de notas de las operaciones en la aplicación del usuario.
Cualquier lectura de un lugar no se han aplicado a lee como '0 's. El conjunto de
instrucciones y arquitectura permiten las operaciones de todos los bancos. La
memoria de datos completa se puede acceder a los modos directo, direccio-
namiento indirecto o indexadas. Modos de direccionamiento se describen más

10
adelante en este apartado. Para asegurarse de que los registros de uso general
(SFR y GPRS elija) se puede acceder en un solo ciclo, los dispositivos PIC18
implementan un Banco de acceso. Este es un espacio de memoria de 256-byte
que proporciona acceso rápido a SFR y la parte inferior de GPR del banco 0 sin
necesidad de utilizar la BSR
2.4.3.- USB RAM
Bancos de 4 a 7 de la memoria de datos están ocupadas en la memoria RAM de
doble puerto especial. Cuando el módulo USB está desactivado, el GPRS en estos
bancos se utilizan como cualquier otro GPR en el espacio de memoria de datos.
Cuando el módulo USB está activado, la memoria de estos bancos se imputa de la
memoria RAM para el funcionamiento USB.
Esta área es compartida entre el núcleo de microcontrolador y el motor de la
interfaz USB de serie (SIE) y se utiliza para transferir datos directamente entre los
dos. En teoría, es posible utilizar las áreas de USB RAM que no se asignan como
amortiguadores de la memoria USB normal de almacenamiento variable. En la
práctica, el carácter dinámico de asignación de áreas de riesgo hace de este el
mejor. Además, el Banco 4 se utiliza para la gestión de memoria intermedia de
USB cuando el módulo está habilitado y no debe utilizarse para otros fines durante
ese tiempo.
2.4.4.- REGISTRO de selección de banco (BSR)

Grandes áreas de la memoria de datos requieren un esquema eficiente para hacer


frente a un rápido acceso a cualquier dirección posible. Idealmente, esto significa
que una dirección completa no es necesario que los importes de cada lectura o
escritura. Para los dispositivos PIC18, esto se logra con un esquema de banca de
RAM. Esto divide el espacio de memoria en 16 bancos contiguos de 256 bytes.
Dependiendo de la instrucción, cada lugar se puede acceder directamente por su
completo de 12 bits de la dirección, o una dirección de 8 bits de menor peso y un
puntero del Banco de 4 bits.
La mayoría de las instrucciones en el conjunto de instrucciones PIC18 hace uso
del puntero del Banco, conocido como el Registro de selección de banco (BSR).

11
Este SFR tiene los 4 bits más significativos de la dirección de un lugar, la propia
instrucción incluye los ocho bits menos significativos. Sólo los cuatro bits más
bajos de el BSR se implementan (BSR3: BSR0). Los cuatro bits superiores no han
sido utilizados, sino que siempre '0 'y no puede escribir. El BSR se puede cargar
directamente mediante la instrucción MOVLB. El valor de la BSR indica el banco
de memoria de datos. Los ocho bits de la instrucción de mostrar la ubicación en el
banco y puede ser pensado como un desplazamiento desde el límite inferior del
banco. La relación entre el valor de la RSE y la división del banco de memoria de
datos se muestra en la Figura 2-5

Figura 2-5 Memoria de dato


Ya que hasta dieciséis registros pueden compartir el mismo orden bajo la
dirección, el usuario siempre debe tener cuidado para asegurarse de que el banco
apropiado es seleccionado antes de realizar una base de datos de lectura o es-
critura. Por ejemplo, escribir lo que debería ser los datos del programa a una
dirección de 8 bits de F9H, mientras que la RSE es 0Fh, el resultado final será el
restablecimiento del contador del programa.
Mientras que cualquier banco puede ser seleccionado, sólo los bancos que se
aplican en realidad se pueden leer o escribir.
Escribe a los bancos no se han aplicado son ignorados, mientras se lee de los
bancos no se han aplicado será de '0 's. Aún así, el registro STATUS también se

12
verán afectados, como si la operación fue un éxito. El mapa de datos en memoria
Figura 2-5 indica que los bancos se aplican. En el conjunto de instrucciones
básicas PIC18, sólo la instrucción MOVFF totalmente especifica la dirección de 12
bits de la fuente y registros de destino. Esta instrucción se hace caso omiso de la
BSR por completo cuando se ejecuta. Todas las demás instrucciones son sólo la
dirección de menor orden como un operando y debe utilizar la BSR o el Banco de
acceso para localizar sus registros de destino.

2.4.5.- Interrupciones USB


A diferencia de otros periféricos, el módulo USB es capaz de generar una amplia
gama de las interrupciones para muchos tipos de eventos. Estos incluyen varios
tipos de comunicación normales y eventos de estado y el nivel de módulo de va-
rias los eventos de error. Para controlar estos eventos, el módulo USB está equi-
pado con su lógica interrupción propia. Las funciones lógicas de una manera
similar a la del embudo microcontrolador interrumpir nivel, con cada fuente de
interrupción con bandera independiente y los bits de habilitación. Todos los
eventos son canalizados a una interrupción de dispositivo de un solo nivel, USBIF
(PIR2 <5>). A diferencia de la lógica del dispositivo de interrupción de nivel, el
individuo eventos USB interrupción no se puede asignar individualmente su propia
prioridad. Esto se determina en el embudo de dispositivo de interrupción de nivel
para todos los eventos USB por el poco USBIP.

2.5.- Visual Basic 6

2.5.1.- Introducción
El lenguaje de programación BASIC (Beginner's All purpose Symbolic Instruction
Code ) nació en el año 1964 como una herramienta destinado a principiantes,
buscando una forma sencilla de realizar programas, empleando un lenguaje casi
igual al usado en la vida ordinaria, y con instrucciones muy sencillas y escasas.
2.5.2.- Características Generales de Visual-Basic

13
Visual-Basic es una herramienta de diseño de aplicaciones para Windows, en la
que estas se desarrollan en una gran parte a partir del diseño de una interface
gráfica. En una aplicación Visual - Basic, el programa está formado por una parte
de código puro, y otras partes asociadas a los objetos que forman la interface
gráfica.
Es por tanto un término medio entre la programación tradicional, formada por una
sucesión lineal de código estructurado, y la programación orientada a objetos.
Combina ambas tendencias. Ya que no podemos decir que VB pertenezca por
completo a uno de esos dos tipos de programación.
La creación de un programa bajo Visual Basic lleva los siguientes pasos:
- Creación de un interface de usuario. Este interface será la principal vía de
comunicación entre el hombre y la máquina, salida y entrada de datos. Partiremos
de un Formulario al que le iremos añadiendo los controles.
- Definición de las propiedades de los controles. Estas propiedades determinarán
la forma estática de los controles, es decir, como son los controles y para qué
sirven.
- Generación del código asociado a los eventos que ocurran a estos objetos. A la
respuesta a estos eventos (click, doble click, una tecla pulsada, etc.) le llamamos
Procedimiento, y deberá generarse de acuerdo a las necesidades del programa.
- Generación del código del programa. Un programa puede hacerse solamente
con la programación de los distintos procedimientos que acompañan a cada
objeto. Sin embargo, VB ofrece la posibilidad de establecer un código de programa
separado de estos eventos. Este código puede introducirse en unos bloques
llamados Módulos, en otros bloques llamados Funciones, y otros llamados
Procedimientos. Estos Procedimientos no responden a un evento acaecido a un
objeto, sino que responden a un evento producido durante la ejecución del
programa.

2.5.3.- Tipos de variables


Las variables pueden ser de los siguientes tipos: (El número indicado en segundo
lugar indica el número de Bytes que ocupa en memoria.)

14
Booleana (2) Admite los valores 0 y 1, o True (verdadero) y False (falso)
Byte (1) Números enteros, en el rango de 0 a 255
Integer (2) Números enteros en el rango de -32768 a 32767
Long (4) Números enteros en el rango de -2147483648 a 2147483647
Single (4) Punto flotante, simple precisión
Doble (8) Punto flotante, doble precisión.
Currency (8) Entero, con punto decimal fijo (Típico de monedas)
String (*) Cadenas alfanuméricas de longitud variable o fija
Date (8) Fechas
Objet (4) Referencia a objetos
Variant (**) Otros tipos de datos
(*) Una variable tipo String ocupa el mismo número de bytes que caracteres tenga
la cadena.
(**) Una variable tipo Variant ocupa 16 bytes si se trata de un número y 22 bytes +
longitud de la cadena si se trata de un dato tipo cadena de caracteres.

2.5.4.- Tipos de declaración de variables.


[Link].- Sentencia DIM Es la forma más común de declarar una variable como
Privada. Puede emplearse en un Procedimiento, Función, Formulario o Módulo. La
sintaxis es de la siguiente forma:
Dim nombrevariable As Integer (o el tipo que sea)
Cuando declaramos una variable con la sentencia DIM, esa variable no sale del
formulario, procedimiento ó módulo donde se declaró. Cada vez que se entre al
formulario, procedimiento o módulo, la variable tomará el valor cero (si es
numérica) o nulo (si es string).

[Link].- Sentencia PRIVATE Es la forma de declarar una variable como Privada.


Puede
emplearse solamente en la sección de declaraciones de un Formulario o Módulo.
La sintaxis es de la siguiente forma:

15
Private nombrevariable As Tipovariable
Declarando una variable mediante la sentencia PRIVATE en un Formulario o
Módulo, esa variable puede usarse en todo ese Formulario o Módulo (En todos
sus Procedimientos y Funciones), pero NO fuera del Formulario o Módulo donde
se declaró. La sentencia Private no puede usarse en un procedimiento o función.

[Link].- Sentencia PUBLIC Es la forma de declarar una variable como Pública.


Puede emplearse solamente en la sección de declaraciones de un Formulario o
Módulo. La sintaxis es de la siguiente forma:
Public nombrevariable As Tipovariable
Declarando una variable de esta forma en la sección de declaraciones de un
Módulo, esa variable puede usarse en cualquier parte del programa citándola
simplemente por su nombre.
Si se declara de esta forma en la sección de declaraciones de un Formulario, esa
variable puede usarse en toda el programa. Para nombrarla, si estamos en el
Formulario donde se declaró basta con citarla por su nombre. Si no estamos en
ese Formulario, habrá que citarla por el nombre del Formulario, seguido del
nombre de la variable, separado por un punto:
[Link]
[Link].- Sentencia STATIC
Si declarásemos una variable en un procedimiento o función, como estática, esa
variable, aunque no la podremos utilizar fuera de ese procedimiento o función,
cuando volvamos a él conservará el valor que tenía cuando lo abandonamos. Esta
declaración como estática se realiza mediante la instrucción Static
Static nombrevariable As tipovariable

2.5.5.- Sentencias condicionales.


Llamamos sentencias condicionales a aquellas que se realizan si se cumple una
determinada condición.
La sentencia condicional más usada es:
Si se cumple una condición Entonces

16
Realiza estas instrucciones
Si no se cumple
Realiza estas otras instrucciones
Fin de la sentencia.

If condición Then
Instrucciones
Else
Otras instrucciones
End If
Sentencias de bucle.
Es muy común utilizar bucles a lo largo de un programa. Un bucle es una sucesión
repetitiva de instrucciones, que se estarán realizando mientras se cumpla una
condición o mientras no se cumpla otra condición. Es tan sencillo como esto:
Mientras condición
Instrucciones
Fin del bucle
Existen dos formas de bucle: Una, que realiza un número determinado de
recorridos por el bucle. Es el denominado bucle por contador. Otra, realiza el bucle
hasta que se cumpla (o deje de cumplirse) una condición. Es el llamado bucle por
condición.

2.5.6.- Funciones de cadenas


Se denomina CADENA a una sucesión de caracteres. Una cadena puede tener
uno o varios caracteres alfanuméricos. Una cadena es también una sucesión de
números.
Str(número) Convierte un número a una cadena en numeración decimal.
Val (cadena numérica) Obtiene el valor (el número) correspondiente a esa
cadena.
Left (cadena, n) Extrae los n primeros caracteres de una cadena, comenzando
por la izquierda.

17
Right (cadena, n) Extrae lo n últimos caracteres de la cadena
Mid (cadena, m, n) Extrae n caracteres de la cadena, siendo el primer carácter
extraído el que ocupa el lugar m.
Len (cadena) Devuelve la longitud de la cadena
LenB (Cadena) Devuelve el número de Bytes empleados para almacenar la
cadena. Sorpréndase, es el doble que Len (Cadena)

2.5.7.- Formulario y controles


Formulario es una ventana que contiene uno o varios controles, un control hace
que se ejecute determinado programa asociado a este, existen diferentes tipos de
controles para cada tipo de aplicación.
VB asigna nombres de manera automática, pero no es recomendable
mantenerlas, se recomienda utilizar siempre tres letras minúsculas que indican el
pito de control, seguidas por el nombre que le asigne el programador para su fácil
identificación. A continuación se muestra las abreviaturas más utilizadas.

Tabla 2- 3 Controles más comunes

18
2.5.8.- Operadores

Tabla 2-4 Operadores de VB


2.5.9.- Introducción a Ado
ADO permite abrir y crear aplicaciones capaces de manipular bases de datos a
través de un proveedor conocido como OLE DB (Object Linking and Embedding
for DataBase). El objetivo de OLE DB es poner a disposición del programador una
herramienta de nivel inferior que le de acceso universal a los datos con
independencia del origen de datos. Debido a la complejidad de los elementos de
OLE DB, no es posible acceder a ellos directamente desde Visual Basic, pues
utilizaremos los objetos ADO que permiten acceder a las funciones de OLE DB.
Pero esto se logra gracias a los DLLs que se puede observar en la carpeta
C:\Archivos de Programa\Archivos Comunes\System\Ado los cuales nos permiten
conectar con las bases de datos de Oracle, SQLServer y Access.
Con ADO no hay que preparar previamente ninguna conexión. Es el propio
programa el que llama al proveedor de datos OLE DB y le pasa como parámetros
los datos necesarios para que este realice la conexión y abra la BD.
Las características generales de ADO son:
 Mayor velocidad y facilidad de uso.

19
 Menor carga de memoria y de espacio en el disco duro.
Para crear una conexión con una base de datos Access 2000 se usa una cadena
de conexión.
‘Provider=[Link].4.0; PersistSecurity Info=False;Data
Source=C:\proyecto\[Link];
Para lograr esto debemos incluir el componente “Microsoft ADO data control 6.0
(OLEDB)” en el menú Proyecto - Componentes. Y nos posicionamos en la
propiedad ConnectionString para generar la conexión.

2.5.10.- Propiedades del Objeto Recordset


El recordset de ADO tiene propiedades iguales al recordset de DAO, pero tienen
otras que no tienen el de DAO se mencionan algunas usadas para el proyecto.
[Link].- Propiedad AbsolutePosition (ADO)
Especifica la posición ordinal del registro actual de un objeto Recordset. Esta
propiedad devuelve un Long con el número de orden del registro. El cursor tipo
lado servidor no permite esta propiedad Esta propiedad devolverá 1 cuando el
registro actual sea el primer registro del recordset.
[Link].- Propiedades BOF y EOF
Indican si la posición del puntero del Recordset está apuntando a un registro
anterior al primero devolverá True (BOF = True) o después del último registro
(EOF = True). Esta propiedad siempre la podremos mirar, independientemente si
el cursor es lado cliente o lado servidor.
[Link].- Propiedad RecordCount
Indica el número actual de registros de un objeto Recordset. Devuelve un Long
Es posible que esta propiedad no la permita el proveedor de datos, o que no
pueda llegar a averiguarse, ya que dependiendo del tipo de cursor utilizado puede
que no suministre ese dato.
[Link].- Propiedad Source
Devuelve la tabla, consulta o sentencia SQL utilizado en el método Open para
crear el recordset. Es un String.

20
[Link].- Propiedad EditMode
Indica el estado de modificación del registro actual. Es solamente de lectura.
Devuelve uno de las siguientes constantes:
AdEditNone Indica que no hay ninguna operación de modificación en
ejecución.
AdEditInProgress Indica que los datos del registro actual se han modificado pero
que no se han guardado.
AdEditAdd Indica que se ha invocado el método AddNew y que el registro
situado actualmente en el búfer de copia es un nuevo registro que no se ha
guardado en la base de datos.
AdEditDelete Indica que el registro actual se ha eliminado.

2.5.11.- Métodos del objeto Recordset de ADO


[Link].- Método Open
Es el método que ABRE el recordset. Este método es el que busca los registros
que han de rellenar el recordset.
Sintaxis. Esta es la sintaxis general:
[Link] Source, ActiveConnection, CursorType, LockType,
Options
Source (Opcional) Es el nombre de una tabla, consulta o sentencia SQL de la cual
se obtienen los registros del Recordset.
ActiveConnection (Opcional). Es el nombre de un objeto Connection abierto o
una cadena de conexión válida. Esta cadena es la misma que la que
emplearíamos para abrir el objeto Connection.
CursorType (Opcional). Un valor que determina el tipo de cursor que el
proveedor debe usar al abrir el Recordset.
[Link].- Método Update
Guarda los cambios realizados en el registro actual de un objeto Recordset. Se
utiliza tanto para la creación de un registro iniciada con AddNew, como para
guardar los nuevos datos del registro actual.
Sintaxis [Link] Fields, Values

21
[Link].- Método UpdateBatch
Escribe en disco todas las actualizaciones pendientes de proceso por lotes. En
ADO un recordset puede actualizarse registro a registro o por lotes. Todo
dependerá de cómo se ha abierto (Si el valor LockType se ha puesto a
AdLockBatchOptimistic)
Sintaxis [Link] AffectRecords
AffectRecords Constante que determina a cuántos registros afectará el método
UpdateBatch. Puede tomar uno de los siguientes valores.
AdAffectCurrent Escribe solamente los cambios pendientes en el registro
actual.
AdAffectGroup Escribe los cambios pendientes que cumplen el valor de la
propiedad Filter.
AdAffectAll (Predeterminado) Escribe los cambios pendientes en todos los
registros del objeto Recordset.
[Link].- Método Delete
Elimina el registro actual o un grupo de registros. Por defecto elimina solamente el
registro actual. Sintaxis [Link] AffectRecords

2.6.- LCD
El LCD tiene un aspecto físico como el mostrado en la figura 2-6. Está constituido
por un circuito impreso en el que están integrados los controladores del display y
los pines para la conexión del display. En total se pueden visualizar 2 líneas de 16
caracteres cada una, es decir, 2x16=32 caracteres, como se muestra en la figura
2-6.
2.6.1.- Caracteres del LCD
El LCD dispone de una matriz de 5x8 puntos para representar cada carácter. En
total se pueden representar 256 caracteres diferentes. 240 caracteres están
grabados dentro del LCD y representan las letras mayúsculas, minúsculas, signos
de puntuación, números, etc... El resto puede es definido por el usuario.

22
Figura 2 - 6 LCD
2.6.2.- La memoria del LCD
El LCD dispone de dos tipos de memorias independientes: la DD RAM y la CG
RAM
[Link].- DD RAM (Display Data Ram)
En esta memoria se almacenan los caracteres que están siendo visualizados o
que se encuentran en posiciones no visibles. El display almacena en esta memoria
dos líneas de 40 caracteres pero sólo se visualizan 2 líneas de 16 caracteres. Por
ello la DD RAM tiene un tamaño de 2x40=80 bytes.
Para localizar los elementos se utilizan coordenadas (x,y) donde x representa la
posición horizontal e y representa la línea (1-2).
[Link].- CG RAM (Character Generator RAM)
La CG RAM es la memoria que contiene los caracteres definibles por el usuario El
usuario puede definir como máximo 8 caracteres. Cada carácter está representado
por una matriz de 5 columnas x 8 filas.

2.7.- Teclado hexadecimal


Representa un dispositivo de entrada generalmente conectado hacia el
microprocesador el cual permite introducir únicamente señales de voltaje al
momento de ser presionada una de las teclas y de esta manera ser procesado
este valor para su respectiva aplicación
2.7.1.- Estructura interna
Un teclado matricial está constituido por pulsadores normalmente abiertos
formando un circuito, el cual se activa al momento de presionar cualquiera de las
teclas, enviando así una señal de voltaje que será procesada en el

23
microprocesador. Para el proyecto se utilizo una matriz de 4X4 que tiene cuatro
filas (ABCD) y cuatro columnas (1234).
En algunos casos se utilizan cuatro resistencias en las filas, para evitar valores
parásitos debido a armónicos (rebotes) que se generan en muchos dispositivos
eléctricos. Pero esto se puede solucionar mediante software realizando un
muestreo continuo a una rapidez determinada.
La figura 2- 7 muestra un teclado hexadecimal de 4x4 profesional ya que están
diseñadas para que no generen rebotes o disminuir. Sus contactos son parecidos
al carbón.

Figura 2-7 Teclado hexadecimal de 4X4

24
CAPITULO III
DESARROLLO DE TEMA
3.0.- Descripción del proyecto

Figura 3-0 Diagrama de bloques

Se ejecutará VB6 (visual basic 6.0 ) y se conectará con la base de datos de


Access a través de ADO, luego se conectará el cable USB al microcontrolador (pic
18F4550) el cual esperará a ser enumerado por el Host (PC). Mientras en el LCD
(pantalla de cristal liquido) nos muestra el mensaje “CONECTANDO” una vez que
haya sido enumerado mostrará en el LCD el mensaje de “INTRODUZCA
CODIGO”.
A través del teclado hexadecimal de una matriz de 4X4 se digitan cuatro dígitos
los cuales están establecidos en Access en el momento del registro, cada digito es
enviado uno a la vez. En la pantalla del LCD mostrará “… ESPERE” hasta que
reciba un “1” o “0” a través del puerto USB, en caso de que sea “0” mostrará el
mensaje de “REGISTRADO” caso contrario el mensaje será “ERROR”.
Una vez recibido los cuatro dígitos VB6 buscara en la base de datos, si lo
encuentra capturará la fecha y hora del sistema operativo y cargará en VB6 luego
se actualizará la base de datos y enviara al microcontrolador un “0”, si no lo
encuentra enviará un “1”. Y nuevamente mostrará el mensaje de “INTRODUZCA
CODIGO”.

25
3.1.- Diseño de la base de datos en Access 2007
Para ello se dirige el mouse a inicio-todos los programas-Microsoft Office Access
2007, nueva base de datos en blanco y se crea la base de batos con el nombre
“[Link]” aparecerá la siguiente imagen figura 3-1

Figura 3-1 Base de datos en blanco

Se posiciona en la tabla1, se hace clic derecho guardar como


“Contactos” luego asigna el nombre a cada campo y tipo de dato como se
muestra en la figura 3-2

Figura 3-2 Asignación de nombre y tipo tabla CONTACTOS

Se posiciona en el primer campo luego clic derecho seleccionar como clave


principal

26
Se adicionará otra tabla, en el menú crear tabla como muestra la figura 3-3. Se

posiciona el mouse en la tabla creada, clic derecho guardar como


“Registro” luego se asignará nombres a cada campo y tipo de dato como se
muestra en la figura 3-4. Y por último se posicionará el mouse en el primer campo
para crear la clave principal Con eso se concluye en Access 2007
figura 3-5.

Figura 3-3 Tabla registro

Figura 3-4 Asignación de nombre y tipo tabla REGISTRO

Figura 3-5 Conclusión de la base de datos

27
3.2.- EasyHID USB Wizard.
El programa Proton Development Suite posee entre sus herramientas EasyHID
USB Wizard.
EasyHID USB Wizard es un software de aplicación gratuita (hasta ciertos límites).
Esta prestación genera de manera automática los programas necesarios para que
el compilador PICBasicPRO pueda utilizar los microcontroladores de la línea PIC
18FXX5X. Mientras que para el ordenador genera el código en Borland Delphi,
Visual C++ y Visual Basic5. Pero no será necesario el código generado para
PICBasicPRO, ya que se usará
compilador es PIC C.
Aquí se deberá de introducir el
nombre y número de la compañía, el
nombre y número del producto.
Aunque los valores del PID y VID
asigna un ente regulador el cual tiene
un costo. La aplicación es de uso
doméstico.

Figura 3-6 VID-PID

Como muestra la figura 3-7 se deberá


de configurar el tiempo, la corriente
por el bus y el tamaño del buffer de
entrada como de salida máximo 64
bytes.

Figura 3-7 Detalles de configuración

28
Como muestra en la siguiente figura 3-8 se podrá seleccionar el lugar donde se
guardará los archivos, se deberá seleccionar la aplicación VB5, el
microcontrolador 18F4550 y la localización del proyecto. El compilador por defecto
es PICBasicPRO.

Figura 3-8 Selección de compilador - aplicación

Por último el sistema comenzará a organizar y armar el código figura 3-9, se


esperará para trabajar en el proyecto.

Figura 3-9 Generación de proyecto

29
3.3.- Módulo generado por EasyHID USB Wizard en función a [Link].
' this is the interface to the HID controller DLL - you should not
' normally need to change anything in this file.
'
' WinProc() calls your main form 'event' procedures - these are currently
' set to..
'
' [Link](ByVal pHandle as long)
' [Link](ByVal pHandle as long)
' [Link]()
' [Link](ByVal pHandle as long)
Option Explicit
‘ HID interface API declarations...
Declare Function hidConnect Lib "[Link]" Alias "Connect" (ByVal pHostWin As
Long) As Boolean
Declare Function hidDisconnect Lib "[Link]" Alias "Disconnect" () As Boolean
Declare Function hidGetItem Lib "[Link]" Alias "GetItem" (ByVal pIndex As
Long) As Long
Declare Function hidGetItemCount Lib "[Link]" Alias "GetItemCount" () As
Long
Declare Function hidRead Lib "[Link]" Alias "Read" (ByVal pHandle As Long,
ByRef pData As Byte) As Boolean
Declare Function hidWrite Lib "[Link]" Alias "Write" (ByVal pHandle As Long,
ByRef pData As Byte) As Boolean
Declare Function hidReadEx Lib "[Link]" Alias "ReadEx" (ByVal pVendorID As
Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
Declare Function hidWriteEx Lib "[Link]" Alias "WriteEx" (ByVal pVendorID As
Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
Declare Function hidGetHandle Lib "[Link]" Alias "GetHandle" (ByVal
pVendoID As Long, ByVal pProductID As Long) As Long

30
Declare Function hidGetVendorID Lib "[Link]" Alias "GetVendorID" (ByVal
pHandle As Long) As Long
Declare Function hidGetProductID Lib "[Link]" Alias "GetProductID" (ByVal
pHandle As Long) As Long
Declare Function hidGetVersion Lib "[Link]" Alias "GetVersion" (ByVal pHandle
As Long) As Long
Declare Function hidGetVendorName Lib "[Link]" Alias "GetVendorName"
(ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
Declare Function hidGetProductName Lib "[Link]" Alias "GetProductName"
(ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
Declare Function hidGetSerialNumber Lib "[Link]" Alias "GetSerialNumber"
(ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
Declare Function hidGetInputReportLength Lib "[Link]" Alias
"GetInputReportLength" (ByVal pHandle As Long) As Long
Declare Function hidGetOutputReportLength Lib "[Link]" Alias
"GetOutputReportLength" (ByVal pHandle As Long) As Long
Declare Sub hidSetReadNotify Lib "[Link]" Alias "SetReadNotify" (ByVal
pHandle As Long, ByVal pValue As Boolean)
Declare Function hidIsReadNotifyEnabled Lib "[Link]" Alias
"IsReadNotifyEnabled" (ByVal pHandle As Long) As Boolean
Declare Function hidIsAvailable Lib "[Link]" Alias "IsAvailable" (ByVal
pVendorID As Long, ByVal pProductID As Long) As Boolean

' windows API declarations - used to set up messaging...


Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA"
(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As
Long

31
' windows API Constants
Private Const WM_APP = 32768
Private Const GWL_WNDPROC = -4

' HID message constants


Private Const WM_HID_EVENT = WM_APP + 200
Private Const NOTIFY_PLUGGED = 1
Private Const NOTIFY_UNPLUGGED = 2
Private Const NOTIFY_CHANGED = 3
Private Const NOTIFY_READ = 4

' local variables


Private FPrevWinProc As Long ' Handle to previous window procedure
Private FWinHandle As Long ' Handle to message window

' Set up a windows hook to receive notification


' messages from the HID controller DLL - then connect
' to the controller
Public Function ConnectToHID(ByVal pHostWin As Long) As Boolean
FWinHandle = pHostWin
ConnectToHID = hidConnect(FWinHandle)
FPrevWinProc = SetWindowLong(FWinHandle, GWL_WNDPROC, AddressOf
WinProc)
End Function

' Unhook from the HID controller and disconnect...


Public Function DisconnectFromHID() As Boolean
DisconnectFromHID = hidDisconnect
SetWindowLong FWinHandle, GWL_WNDPROC, FPrevWinProc
End Function

32
' This is the procedure that intercepts the HID controller messages...
Private Function WinProc(ByVal pHWnd As Long, ByVal pMsg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
If pMsg = WM_HID_EVENT Then
Select Case wParam

' HID device has been plugged message...


Case Is = NOTIFY_PLUGGED
[Link] (lParam)

' HID device has been unplugged


Case Is = NOTIFY_UNPLUGGED
[Link] (lParam)

' controller has changed...


Case Is = NOTIFY_CHANGED
[Link]
' read event...
Case Is = NOTIFY_READ
[Link] (lParam)
End Select
End If
' next...
WinProc = CallWindowProc(FPrevWinProc, pHWnd, pMsg, wParam, lParam)

End Function

33
3.4.- Diseño de los formularios en VB6
Se abrirá el programa generado por EasyHID USB Wizard, en el formulario se

adiciona el primer Frame y en su propiedad caption se escribe “Datos

Personales” y se adicionará un TextBox como se muestra en la figura 3-10 se


hace una copia, preguntará si se desea crear una matriz de controles se aceptará
y pegará como se muestra en la figura 3-10. Se adiciona un Label para darle
nombre o etiquetar a cada caja de texto según la base de datos, PictureBox
para la imagen y ComboBox para seleccionar entre femenino y masculino.

Figura 3-10 Frame Datos Personales.


3.4.1.- Conexión entre la base de datos y la tabla
Haz clic en el menú Proyecto, Componentes,
selecciona el componente Microsoft Ado Data Control
6.0(OLEDB) y haz clic en Aceptar. Ahora el objeto se
halla en la Caja de herramientas, se adicionará dos al
formulario y en sus propiedades le asignamos el nombre
AdoContactos y Ado Registro. En su propiedad
ConnectionString hacemos clic en los tres puntos como
muestra la figura 3-11, aparecerá una ventana con el
nombre de Páginas de propiedades y seleccionar usar
una cadena de conexión, presionar generar.
Figura 3-11 Propiedades de AdoContactos.

34
En la ventana proveedor figura 3-
12, se seleccionará Microsoft
OLE DB Provider for ODBC
Drivers.
En la ventana “Conexión”
seleccionar usar la cadena de
conexión, luego presionar generar
aparecerá una ventana
“seleccionar origen de datos”,
nombre de DNS presionar nuevo.
Seleccionar Microsoft Access
Driver (*.mdb, *.accdb) como en la
figura 3-13.

Figura 3-12 Proveedor

Presionar siguiente, examinar y


guardamos con el nombre App y
finalizar. Se Seleccionará el
nombre de la base de datos
“[Link]” por ultimo
aceptar.

figura 3-13 Crear nuevo origen de datos

En AdoContactos en su propiedad RecordSource se escribe el comando SQL


SELECT * FROM CONTACTOS

35
3.4.2.- Conectando las cajas de texto con AdoContactos.
a) Selecciona una de las cajas de texto y modifica sus propiedades como
sigue:
b) DataSource: selecciona AdoContactos.
c) DataField: selecciona el nombre del campo de la tabla –que corresponda
con la etiqueta correcta, que se mostrará en la caja de texto.
d) Repite los pasos con cada caja de texto del formulario.
En el formulario que se conecto a la base de datos, al hacer clic en el botón de
avance del control Adodc se mostrarán los registros de la tabla Contactos.

En la figura 3-14 contiene un DTPicker para ello se dirige el mouse al menú


proyecto-componentes o Ctrl T y seleccionar Microsoft Windows Common
Controls-2 6.0(SP4). El resto son TextBox ya mencionadas anteriormente. Con
la excepción de que tiene un datagrid y en su propiedad DataSource =
AdoRegistro.

Figura 3-14 Datos Institucionales.


En la figura 3-15 se tiene un TextBox con el nombre TxtRecibe en el cual se
llega a visualizar los datos que llegan del puerto USB. Además se tiene un
Timer par la hora y fecha.

Figura 3-15 Frame2.


En la figura 3-16 se tiene tres Frames, el primer frame se muestra al ejecutar
el programa, si se requiere adicionar mostrará el FrmAdi con sus tres opciones,
si quiere modificar mostrará el FraOtro, pero en su propiedad caption del

36
primer CommandButton mostrará modificar y no así eliminar como muestra la
figura y por ultimo si se quiere eliminar mostrará el FrmOtro.

Figura 3-16 (FraPrin- FrmAdi- FraOtro).


En la figura 3-17 se tiene un Frame3, dentro de él un ListBox para poder
visualizar el registro de cada uno.

Figura 3-17 Registro.


En la figura 3-18 muestra el estado de conexión entre Visual Basic y pic
18f4550.

Figura 3-18 Estado de conexión.

37
3.5.- Código de VB6
Dim modifica, encontrado As Boolean
Dim r As VbMsgBoxResult
Private Const VendorID = 1121'ID vendedor y producto
Private Const ProductID = 32
Dim BufferIn(0 To 8) As Byte
Dim BufferOut(0 To 8) As Byte
_________________________________________________
Private Sub Form_Load()
ConnectToHID ([Link])
[Link] = "DESCONECTADO"
End Sub
__________________________________________________
Private Sub Form_Unload(Cancel As Integer)
DisconnectFromHID
End Sub
__________________________________________________
'evento de conexion del dispositivo HID
Public Sub OnPlugged(ByVal pHandle As Long)
If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) =
ProductID Then
[Link] = "USB CONECTADO"
End If
End Sub
_______________________________________________________________
'evento de desconexion del dispositivo HID
Public Sub OnUnplugged(ByVal pHandle As Long)
If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) =
ProductID Then
[Link] = "USB DESCONECTADO"
End If

38
End Sub
________________________________________________________________
'Compara los ID con los ID del controlador HID
Public Sub OnChanged()
Dim DeviceHandle As Long
DeviceHandle = hidGetHandle(VendorID, ProductID)
hidSetReadNotify DeviceHandle, True
[Link] = ""
End Sub
_________________________________________________________________
'Evento de llegada de datos HID por USB, sirve para leer informacion
Public Sub OnRead(ByVal pHandle As Long)
If hidRead(pHandle, BufferIn(0)) Then
If (BufferIn(1) = Asc("P") And BufferIn(2) = Asc("=") And BufferIn(4) =
Asc("T")) Then
[Link] = [Link] & Chr(BufferIn(3)) '& vbCrLf
End If
End If
End Sub
________________________________________________________________
Private Sub cmdAdi_Click()
[Link] = False
[Link] = True
[Link]
[Link]
Text1(1).SetFocus
End Sub
__________________________________________________________________
Private Sub cmdCancel_Click()
[Link]
[Link] = False

39
[Link] = True
End Sub
__________________________________________________________________
Private Sub cmdEje_Click()
If [Link] = "&Modificar" Then ' modificamos
[Link]
MsgBox "Los datos fueron modificados", vbExclamation
[Link] = False
[Link] = True
[Link]
Exit Sub
End If
If [Link] = "&Eliminar" Then
r = MsgBox("Está seguro de eliminar el registro", vbQuestion + vbYesNo)
If r = vbYes Then
[Link]' colocamos el puntero
MsgBox "Los datos fueron eliminados"
[Link] = False
[Link] = True
[Link]
End If
End If
End Sub
__________________________________________________________________
Private Sub cmdEli_Click()
modifica = False
[Link] = True
[Link]
[Link]
End Sub
________________________________________________________________

40
Private Sub CmdFoto_Click(Index As Integer)
[Link]
If [Link] <> "" Then
[Link] = LoadPicture([Link])
End If
End Sub
__________________________________________________________________
Private Sub cmdModi_Click()
modifica = True
[Link] = True
[Link]
[Link]
End Sub
_________________________________________________________________
Private Sub CmdCancelar_Click()
[Link]
[Link] = False
[Link] = True
End Sub
__________________________________________________________________
Private Sub CmdGuardar_Click()
[Link]
[Link] = False
[Link] = True
End Sub
__________________________________________________________________
Private Sub Timer1_Timer()
[Link] = Time
[Link] = Date
End Sub
__________________________________________________________________

41
Private Sub txtBuscar_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 And [Link] <> "" And
[Link] <> 0 Then
encontrado = False
[Link]
Do While (Not [Link]) And encontrado = False
If [Link]("id") = [Link] Then
encontrado = True
End If
_________________________________________________________________
If Not [Link] And encontrado = False Then
[Link]
Loop
If encontrado = True Then ' habilitamos
[Link] = False
[Link] = True
If modifica = True Then
[Link] = "&Modificar"
If [Link] = dbEditNone Then
End If
Else
[Link] = "&Eliminar"
End If
Text1(1).SetFocus
[Link] = ""
[Link] = False
Else
MsgBox "Registro no encontrado", vbExclamation + vbOKOnly, "Error"
End If
End If
If KeyAscii = 27 Then

42
[Link] = ""
[Link] = False
End If
End Sub
________________________________________________________________
Private Sub txtRecibe_Change()
Dim AUXCOD, AUXHORA, AUXFECHA As String
If Len([Link]) = 4 Then
encontrado = False
[Link]
Do While (Not [Link]) And encontrado = False
If [Link]("id") = [Link] Then
encontrado = True
End If
If Not [Link] And encontrado = False Then
[Link]
Loop
If encontrado = True Then ' adicionamos SUS REGISTROS
AUXCOD = [Link]
AUXHORA = [Link]
AUXFECHA = [Link]
[Link]
[Link]("COD_P").Value = AUXCOD
[Link]("HORA").Value = AUXHORA
[Link]("FECHA").Value = AUXFECHA
[Link] adAffectAllChapters
[Link]
[Link]
[Link] ' buscamos sus registros
[Link]
Do While Not [Link]

43
If [Link]("COD_P") = [Link] Then
[Link] [Link]("HORA").Value & " - "
& [Link]("FECHA").Value
End If
If Not [Link] Then [Link]
Loop
[Link] AUXHORA & " - " & AUXFECHA
[Link] = ""
BufferOut(0) = 0
BufferOut(1) = Asc("P")
BufferOut(2) = Asc("=")
BufferOut(3) = "0" ' mandamos un cero por el puerto serie
BufferOut(4) = Asc("T")
hidWriteEx VendorID, ProductID, BufferOut(0)
Else
[Link] = ""
BufferOut(0) = 0
BufferOut(1) = Asc("P")
BufferOut(2) = Asc("=")
BufferOut(3) = "1" 'mandamos un uno por el puerto serie
BufferOut(4) = Asc("T")
hidWriteEx VendorID, ProductID, BufferOut(0)
End If
End If
End Sub
__________________________________________________________
Private Sub CmdEnd_Click()
End
End Sub

44
3.6.- Compilador CCS (PIC C)
Como compilador se utilizó el CCS v4.068, ya que ofrece una gran facilidad en el
uso de las librerías USB.
El entorno de trabajo del CCS permite compilar y también suministra una gran
variedad de herramientas auxiliares como se muestra en la figura 3-19 los distintos
elementos básicos del entorno de trabajo. Existen dos formas de iniciar una
sesión: abriendo un fichero de código fuente o creando un proyecto.

Figura 3-19 Ventana del compilador CCS

Para crear el proyecto o para la creación del FIRWARE se dirige el mouse a inicio
\todos los programas \PIC-C \ PIC C Compiler, luego new-Source File y se asigna
un nombre al proyecto que desea crear.

45
Figura 3-20 New Source File

Figura 3-21

Figura 3-22

46
3.6.1.- Desarrollo en el compilador PIC C paso a paso
Una vez que ya se tiene el proyecto creado se escribe el archivo de cabecera para
el pic 18f4550, sentencia de código:

Luego Los “fuses” (o más conocido como palabra de configuración) los cuales son
muy importantes ya que determinan muchos parámetros del microcontrolador.

- HSPLL: Se utiliza un cristal de alta velocidad en conjunto con el PLL del pic. Se
debe utilizar un crystal de alta velocidad >= a 4MHZ
- NOMCLR: No usar el pin MCLR, utilizar reset por software.
- NOWDT: No utilizar el perro guardián.
- NOPROTECT: No proteger la memoria contra lecturas.
- NOLVP: No habilitar la programación con bajo voltaje.
- NODEBUG: No utilizar código para debug.
- USBDIV: Significa que el reloj del módulo USB se tomará de la salida del PLL\2.
En este caso 96Mhz \ 2 = 48Mhz (Frecuencia de trabajo).
- PLL5: Esto quiere decir que el prescaler dividirá en 5 la frecuencia del oscilador
principal para obtener los 4Mhz necesarios en la entrada del PLL. Como se usará
un cristal de 20Mhz….20Mhz \ 5 = 4Mhz.
- CPUDIV4: La frecuencia del PLL se dividirá en 6 para obtener la frecuencia de
trabajo del CPU: 16Mhz. (esto quiere decir que el clock del pic trabajara con
16Mhz) ya que son independientes y pueden trabajar en distintas frecuencias.
- VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB
- NOPBADEN: Todo el puerto B como entradas/salidas digitales.

Se declara la frecuencia de trabajo para que el compilador pueda calcular los


retardos en las funciones de delay.

47
Luego se llama a las librerías del lcd y del teclado al cual se hicieron
modificaciones ya que por defecto solo tiene una matriz de 3X4 y lo que se
necesita es una matriz de 4X4, el cual ocupará el puerto B, se pone entre comillas
ya que buscará lo más cercano y no buscara en las librerías del CCS sino en la
carpeta donde se encuentra el proyecto.

Se define que usará la clase HID (Human Interface Device) y no así la clase CDC
al cual es necesario instalar un driver par que lo reconozca.

Habilitar la transferencia y recepción, indicar que usará cuatro bytes para


transmisión y cuatro bytes para recepción. Los endpoint (USB_EP1_TX_SIZE y
USB_EP1_RX_SIZE) son simplemente buffer de memoria RAM que son utilizados
para el envío y recepción de datos o comandos de control durante una
comunicación USB. Cada endpoint puede ser de entrada o salida de datos o
ambos (bidireccional), el endpoint 0 está reservado para comandos de control, el
proceso de enumeración se realiza a través del endpoint número 0.

Estas son las librerías necesarias para la clase HID en el respectivo orden pero lo
que interesa es: “usb_desc_hidh” ya que en ella se podrá personalizar el
proyecto.
Sacar una copia del archivo usb_desc_hid.h que está en el directorio de driver
const char USB_CLASS_SPECIFIC_DESC[]

48
Las dos líneas que dicen 0x95, 2, // Report count = 16 bits (2 bytes) cambiar el dos
por cuatro, que para el caso los caracteres a enviar o recibir es: “P=nT “.
Donde n es el valor del dato que interesa, cada carácter representa un byte..
Otra modificación se realizará en: const char
USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={

0x61,0x04, //vendor id (0x04D8 is Microchip, or is it 0x0461 ??)


0x20,0x00, //product id ==11,12 //don't use ffff says usb-by-example guy. oops
El VID es un número de 16 bits que significa Vendor Identification o código que
identifica al fabricante del hardware. Para el proyecto utilizar el número 0x0461
que es por defecto pero también puede usarse 0x04D8 que identifica a Microchip.

49
O cualquier otro número, pero en realizad se debe de comprar el numero para
trabajar en el mercado. El PID también de 16 bits que significa Product
Identification o código que identifica al dispositivo. Utilizar el número 0x0020 que
también es por defecto, pero Microchip usa 0x 000A.
Por último el nombre con el que Windows detectará el dispositivo, sirven para que
muestre información referente al fabricante del dispositivo, como nombre de la
compañía y nombre del producto. Para ello se debe ir a: char const
USB_STRING_DESC[]={
USB_STRING_DESC contiene los tres strings que se desea transmitir con el
descriptor USB. Cada uno de ellos tiene la misma estructura que consta de un
primer byte que indica la longitud total de la correspondiente cadena, un segundo
byte que indica el tipo de dato que viene a continuación y por último tantos bytes
como sean necesarios como contenido del string.
4, USB_DES_STRING_TYPE, 0x09, 0x04 que puede leerse como cuatro:
Longitud en bytes del dato. USB_DES_STRING_TYPE que es una constante cuyo
valor es tres y que dice que lo que sigue es un string. Y 0x09, 0x04 que le indica al
Windows que los strings que siguen están escritos en correcto inglés americano
(US-English)
Longitud de la cadena = (Nº caracteres + 1)x2
string 1-Fabricante: 8, // (3+1)x2=8
string 2-Fabricante: 30, // (14+1)x2=30

50
Ahora se declaran variables como MSJ que servirá para mostrar los mensajes en
el lcd, rx_msg[4] y rx_Mensaje[4] cuatro bytes de envió y recepción, cont para los
cuatro dígitos del pasword y lcd_cont para la posición del primer digito a digitar.

Se declara una función para la recepción de datos (usb_rx_task). usb_kbhit que


devuelve verdaderos (true) si el punto final (endpoint) de salida contiene los datos
del host. Usb_get_packet consigue un paquete del host. De usb_kbhit debe
devolver verdadero antes de que se llame esta rutina o sus datos no podrían ser
ciertos. usb_get_packet(endpoint, *ptr, max) esto solamente recibe un packet, si
se quiere recibir un mensaje multi- paquete se usa usb_gets.
En caso de que el paquete de cuatro bytes contenga el número cero en el byte
(dos) nos confirmarán que se encuentra en la base de datos y en la pantalla lcd
nos mostrará registrado, caso contrario nos mostrará el mensaje de error. Los
delay se usan para poder visualizar mejor ya sin ello no se lograría.

51
Por último se declara la función principal. El paquete que se enviará al host
(Mensaje[0-3]). El programa envía el número ingresado al microcontrador a través
del teclado hexadecimal, el paquete consta de cuatro caracteres en el siguiente
formato:
P= nT
Donde P de carácter que señala el inicio de los datos, n es el byte a ser enviado al
host, y T es el carácter que indica el final del paquete.
Deshabilitar puertos analógicos e inicializar el lcd y teclado, pero además habilitar
el pullups del puerto B.
usb_init inicializa el hardware del USB, se encuentra en un bucle infinito hasta
que el conector usb es conectado al bus, pero esto no quiere decir que haya sido
enumerado por el HOST. Habilita las interrupciones del USB.
Luego muestra en la pantalla del lcd, el mensaje “conectando”.
usb_wait_for_enumeration Se encierra en un bucle hasta que el Pic sea
configurado por el host y después sale. Y ya se puede usar para la comunicación.

52
Luego entra en un bucle donde espera a que llegue un mensaje o que se digite en
el teclado

53
3.6.2.- Código fuente del pic 18f4550
#include <18f4550.h> //archivo de cabecera
#fuses
HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPU
DIV4,VREGEN,NOPBADEN // fuses configurados
#use delay(clock=48000000) // el clock que se tendrá a la entrada
del CPU compatible con USB 2.0
#include <lcd.c>
#define use_portb_kbd TRUE
#include "kbd4X4.c"
#DEFINE USB_HID_DEVICE TRUE // Si usar HID
//Habilitar la Transferencia
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT //Activa el punto
final 1 para transferencias por bloque
#define USB_EP1_TX_SIZE 4 //4 bytes para envío
//Habilitar la Recepción
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT //Activa el punto
final 1 para recepción por bloque
#define USB_EP1_RX_SIZE 4 //4 bytes para recepción
#include <pic18_usb.h> //Funciones de bajo nivel (hardware) para la serie PIC
18Fxx5x que servirán en usb.c
#include "usb_desc_hid.h" //Aqui es donde van las descripciones de este
dispositivo (como lo reconocerá Windows)
#include <usb.c> //librería para el manejo del USB

CHAR MSJ;
int8 rx_msg[4];
int8 Mensaje[4];
int cont=0;
int lcd_cont=9;

54
void usb_rx_task(void) {
if (usb_kbhit(true)) {
//usb_get_packet(1, rx_msg, sizeof(rx_msg));
usb_get_packet(1, rx_msg, 4);
delay_ms(100);
if (rx_msg[2]==0){
printf(lcd_putc,"\fREGISTRADO");
delay_ms(200);
lcd_putc("\f ");
lcd_gotoxy(4,1);
printf(lcd_putc,"INGRESE CODIGO\n");
}
else
{
printf(lcd_putc,"\fERROR?");
delay_ms(200);
lcd_putc("\f ");
lcd_gotoxy(4,1);
printf(lcd_putc,"INGRESE CODIGO\n");
}
}
}
void main() { //función principal
Mensaje[0]="P";
Mensaje[1]="=";
Mensaje[3]="T";
setup_adc_ports(NO_ANALOGS); // desactivando puertos analogicos
lcd_init();
kbd_init();
port_b_pullups(true);
usb_init(); //inicializa y espera a ser encendido

55
printf(lcd_putc,"...CONECTANDO");
usb_wait_for_enumeration(); //ahora espera hasta ser enumerado (reconocido
por la PC)
lcd_putc("\f ");
lcd_gotoxy(4,1);
printf(lcd_putc,"\INGRESE CODIGO\n");

while(true){
usb_rx_task();
Mensaje[2]=kbd_getc();
MSJ=Mensaje[2];
if (cont<=3){
if (Mensaje[2]!=0){
//usb_puts(1,Mensaje,4,100);
usb_put_packet(1, Mensaje,4,USB_DTS_TOGGLE);
lcd_gotoxy(lcd_cont,2);
lcd_putc("*");
cont++;
lcd_cont++;
}
}
else{
delay_ms(5);
printf(lcd_putc,"\f...ESPERE");
cont=0;
lcd_cont=9;
}
}
}

56
3.6.3.- Diseño de la placa en proteus

Partirde la creación de proteus, en el menú Tools seleccionar netlist a ares y


abrirá Ares con los PCB utilizados como nuestra la figura 3-24.

Figura 3-23 Isis7 (proteus)

Seleccionar Component Mode de la caja de


herramientas y arrastrar cada componente como se
desee posicionar, como la figura 3-25.

En el menú Technology seleccionar Design Ruler


- Net Classes – (Power- Signal) para que sea en
una sola capa Pair1 H y V ambos en Bottom Copper
por último auto router .

Figura 3-24 PCB utilizados

57
Figura 3-25

Figura 3-26 Visualización 3D de Ares

58
Figura 3-27 Visualización 3D de Ares

Figura 3-28 Placa quemada

59
Figura 3-29 Conclusión de la Placa

Figura 3-30 En funcionamiento

60
CONCLUSIONES

Permite que los diferentes supervisores utilicen su autoridad para modificar la


información pertinente de sus subordinados, permite llevar a cabo la síntesis de la
información de nomina en menor tiempo que el sistema tradicional de marcación
de tarjetas que pertenece a un departamento asignado para esta labor. Fácil de
consultar la información del personal y tiene gran capacidad de almacenamiento.
Su costo es muy bajo comparado con los actuales sistemas de control de
asistencia. Puesto que este sistema utiliza los recursos existentes de las
empresas como una computadora y el consumo de corriente es de
aproximadamente unos 25 mA , la inversión es muy inferior en relación con los
sistemas electrónicos actuales como el código de barras en donde el simple
dispositivo llega a cotizarse entre 1000 y 2000 dólares según internet, mientras
que el dispositivo utilizado es de aproximadamente de 250 Bs.

Componente Cantidad Costo Bs


LCD 1 100
Pic 18f4550 1 <80
Zócalo 20 x lado 1 3
Conector USB tipo B 1 7
Cristal 1 7
Capacitor 3 3
Potenciómetro 1 5
Placa virgen 1 5
Acetato 1 2
Perclorato 1 18
Cable USB 1 20
Total 250

Una recomendación: siempre utilizar los capacitores para el cristal, para la


estabilidad que es muy importante. Para grabar el firmware se utilizo WinPic800
con el hardware pipo (modificación de JDM) agregándole dos capacitores de entre
22-30 pF en: reloj y data respecto a tierra para darle estabilidad.

61
BIBLIOGRAFIA

COMPILADOR C CCS Y SIMULADOR PROTEUS PARA


MICROCONTROLADORES PIC Eduardo García Breijo

ADVANCED PIC MICROCONTROLLER PROJETS IN C From USB to ZIGBEE


with the PIC 18F Series Dogan Ibrahim

[Link]

[Link]
[Link]

[Link]
-usb-para-principiantes&catid=1:tutorial&Itemid=23

[Link]

[Link]
31415/

[Link]

[Link]

[Link]

[Link]
pic18f2550-17458/[Link]

[Link]
pic18f2550-17458/

[Link]

[Link]
[Link]

[Link]
[Link]#introduccion

[Link]
basic/zip/[Link]

[Link]

62

También podría gustarte