Pic Con Teclado Matricial
Pic Con Teclado Matricial
FACULTAD TECNICA
ELECTRONICA Y TELECOMUNICACIONES
NIVEL LICENCIATURA
PROYECTO DE APLICACION
LA PAZ – BOLIVIA
2011
DEDICATORIA
Í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.2.- JUSTIFICACION
1.3.0.- OBJETIVO
1.4.- DELIMITACION
1
CAPITULO II
FUNDAMENTO TEORICO
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
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.
5
El diseño del oscilador requiere el uso de un cristal de corte paralelo.
Tabla 2-2
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.
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.
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.
9
La Figura 2-4 Muestra la organización de la memoria de datos
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)
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
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.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.
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.
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.
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.
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)
18
2.5.8.- Operadores
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.
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.
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.
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.
24
CAPITULO III
DESARROLLO DE TEMA
3.0.- Descripción del proyecto
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
26
Se adicionará otra tabla, en el menú crear tabla como muestra la figura 3-3. Se
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.
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.
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
31
' windows API Constants
Private Const WM_APP = 32768
Private Const GWL_WNDPROC = -4
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
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
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.
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.
36
primer CommandButton mostrará modificar y no así eliminar como muestra la
figura y por ultimo si se quiere eliminar mostrará el FrmOtro.
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.
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.
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.
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] ={
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.
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
57
Figura 3-25
58
Figura 3-27 Visualización 3D de Ares
59
Figura 3-29 Conclusión de la Placa
60
CONCLUSIONES
61
BIBLIOGRAFIA
[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