Professional Documents
Culture Documents
WWW.CONEXIONELECTRONICA.COM
CONTENIDO
Prologo.
Capitulo I.
1.1.1.2.1.3.1.4.1.5.1.6.-
Herramientas de diseo.
Entorno de Desarrollo Integrado de mikroBasic.
Estructura de un programa.
Crear un nuevo proyecto en mikroBasic.
Conociendo el entorno de desarrollo integrado.
Componentes y operadores en mikroBasic.
1.6.1.1.6.2.1.6.3.1.6.4.1.6.5.1.6.6.1.6.7.1.6.8.-
Subrutinas.
Variables.
Arrays.
Constantes.
Alias.
Operadores Aritmticos.
Operadores Bit a Bit.
Operadores de Comparacin.
Capitulo II.
2.1.2.2.2.3.2.4.-
iv
El registro ADCON0.
El registro ADCON1.
Ejemplo #43. Conversin A/D de una seal analgica.
Ejemplo #44. Conversin A/D con voltaje de referencia.
Ejemplo #45. Conversin A/D, datos adicionales en la pantalla.
8.2.- El Acelermetro.
8.2.1.- Ejemplo #46. Acelermetro 3D, conversin A/D de datos en los
ejes X, Y, Z.
8.2.2.- Clculo del voltaje de entrada del conversor A/D.
8.2.3.- Clculo de la aceleracin en base al voltaje calculado en cada eje.
8.2.4.- Ejemplo #47. Visualizar voltaje y aceleracin calculada en la GLCD.
8.3.- Termocupla.
8.3.1.- AD594/AD595, clculo de la linealidad.
8.3.2.- Ejemplo #48. Termmetro digital con termocupla tipo J.
Captulo IX. Comunicacin Serial Asncrona RS232.
9.1.- Comunicacin Serial Asncrona RS232.
9.2.- Librera UART.
9.2.1.- Rutina UART1_Init().
9.2.2.- Rutina UART1_Data_Ready().
v
9.2.3.9.2.4.9.2.5.9.2.6.9.2.7.-
Rutina UART1_Read().
Ejemplo #49. Recepcin de datos va RS232.
Ejemplo #50. Almacenar y visualizar una cadena de caracteres.
Rutina UART1_Write().
Ejemplo #51. Transmisin y recepcin de datos va RS232.
Rutina
Rutina
Rutina
Rutina
Rutina
Mmc_Init().
Mmc_Read_Cid().
Mmc_Read_Csd().
Mmc_Write_Sector().
Mmc_Read_Sector().
10.4.- WinHex.
10.4.1.- Ejemplo #58. Almacenamiento de datos en sectores especficos
de la memoria SD.
10.4.2.- Ejemplo #59. Lectura de datos de un sector especfico.
10.5.- Sistema de archivos FAT.
10.5.1.- Rutina Mmc_Fat_Init().
10.5.2.- Rutina Mmc_Fat_QuickFormat().
10.5.3.- Ejemplo #60. Cmo dar formato a una tarjeta de memoria SD
desde el microcontrolador PIC.
10.5.4.- Cmo crear un archivo en una tarjeta de memoria SD?.
10.5.5.- Rutina Mmc_Fat_Assign().
10.5.6.- Ejemplo #61. Crear un archivo .txt con atributo de slo lectura.
10.5.7.- Ejemplo #62. Crear un archivo .txt con atributo de slo lectura y
archivo oculto.
10.5.8.- Ejemplo #63. Crear un subdirectorio o carpeta.
10.5.9.- Ejemplo #64. Atributo Archivo.
10.6.- Ingresar datos en un archivo almacenado en la memoria SD.
10.6.1.- Ejemplo #65. Almacena cadena de caracteres enviada desde la
terminal de comunicaciones de mikroBasic va RS232.
10.7.- Asignar fecha y hora a un archivo.
10.7.1.- Ejemplo #66. Asigna fecha y hora a un archivo.
10.8.- Verificar si un archivo de nombre especfico existe.
10.8.1.- Ejemplo #67. Verifica si existe un archivo en la memoria SD.
10.9.- Insertar datos en un archivo existente.
10.9.1.- Ejemplo #68. Insertar cadena de datos en un archivo existente.
vii
Rutina PWM1_Init().
Rutina PWM1_Set_Duty().
Rutina PWM1_Start().
Rutina PWM1_Stop().
PWM2.
Ejemplo #71. Genera seal PWM controlada.
Ejemplo #72. Control de un Motor DC.
viii
Prlogo
La segunda edicin del libro Basic para Microcontroladores PIC esta basado en el estudio
del compilador mikroBasic Pro, de la empresa MikroElektronika. El contenido de esta obra
facilita un verdadero inicio rpido en la programacin de microcontroladores PIC gracias a
una completa librera diseada para el control de una gran variedad de perifricos,
facilitando el desarrollo de proyectos electrnicos a travs de 72 ejemplos prcticos,
analizados y comentados detalladamente en base a los microcontroladores PIC16F877,
PIC18F442, PIC18F452 y PIC18F458.
La mayora de los proyectos han sido desarrollados con la ayuda del entrenador de
microcontroladores EasyPic5 de mikroElektronika, adems de una serie de componentes
adicionales de fcil adquisicin y bajo costo.
Al igual que en la primera edicin, la metodologa empleada ha sido orientada para que el
lector pueda expandir sus conocimientos para generar nuevas ideas en la implimentacin de
este compilador sobre esta tecnologa ya anteriormente estudiada. Esta obra es la primera
parte de un extenso estudio de mikroBasic, adaptado a nuestro idioma y pensado para
aquellas personas con conocimientos bsicos en la programacin de estos componentes.
Los puntos de estudios ms importantes han sido el control de puertos, pantallas LCD y
GLCD, sonido, funciones trigonomtricas, teclado matricial y PS/2, memoria de datos
EEPROM, conversor A/D, control de dispositivos como potencimetros, acelermetro 3D,
termocupla, comunicacin serial RS-232, BlueTooth, mdulos GPS, programacin en Visual
Basic para control de puertos, multimedia card (MMC y SD), almacenamiento masivo de
datos, creacin de archivos en formato FAT desde el microcontrolador PIC, servomotores y
PWM.
MikroBasic hace posible el desarrollo de nuevas ideas en muy poco tiempo, haciendo del
estudio de los microcontroladores un tema sencillo y accesible.
Capitulo I
2
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
3
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.4
4
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.5
Figura 1.6
5
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.7
Figura 1.8
6
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Haciendo doble clic sobre el mismo, iniciamos el proceso de instalacin del programa.
Figura 1.9
Figura 1.10
En la figura anterior podemos ver la ventana de bienvenida, y al hacer clic en siguiente, la
ventana del contrato de licencia para el usuario.
7
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.11
El compilador.
8
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.12
Al hacer clic en el botn Next, veremos la ruta de instalacin por defecto del compilador en
nuestro PC.
Figura 1.13
9
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.14
Figura 1.15
10
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.16
Figura 1.17
11
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.18
Figura 1.19
Al hacer clic en el botn Si veremos la ventana de bienvenida a la gua de instalacin, y
seguidamente nos encontraremos con la ventana del acuerdo de licencia de programa.
12
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.20
Seleccionamos la opcin para la aceptacin de la licencia y hacemos clic en el botn Next.
Un componente adicional a seleccionar es el software para el programador de
microcontroladores de mikroelektronika. Si ya poseemos el hardware correspondiente a este
software, seleccionamos la casilla para la instalacin del software PicFlash.
Este programador viene integrado en las tarjetas entrenadoras, e incluso se vende por
separado en su versin USB.
13
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.21
Haciendo clic en el botn Next, estaremos viendo la ruta de instalacin por defecto o ruta
sugerida por el programa de instalacin. Esta ruta se puede mantener igual o ser cambiada
segn convenga al usuario.
Una vez seleccionada la ruta, hacemos clic en el botn Install y esperamos a que termine
el proceso de instalacin como se muestra en las siguientes imgenes:
Figura 1.22
14
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.23
Figura 1.24
15
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.25
Figura 1.26
16
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.27
Figura 1.28
17
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.29
Figura 1.30
18
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.31
Terminada la instalacin de drivers, la instalacin de mikroBasic nos pregunta si deseamos
ejecutar el software inmediatamente. Al hacer clic en el botn Si podremos ver que la
interfaz de programacin se abre y queda lista para iniciar a programar nuestros proyectos.
Inicialmente se podr observar que la misma abre automticamente un ejemplo de
programacin en lenguaje Basic, Led_Blinking.pbas.
Figura 1.32
19
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.33
Figura 1.34
20
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
1.3.- Estructura de un programa: Para que nuestros programas tengan una apariencia
ordenada y se facilite la comprensin del mismo ante otros programadores que deseen
realizar mejoras a ste, es necesario establecer una estructura que nos permita identificar
fcilmente cada una de las partes que lo componen.
Figura 1.35
Seccin C: Estar destinada para las instrucciones de programa y la misma est separada
de la columna cero del editor de texto por una tabulacin, es decir, cuando el cursor se
encuentra en la columna cero, presionamos una vez la tecla TAB, y de esta manera
establecemos un espacio mnimo, siempre igual o superior entre la seccin B y C.
Seccin D: Esta destinada para realizar comentarios acerca de la funcin que estar
cumpliendo una instruccin especfica en nuestro programa. Cada comentario debe
empezar siempre con una comilla simple como se muestra a continuacin:
' Define el Oscilador para un Cristal
' de 4 Mhz.
22
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.36
23
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.37
En el paso 2 debemos seleccionar el valor exacto del cristal que estaremos utilizando
como oscilador externo de nuestro microcontrolador PIC.
Figura 1.38
24
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.39
Figura 1.40
25
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.41
Figura 1.42
26
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.43
27
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.44
Figura 1.45
28
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
B
D
E
Figura 1.46
En la seccin A, podemos encontrar las opciones del men principal, adems de todos los
accesos directos a cada funcion del software a travs de pequeos botones ordenados y de
fcil acceso.
La seccin B es el editor en el cual se escribirn los programas de cada proyecto bajo las
recomendaciones realizadas en punto 1.3 de este captulo.
29
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Men File:
Figura 1.47
New Unit: Abre una nueva ventana de edicin de programas para mikroBasic. En
esta ventana escribiremos el cdigo de programa de nuestros proyectos.
Recent Files: Al seleccionar esta opcin, podremos ver una lista de nombres de los
archivos mas recientes en los cuales hemos estado trabajando.
30
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Men Edit:
Figura 1.48
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Sub-Men Advanced:
Figura 1.49
32
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Men View:
Figura 1.50
33
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.51
Sub-men Debug Windows: A travs de este sub-men podemos seleccionar las
ventanas disponibles en el depurador de mikroBasic.
Figura 1.52
34
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.53
Figura 1.54
35
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.55
Figura 1.56
Esta ventana posee adems botones de acceso rpido a algunas funciones importantes:
o
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.57
Cerrar un Proyecto.
Compilar un proyecto.
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.58
38
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.59
Figura 1.60
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Windows o Ventanas: A travs de esta opcin podremos ver un listado de todas las
ventanas desplegables en el entorno de desarrollo integrado de mikroBasic.
Men Project:
Figura 1.61
40
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Clean Project Folder: Esta opcin limpia o borra de la carpeta de proyecto los
archivos generados cuando se realiza la compilacin del mismo.
Edit Project: Despliega una ventana a travs de la cual podemos configurar los
fusibles de programacin del microcontrolador.
41
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.62
Men Run: Contiene todos los comandos relacionados con el depurador de mikroBasic.
Figura 1.63
42
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 1.64
Men Help: A travs de este men podremos acceder a toda la ayuda disponible acerca
del compilador, accesos directos al foro de discusin, pgina Web oficial de
mikroElektronika, formulario de registro del compilador e informacin de registro actual.
Figura 1.65
43
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Nota Importante: En la versin DEMO del compilador mikroBasic, el archivo de salida .HEX
generado cuando compilamos un programa esta limitado a 2K bytes.
Es muy importante que adquiera la licencia correspondiente para la versin completa del
compilador, para poder llevar a cabo todos los ejemplos propuestos en esta edicin.
La licencia es suministrada en lnea por la empresa MikroElektronika y el proceso de
registro es sumamente sencillo. Tener la licencia del compilador nos garantiza adems el
acceso al soporte tcnico de la empresa y el acceso a las continuas actualizaciones que se
realizan para mejorar el producto.
Figura 1.66
44
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Led1:
Etiqueta
For Z = 0 To 9
LED = Encendido
Delay_ms(1000)
LED = Apagado
Delay_ms(1000)
Next Z
GoTo Inicio
Subrutina
End.
MikroBasic cuenta con una serie de herramientas de programacin entre las cuales
podemos mencionar las etiquetas, variables, identificadores, constantes, comentarios y
smbolos entre otras.
Algunas de estas herramientas son de uso obligatorio a la hora de realizar un programa, y
otras que no son de uso obligatorio, nos facilitarn el trabajo considerablemente.
1.6.2.- Variables: En las variables podemos almacenar datos temporalmente, los cuales
podrn ser consultados o modificados cada vez que sea necesario. Normalmente la
definicin de variables se hace al inicio de un programa y para ello se utiliza el formato:
DIM variable As tipo de variable
Tipo de Variable
Tamao
bit
1bit
0 or 1
Rango
sbit
1bit
0 or 1
byte, char
8bit
0 .. 255
short
8bit
-127 .. 128
word
16bit
0 .. 65535
integer
16bit
-32768 .. 32767
longword
32bit
0 .. 4294967295
longint
32bit
-2147483648 .. 2147483647
float
32bit
Figura 1.67
1.6.3.- Arrays: Las variables Arrays tienen un determinado nmero de elementos, definido
segn el tamao de la variable. Las variables Arrays tipo Bit, pueden almacenar 256
elementos; las variables Arrays tipo Byte pueden almacenar hasta 96 elementos y las
variables Arrays tipo Word hasta 48 elementos, los cuales se pueden accesar en cualquiera
de los tres casos a travs de un ndice. Este ndice se especfica entre corchetes como se
muestra en los siguientes ejemplos:
Para declarar una variable tipo Array utilizamos la siguiente sintaxis:
Dim Variable As Byte[7]
El primer elemento de esta variable es Dato[0] y el ltimo elemento es Dato[7], lo cual
significa que hemos declarado una variable array de 8 elementos. En este caso podemos
almacenar un byte en cada elemento, siempre que especifiquemos el ndice.
Ejemplo: Almacenar en cada elemento de la variable Dato los valores 200, 15, 56, 75, 80,
20, 33, 45.
Dato[0] = 200
Dato[1] = 15
Dato[2] = 56
Dato[3] = 75
Dato[4] = 80
Dato[5] = 20
Dato[6] = 33
Dato[7] = 45
En algunos casos se debe verificar la hoja de datos del microcontrolador, ya que la cantidad
de elementos que se pueden almacenar en variables Arrays tipo Byte o Word puede variar
segn el modelo del mismo.
PI
As
Const Meses As
Float = 3.1416
Byte[12] = (31,28,31,30,31,30,31,31,30,31,30,31)
46
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
{alias}
{elemento}
Por ejemplo, si deseamos controlar un motor DC a travs de uno de los pines del puerto A
de un microcontrolador, resultara mucho mas sencillo referirse a este pin como Motor, en
vez de referirse a l como PortA.0.
Entonces,
Symbol
Motor = PORTA.0
Relay = PORTB.0
Symbol
Sensor = PORTA.0
Symbol
LED
= PORTA.1
Symbol
RC0
= PORTC.0
Operadores
Operacin
Operandos
Resultado
Suma
Resta
multiplicacin
float
div
mod
Figura 1.68
47
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
1.6.7.- Operadores Bit a Bit: En la siguiente tabla veremos los operadores binarios
proporcionados para el lenguaje Basic:
Operador
and
or
xor
not
Operacin
AND Lgico
OR Lgico
OR Exclusiva (XOR)
NOT Lgico
Figura 1.69
Con estos operadores resulta muy sencillo realizar operaciones binarias, como lo demuestra
el siguiente ejemplo:
Si aplicamos una AND lgica, donde deseamos filtrar los siete bits ms significativos del
valor almacenado en la siguiente variable:
Var1 = %00101001
Entonces,
Var1 = Var1 and %00000001
El resultado de esta operacin es Var1 = %00000001
Operador
=
<>
>
<
>=
<=
Operacin
Igual
Diferente
Mayor que
Menor que
Mayor o Igual que
Menor o Igual que
Figura 1.70
48
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Capitulo II
Bajo consumo de potencia: < 0.6 mA typical @ 3V, 4 Mhz / 20 A typical @ 3V, 32
kHz.
49
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 2.1
50
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
PIN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Identificacin
MCLR/Vpp
RA0/AN0
RA1/AN1
RA2/AN2/VrefRA3/AN3/Vref+
RA4/TOCKI
RA5/AN4/SS
RE0/RD/AN5
RE1/WR/AN6
RE2/CS/AN7
VDD
VSS
OCS2/CLKOUT
OSC1/CLKIN
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7
VSS
VDD
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
Figura 2.2
51
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 2.3
En los modos de oscilador LP, XT y HS el cristal debe ser conectado a los pines 13 y 14,
Osc2/CLKin y Osc1/CLKout respectivamente, como se muestra en la figura 2.4.
52
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Los valores de los condensadores cermicos vienen dados segn la tabla que se muestra a
continuacin:
Modo
LP
XT
HS
Frecuencia
32 kHz
200 kHz
2 MHz
4 MHz
4 MHz
10 MHz
Osc1/CLKin
68 - 100 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
Osc2/CLKout
68 - 100 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
Figura 2.4
Por ejemplo, para un oscilador tipo XT, podemos utilizar un cristal de cuarzo como el de la
figura 2.5.
Figura 2.5
Al conectar el microcontrolador a la fuente de alimentacin de 5 Vdc y medir la seal de
salida del oscilador XT con un osciloscopio, en el pin 14 (Osc2/CLKout) del
microcontrolador, podremos ver la onda generada bajo los siguientes parmetros de
medicin seleccionados en el equipo:
Voltios/Div: 200mV
Time/Div: 100ns
Figura 2.6
53
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Cristal de cuarzo TTL: Este tipo de cristal consta de cuatro pines, de los cuales solo tres
estn implementados de la siguiente manera:
Figura 2.7
Pin 1: NC (Este pin no se encuentra conectado internamente)
Pin 7: GND
Pin 8: Salida TTL
Pin 14: +5Vdc
En su salida se obtiene un tren de pulsos como se puede observar en la figura 2.8, bajo los
siguientes parmetros de medicin seleccionados en un osciloscopio:
Voltios/Div: 2V
Time/Div: 100ns
Figura 2.8
54
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Perodo: 250,013 ns
C1 > 20 pF
Figura 2.9
55
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
2.3.- Circuito de Reset: El Pin denominado MCLR (Master Clear), siempre debe ser tomado
en cuenta cuando se disea un circuito con microcontroladores PIC. A travs de este Pin se
podr reiniciar el dispositivo, si a ste se le aplica un nivel lgico bajo (0V), por lo tanto
resulta importante destacar que para que un programa cargado en un microcontrolador se
mantenga en ejecucin, el Pin MCLR debe estar siempre en un nivel lgico alto (5V).
Si deseamos tener control externo del reset de un microcontrolador PIC, debemos
considerar el circuito de la figura 2.10:
Figura 2.10
Este circuito permite reiniciar el microcontrolador cada vez que el pulsador de Reset es
presionado.
56
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 2.11
Esto significa que si deseamos realizar un programa en mikroBasic encargado de cambiar el
estado lgico de un pin especfico, en cualquiera de los puertos de un microcontrolador, una
forma bsica de visualizar este cambio es a travs del uso de Leds.
57
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 2.12
El primer circuito en la figura 2.12 mantiene un nivel lgico alto (5V) mientras el pulsador
permanece abierto. Al presionar el pulsador, el nivel lgico en el pin I/O del puerto pasa a
ser bajo (0V).
El segundo circuito de la figura 2.12 mantiene un nivel lgico bajo (0V) mientras el pulsador
permanece abierto. Al presionar el pulsador, el nivel lgico en el pin I/O del puerto pasa a
ser alto (5V).
58
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 2.13
En la configuracin de la figura 2.13, cuando en el pin I/O aplicamos un 1 lgico (5V), el LED
del opto-acoplador enciende y el fototransistor conduce la corriente a tierra; por lo tanto, en
la salida tendremos un 0 lgico (0V).
Si apagamos el LED, el transistor no conduce, de tal manera que en la salida tendremos un
1 lgico (5V).
En la configuracin de la figura 2.14, cuando en el pin I/O aplicamos un 1 lgico (5V), el LED
del opto-acoplador enciende y el fototransistor conduce para poner en la salida un 1 lgico
(5V). Mientras haya un 0 lgico en la entrada, el fototransistor permanecer abierto entre el
emisor y colector, dando como resultado un 0 lgico (0V) en la salida.
59
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 2.14
Una configuracin muy comn para el control de dispositivos de potencia como motores
elctricos, luces incandescentes, solenoides, etc., se puede ver en la figura 2.15, la cual se
basa en cualquiera de los dos circuitos antes mencionados (figura 2.13 y figura2.14), en la
cual se ha incluido un rel a travs del cual circular la corriente necesaria entre sus
contactos, para hacer funcionar cualquiera de estos dispositivos de potencia.
Figura 2.15
60
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 2.16
61
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
TrisA (registro de configuracin I/O del puerto A), es un registro de 8 bits, encargado de
determinar cual de los pines del puerto A ser entrada o salida. Los tres Bits ms
significativos de este registro no se encuentran implementados para este modelo de
microcontrolador, como se puede observar en el diagrama de pines del dispositivo (figura
2.17). En este caso, el puerto A solo cuenta con 5 pines I/O (RA0, RA1, RA2, RA3 y RA4).
Para determinar si uno de los pines de un puerto ser entrada o salida, es importante
conocer la siguiente regla, la cual aplica para todos los modelos de microcontroladores PIC
en los cuales estaremos trabajando:
Esto significa que si deseramos configurar el Pin RA0 del puerto A como una salida,
tendremos entonces que poner un 0 en el Bit 0 del registro TRISA
Registro TrisA
1
1
1
Bit menos
significativo
Figura 2.17
Al ver la figura 2.17, se puede observar que el pin RA0 ha sido configurado como salida y el
resto de los pines como entrada.
En mikroBasic, expresar este paso en forma de cdigo es muy sencillo:
TrisA = %11110
62
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
RA0 = salida.
RA1 a RA4 = entradas.
TrisB, es un registro de 8 bits en el cual se configuran los pines del puerto B, ya sea como
entrada o como salida, por ejemplo:
Registro TrisB
1
1
1
1
Bit menos
significativo
Figura 2.18
1 = Entrada (Al configurar un bit del registro TrisB en 1, ste se comporta como entrada).
0 = Salida (Al configurar un bit del registro TrisB en 0, ste se comporta como salida).
Para el caso particular del puerto B, se puede observar que el pin RB0 ha sido configurado
como salida en este ejemplo, y el resto de los pines como entrada.
Consideramos importante configurar los pines que no estarn en uso como entrada, ya que
de esta forma podemos evitar daos en el hardware interno del microcontrolador en caso de
una conexin errnea al experimentar con ste en un tablero de pruebas.
La configuracin en mikroBasic en forma de cdigo de programa en este caso sera:
TrisB = %11111110 (si se desea hacer la notacin en binario), :
TrisB = $FE (si se desea hacer la notacin en hexadecimal)
En este caso podemos determinar que el puerto B se comportar de la siguiente forma:
RB0 = Salida.
El mismo caso aplica para los registros de configuracin de los puertos C, D y E. Sus
registros de configuracin TRISC, TRISD y TRISE debern ser siempre configurados para
determinar su funcin dentro de un proyecto electrnico.
63
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 2.19
El Led D1 tiene su nodo conectado al pin RB1 del puerto B, por lo tanto el Led
slo encender cuando RB1 = 1.
El Led D2 tiene su ctodo conectado al pin RB0 del puerto B, por lo tanto el Led
slo encender cuando RB0 = 0
64
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 2.20
Ntese que en la ventana de programacin mikroBasic ha generado automticamente una
pequea estructura de programa que nos servir de gua para comenzar a programar. En
este caso, lo primero que vamos a agregar ser la lnea de configuracin del puerto B, ya
que en l hemos conectado los Leds que deseamos encender. Para determinar la palabra
de configuracin del registro TRISB, veamos la siguiente figura:
Registro TrisB
1
1
1
1
Figura 2.21
65
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
TRISB = %11111100
Agregamos esta lnea en la estructura del programa:
program Ejemplo1
' Area de declaracin.
main:
TRISB = %11111100
End.
Figura 2.22
El siguiente paso ser hacer que los Leds enciendan. Para esto es posible especificar el
estado de un pin determinado del puerto B de la siguiente forma:
66
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Veamos:
program Ejemplo1
' Area de declaracin.
main:
TRISB = %11111100
PORTB.0 = 1
PORTB.1 = 1
End.
Figura 2.23
Por ltimo y para verificar que todo funciona segn lo esperado, compilamos el programa a
travs del acceso directo Build en la barra de herramientas:
Build
Si el programa no tiene errores, podremos ver en la ventana de errores que el resultado de
compilar el programa ha sido satisfactorio:
67
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 2.24
Este resultado significa que el compilador ha creado adems el archivo de extensin .hex el
cual utilizaremos para grabar el microcontrolador y de esta forma poder verificar el correcto
funcionamiento del programa sobre el circuito.
68
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
RD0 = 0
RD1 = 0
RD0 = 1
RD1 = 1
Figura 2.25
69
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
El objetivo del programa que haremos a continuacin ser encender los Leds de forma
individual asignando a cada uno de ellos un pulsador. Al encender uno de estos Leds, ste
deber permanecer encendido durante 2 segundos.
main:
'
Programa Principal.
PORTB.0 = 0
PORTB.1 = 0
Pulsadores:
If PortD.0 = 1 Then
GoSub Led1
End If
If PortD.1 = 1 Then
GoSub Led2
End If
GoTo Pulsadores
Led1:
PORTB.0 = 1
delay_ms(2000)
PORTB.0 = 0
Return
'
'
'
'
'
'
'
'
Led2:
PORTB.1 = 1
delay_ms(2000)
PORTB.1 = 0
Return
End.
70
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Symbol P1 = PortD.0
Symbol P2 = PortD.1
main:
'
Programa Principal.
D2 = 0
Pulsadores:
If P1 = 1 Then
GoSub Led1
End If
If P2 = 1 Then
GoSub Led2
End If
GoTo Pulsadores
Led1:
D1 = 1
delay_ms(2000)
D1 = 0
Return
'
'
'
'
'
'
'
'
Led2:
D2 = 1
delay_ms(2000)
D2 = 0
Return
End.
71
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
2.6.3.- Ejemplo de programacin #3: En este ejemplo haremos uso de la librera Button
de mikroBasic.
Button permite eliminar rebotes en pulsadores o interruptores, evitando as errores de
lectura que pueden generar mal funcionamiento de nuestros diseos.
La sintaxis de esta rutina es la siguiente:
Button(Puerto, Pin, Tiempo, Estado Activo)
Pin: Este campo representa un pin especfico del puerto que estaremos utilizando
para tomar lectura de un pulsador o interruptor.
Estado Activo: Este parmetro puede ser cero (0) uno (1). A travs de este campo
podemos definir si el pulsador o interruptor estar activo con un 0 lgico o con un 1
lgico.
Esta rutina tambin devuelve un resultado (255), si el pulsador o interruptor han estado en
un estado activo durante el tiempo especificado. En caso contrario, devuelve un cero (0).
Veamos un ejemplo prctico, basado en el ejemplo de programacin #2.
program Ejemplo3
' Area de declaracin.
Symbol D1 = PORTB.0
Symbol D2 = PORTB.1
'
Programa Principal.
D2 = 0
Pulsadores:
Estado = Button(PortD, 0, 255, 1) ' Verificamos si P1 fue presionado, estado activo = 1.
If Estado = 255 Then
GoSub Led1
End If
72
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
GoTo Pulsadores
Led1:
D1 = 1
delay_ms(1000)
D1 = 0
Return
'
'
'
'
'
'
'
'
Led2:
D2 = 1
delay_ms(1000)
D2 = 0
Return
End.
73
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 2.26
Si mantenemos el pulsador P1 activo el tiempo suficiente para vencer el tiempo de antirebote, la rutina Button devuelve el valor 255. Entonces podremos generar la salida
deseada en el pin del puerto correspondiente al Led D1 (Canal Verde):
Figura 2.27
74
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Tiempo Anti-rebote
Figura 2.28
Este tiempo es medido desde que inicia el pulso en el canal rojo del osciloscopio, hasta el
inicio del pulso del canal verde. En este ejemplo, el tiempo medido en el osciloscopio ha
dado como resultado un tiempo de antirrobote igual a 250 milisegundos.
'
Programa Principal.
D2 = 0
Pulsadores:
If Button(PortD, 0, 255, 1) Then ' Verificamos si P1 fue presionado, estado activo = 1.
75
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
GoSub Led1
End If
Led1:
D1 = 1
delay_ms(1000)
D1 = 0
Return
'
'
'
'
'
'
'
'
Led2:
D2 = 1
delay_ms(1000)
D2 = 0
Return
End.
76
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
A continuacin estudiaremos las libreras encargadas del control de pantallas LCD y GLCD
de mikroBasic PRO a travs de ejemplos claros y de fcil entendimiento.
Pin 1, 2 y 3: como se puede observar en la figura 6.4, en la mayora de las pantallas LCD, el
Pin No. 1 y 2 corresponden a la alimentacin de la pantalla, GND y Vcc, donde el voltaje
77
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.2
3.1.2.- Conexin y configuracin de una pantalla LCD: Una pantalla LCD puede ser
conectada a un microcontrolador utilizando los ocho bits del bus de datos (D0 a D7) o
solamente los cuatro bits mas significativos del bus de datos (D4 a D7). Al emplear los ocho
bits, estos debern estar conectados en un solo puerto y nunca en puertos diferentes. Si
deseamos trabajar solo con los cuatro bits ms significativos del bus, estos debern ser
conectados en los cuatro bits menos significativos de un puerto o en los cuatro bits ms
significativos del puerto seleccionado.
78
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Los pines E (Pin 6) y RS (Pin 4) pueden estar conectados en cualquier puerto del
microcontrolador. Por ltimo, el Pin R/W deber estar conectado a tierra (GND) para indicar
a la pantalla LCD que estaremos escribiendo en ella.
Un dato interesante resulta ser el hecho de que las pantallas LCD pueden ser controladas
utilizando dos configuraciones distintas para el bus de datos:
Figura 3.3
79
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
El primer punto importante ser aprender a inicializar una pantalla LCD con mikroBasic. El
primer paso que debemos realizar ser especificar en el programa de que manera han sido
conectados los pines de control y datos de la pantalla LCD en el puerto elegido del
microcontrolador.
Basados en el diagrama esquemtico de la figura 3.3, la configuracin de pines se realiza de
la siguiente manera:
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
PortB.4
PortB.5
PortB.0
PortB.1
PortB.2
PortB.3
3.1.3.- LCD_Init()
Esta rutina es necesaria para inicializar un mdulo LCD. Normalmente se ubica al inicio del
programa, despus de la etiqueta de inicio y no en la zona de declaracin de variables o
configuracin de pines de la pantalla.
Ejemplo:
main: '
Programa Principal
LCD_Init()
80
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
3.1.4.- Lcd_Cmd(comando)
Esta rutina es importante para el control de una pantalla LCD, la cual puede facilitar la
programacin de ciertas funciones importantes.
En el campo comando de la rutina, podemos especificar algunas funciones las cuales se
describen en la siguiente tabla:
Comando LCD
Propsito
_Lcd_First_Row
_Lcd_Second_Row
_Lcd_Third_Row
_Lcd_Fourth_Row
_Lcd_Clear
_Lcd_Return_Home
_Lcd_Cursor_Off
_Lcd_Underline_On
_Lcd_Blink_Cursor_On
_Lcd_Move_Cursor_Left
_Lcd_Turn_Off
_Lcd_Shift_Left
_Lcd_Shift_Right
Figura 3.4
Tal y como esta especificado en la tabla anterior, es posible realizar fcilmente acciones
como mover el cursor o limpiar la pantalla entre otras como se demuestra en el prximo
ejercicio, pero antes veamos otras rutinas importantes.
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Programa Principal
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
Delay_ms(1000)
LCD_Out(1,4,"mikroBasic")
End.
Figura 3.5
82
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.6
Observe que cuando la librera correspondiente no ha sido incluida, las rutinas de nuestros
programas son subrayadas por una lnea roja ondulada indicando que no han sido
reconocidas las rutinas en el programa.
83
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
La siguiente imagen demuestra como se debe ver nuestro programa para que no se generen
errores al compilar:
Figura 3.7
Si observamos cada lnea de programacin, y analizamos cada una de ellas, tenemos que:
El primer paso ha sido configurar los pines de control y datos de la pantalla LCD en el
formato anteriormente especificado con respecto al puerto elegido en el
microcontrolador.
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Programa Principal
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
Delay_ms(1000)
LCD_Out(1,4,"mikroBasic")
'
'
'
'
Delay_ms(2000)
LCD_Cmd(_Lcd_Blink_Cursor_On)
Delay_ms(3000)
For I = 0 To 10
'
'
'
'
'
'
'
'
LCD_Cmd(_Lcd_Move_Cursor_Left)
Delay_ms(300)
Next I
For I = 0 To 10
LCD_Cmd(_Lcd_Move_Cursor_Right)
Delay_ms(300)
Next I
Delay_ms(1000)
Lcd_Cmd(_Lcd_Turn_Off)
delay_ms(2000)
GoTo main
End.
A diferencia del programa en el primer ejercicio, ahora hemos activado el cursor en modo
intermitente, para luego hacer una pausa de tres segundos y empezar a desplazar el mismo
diez posiciones hacia la izquierda y luego diez posiciones a la derecha. Para poder ver el
movimiento del cursor se ha incluido una pequea pausa de 300 milisegundos. Por ltimo
85
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
_Lcd_Shift_Left
_Lcd_Shift_Right
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Delay_ms(1000)
LCD_Out(1,4,"mikroBasic")
Delay_ms(2000)
LCD_Cmd(_Lcd_Blink_Cursor_On)
Delay_ms(3000)
For I = 0 To 10
'
'
'
'
'
'
'
'
LCD_Cmd(_Lcd_Shift_Left)
Delay_ms(300)
Next I
For I = 0 To 10
LCD_Cmd(_Lcd_Shift_Right)
Delay_ms(300)
86
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Next I
Delay_ms(1000)
Lcd_Cmd(_Lcd_Turn_Off)
delay_ms(2000)
GoTo main
End.
3.1.6.- Lcd_Out_Cp(caracteres)
Esta es otra rutina til en el manejo de la pantalla LCD. La funcin de esta rutina es escribir
en la pantalla LCD los caracteres especificados en la posicin en la cual ha quedado el
cursor.
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Delay_ms(1000)
LCD_Out(1,3,"mikro")
LCD_Cmd(_Lcd_Move_Cursor_Right)
Lcd_Out_Cp("Basic")
End.
87
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.8
Otras dos rutinas de mikroBasic para el manejo de pantallas LCD son las que se muestran a
continuacin:
3.1.7.- Lcd_Chr()
Lcd_Chr(fila, columna, caracter): Esta rutina imprime un solo caracter en la fila y columna
especificada.
3.1.8.- Lcd_Chr_Cp()
Lcd_Chr_Cp(caracter): Esta rutina imprime un caracter en la posicin en la cual ha
quedado el cursor.
3.1.8.1.- Ejemplo de programacin #7: El siguiente ejercicio, imprime en la fila 1, columna
8 de la pantalla LCD el caracter @.
program Proyecto_LCD_5
' Seccin de Declaracin
' Configuracin de los pines de la LCD
Dim LCD_RS
LCD_EN
LCD_D4
LCD_D5
LCD_D6
LCD_D7
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Delay_ms(1000)
LCD_Chr(1,8,"@")
Delay_ms(1000)
Lcd_Chr_Cp("%")
'
'
'
'
Retardo de 1 segundo
Imprime un caracter en la fila 1 y columna 8
Retardo de 1 segundo
Impreime el caracter en la posicin actual del cursor
End.
88
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.9
Pero en algunos casos, ser necesario controlar estos parmetros a travs de variables las
cuales pueden cambiar su valor o contenido segn sea necesario para la aplicacin que
estemos desarrollando.
Dim fila As Byte
' declaracin de la variable "fila" tipo byte
columna As Byte
' declaracin de la variable "columna" tipo byte
texto As String[10] ' declaracin de la variable "texto" tipo string
main:
fila = 1
columna = 1
texto = mikro Basic
.
.
Lcd_Out(fila, columna, texto)
.
.
End.
89
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
LCD_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)
Delay_ms(1000)
LCD_Out(fila,columna,"mikro Basic")
LCD_Cmd(_Lcd_Move_Cursor_Right)
Lcd_Out_Cp("Basic")
End.
Se puede observar en el programa anterior que hemos sustituido los valores en la rutina
LCD_Out(1, 3, mikro Basic) por sus respectivas variables, declaradas al inicio del
programa, y a las cuales les dimos el nombre de fila y columna.
Veamos otro ejemplo de programacin en el cual se carga el texto que se desea imprimir en
dos variables separadas:
90
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
Byte
Byte
string[8]
string[8]
'
'
'
'
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
con el numero
con el numero
"mikro" en la
"Basic" en la
de la fila
de la columna
variable
variable
LCD_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)
Delay_ms(1000)
LCD_Out(fila,columna,texto1)
LCD_Cmd(_Lcd_Move_Cursor_Right)
Lcd_Out_Cp(texto2)
End.
Figura 3.10
91
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
.
.
main:
.
.
End.
Observe que la primera variable (numero_1) es del tipo Byte y tiene un valor cargado igual
a 127. Si intentamos imprimir en la pantalla LCD el contenido de esta variable a travs del
campo texto de la rutina Lcd_out(), el resultado ser un error de sintaxis a la hora de
compilar el programa:
Error
Esto debido a que la rutina Lcd_Out() slo es capz de imprimir variables tipo cadena o
string. En este caso, la solucin se extrae de la librera Conversions de mikroBasic, la
cual posee una rutina especfica para cada caso de conversin de variables segn su tipo de
declaracin:
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
Byte
Word
Float
String[10]
'
'
'
'
Declaramos
Declaramos
Declaramos
Declaramos
la
la
la
la
primera
primera
primera
primera
variable
variable
variable
variable
tipo
tipo
tipo
tipo
Byte.
Word.
Float.
String.
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Variables:
LCD_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)
Lcd_Out(1, 1, "Variable Byte:
ByteToStr(Var_1, Txt)
LCD_Out(2, 7, Txt)
Delay_ms(2000)
Lcd_Out(1, 1, "Variable Word:
WordToStr(Var_2, Txt)
LCD_Out(2, 6, Txt)
Delay_ms(2000)
")
93
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
")
Delay_ms(2000)
GoTo Variables
End.
Figura 3.11
Para este ejemplo se ha realizado un programa que muestra el valor cargado en una
variable a la cual hemos denominado Dato, y la cual podr ser incrementada al accionar el
pulsador P1 conectado en RD0; el valor de esta variable tambin se podr decrementar al
accionar el pulsador P2 conectado en RD1.
Los puertos han sido configurados de la siguiente manera:
Puerto D: se configura como entrada ya que en los pines RD0 y RD1 estarn
conectados los pulsadores P1 y P2.
94
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
La variable dato ha sido inicializada con un valor cargado igual a 25. Para aumentar o
disminuir este valor, simplemente se pregunta si en RD0 o en RD1 hay un cambio de estado
lgico. Debemos considerar que el estado lgico presente en ambos pines es cero (0)
cuando el pulsador est normalmente abierto, esto gracias a las resistencias Pull Down de
10kohm. Al presionar cualquiera de los dos pulsadores, el estado lgico de los pines pasa a
ser uno (1).
Adicionalmente se establecen dos condiciones en el planteamiento de este ejercicio que se
deben cumplir cuando la variable aumenta o disminuye su valor, fijando lmites en los
extremos, es decir, un lmite inferior igual a uno (1), y un lmite superior igual a cincuenta
(50):
La primera condicin al pulsar P1 para el incremento es: cuando la variable dato sea
igual a 51, actualizamos su valor a 50, de tal manera que el valor mximo a ser
mostrado en la pantalla sea igual a cincuenta, el cual es el lmite superior fijado
propuesto en el planteamiento anterior.
program Proyecto_LCD_8
' Seccin de Declaracin
Dim texto1
texto2
txt
dato
As
As
As
As
string[16]
string[16]
String[6]
Byte
'
'
'
'
Variable
Variable
Variable
Variable
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
main:
dato = 25
texto1 = "P1 Suma P2 Resta"
texto2 = "Dato = "
95
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
LCD_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)
LCD_Out(1, 1,texto1)
While true
LCD_Out(2, 1,texto2)
ByteToStr(dato, txt)
Lcd_Out(2, 8, txt)
While PortD.0 = 1
dato = dato + 1
delay_ms(300)
'
'
'
'
'
'
'
'
'
'
'
'
'
dato = 50
End If
Wend
While PortD.1 = 1
dato = dato - 1
delay_ms(300)
'
'
'
'
'
'
'
'
'
dato = 1
End If
Wend
Wend
End.
96
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.12
Se puede observar que no es necesario presionar ningn pulsador para que el dato inicial
de la variable (25) aparezca en pantalla. Este dato se presenta al iniciar el programa gracias
a que hemos programado las dos siguientes lneas de cdigo justo antes de empezar a
preguntar por el estado de los pulsadores:
main:
.
.
.
While true
LCD_Out(2, 1,texto2)
ByteToStr(dato, txt)
Lcd_Out(2, 8, txt)
While PortD.0 = 1
.
.
.
97
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Es por esto que damos uso a la librera Conversions la cual deber estar seleccionada en
la pestaa de libreras, como se muestra en la siguiente figura:
Figura 3.13
While PortD.0 = 1
dato = dato + 1
delay_ms(300)
'
'
'
'
'
'
'
'
'
98
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
If dato = 51 Then
dato = 50
End If
Wend
En esta parte, debemos observar que todas estas instrucciones ser ejecutadas slo si
PortD.0 = 1. Entonces, al presionar P1, la condicin en la instruccin while se cumple y el
microcontrolador pasa a ejecutar la siguiente lnea en la cual incrementamos el valor de la
variable dato en una unidad.
Despus tenemos un retardo de 300 milisegundos, con la finalidad de evitar que el
incremento en la variable sea muy acelerado mientras el pulsador P1 se encuentra
presionado.
Seguidamente reescribimos el nuevo valor de la variable en la pantalla LCD y verificamos si
este valor es mayor a 50.
El mismo procedimiento se cumple para el anlisis del pulsador P2, el cual decrementa el
valor de la variable dato
En el siguiente proyecto nos hemos basado en el diagrama de la figura 3.11 para efectuar la
programacin del microcontrolador.
La idea principal en este ejemplo, ser mostrar un men inicial en la pantalla LCD, tal y
como se observa a continuacin:
Figura 3.14
99
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.15
Figura 3.16
Lea detenidamente los comentarios de cada lnea del programa. Observe que en esta
oportunidad hemos utilizado un alias para cada una de las entradas utilizadas en el puerto D
(RD0 se llamar Pulsador_1, y RD1 se llamar Pulsador_2).
program Proyecto_LCD_9
' Seccin de Declaracin
Symbol Pulsador_1 = PortD.0
Symbol Pulsador_2 = PortD.1
Dim texto1
texto2
As string[16]
As string[16]
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
sbit
sbit
sbit
sbit
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
100
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
main:
LCD_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)
Delay_ms(1000)
menu:
texto1 = "P1: Ver Mensaje1"
texto2 = "P2: Ver Mensaje2"
LCD_Out(1, 1,texto1)
LCD_Out(2, 1,texto2)
If Pulsador_1 = 1 Then
GoSub menu1
End If
If Pulsador_2 = 1 Then
GoSub menu2
End If
GoTo menu
menu1:
texto1 = "
Menu #1
"
texto2 = "Mensaje #1 aqui!"
LCD_Out(1, 1,texto1)
LCD_Out(2, 1,texto2)
delay_ms(5000)
Return
menu2:
texto1 = "
Menu #2
"
texto2 = "Mensaje #2 aqui!"
LCD_Out(1, 1,texto1)
LCD_Out(2, 1,texto2)
delay_ms(5000)
Return
End.
101
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
El primer paso ha sido crear un Alias a los pines de entrada RD0 y RD1. En este
caso, como el pulsador P1 lo hemos conectado en el pin RD0, entonces le hemos
dado el nombre o alias de pulsador_1. Para el pulsador P2, el cual est conectado
en el pin RD1 hemos designado el alias de pulsador_2. Los alias son muy tiles a la
hora de realizar programas relativamente extensos, ya que de esta forma no es
necesario tener que estar recordando en cual pin hemos conectado un pulsador, Led,
rel o cualquier otro dispositivo de entrada o salida. Bastar entonces con recordar el
nombre del mismo previamente asignado a travs de un alias.
Cargamos el mensaje del men principal en las variables designadas para cada lnea
de la pantalla LCD.
102
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.17
103
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Al igual que para una pantalla LCD, el primer paso siempre ser establecer la configuracin
de pines entre el mdulo GLCD y el microcontrolador. Sin este paso el mdulo nunca
arrancar, evitando que podamos avanzar en la programacin de nuestros proyectos.
Para inicializar la pantalla GLCD segn la configuracin de pines del diagrama de la figura
3.17, usaremos el siguiente arreglo:
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
Los pines CS1 y CS2 son importantes, debido a que la pantalla Glcd est dividida en dos
partes iguales, similar a un libro abierto con dos pginas en blanco en las cuales podremos
escribir. Llamemos a estas dos pginas CS1 (primera pgina) y CS2 (segunda pgina).
104
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.18
Figura 3.19
105
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.20
106
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
Figura 3.21
107
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Sin embargo, es importante saber que los caracteres que vamos a escribir tambin pueden
estar asociados a un mdulo de fuentes adicional, el cual define la forma o estilo de cada
carcter de una manera personalizada.
Figura 3.22
En la figura anterior, cada cuadro estar asociado a un pxel en la pantalla. Cada caracter
estar asociado a su vez a un valor que representaremos en hexadecimal, para cada una de
las columnas de la figura anterior. Es decir, si observamos la siguiente figura, podremos ver
que hemos identificado cada fila y cada columna. La primera columna c1, tendr un valor
asociado que depender directamente de los pxeles que deseamos activar para formar una
figura. Entonces, basados en la columna 1 de la figura 3.22, podramos decir que solo
activaremos los pxeles correspondientes a las filas 2, 3, 4, 5, 6 y 7 (marcados por una x).
108
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
c1 c2 c3 c4 c5
f1
f2
f3
f4
f5
f6
f7
f8
x
x
x
x
x
x
Figura 3.23
c1 c2 c3 c4 c5
f1
f2
f3
f4
f5
f6
f7
f8
1
2
4
8
16
32
64
128
Figura 3.24
F7
F6
F5
23 = 8
22 = 4
21 = 2
20 = 1
F1
2 4 = 16
F2
2 5 = 32
F3
2 6 = 64
F4
2 7 = 128
F8
Figura 3.25
109
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Byte = 01111110
F1
F5
F2
F3
F4
F6
F7
F8
Figura 3.26
Valor Hexadecimal:
0111 = 7 07h
1110 = 14 0Eh
f1
f2
f3
f4
f5
f6
f7
f8
c1 c2 c3 c4 c5
x x x
x
x
x
x
x
x
x x x x x
x
x
x
x
Figura 3.27
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
Espace
! */
" */
# */
$ */
% */
& */
' */
( */
) */
' */
+ */
, */
- */
. */
/ */
0
1 */
2 */
3 */
4 */
5 */
6 */
7 */
8 */
9 */
as */
*/
< */
= */
> */
? */
@
A */
B */
C */
D */
E */
F */
G */
H */
I */
J */
K */
L */
M */
N */
O */
P
Q */
R */
S */
T */
U */
V */
W */
X */
Y */
Z */
[ */
\ */
] */
^ */
_ */
`
$20 */
$30 */
$40 */
$50 */
$60 */
111
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
$20,$54,$54,$54,$78,
$7F,$44,$44,$44,$38,
$38,$44,$44,$44,$44,
$38,$44,$44,$44,$7f,
$38,$54,$54,$54,$18,
$04,$04,$7e,$05,$05,
$08,$54,$54,$54,$3c,
$7f,$08,$04,$04,$78,
$00,$44,$7d,$40,$00,
$20,$40,$44,$3d,$00,
$7f,$10,$28,$44,$00,
$00,$41,$7f,$40,$00,
$7c,$04,$7c,$04,$78,
$7c,$08,$04,$04,$78,
$38,$44,$44,$44,$38,
$7c,$14,$14,$14,$08,
$08,$14,$14,$14,$7c,
$7c,$08,$04,$04,$00,
$48,$54,$54,$54,$24,
$04,$04,$3f,$44,$44,
$3c,$40,$40,$20,$7c,
$1c,$20,$40,$20,$1c,
$3c,$40,$30,$40,$3c,
$44,$28,$10,$28,$44,
$0c,$50,$50,$50,$3c,
$44,$64,$54,$4c,$44,
$08,$36,$41,$41,$00,
$00,$00,$77,$00,$00,
$00,$41,$41,$36,$08,
$08,$08,$2a,$1c,$08,
$08,$1c,$2a,$08,$08,
$ff,$ff,$ff,$ff,$ff,
$06,$09,$09,$06,$00
)
'* a */
'* b */
'* c */
'* d */
'* e */
'* f */
'* g */
'* h */
'* i */
'* j */
'* k */
'* l */
'* m */
'* n */
'* o */
'* p
'* q */
'* r */
'* s */
'* t */
'* u */
'* v */
'* w */
'* x */
'* y */
'* z */
'* { */
'* | */
'* } */
'* <- */
'* -> */
'*
' oC $81
$70 */
$80 */
implements
End.
Esta tabla posee el cdigo para crear 98 caracteres personalizados, donde cada caracter
tiene asignado 5 bytes, dando como resultado la declaracin de 490 variables tipo byte,
como se observa en la cabecera de la tabla:
const
Fuentes5x8 As Byte[490] = (
112
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.28
Hacemos clic en el men File y seleccionamos la opcin New Unit, o simplemente
accedemos a esta opcin a travs del atajo Ctrl+N.
Figura 3.29
113
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
2.- Copiamos el cdigo del archivo de fuentes personalizadas que hemos creado con
anterioridad, y lo guardamos en una ruta conocida con el nombre de mis_fuentes.mbas
como se muestra a continuacin:
Figura 3.30
114
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Este archivo es importante porque contiene el cdigo responsable de dar forma a cada
nmero, letra, o caracter especial que deseamos mostrar en la pantalla Glcd. Adems, este
archivo deber estar en la misma ruta o carpeta en la cual est el proyecto en el cual
realizaremos el cdigo correspondiente para escribir en la pantalla.
3.- Creamos un nuevo proyecto en mikroBasic, el cual estar basado en el diagrama
esquemtico de la figura 3.17. Haciendo clic en el men Project y seguidamente en New
Project. En este punto, tendremos la asistencia de mikroBasic a travs de New Project
Wisard para configurar convenientemente nuestro proyecto.
Figura 3.31
115
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Veamos ahora el programa de ejemplo que nos permitir finalmente escribir en la pantalla
Glcd en base al mdulo de fuentes descrito anteriormente.
3.5.3.1.- Ejemplo de programacin #14:
program Proyecto_Glcd_02
Include mis_fuentes ' Incluimos el archivo de fuentes
Dim
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
End.
Figura 3.32
116
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Analicemos el programa:
Declaramos una variable tipo string, en cual almacenaremos el contenido del mensaje
que deseamos mostrar en la pantalla.
Limpiamos la pantalla Glcd, llenando cada pxel con un cero lgico a travs de la
rutina Glcd_Fill(), la cual detallaremos a continuacin.
3.5.4.- Glcd_Fill().
La rutina Glcd_Fill(), es utilizado para llenar el contenido de la memoria de la pantalla con el
dato especificado. Normalmente, esta rutina es utilizada para limpiar la pantalla llenando la
misma con un cero lgico (0) en cada pxel, o para verificar la pantalla observando cada
pxel encendido al aplicar un uno lgico (1) en cada uno de ellos. Entonces, si escribimos
Glcd_Fill(0), tendremos todos los pxeles apagados, y si escribimos Glcd_Fill($FF)
tendremos todos los pxeles encendidos.
En nuestro programa, hemos escrito Glcd_Fill(0x00), la cual es una forma de un nmero en
hexadecimal.
3.5.5.- Glcd_Set_Font().
La rutina Glcd_Set_Font(), es utilizada para seleccionar el tipo de fuente que deseamos
mostrar dentro de nuestro archivo de fuentes creado. Esto infiere que podemos tener en el
mismo archivo de fuentes distintos modelos de fuentes definidos por un nombre declarado
como variable al inicio de cada tabla de datos.
Por ejemplo:
module mis_fuentes
117
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
$20 */
Observe que en el mdulo mis_fuentes, ahora tenemos fuentes para caracteres de 5x8
pixeles llamado Fuentes5x8, y fuentes para caracteres de 3x6 pixeles llamado
Fuentes3x6.
En nuestro programa hemos elegido las fuentes de 5x8 de la siguiente forma:
Glcd_Set_Font(direccin
Glcd_Set_Font(@fuentes5x8, 5, 8, 32)
El primer campo de la rutina define que fuentes debe tomar el modulo Glcd. Se accede al
nombre de la fuente fuentes5x8 a travs de operador @.
El segundo campo (ancho font_width) define la cantidad de columnas que tiene la fuente
especificada.
El tercer campo (alto font_height) define la cantidad de filas que tiene la fuente
especificada.
El cuarto campo (font_offset) define el carcter inicial en la tabla ASCII a partir del cual la
pantalla Glcd asociar los caracteres cargados en la variable texto con la tabla de fuentes
que hemos creado en nuestro archivo mis_fuentes.mbas.
118
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
3.5.6.- Glcd_Write_Text().
Figura 3.33
119
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.34
dato
As Byte
datoStr As String[3]
dato
As Word
datoStr As String[5]
120
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
dato
As Float
datoStr As String[16]
Veamos a continuacin un ejemplo en el cual se imprime el valor de una variable tipo Word
en una posicin predeterminada de la pantalla Glcd.
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
Glcd_Init()
Glcd_Fill(0x00)
'
'
'
'
'
End.
121
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.35
MikroBasic cuenta con algunas otras rutinas para graficar en una pantalla Glcd que
seguramente nos ayudaran a desarrollar nuevas ideas para nuestros proyectos.
Veamos a continuacin cuales son las rutinas para crear grficos de una forma simple y
rpida.
122
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
GLCD_RS
GLCD_RW
GLCD_EN
GLCD_RST
As
As
As
As
sbit
sbit
sbit
sbit
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
End.
El resultado es el siguiente:
Figura 3.36
123
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
Glcd_Dot(64, 32, 0)
End.
Para ver el efecto de cambio de estado de un Pxel cuando el campo color es igual a 2,
hacemos una pequea modificacin al programa anterior, de tal manera que el pxel
especificado cambie de estado cada 1 segundo.
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
intermitencia:
Glcd_Dot(64, 32, 2)
Delay_ms(1000)
GoTo intermitencia
End.
124
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
End.
125
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.37
Veamos como sera el efecto inverso.
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
End.
126
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.38
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
127
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
End.
Figura 3.39
128
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
End.
Figura 3.40
129
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
' Rectngulo:
' (x1=26)(Y1=26)(x2=102)(y2=38)
End.
Figura 3.41
130
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
Byte
Byte
Byte
Byte
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
=
=
=
=
0
0
127
63
Glcd_Init()
Glcd_Fill(0)
rectangulo:
Glcd_Rectangle(x1, y1, x2, y2, 1)
delay_ms(500)
' Rectngulo:
' (x1=26)(Y1=26)(x2=102)(y2=38)
' retardo de 500 milisegundos
x1 = x1 + 2
y1 = y1 + 2
x2 = x2 - 2
y2 = y2 - 2
If x1 > 30 Then
GoSub inicializa
End If
'
'
'
'
GoTo rectangulo
inicializa:
delay_ms(500)
x1 = 0
y1 = 0
x2 = 127
y2 = 63
Glcd_Fill(0)
Return
End.
131
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.42
Al igual que en la rutina anterior, con esta rutina podemos dibujar un cuadrado o rectngulo.
La diferencia radica en que esta vez se activaran todos los pxeles internos.
Veamos un ejemplo.
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
132
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
main:
Glcd_Init()
Glcd_Fill(0)
' Rectngulo:
' (x1=26)(Y1=26)(x2=102)(y2=38)
End.
Figura 3.43
Si invertimos el fondo de la pantalla y cambiamos el campo color en la rutina a 0 tenemos
que:
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
' Rectngulo:
' (x1=26)(Y1=26)(x2=102)(y2=38)
End.
133
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.44
3.5.13.- Glcd_Circle(x, y, radio, color).
Esta rutina genera un circulo en la pantalla Glcd, siendo (x, y) la coordenada del centro del
circulo, de radio definido en pxeles en el campo del mismo nombre, y al igual que en las
rutinas anteriores, de color activo especfico.
Veamos un ejemplo.
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
End.
134
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.45
(Como ejercicio adicional a este ejemplo, se podra aumentar el tamao del radio, sobrepasando el lmite
permitido por el nmero de pxeles de la pantalla. El resultado es muy interesante).
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
' Crculo.
End.
135
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 3.46
Otro ejemplo interesante podra ser dibujar una secuencia de crculos utilizando la
instruccin For Next:
As Byte
'
'
'
'
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
Glcd_Init()
Glcd_Fill(0)
For I = 0 To 10
' Crculo
Radio = Radio - 2
136
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
delay_ms(500)
Next I
End.
El resultado es el siguiente:
Figura 3.47
137
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
tanh(x): calcula la
sinh(x)/cosh(x).
Atan(x): Calcula el arco tangente del valor de x, es decir, el valor cuya tangente es
x. Retorna un valor en radianes entre /2 y /2.
tangente
hiperblica
de
x,
definida
e x ex
.
2
e x + ex
.
2
matemticamente
138
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
como
Figura 4.1
Ejemplo para el calculo del sin(x), donde x = -0.5
program Trigon
' Seccin de Declaracin
Dim X As Float
Y As Float
txt As String[11]
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
139
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
As
As
As
As
sbit
sbit
sbit
sbit
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Programa Principal
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
X = -0.5
Y = Sin(X)
'
'
'
'
floatToStr(Y, txt)
El resultado:
Figura 4.2
140
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
4.1.2.- Ejemplo de programacin #31: Ejemplo para el calculo del cos(x), donde x = 1.
program Trigon
' Seccin de Declaracin
Dim X As Float
Y As Float
txt As String[11]
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Programa Principal
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
X = 1
Y = Cos(X)
'
'
'
'
floatToStr(Y, txt)
El resultado:
Figura 4.3
141
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
4.1.3.- Ejemplo de programacin #32: Ejemplo para el calculo de la tan(x), donde x = 0.6.
program Trigon
' Seccin de Declaracin
Dim X As Float
Y As Float
txt As String[11]
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Programa Principal
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
X = 0.6
Y = tan(X)
'
'
'
'
floatToStr(Y, txt)
El resultado:
Figura 4.4
142
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Suma.
Resta.
Multiplicacin.
Divisin.
Raz Cuadrada de un valor.
Si deseamos realizar una nueva operacin, se deber pulsar el botn de Reset del circuito
para inicializar todo el programa.
Analice y lea detenidamente los comentarios realizados en cada lnea del programa, ya que
la explicacin del procedimiento de clculo se encuentra a lo largo de todo el cuerpo del
programa.
El ejemplo est basado en el diagrama esquemtico de la figura 4.5. El microcontrolador
elegido para este ejemplo ha sido el PIC18F442. Se debe tomar en cuenta que cada botn
en el teclado deber tener la configuracin mostrada en el recuadro que contiene un
pulsador con una resistencia Pull Down.
143
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 4.5
program calculadora
' Seccin de Declaracin
Dim pulsador
As Byte
txt As String[25]
Digito As Byte[15]
'
'
'
'
'
'
Operacion As Byte
'
'
'
'
'
Resultado As Float
Valor As Float[3]
144
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
X As Byte
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Programa Principal
Operacion = 0
pulsador = 0
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
I = 1
X = 1
Valor[1] = 0
Valor[2] = 0
Lcd_Out(1, 1, "Calculadora:
Lcd_Out(2, 1, "
")
")
inicio:
GoTo Teclado
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
145
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
sigue:
If I = 1 Then
Valor[X] = Digito[1]
End If
If I = 2 Then
' Significa que hemos introducido un segundo dgito.
Digito[1] = Digito[1] * 10
Valor[X] = Digito[1] + Digito[2]
End If
If I = 3 Then
' Significa que hemos introducido un tercer dgito.
Valor[X] = Valor[X] * 10
Valor[X] = Valor[X] + Digito[3]
End If
If I = 4 Then
' Significa que hemos introducido un cuarto dgito.
Valor[X] = Valor[X] * 10
Valor[X] = Valor[X] + Digito[4]
End If
If I = 5 Then
' Significa que hemos introducido un quinto dgito.
Valor[X] = Valor[X] * 10
Valor[X] = Valor[X] + Digito[5]
End If
If I = 6 Then
' Significa que hemos introducido un sexto dgito.
Valor[X] = Valor[X] * 10
Valor[X] = Valor[X] + Digito[6]
End If
If I = 7 Then
' Significa que hemos introducido un septimo dgito.
Valor[X] = Valor[X] * 10
Valor[X] = Valor[X] + Digito[7]
End If
If I = 8 Then
' Significa que hemos introducido un octavo dgito.
Valor[X] = Valor[X] * 10
Valor[X] = Valor[X] + Digito[8]
End If
If I = 9 Then
' Significa que hemos introducido un noveno dgito.
Valor[X] = Valor[X] * 10
Valor[X] = Valor[X] + Digito[9]
End If
I = I + 1
' A medida que vamos introduciendo dgitos al valor deseado para la operacin
146
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Lcd_Out(1, 1, "Calculadora:
Lcd_Out(2, 1, txt)
GoTo inicio
Suma:
'
'
'
'
'
'
'
")
Operacion = 1
I = 1
X = 2
Lcd_Out(1, 1, "Calculadora: +
Lcd_Out(2, 1, "
GoTo inicio
Resta:
")
")
Operacion = 2
I = 1
X = 2
Lcd_Out(1, 1, "Calculadora: Lcd_Out(2, 1, "
")
")
GoTo inicio
Multiplica: ' Esta subrutina se ejecuta cuando pulsamos la tecla "Mult." conectada
' al pin RD4 del puerto "D" del microcontrolador.
Operacion = 3
I = 1
X = 2
Lcd_Out(1, 1, "Calculadora: X
Lcd_Out(2, 1, "
")
")
GoTo inicio
Divide: ' Esta subrutina se ejecuta cuando pulsamos la tecla "Div." conectada al
' pin RD5 del puerto "D" del microcontrolador.
Operacion = 4
I = 1
X = 2
Lcd_Out(1, 1, "Calculadora: /
Lcd_Out(2, 1, "
")
")
GoTo inicio
RaizCuadrada:
147
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Resultado = Sqrt(Valor[1])
FloatToStr(Resultado, txt)
Lcd_Out(1, 1, "Calculadora: =
Lcd_Out(2, 1, txt)
")
Fin: GoTo Fin ' Lazo Infinito. Si deseamos realizar una nueva operacin matemtica
' entoces debemos reiniciar el microcontrolador a travs del pulsador
' "Reset" del circuito.
'
'
'
'
'
Teclado:
If Button(PortC, 0, 150, 1) Then
Digito[I] = 1
GoTo sigue
End If
If Button(PortC, 1, 150, 1) Then
Digito[I] = 2
GoTo sigue
End If
If Button(PortC, 2, 150, 1) Then
Digito[I] = 3
GoTo sigue
End If
148
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
149
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
GoTo inicio
End.
Figura 4.6
En este punto, el programa est listo para recibir los dgitos del primer valor. Veamos un
ejemplo de una operacin matemtica:
1521 + 50 = 1571.00000
Ingresamos el primer valor:
Figura 4.7
150
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 4.8
Ingresamos el segundo valor:
Figura 4.9
Por ltimo, pulsamos la tecla de igualdad para visualizar el resultado:
Figura 4.10
151
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Sound_Init(Puerto, Pin).
Sound_Play(Frecuencia, Duracin).
Estas dos rutinas son muy intuitivas por lo cual ser muy sencillo visualizar un diseo que
genere tonos audibles para el odo humano.
Un ejemplo prctico y til para demostrar el uso de esta librera, ser crear un programa
capaz de generar las frecuencias correspondientes a la escala de notas musicales universal:
Do Do#
Re
Re# Mi
Fa
Fa#
Sol
Sol# La
La# Si
Figura 5.1
152
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Acerca de las notas musicales, existe un convenio mundial en el cual se toma la nota LA
como nota de referencia o como nota para afinar instrumentos musicales, y cuya frecuencia
es de 440 Hz. Este convenio ha determinado el uso de frecuencias especficas
denominadas notas, y este arreglo de frecuencias a su vez ha sido dividido en intervalos
denominados octavas. Cada octava se compone de 12 notas musicales. Las notas que
tienen el smbolo # en la figura 5.1 se denominan semitonos o bemoles.
La nota de referencia La, se encuentra en la octava A4, cuyas 12 frecuencias
especificaremos a continuacin y las cuales utilizaremos como punto de partida para la
generacin de tonos de una escala musical.
Una formula matemtica para obtener las frecuencias de las notas musicales a partir de una
nota de referencia, ha sido la de multiplicar la frecuencia de dicho tono por la raz duodcima
de 2, es decir, por 1,05945454545.
Esto significa que si deseamos hallar la frecuencia para la nota inmediatamente superior a la
nota de referencia La, la formula matemtica correspondiente para calcular este valor seria
la siguiente:
La # = 440 Hz 12 2 = 440 1.059454545 = 466.15 Hz
Si deseramos hallar la nota inmediatamente inferior a la nota de referencia L, entonces la
formula matemtica para calcular este valor sera la siguiente:
La # =
440 Hz
12
440 Hz
= 415.30 Hz
1.059454545
Entonces, realizando los clculos para todas las notas de la octava A4, tenemos que:
Nota
Frecuencia
Do
Do#
Re
Re#
Mi
Fa
Fa#
Sol
Sol#
La
La#
Si
261.64 Hz
277.20 Hz
293.68 Hz
311.14 Hz
329.64 Hz
349.24 Hz
370.00 Hz
392.00 Hz
415.30 Hz
440.00 Hz
466.15 Hz
493.86 Hz
Figura 5.2
153
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Veamos como reproducir el sonido que cada nota de la figura 5.1 a travs de un programa
en mikroBasic, el cual esta diseado en base al diagrama esquemtico de la figura 5.3:
Figura 5.3
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
154
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
nota_Do
nota_Re
nota_Mi
nota_Fa
nota_Sol
nota_La
nota_Si
nota_Do5
=
=
=
=
=
=
=
=
261.64
293.68
329.64
349.24
392.00
440.00
493.86
523.28
main:
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
Sound_Init(PORTD, 0)
FloatToStr(nota_Do, txt)
Lcd_Out(1, 1, "Nota Do: ")
Lcd_Out(1, 10, txt)
Sound_Play(nota_Do, 500)
'
'
'
'
'
FloatToStr(nota_Re, txt)
Lcd_Out(1, 1, "Nota Re: ")
Lcd_Out(1, 10, txt)
Sound_Play(nota_Re, 500)
'
'
'
'
'
FloatToStr(nota_Mi, txt)
Lcd_Out(1, 1, "Nota Mi: ")
Lcd_Out(1, 10, txt)
Sound_Play(nota_Mi, 500)
'
'
'
'
'
FloatToStr(nota_Fa, txt)
Lcd_Out(1, 1, "Nota Fa: ")
Lcd_Out(1, 10, txt)
Sound_Play(nota_Fa, 500)
'
'
'
'
'
FloatToStr(nota_Sol, txt)
Lcd_Out(1, 1, "Nota Sol: ")
Lcd_Out(1, 10, txt)
Sound_Play(nota_Sol, 500)
'
'
'
'
'
FloatToStr(nota_La, txt)
Lcd_Out(1, 1, "Nota La: ")
Lcd_Out(1, 10, txt)
Sound_Play(nota_La, 500)
'
'
'
'
'
155
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
FloatToStr(nota_Si, txt)
Lcd_Out(1, 1, "Nota Si: ")
Lcd_Out(1, 10, txt)
Sound_Play(nota_Si, 500)
'
'
'
'
'
FloatToStr(nota_Do5, txt)
Lcd_Out(1, 1, "Nota Do5: ")
Lcd_Out(1, 10, txt)
Sound_Play(nota_Do5, 500)
'
'
'
'
'
End.
Para reproducir una octava superior a esta (A4), bastar con multiplicar por 2 el valor de las
frecuencias de sta, entonces estaremos reproduciendo los tonos correspondientes a una
quinta octava. Esto infiere que si deseamos or los tonos correspondientes a una sexta
octava, entonces podramos multiplicar la octava A4 por 3, o la quinta octava por 2.
nota_Do
nota_DoB
nota_Re
nota_ReB
nota_Mi
nota_Fa
nota_FaB
nota_Sol
nota_SolB
nota_La
nota_LaB
nota_Si
=
=
=
=
=
=
=
=
=
=
=
=
261.64
277.20
293.68
311.14
329.64
349.24
370.00
392.00
415.30
440.00
466.15
493.86
nota_Do
nota_DoB
nota_Re
nota_ReB
nota_Mi
nota_Fa
nota_FaB
nota_Sol
nota_SolB
nota_La
nota_LaB
nota_Si
=
=
=
=
=
=
=
=
=
=
=
=
261.64
277.20
293.68
311.14
329.64
349.24
370.00
392.00
415.30
440.00
466.15
493.86
*
*
*
*
*
*
*
*
*
*
*
*
2
2
2
2
2
2
2
2
2
2
2
2
156
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 5.4
157
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
nota_Do
nota_DoB
nota_Re
nota_ReB
nota_Mi
nota_Fa
nota_FaB
nota_Sol
nota_SolB
nota_La
nota_LaB
nota_Si
=
=
=
=
=
=
=
=
=
=
=
=
261.64
277.20
293.68
311.14
329.64
349.24
370.00
392.00
415.30
440.00
466.15
493.86
main:
TRISC = $FF
TRISD = $7F
Sound_Init(PORTD, 7)
If Button(PortC, 0, 50, 1) Then ' Verificamos si "Do" fue presionado, estado activo = 1.
Sound_Play(nota_Do, 200)
' Se reproduce el sonido correspondiente a la nota
' durante 200 milisegundos.
End If
If Button(PortC, 1, 50, 1) Then ' Verificamos si "Do#" fue presionado, estado activo = 1.
Sound_Play(nota_DoB, 200)
' Se reproduce el sonido correspondiente a la nota
' durante 200 milisegundos.
End If
If Button(PortC, 2, 50, 1) Then ' Verificamos si "Re" fue presionado, estado activo = 1.
Sound_Play(nota_Re, 200)
' Se reproduce el sonido correspondiente a la nota
' durante 200 milisegundos.
End If
If Button(PortC, 3, 50, 1) Then ' Verificamos si "Re#" fue presionado, estado activo = 1.
Sound_Play(nota_ReB, 200)
' Se reproduce el sonido correspondiente a la nota
' durante 200 milisegundos.
End If
If Button(PortC, 4, 50, 1) Then ' Verificamos si "Mi" fue presionado, estado activo = 1.
Sound_Play(nota_Mi, 200)
' Se reproduce el sonido correspondiente a la nota
' durante 200 milisegundos.
End If
If Button(PortC, 5, 50, 1) Then ' Verificamos si "Fa" fue presionado, estado activo = 1.
Sound_Play(nota_Fa, 200)
' Se reproduce el sonido correspondiente a la nota
' durante 200 milisegundos.
End If
If Button(PortC, 6, 50, 1) Then ' Verificamos si "Fa#" fue presionado, estado activo = 1.
Sound_Play(nota_FaB, 200)
' Se reproduce el sonido correspondiente a la nota
' durante 200 milisegundos.
End If
If Button(PortC, 7, 50, 1) Then ' Verificamos si "Sol" fue presionado, estado activo = 1.
Sound_Play(nota_Sol, 200)
' Se reproduce el sonido correspondiente a la nota
' durante 200 milisegundos.
158
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
End If
If Button(PortD, 0, 50, 1) Then ' Verificamos si "Sol#" fue presionado, estado activo =
1.
Sound_Play(nota_SolB, 200)
End If
If Button(PortD, 1, 50, 1) Then ' Verificamos si "La" fue presionado, estado activo = 1.
Sound_Play(nota_La, 200)
' Se reproduce el sonido correspondiente a la nota
' durante 200 milisegundos.
End If
If Button(PortD, 2, 50, 1) Then ' Verificamos si "La#" fue presionado, estado activo = 1.
Sound_Play(nota_LaB, 200)
' Se reproduce el sonido correspondiente a la nota
' durante 200 milisegundos.
End If
If Button(PortD, 3, 50, 1) Then ' Verificamos si "Si" fue presionado, estado activo = 1.
Sound_Play(nota_Si, 200)
' Se reproduce el sonido correspondiente a la nota
' durante 200 milisegundos.
End If
GoTo main
End.
159
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 6.1
Figura 6.2
El principio de funcionamiento de un teclado matricial es muy sencillo. Bsicamente cuando
pulsamos un botn en el teclado, estamos uniendo una fila con una columna.
160
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Puerto D
RD0
RD1
RD2
RD3
RD4
RD5
RD6
RD7
Teclado 4x4
Columna 1
Columna 2
Columna 3
Columna 3
Fila 1
Fila 2
Fila 3
Fila 4
Figura 6.3
Los pines RD0, RD1, RD2 y RD3 correspondientes a las columnas se comportan como
entradas, y los pines RD4, RD5, RD6 y RD7 correspondientes a las filas se comportan como
salidas.
Observe en el diagrama esquemtico, que los pines RD0, RD1, RD2 y RD3 tienen una
resistencia Pull-Down de 10 Kohm, lo cual significa que si leemos cualquiera de estas
entradas, asumiendo que ninguna tecla ha sido presionada, entonces siempre habr un cero
lgico (0) presente en cada una de ellas.
161
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 6.4
En la primera edicin del libro Basic para microcontroladores PIC, analizar un teclado
matricial para saber cual de las teclas haba sido presionada, requera de una serie de pasos
en los cuales debamos enviar un pulso a travs de cada salida del puerto en el cual se
encontraba conectado el teclado matricial y seguidamente preguntar en cada una de las
entradas si el estado lgico presente haba cambiado, de tal manera que pudisemos
reconocer cual de las teclas en ese instante haba sido presionada.
Con mikroBasic, la tarea del anlisis de un teclado matricial ha sido simplificada de tal
manera a travs de su librera KeyPad, que tan solo requerimos de una sola rutina para
capturar el dato que identificar a la tecla presionada en un determinado momento. Por
supuesto, antes de utilizar esta rutina, siempre es importante inicializar el puerto en el cual
estaremos conectando el teclado.
162
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 6.5
163
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Como en otros captulos, esta lnea de programacin se hace al inicio del programa, en la
seccin de declaracin de variables. Esta lnea es muy importante, ya que sin ella el
compilador no podr determinar en cual de los puertos del microcontrolador estar ubicado
el teclado matricial.
Lo siguiente a tomar en cuenta ser la rutina de inicializacin para el teclado matricial. Esta
rutina inicializa el puerto elegido para que sea capaz de trabajar con el teclado.
6.2.1.- Keypad_Init().
Una vez inicializado el puerto, solo nos queda preguntar en el programa si alguna de las
teclas ha sido presionada, y si ese fuese el caso, cual es el valor correspondiente de sta
para cargarlo en una variable y poder visualizarlo en la pantalla LCD.
En el siguiente ejemplo podremos ver la rutina encargada de extraer el dato correspondiente
a la tecla presionada en el teclado en un determinado momento. Este paso es posible
gracias a la siguiente rutina.
6.2.2.- Keypad_Key_Press().
El dato correspondiente a la tecla presionada se cargar en una variable tipo Byte
previamente declarada. Por ejemplo:
Dim Pulsador As Byte
Pulsador = Keypad_Key_Press()
Cuando el microcontrolador procesa esta lnea (asumiendo que hemos conectado un teclado
matricial de 4 filas por 4 columnas), un valor entre 1 y 16 es cargado en la variable
Pulsador.
164
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 6.6
Tecla Presionada
1
2
3
A
4
5
6
B
7
8
9
C
*
0
#
D
Figura 6.7
Un dato importante a considerar sobre esta rutina, es que el valor es cargado en la variable
justo cuando presionamos la tecla, a diferencia de la siguiente rutina, que carga el valor en
la variable cuando liberamos la tecla:
Dim Pulsador As Byte
Pulsador = Keypad_Key_Click()
165
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
main: '
Programa Principal
pulsador = 0
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
Delay_ms(500)
'
'
'
'
GoSub Teclado
byteToStr(pulsador, pulsadorStr)
Lcd_Out(1, 1, "Tecla:")
Lcd_Out(1, 7,pulsadorStr)
'
'
'
'
GoTo inicio
inicio:
Teclado:
pulsador = Keypad_Key_Press()
delay_ms(300)
Return
End.
166
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 6.8
A presionar cada una de las teclas, el resultado deber corresponder a la tabla de la figura
6.7.
Observe que el valor de la tecla presionada efectivamente se mantiene en pantalla mientras
la tecla se encuentra en ese estado.
Si deseramos cargar el valor correspondiente a la tecla en la variable Pulsador al soltar la
tecla, entonces la subrutina teclado deber verse de la siguiente manera:
Teclado:
pulsador = Keypad_Key_Click()
delay_ms(300)
Return
Analizando el programa, podemos observar que primero hemos hecho lo necesario para
configurar los puertos de conexin entre el microcontrolador y los perifricos, adems de la
declaracin de dos variables, una para almacenar el dato obtenido desde el teclado matricial
y la otra para realizar la conversin del contenido de la primera variable de byte a string,
de tal manera que podamos mostrar en resultado en la pantalla LCD.
Luego inicializamos la pantalla LCD, limpiamos la pantalla y apagamos el cursor y por
ltimo, hacemos un llamado con retorno a la subrutina teclado la cual extraer el valor
correspondiente si es que hay alguna tecla presionada, para luego regresar y mostrar el dato
en la pantalla LCD haciendo la respectiva conversin del dato cargado en la variable
Pulsador.
Es de esta manera que podremos ver un valor en la pantalla LCD entre 1 y 16, cada uno de
ellos correspondientes a un pulsador en un teclado matricial 4 x 4. Pero estos valores que
estamos mostrando en pantalla no necesariamente se corresponden con los valores o letras
impresas sobre cada tecla. Veamos de nuevo la figura del teclado y cmo est identificada
cada tecla:
167
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 6.9
La asociacin de valores versus teclas de la tabla de la figura 6.7 pudiera ser confusa a la
hora de realizar un programa, ya que slo la identificacin en las tres primeras teclas se
corresponde con el valor que vamos a obtener de la rutina Keypad, ya que cuando
presionamos la cuarta tecla, en vez de ver una A en la pantalla, estaremos viendo un 4
como valor correspondiente a esta tecla.
Lo mismo ocurre para el resto de las teclas, por ejemplo, la siguiente tecla en el orden que
corresponde a los valores capturados por la rutina Keypad sera la tecla identificada con el
nmero 4 sobre ella, pero el valor correspondiente a ella cargado en la variable es el
nmero 5, y esto contina igual para el resto de las teclas hasta la ltima, identificada en
este caso con la letra D y cuyo valor correspondiente a ser cargado en la variable es igual
a 16.
Para evitar confusiones al respecto a la hora de querer mostrar en pantalla cual de las teclas
ha sido presionada, lo que haremos ser enmascarar en valor obtenido por la rutina
Keypad, de manera tal que podamos ver la identificacin sobre la tecla y no el valor
capturado correspondiente a cada una de ellas.
168
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Programa Principal
pulsador = 0
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
inicio:
GoSub Teclado
' Enmascaramos los valores de las teclas con el equivalente ASCII del valor
' o letra impresa sobre cada tecla:
' Abra la tabla Ascii Chart desde el men "Tools" para comparar.
If pulsador = 0 Then
pulsador = 160
End If
If pulsador = 1 Then
pulsador = 49
End If
If pulsador = 2 Then
pulsador = 50
End If
If pulsador = 3 Then
pulsador = 51
End If
If pulsador = 4 Then
pulsador = 65
End If
If pulsador = 5 Then
169
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
pulsador = 52
End If
If pulsador = 6 Then
pulsador = 53
End If
If pulsador = 7 Then
pulsador = 54
End If
If pulsador = 8 Then
pulsador = 66
End If
If pulsador = 9 Then
pulsador = 55
End If
If pulsador = 10 Then
pulsador = 56
End If
If pulsador = 11 Then
pulsador = 57
End If
If pulsador = 12 Then
pulsador = 67
End If
If pulsador = 13 Then
pulsador = 42
End If
If pulsador = 14 Then
pulsador = 48
End If
If pulsador = 15 Then
pulsador = 35
End If
If pulsador = 16 Then
pulsador = 68
End If
Lcd_Out(1, 1, "Tecla:")
Lcd_Chr(1, 8, pulsador)
GoTo inicio
Teclado:
pulsador = Keypad_Key_Press()
delay_ms(300)
Return
End.
170
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
De esta forma podremos ver el valor o letra impresa sobre cada tecla, es decir, si
presionamos la tecla A, veremos esta misma en la pantalla:
Figura 6.10
Si presionamos la tecla *, veremos este mismo smbolo en la pantalla:
Figura 6.11
Figura 6.12
Lo mismo aplica para resto de las teclas.
171
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 6.13
172
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 6.14
Los valores correspondientes a cada uno de los smbolos en un teclado estndar han sido
escritos en color rojo en la siguiente figura al lado derecho de cada smbolo, para tener una
referencia del valor ASCII en cada tecla.
Figura 6.15
173
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Los valores para las teclas de funciones especiales los podemos observar en la siguiente
tabla:
Tecla
Valor
Retornado
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
10
F11
11
F12
12
Enter
13
Page Up
14
Page Down
15
Backspace
16
Insert
17
Delete
18
Windows
19
Ctrl
20
Shift
21
Alt
22
Print Screen
23
Pause
24
Caps Lock
25
End
26
Home
27
Scroll Lock
28
Num Lock
29
Left Arrow
30
Right Arrow
31
Up Arrow
32
Down Arrow
33
Escape
34
Tab
35
Figura 6.17
La identificacin de los pines en un conector PS/2 con respecto al smbolo del mismo en el
diagrama esquemtico se puede observar en la siguiente figura:
175
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As sbit At PORTC.0
As sbit At PORTC.1
Se puede ver que en estas lneas han sido definidos los pines del puerto en el cual han sido
conectados los pines de comunicacin del teclado, Data y Clk. Esta definicin se realiz
en base al diagrama esquemtico propuesto anteriormente.
Adicionalmente a esto, la librera PS/2 cuenta con dos rutinas a travs de las cuales
inicializamos el teclado y extraemos los datos:
Ps2_Config()
Ps2_Key_Read()
6.4.1.- Ps2_Config().
Esta rutina se encarga de inicializar el microcontrolador para trabajar con el teclado PS/2.
Funcin: Es una bandera cuyo estado cambia entre 1 y 0, y nos indica si una tecla de
funcin especial ha sido presionada o no. Si una tecla de funcin especial ha sido
presionada, el estado de este campo ser igual a 1.
Estado: Este campo ser igual a 1 si una tecla ha sido presionada. Si no hay teclas
presionadas, este campo ser igual a 0.
Para entender como funcionan estas dos rutinas, realizaremos un ejemplo de un programa
capaz de mostrar el valor ASCII de cada smbolo sobre el teclado en la pantalla LCD,
exceptuando los valores de las teclas de funciones especiales.
176
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 6.19
Veamos el siguiente ejercicio:
6.4.2.1.- Ejemplo de programacin #38:
program PS2_01
' Declaracin de variables y puertos para Librera PS/2:
Dim PS2_Data
PS2_Clock
As sbit At PORTC.0
As sbit At PORTC.1
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
177
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
As
As
As
As
sbit
sbit
sbit
sbit
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Ps2_Config()
Delay_ms(100)
While TRUE
Ps2_Key_Read(Valor, funcion, estado)
entonces:
End If
Delay_ms(10)
Wend
End.
Analizando el programa detenidamente, podemos observar que gran parte del mismo solo
define la configuracin de los dispositivos perifricos conectados al microcontrolador.
En primer lugar, se realiz la definicin de pines para el conexionado del teclado PS/2
y la pantalla LCD. Luego hemos definido las variables necesarias para cargar los
datos capturados desde el teclado.
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Escribimos el texto que identificar los datos a ser mostrados en cada una de las
lneas de la pantalla LCD. En este ejemplo escribimos la palabra Caracter: en la
lnea 1, columna 1; y la palabra ASCII: en la lnea 2, columna 1 de la pantalla.
Figura 6.20
Al presionar la tecla sealada por un crculo en la figura anterior, el resultado en la
pantalla deber ser el siguiente:
Figura 6.21
179
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 6.22
Lo mismo ocurrir si presionamos cualquier otra tecla, siempre y cuando no sea una tecla de
funcin especial, ya que en este primer ejemplo no hemos contemplado el uso de las
mismas.
Si queremos obtener el valor correspondiente a las teclas de funciones especiales de la
figura 6.16, tendremos que reconsiderar el estado de la variable funcin cuando definimos
el condicional que nos permitir saber si una de estas teclas ha sido presionada para
capturar el valor correspondiente. Esto significa que en el condicional If, la variable
funcin deber ser igual a 1 para determinar que una tecla de funcin especial ha sido
presionada.
If (estado <> 0) And (funcion = 1) And (Valor <> 0) Then
180
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As sbit At PORTC.0
As sbit At PORTC.1
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Ps2_Config()
Delay_ms(100)
Lcd_Out(1, 1, "Tecla Func.: ") ' Escribimos la palabra "Caracter:" en la primera lnea.
While TRUE
Ps2_Key_Read(Valor, funcion, estado)
entonces:
End If
Delay_ms(10)
Wend
End.
181
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
De este ejemplo podremos ver en la pantalla LCD solamente los valores correspondientes a
las teclas de funciones especiales, especificados en la tabla de la figura 6.16.
Esto significa que si presionamos la tecla ESC, deberamos poder ver su valor
correspondiente 34 en la pantalla LCD como se muestra a continuacin:
Figura 6.23
Figura 6.24
182
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As sbit At PORTC.0
As sbit At PORTC.1
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Ps2_Config()
Delay_ms(100)
entonces:
Else
If (estado <> 0) And (funcion = 1) And (Valor <> 0) Then
ByteToStr(Valor, txt)
Lcd_Out(2, 13, txt)
183
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
End If
End If
Delay_ms(10)
Wend
End.
184
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 7.1
185
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Dato = EEPROM_Read(0x01)
La idea principal en cada proyecto ser familiarizarse con el uso de la memoria de datos,
almacenando en ella informacin que deber poder ser consultada aunque el circuito sea
reiniciado o apagado.
Como se puede observar en la figura 7.2, se requiere el uso de un teclado matricial 4x4
para el ingreso de datos y una pantalla LCD, con la cual se podr visualizar toda la
informacin a ser consultada.
186
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 7.2
En este ejercicio vamos a almacenar datos en la memoria EEPROM, para luego ser
consultados y verificados.
Vamos a desarrollar a continuacin un sistema de control de acceso, en el cual el usuario
deber introducir una contrasea previamente almacenada en la memoria de datos. Si la
contrasea es correcta, se genera un mensaje de confirmacin en la pantalla. Si la
contrasea es incorrecta, se genera un mensaje de error.
Basados en el diagrama esquemtico de la figura 7.2, empezamos el programa realizando la
configuracin de los pines de control de los dispositivos perifricos conectados al
microcontrolador.
Antes de empezar a programar, es importante tomar en cuenta cuales sern las posiciones
en la memoria de datos para guardar la contrasea.
Para un sistema de control de acceso donde la contrasea ser de seis dgitos, y donde
cada dgito deber ser almacenado en una posicin especfica, convenientemente podemos
tomar las posiciones en el mapa de la memoria de datos a partir de la direccin $10 por
ejemplo, hasta la direccin $15, como se puede apreciar en la siguiente tabla:
187
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
0000:
0008:
0010:
0018:
0020:
0028:
0030:
0038:
0040:
0048:
0050:
0058:
0060:
0068:
0070:
0078:
0080:
0088:
0090:
0098:
00A0:
00A8:
00B0:
00B8:
00C0:
00C8:
00D0:
00D8:
00E0:
00E8:
00F0:
00F8:
Tabla 7.3
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
188
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Programa Principal
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
Sound_Init(PORTE, 0)
inicio:
pulsador = 0
1)
2)
3)
5)
6)
7)
'
'
'
'
'
'
1er
2do
3er
4to
5to
6to
digito
digito
digito
digito
digito
digito
de
de
de
de
de
de
la
la
la
la
la
la
contrasea
contrasea
contrasea
contrasea
contrasea
contrasea
en
en
en
en
en
en
la
la
la
la
la
la
direccin
direccin
direccin
direccin
direccin
direccin
10
11
12
13
14
15
del
del
del
del
del
del
mapa.
mapa.
mapa.
mapa.
mapa.
mapa.
Clave:
Clave[1]
Clave[2]
Clave[3]
Clave[4]
Clave[5]
Clave[6]
=
=
=
=
=
=
EEPROM_Read(10)
EEPROM_Read(11)
EEPROM_Read(12)
EEPROM_Read(13)
EEPROM_Read(14)
EEPROM_Read(15)
'
'
'
'
'
'
Leemos
Leemos
Leemos
Leemos
Leemos
Leemos
Lcd_Out(1, 1, "Introduzca su
")
Lcd_Out(2, 1, "Clave de Acceso:")
el
el
el
el
el
el
1er
2do
3er
4to
5to
6to
Digito
Digito
Digito
Digito
Digito
Digito
de
de
de
de
de
de
la
la
la
la
la
la
Clave
Clave
Clave
Clave
Clave
Clave
almacenada.
almacenada.
almacenada.
almacenada.
almacenada.
almacenada.
Delay_Ms(2000)
Contador = 0
espera:
GoSub Teclado
If pulsador = 0 Then
GoTo espera
End If
Sound_Play(880, 80)
Contador = Contador + 1
189
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Digito[Contador] = pulsador
'
'
'
'
If Contador = 6 Then
GoTo Comprobar
End If
GoTo espera
Comprobar:
' Si DIGITO[X] es igual a CLV[X] el digito es correcto,
' y salta a la etiqueta "paseX",
' si es diferente salta a la subrutina "error"; veamos
If Digito[1] = Clave[1] Then
GoTo pase1
Else
GoTo ErrorClave
End If
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
pase1:
If Digito[2] = Clave[2] Then
GoTo pase2
Else
GoTo ErrorClave
End If
pase2:
If Digito[3] = Clave[3] Then
GoTo pase3
Else
GoTo ErrorClave
End If
pase3:
If Digito[4] = Clave[4] Then
GoTo pase4
Else
GoTo ErrorClave
End If
pase4:
If Digito[5] = Clave[5] Then
GoTo pase5
Else
GoTo ErrorClave
End If
'
'
'
'
'
'
'
'
pase5:
If Digito[6] = Clave[6] Then
GoTo ClaveCorrecta
Else
GoTo ErrorClave
End If
Delay_ms(2000)
190
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
ClaveCorrecta:
Lcd_Out(1, 1, " Clave Correcta ")
Lcd_Out(2, 1, "****************")
Delay_ms(2000)
Final:
GoTo Final
Teclado:
pulsador = Keypad_Key_Press()
delay_ms(300)
Return
End.
Para verificar el funcionamiento de este ejercicio, es muy importante recordar que un teclado
de 4 filas por 4 columnas nos devuelve valores consecutivos partiendo de la primera tecla,
entre 1 y 16. Esto significa que los valores impresos en cada tecla no van a coincidir con los
valores entregados por la rutina del teclado matricial.
Tecla Presionada
1
2
3
A
4
5
6
B
7
8
9
C
*
0
#
D
Figura 7.4
Entonces, si la clave del sistema que hemos elegido como ejemplo es 123456, observando
la figura 7.4 nos daremos cuenta que las teclas que debemos presionar consecutivamente
sern: 1, 2, 3, A, 4 y 5.
191
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Para lograr que la clave a introducir desde el teclado sea la que hemos propuesto, entonces
los valores a cargar en la memoria EEPROM de datos debern ser: 1, 2, 3, 5, 6 y 7. Esta es
una forma de relacionar los dgitos impresos en las teclas y los dgitos reales de la clave
elegida.
Cada vez que introducimos un digito para almacenar la nueva clave, se deber
generar un sonido de confirmacin de cada tecla pulsada. El sonido es sumamente
importante en este proyecto, ya que permite al usuario saber que un dgito ha sido
introducido en el sistema.
Por ltimo, para comprobar que la nueva clave efectivamente ha sido almacenada
con xito, ser necesario reiniciar el sistema para que ste solicite el ingreso con
clave nuevamente. Tambin es posible verificar estos cambios en la memoria
EEPROM de datos a travs del programador de microcontroladores PIC, tomando
una lectura de la memoria EEPROM como se muestra en la figura 7.5.
192
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 7.5
En la figura 7.5 se muestra el contenido de la memoria EEPROM de datos del
microcontrolador. Observe que los valores de la clave de fbrica (123456, 123567 en
relacin a los valores entregados por la rutina del teclado) se encuentran en las posiciones
10, 11, 12, 13, 14 y 15. Observe adems que el valor en la posicin 0 de la memoria es $FF.
Cuando hacemos el primer cambio de clave, por ejemplo, 456789, cuyos valores
relacionados a la rutina del teclado sern 5, 6, 7, 9, 10 (A en Hexadecimal) y 11 (B en
Hexadecimal), este mapa se ver de la siguiente manera:
Figura 7.6
Observe adems que la bandera en la posicin cero la ha sido cambiada con un nuevo
valor, 1 en nuestro ejemplo.
193
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Analice detenidamente el siguiente programa, siga paso a paso los comentarios y saltos de
lnea para una mejor comprensin:
program Control_Acceso
' Seccin de Declaracin
Dim keypadPort
pulsador
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Programa Principal
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
Sound_Init(PORTE, 0)
inicio:
pulsador = 0
'
'
'
'
'
'
'
' Al leer la posicin 0 y compararla con un valor que va a definir que la clave ha
' sido cambiada, entonces sabremos si debemos saltar la rutina que almacena la
' clave de fbrica cada vez que se reinicia el microcontrolador.
' El valor para definir que la clave fue cambiada ser 1. Mas adelante, en la
' rutina respectiva al cambio de clave, este valor se almacenar en la posicin
' 0 de la EEPROM de datos.
ClavedeFabrica = EEPROM_Read(0)
If ClavedeFabrica = 1 Then
GoTo Bienvenido
End If
194
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
1)
2)
3)
5)
6)
7)
'
'
'
'
'
'
1er
2do
3er
4to
5to
6to
digito
digito
digito
digito
digito
digito
de
de
de
de
de
de
la
la
la
la
la
la
contrasea
contrasea
contrasea
contrasea
contrasea
contrasea
en
en
en
en
en
en
la
la
la
la
la
la
direccin
direccin
direccin
direccin
direccin
direccin
10
11
12
13
14
15
del
del
del
del
del
del
mapa.
mapa.
mapa.
mapa.
mapa.
mapa.
Bienvenido:
Lcd_Out(1, 1, "Control - Acceso")
Lcd_Out(2, 1, "** Bienvenido **")
Delay_Ms(2000)
Clave:
Clave[1]
Clave[2]
Clave[3]
Clave[4]
Clave[5]
Clave[6]
=
=
=
=
=
=
EEPROM_Read(10)
EEPROM_Read(11)
EEPROM_Read(12)
EEPROM_Read(13)
EEPROM_Read(14)
EEPROM_Read(15)
'
'
'
'
'
'
Leemos
Leemos
Leemos
Leemos
Leemos
Leemos
Lcd_Out(1, 1, "Introduzca su
")
Lcd_Out(2, 1, "Clave de Acceso:")
el
el
el
el
el
el
1er
2do
3er
4to
5to
6to
Digito
Digito
Digito
Digito
Digito
Digito
de
de
de
de
de
de
la
la
la
la
la
la
Clave
Clave
Clave
Clave
Clave
Clave
almacenada.
almacenada.
almacenada.
almacenada.
almacenada.
almacenada.
Delay_Ms(2000)
Contador = 0
espera:
GoSub Teclado
If pulsador = 0 Then
GoTo espera
End If
Sound_Play(880, 80)
Contador = Contador + 1
Digito[Contador] = pulsador
'
'
'
'
If Contador = 6 Then
GoTo Comprobar
End If
GoTo espera
Comprobar:
' Si DIGITO[X] es igual a CLV[X] el digito es correcto,
' y salta a la etiqueta "paseX",
' si es diferente salta a la subrutina "error"; veamos
If Digito[1] = Clave[1] Then
GoTo pase1
Else
GoTo ErrorClave
'
'
'
'
195
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
End If
pase1:
If Digito[2] = Clave[2] Then
GoTo pase2
Else
GoTo ErrorClave
End If
'
'
'
'
'
'
'
'
'
'
'
'
pase2:
If Digito[3] = Clave[3] Then
GoTo pase3
Else
GoTo ErrorClave
End If
pase3:
If Digito[4] = Clave[4] Then
GoTo pase4
Else
GoTo ErrorClave
End If
pase4:
If Digito[5] = Clave[5] Then
GoTo pase5
Else
GoTo ErrorClave
End If
'
'
'
'
'
'
'
'
pase5:
If Digito[6] = Clave[6] Then
GoTo ClaveCorrecta
Else
GoTo ErrorClave
End If
Delay_ms(2000)
GoTo Clave
ClaveCorrecta:
Lcd_Out(1, 1, " Clave Correcta ")
Lcd_Out(2, 1, "****************")
Delay_ms(2000)
Pulsador = 0
Menu:
Lcd_Out(1, 1, "Cambio de Clave ")
Lcd_Out(2, 1, "****************")
Delay_ms(2000)
196
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Opcion_1:
Lcd_Out(1, 1, "Presione C para")
Lcd_Out(2, 1, "cambiar la clave")
GoSub Teclado
If Pulsador = 0 Then
GoTo Opcion_1
End If
Sound_Play(880, 80)
If Pulsador = 12 Then
GoTo CambiodeClave
Else
GoTo Menu
End If
'
'
'
'
CambiodeClave:
Lcd_Out(1, 1, " Introduzca la
Lcd_Out(2, 1, " clave nueva
Contador = 0
")
")
espera_2:
GoSub Teclado
If pulsador = 0 Then
GoTo espera_2
End If
Sound_Play(880, 80)
Contador = Contador + 1
Digito[Contador] = pulsador
'
'
'
'
If Contador = 6 Then
GoTo GrabarClave
End If
GoTo espera_2
GrabarClave:
delay_ms(1000)
Lcd_Out(1, 1, "
Lcd_Out(2, 1, "
EEPROM_Write(10,
EEPROM_Write(11,
EEPROM_Write(12,
EEPROM_Write(13,
EEPROM_Write(14,
EEPROM_Write(15,
Grabando la
nueva clave
Digito[1])
Digito[2])
Digito[3])
Digito[4])
Digito[5])
Digito[6])
EEPROM_Write(0, 1)
Sound_Play(440, 2000)
Lcd_Out(1, 1, " Reinicie el
Lcd_Out(2, 1, " sistema...
'
'
'
'
'
'
")
")
1er
2do
3er
4to
5to
6to
de
de
de
de
de
de
la
la
la
la
la
la
contrasea
contrasea
contrasea
contrasea
contrasea
contrasea
en
en
en
en
en
en
la
la
la
la
la
la
direccin
direccin
direccin
direccin
direccin
direccin
10
11
12
13
14
15
del
del
del
del
del
del
mapa.
mapa.
mapa.
mapa.
mapa.
mapa.
197
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Teclado:
pulsador = Keypad_Key_Press()
delay_ms(300)
Return
End.
Figura 7.7
Figura 7.8
198
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 7.9
Si la clave es la correcta, entonces el mensaje ser el siguiente:
Figura 7.10
Transcurridos 2 segundos despus del mensaje de confirmacin de la clave correcta,
veremos el siguiente mensaje que nos indica que debemos cambiar la clave:
Figura 7.11
199
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Para esto debemos presionar la tecla C en el teclado matricial del circuito. Este mensaje se
quedar en la pantalla hasta que se introduzca esta orden.
Figura 7.12
Seguidamente ser necesario ingresar los nuevos dgitos de la clave, recordando que cada
vez que presionamos una tecla debemos esperar el tono de confirmacin del sistema:
Figura 7.13
Al terminar de ingresar la clave, podremos ver un mensaje indicando que la misma esta
siendo almacenada en la memoria EEPROM de datos del microcontrolador. Tambin
escucharemos un sonido de dos segundos de duracin. Recuerde que el propsito de este
tiempo es dejar al usuario la oportunidad de poder leer el contenido del mensaje publicado
en la pantalla.
200
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 7.14
Por ltimo, el sistema muestra un mensaje que indica que el sistema deber ser reiniciado
para poder verificar la nueva clave.
Figura 7.15
201
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 8.1
202
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
1
0
0
1
0
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
1
1
1
1
1
1
0
0
1
1
0
1
0
1
0
1
1018
1019
1020
1021
1022
1023
0
1
2
3
4
BIT 7
Decimal
Figura 8.2
Para comprender an mejor este punto, veamos el siguiente ejemplo:
Si se configura el conversor A/D a 8 bits e introducimos una seal cuya amplitud vara entre
0 y 5 voltios, y donde el voltaje de referencia del conversor es 5 voltios, entonces la
resolucin que obtendremos en la conversin sera la siguiente:
Resolucin =
Vimax
2n
Resolucin =
5V
28
Resolucin =
5V
256
Esto significa que la resolucin a 8 bits para el ejemplo planteado es de 20 mV por cada
paso que da el conversor A/D entre 0 y 255.
203
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Si configuramos el conversor A/D a 10 bits, entonces tenemos que 210 = 1024, y por lo tanto
obtenemos una resolucin mayor, lo cual podemos demostrar realizando los clculos
correspondientes:
Resolucin =
Vimax
2n
Resolucin =
5V
210
Resolucin =
5V
1024
Entonces la resolucin a 10 Bits es de 4.9 mV por cada paso que da el conversor A/D entre
0 y 1023.
Veamos el diagrama de bloques del conversor A/D (figura 8.3):
Figura 8.3
204
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Resulta interesante saber que se puede obtener ms resolucin en trminos de voltios por
paso, si utilizamos un voltaje de referencia menor al de la alimentacin del microcontrolador
a travs de los pines Ref+ o Ref- segn sea el caso.
Por ejemplo, si aplicamos un voltaje de referencia positivo igual a 2.5 voltios en el pin
RA3/AN3/Ref+ del puerto A, el cual ha sido previamente configurado para esto, entonces:
Resolucin =
Vimax
2n
Resolucin =
2.5V
210
Resolucin =
2.5V
1024
La resolucin del conversor A/D sera de 2.5 mV por cada paso entre 0 y 1023. Hay una
serie de pasos que debemos tomar en cuenta para llevar a cabo una conversin A/D,
basados en el diagrama de bloques de la figura 8.3:
Lo primero, ser configurar los canales de entrada que utilizaremos para introducir la seal
analgica al conversor A/D y los canales para voltajes de referencia, en el caso de ser
necesario. Esto se hace seleccionando la combinacin correspondiente en los bits PCFG3,
PCFG2 PCFG1 y PCFG0 del registro de control ADCON1 (figura 8.4).
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADFM
------
------
------
PCFG3
PCFG2
PCFG1
PCFG0
Figura 8.4
205
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
En este punto es muy conveniente detenerse a analizar la tabla de la figura 8.5, que define
cuales pines del puerto A y E sern entradas al conversor A/D, segn la combinacin
elegida.
PCFG3 PCFG2 PCFG1 PCFG0 AN7
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
1
1
1
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
x
0
1
0
1
0
1
0
1
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D
AN6
AN5
AN4
AN3
AN2
AN1
AN0
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D
A
A
D
D
D
D
D
A
A
A
A
D
D
D
D
A
A
A
A
D
D
D
A
A
A
A
A
D
D
D
A
Vref+
A
Vref+
A
Vref+
D
Vref+
A
Vref+
Vref+
Vref+
Vref+
D
Vref+
A
A
A
A
D
D
D
VrefA
A
VrefVrefVrefD
Vref-
A
A
A
A
A
A
D
A
A
A
A
A
A
D
D
A
A
A
A
A
A
D
A
A
A
A
A
A
A
A
Vref+ Vref-
Vdd
RA3
Vdd
RA3
Vdd
RA3
Vdd
RA3
Vdd
RA3
RA3
RA3
RA3
Vdd
RA3
Vss
Vss
Vss
Vss
Vss
Vss
Vss
RA2
Vss
Vss
RA2
RA2
RA2
Vss
RA2
Figura 8.5
El segundo paso ser activar el canal en el cual se encuentra presente la seal analgica
para que pase a la etapa de muestreo. La seleccin de las entradas analgicas se realiza
configurando los bits CHS2 (bit 5), CHS1 (bit 4) y CHS0 (bit 3) del registro ADCON0 (figura
8.6):
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADCS1
ADCS0
CHS2
CHS1
CHS0
GO/DONE
------
ADON
Figura 8.6
CHS2 CHS1 CHS0
0
0
0
0
0
1
0
1
0
0
1
1
1
0
0
1
0
1
1
1
0
1
1
1
Canal/Pin
Canal 0 (AN0)/RA0
Canal 1 (AN1)/RA1
Canal 2 (AN2)/RA2
Canal 3 (AN3)/RA3
Canal 4 (AN4)/RA5
Canal 5 (AN5)/RE0
Canal 6 (AN6)/RE1
Canal 7 (AN7)/RE2
=
=
=
=
=
=
=
=
Figura 8.7
206
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Debemos saber que es posible seleccionar el canal que deseamos utilizar, con la rutina
correspondiente en la librera, Adc_Read(canal), en la cual slo se especifica cual ser el
canal de entrada de la seal a ser convertida. El resultado de la lectura del canal
especificado podr ser almacenado en una variable previamente declarada, tal y como se
muestra en el siguiente ejemplo:
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADCS1
ADCS0
CHS2
CHS1
CHS0
GO/DONE
------
ADON
Figura 8.8
Bit 7 y Bit 6: Seleccin del reloj del conversor A/D.
ADCS1 ADCS0
Conversin del Reloj
0
0
=
Fosc/2
0
1
=
Fosc/8
1
0
=
Fosc/32
1
1
=
FRC
Figura 8.9
Bit 5, Bit 4 y Bit 3: Seleccin del canal de entrada.
CHS2 CHS1 CHS0
0
0
0
0
0
1
0
1
0
0
1
1
1
0
0
1
0
1
1
1
0
1
1
1
Canal/Pin
Canal 0 (AN0)/RA0
Canal 1 (AN1)/RA1
Canal 2 (AN2)/RA2
Canal 3 (AN3)/RA3
Canal 4 (AN4)/RA5
Canal 5 (AN5)/RE0
Canal 6 (AN6)/RE1
Canal 7 (AN7)/RE2
=
=
=
=
=
=
=
=
Figura 8.10
207
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADFM
------
------
------
PCFG3
PCFG2
PCFG1
PCFG0
Figura 8.11
Bit 7: Justificacin del resultado de la conversin a 10 bits a la derecha o izquierda.
1 = Justifica a la derecha.
0 = Justifica a la Izquierda.
Bit 6 al Bit 4: No estn implementados.
Bit3, Bit 2, Bit 1 y Bit 0: Configuracin
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
1
1
1
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
x
0
1
0
1
0
1
0
1
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D
AN6
AN5
AN4
AN3
AN2
AN1
AN0
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D
A
A
D
D
D
D
D
A
A
A
A
D
D
D
D
A
A
A
A
D
D
D
A
A
A
A
A
D
D
D
A
Vref+
A
Vref+
A
Vref+
D
Vref+
A
Vref+
Vref+
Vref+
Vref+
D
Vref+
A
A
A
A
D
D
D
VrefA
A
VrefVrefVrefD
Vref-
A
A
A
A
A
A
D
A
A
A
A
A
A
D
D
A
A
A
A
A
A
D
A
A
A
A
A
A
A
A
Vref+ Vref-
Vdd
RA3
Vdd
RA3
Vdd
RA3
Vdd
RA3
Vdd
RA3
RA3
RA3
RA3
Vdd
RA3
Vss
Vss
Vss
Vss
Vss
Vss
Vss
RA2
Vss
Vss
RA2
RA2
RA2
Vss
RA2
Figura 8.12
208
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
A = Entrada Analgica
D = I/O Digital
Cuando realizamos la conversin A/D a 10 bits, el resultado de la conversin se almacena
en dos registros, ADRESH y ADRESL, los cuales unidos forman un solo registro de 16 bits,
solo que en la parte alta de ste, los 6 bits mas significativos (Bit 2 al Bit 7 de ADRESH,
figura 8.13) no son tomados en cuenta, es decir, son considerados como 0. Esto da como
resultado que el valor mximo a ser almacenado en l ser: 0000001111111111, es decir,
1023.
REGISTRO ALTO (ADRESH)
Figura 8.13
En la conversin a 10 bits tambin es muy importante considerar el bit 7 (ADFM) del registro
de control ADCON1, ya que este bit mantiene el resultado de la conversin de 10 bits
justificado, ya sea a la derecha si ADFM = 1, como lo demuestra la figura 8.14, o a la
izquierda si ADFM = 0 como lo demuestra la figura 8.15:
Figura 8.14
Figura 8.15
Figura 8.16
210
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
'
'
'
'
'
main:
ADCON1 = 0
TRISA
= $FF
Glcd_Init()
' Inicializamos la pantalla
Glcd_Fill(0)
' Limpiamos la pantalla
Glcd_Set_Font(@fuentes5x8, 5, 8, 32) ' Elegimos el mdulo de fuentes
While (TRUE)
dato = Adc_Read(2)
wordtostr(dato, DatoStr)
Wend
End.
211
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
El resultado de este programa ser la pantalla que vemos en la figura 8.17, en la cual
podremos observar el valor de la variable dato convertida en un string de uno a cuatro
dgitos, la cual puede variar su valor entre 0 y 1023 al modificar la posicin del
potencimetro conectado en la entrada del conversor A/D:
!
!
!
!
Figura 8.17
212
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Veamos ahora como podramos configurar este ejemplo, para hacer uso de un voltaje de
referencia en el conversor A/D, de tal manera que podamos variar la resolucin de la
conversin de datos.
Para esto, ser necesario tomar en cuenta nuevamente el registro ADCON1 y la tabla de
configuracin de pines del conversor:
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADFM
------
------
------
PCFG3
PCFG2
PCFG1
PCFG0
Figura 8.18
Recordemos entonces que para configurar los pines de entrada del conversor, debemos
hacer uso de los bits 0 al 3 del registro ADCON1, basados en la siguiente tabla de
configuracin de pines del mismo.
En este ejemplo, elegiremos como pin de voltaje de referencia positivo a RA3 y
mantendremos RA2 como pin de entrada analgica. Esto significa que una de las
configuraciones posibles representadas en la tabla, puede ser la que encontramos en la
lnea 2 de la misma, como se muestra a continuacin:
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
1
1
1
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
x
0
1
0
1
0
1
0
1
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D
AN6
AN5
AN4
AN3
AN2
AN1
AN0
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D
A
A
D
D
D
D
D
A
A
A
A
D
D
D
D
A
A
A
A
D
D
D
A
A
A
A
A
D
D
D
A
Vref+
A
Vref+
A
Vref+
D
Vref+
A
Vref+
Vref+
Vref+
Vref+
D
Vref+
A
A
A
A
D
D
D
VrefA
A
VrefVrefVrefD
Vref-
A
A
A
A
A
A
D
A
A
A
A
A
A
D
D
A
A
A
A
A
A
D
A
A
A
A
A
A
A
A
Vref+ Vref-
Vdd
RA3
Vdd
RA3
Vdd
RA3
Vdd
RA3
Vdd
RA3
RA3
RA3
RA3
Vdd
RA3
Vss
Vss
Vss
Vss
Vss
Vss
Vss
RA2
Vss
Vss
RA2
RA2
RA2
Vss
RA2
Figura 8.19
La configuracin de los bits en el registro ADCON1 entonces deber ser igual a:
ADCON1 = %00000001
(en binario)
(en decimal)
213
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Pero antes de continuar con el ejercicio, veamos como debera quedar el circuito propuesto:
Figura 8.20
Observe que hemos puesto un potencimetro de 5 kohm adicional con respecto al circuito
anterior y conectado al pin RA3, de tal manera que podamos variar el voltaje de referencia
aplicado al mismo.
En base a lo estudiado anteriormente, podramos deducir que para este nuevo circuito, si
giramos el potencimetro REF hasta obtener un voltaje de referencia de 5 Voltios, al variar la
entrada en RA2 el resultado en la pantalla debera ser el mismo en comparacin con el
ejemplo anterior, es decir, al variar el recorrido del potencimetro POT de extremo a
extremo, la lectura debe variar entre 0 y 1023.
214
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Vimax
2n
Resolucin =
5V
210
Resolucin =
5V
1024
Pero que sucede si ponemos un voltaje de referencia igual a 2.5 voltios? Fcilmente
podremos ver el resultado variando el potencimetro REF hasta obtener el voltaje de
referencia deseado.
Con un voltaje de referencia igual a la mitad del voltaje que aplicamos en RA2, la resolucin
en la conversin sera:
Resolucin =
Vimax
2n
Resolucin =
2.5V
210
Resolucin =
2.5V
1024
En este caso se podr observar que la conversin entre 0 y 5 voltios en el pin RA2 se har
en la mitad del recorrido del potencimetro POT.
215
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Para esto, el nico cambio necesario en el programa ser con respecto a la configuracin
del registro ADCON1:
program ADC_02
Include mis_fuentes ' Incluimos el archivo de fuentes
' Configuracin de coneccin del mdulo Glcd
Dim GLCD_DataPort As Byte At PORTD
Dim GLCD_CS1
GLCD_CS2
GLCD_RS
GLCD_RW
GLCD_EN
GLCD_RST
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
'
'
'
'
'
main:
ADCON1 = 1
TRISA
= $FF
Glcd_Init()
' Inicializamos la pantalla
Glcd_Fill(0)
' Limpiamos la pantalla
Glcd_Set_Font(@fuentes5x8, 5, 8, 32) ' Elegimos el mdulo de fuentes
While (TRUE)
dato = Adc_Read(2)
wordtostr(dato, DatoStr)
Wend
End.
En vista de que hemos estado convirtiendo el nivel de un voltaje que vara entre 0 y 5 voltios
en datos de de 10 bits a travs del conversor A/D, sera interesante agregar mas informacin
en la pantalla Glcd en base a stos, como por ejemplo, el valor del voltaje en la entrada
analgica.
Esto tambin significa que basados en los datos obtenidos en la conversin A/D los cuales
varan entre 0 y 1023, el voltaje de referencia seleccionado a travs del potencimetro POT
216
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Por ejemplo, si tenemos un valor de conversin igual a 512, y el voltaje de referencia del
conversor es de 5 voltios, entonces:
Voltaje = (Resolucin x Valor de la conversin A/D)
Voltaje en RA2 = (4.9 mV x 512)
Voltaje = 2,5088 voltios
Esto significa que el voltaje en la entrada RA2 cuando la conversin nos ha entregado un
valor igual a 512, debera ser igual o aproximadamente el voltaje calculado.
Convirtamos esta formula en cdigo y observemos el resultado:
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
217
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
'
'
'
'
main:
ADCON1 = 1
TRISA
= $FF
Glcd_Init()
' Inicializamos la pantalla
Glcd_Fill(0)
' Limpiamos la pantalla
Glcd_Set_Font(@fuentes5x8, 5, 8, 32) ' Elegimos el mdulo de fuentes
While (TRUE)
dato = Adc_Read(2)
datoflt = dato
wordtostr(dato, DatoStr)
FloatToStr(Voltaje, VoltajeStr)
Se observa en el programa que hemos agregado tres nuevas variables. Considerando que
realizaremos clculos cuyos resultados generan decimales, dos de estas variables han sido
declaradas como float o punto flotante.
En una de estas variables, Voltaje, almacenaremos el resultado en el clculo del valor del
voltaje en RA2, por lo cual esta variable deber ser tipo float.
La otra variable tipo float se denomin datoflt, y en ella cargaremos el valor de la
conversin proveniente de la variable dato la cual ha sido ya declarada anteriormente
como word.
En la tercera nueva variable, almacenaremos la conversin de la variable Voltaje de float
a string, para poder visualizar el dato en la pantalla Glcd.
Por ltimo, se han agregado las lneas de programa correspondientes al clculo de la
formula, conversin de datos e impresin de datos en la pantalla.
218
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 8.21
219
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 8.22
220
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
8.2.- El Acelermetro.
En el siguiente ejemplo realizaremos un programa para el control de un acelermetro triaxial,
el cual posee tres salidas analgicas las cuales deseamos representar en un formato digital
en la pantalla Glcd, y en la cual incluiremos adems de los datos de la conversin A/D de
cada salida, los valores de los voltajes calculados en cada una de ellas, en base a algunas
caractersticas del dispositivo, las cuales estudiaremos a continuacin.
El acelermetro propuesto es de la empresa Dimension Engineering LLC.
http://www.dimensionengineering.com/DE-ACCM3D2.htm
El modelo elegido ha sido el siguiente:
Buffered 3D Accelerometer, Cdigo: DE-ACCM3D2
221
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
En pocas palabras, podramos medir la direccin hacia la cual se encuentra un objeto con
respecto al espacio tridimensional X, Y, Z.
El voltaje de operacin est entre 3.5V y 15V, debido a que incorpora un regulador de
voltaje de 3.3V.
El circuito cuenta con un punto de conexin (regulator bypass) a travs del cual
podemos alimentar el acelermetro entre 2.4V y 3.6V, y prescindir del regulador de
voltaje.
Mide un rango de 2g en sus tres ejes X, Y, Z, con una sensibilidad de hasta 720 mV/g.
Segn los datos proporcionados por su fabricante, los datos de rangos de sensibilidad para
los siguientes voltajes de operacin son los siguientes:
En nuestro caso, haremos uso del regulador de voltaje de 3.3V, por lo cual los clculos se
realizarn en base a la sensibilidad correspondiente, S = 666 mV/g. Los voltajes mximos en
cada salida observando la placa del acelermetro en sus posiciones extremas, considerando
que la alimentacin del acelermetro es de 3.3V son los siguientes:
222
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Entonces,
1.95V 1.66V = +0.29V con respecto al punto de 0g del acelermetro.
Si sabemos que la sensibilidad a 3.3V es 666 mV/g, 0.29V 0.666 V/g = 0.435 g
Esto da como resultado que la aceleracin en el eje X es +0.435 g
223
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Calculemos ahora la inclinacin del circuito en el eje Y, con respecto al voltaje en la salida
correspondiente. Para este clculo utilizaremos un voltaje de ejemplo, igual a 1.85 V.
Datos conocidos:
Figura 8.25
Figura 8.26
Entonces,
1.85V 1.66V = +0.19V con respecto al punto de 0g.
Con una sensibilidad de 666 mV/g, 0.19 V 0.666 V/g = 0.2852 g
Arc Sen (0.2852) = 0.289215
224
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Este resultado expresado en radianes pude ser convertido en grados de la siguiente forma:
Angulo = (180 x 0.289215) / 3.14159 = 16.57
La inclinacin del circuito de la figura 8.26 es igual a 16.5 con respecto al suelo.
Figura 8.27
225
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
Eje_X As Word
Eje_Y As Word
Eje_Z As Word
main:
ADCON1 = 1
TRISA
= $FF
Glcd_Init()
Glcd_Fill(0)
Glcd_Set_Font(@fuentes5x8, 5, 8, 32)
While (TRUE)
texto = "Acelerometro"
Glcd_Write_Text(texto, 25, 0, 1)
Eje_X = Adc_Read(0)
wordtostr(Eje_X, DatoStr)
texto = "X:"
' Cargamos la variable con un mensaje.
Glcd_Write_Text(texto, 5, 4, 1)
' Escribimos el contenido en la lnea 4
Glcd_Write_Text(DatoStr, 16, 4, 1) ' Escribimos el contenido de la conversin
Eje_Y = Adc_Read(1)
226
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
wordtostr(Eje_Y, DatoStr)
texto = "Y:"
' Cargamos la variable con un mensaje.
Glcd_Write_Text(texto, 5, 5, 1)
' Escribimos el contenido en la lnea 5
Glcd_Write_Text(DatoStr, 16, 5, 1) ' Escribimos el contenido de la variable
Eje_Z = Adc_Read(2)
wordtostr(Eje_Z, DatoStr)
texto = "Z:"
' Cargamos la variable con un mensaje.
Glcd_Write_Text(texto, 5, 6, 1)
' Escribimos el contenido en la lnea 6
Glcd_Write_Text(DatoStr, 16, 6, 1) ' Escribimos el contenido de la variable
Wend
End.
Analizando el programa, nos podremos dar cuenta que hemos agregado tres nuevas
variables para almacenar el resultado de la conversin A/D de cada una de las salidas del
acelermetro.
Estas tres variables llamadas Eje_X, Eje_Y y Eje_Z han sido declaradas tipo word, ya
que la conversin A/D est configurada por defecto a 10 bits, por lo cual una variable de 8
bits (byte), no funcionara en este caso.
Eje_X As Word
Eje_Y As Word
Eje_Z As Word
Otra de las cosas importantes a resaltar es que el registro ADCON1 esta configurado para
que los pines del puerto A que deseamos utilizar en la conversin, RA0, RA1 y RA2 sean
entradas anlogas, y para que el pin RA3 sirva de voltaje de referencia positivo.
ADCON1 = 1
Tambin contamos con un ttulo para nuestro proyecto, el cual ha sido ubicado en la primera
lnea de la pantalla Glcd, al igual que el ttulo de las dos columnas de datos ubicado en la
segunda lnea de la pantalla.
texto = "Acelerometro"
Glcd_Write_Text(texto, 25, 0, 1)
Por ltimo, tenemos las rutinas correspondientes a la captura y conversin de datos del
acelermetro:
227
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Eje_X = Adc_Read(0)
wordtostr(Eje_X, DatoStr)
texto = "X:"
' Cargamos la variable con un mensaje.
Glcd_Write_Text(texto, 5, 4, 1)
' Escribimos el contenido en la lnea 4
Glcd_Write_Text(DatoStr, 16, 4, 1) ' Escribimos el contenido de la conversin
Eje_Y = Adc_Read(1)
wordtostr(Eje_Y, DatoStr)
texto = "Y:"
' Cargamos la variable con un mensaje.
Glcd_Write_Text(texto, 5, 5, 1)
' Escribimos el contenido en la lnea 5
Glcd_Write_Text(DatoStr, 16, 5, 1) ' Escribimos el contenido de la variable
Eje_Z = Adc_Read(2)
wordtostr(Eje_Z, DatoStr)
texto = "Z:"
' Cargamos la variable con un mensaje.
Glcd_Write_Text(texto, 5, 6, 1)
' Escribimos el contenido en la lnea 6
Glcd_Write_Text(DatoStr, 16, 6, 1) ' Escribimos el contenido de la variable
Las rutinas para la captura y conversin A/D, son bsicamente las mismas. Solo hemos
cambiado las variables en las cuales estamos almacenando el dato correspondiente a cada
salida del acelermetro, la conversin de datos de word a string y las posiciones
correspondientes a los mensajes y resultados a ser mostrados en la pantalla Glcd.
Figura 8.28
228
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Como se puede ver en la figura 8.28, nuestro programa ha sido capaz de mostrarnos el valor
de la conversin A/D para cada una de las salidas del acelermetro. Pero ste sera mas til
an si pudisemos contar con estos valores expresados en trminos de voltaje y
aceleracin, tal y como lo estudiamos antes de empezar a hacer este ejercicio.
8.2.2.- Clculo del voltaje de entrada del conversor A/D.
Empecemos calculando el voltaje en cada una de las entradas del conversor A/D. Los datos
que debemos tomar en cuenta para este clculo seran los siguientes:
Para calcular el voltaje necesitamos saber el valor de la resolucin en la conversin A/D:
Resolucin =
Vimax
2n
Resolucin =
3.3V
210
Resolucin =
3.3V
1024
Resolucin = 0,003222 V
Las formulas para el clculo de voltaje en cada entrada seran las siguientes:
229
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Entonces,
La aceleracin para el Eje X:
Voltaje en RA0 1.66V = Voltaje con respecto al punto de 0g del acelermetro.
Si sabemos que la sensibilidad a 3.3V es 666 mV/g:
Voltaje con respecto al punto de 0g del acelermetro 0.666 V/g = Aceleracin en X.
230
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction
RB0_bit
RB1_bit
RB2_bit
RB3_bit
RB4_bit
RB5_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISB4_bit
TRISB5_bit
Eje_X As Word
Eje_Y As Word
Eje_Z As Word
As Float
As Float
As Float
Volt_Eje_Y
Volt_Acell_Y
Acell_Y
As Float
As Float
As Float
Volt_Eje_Z
Volt_Acell_Z
Acell_Z
As Float
As Float
As Float
Dato_Temp
As Float
main:
ADCON1 = 1
TRISA
= $FF
Glcd_Init()
Glcd_Fill(0)
Glcd_Set_Font(@fuentes5x8, 5, 8, 32)
Acelerometro:
texto = "Acelerometro"
231
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Glcd_Write_Text(texto, 25, 0, 1)
texto = "
Volt.
Acell."
Glcd_Write_Text(texto, 2, 2, 1)
'*************************************************************************
' Rutina correspondiente al Eje X del Acelermetro ***********************
Eje_X = Adc_Read(0)
texto = "X:"
Glcd_Write_Text(texto, 2, 4, 1)
FloatToStr(Volt_Eje_X, DatoStr)
' Conversin de float a string
Glcd_Write_Text(DatoStr, 15, 4, 1) ' Escribimos el contenido de la conversin.
' Calculamos la Aceleracin:
Volt_Acell_X =
Volt_Eje_X - 1.66
FloatToStr(Acell_X, DatoStr)
' Se convierte el resultado a string.
Glcd_Write_Text(DatoStr, 65, 4, 1) ' Se imprime el dato en pantalla.
'*************************************************************************
' Rutina correspondiente al Eje Y del Acelermetro ***********************
Eje_Y = Adc_Read(1)
texto = "Y:"
Glcd_Write_Text(texto, 2, 5, 1)
FloatToStr(Volt_Eje_Y, DatoStr)
' Conversin de float a string
Glcd_Write_Text(DatoStr, 14, 5, 1) ' Escribimos el contenido de la variable.
' Calculamos la Aceleracin:
Volt_Acell_Y =
Volt_Eje_Y - 1.66
FloatToStr(Acell_Y, DatoStr)
' Se convierte el resultado a string.
Glcd_Write_Text(DatoStr, 65, 5, 1) ' Se imprime el dato en pantalla.
'*************************************************************************
' Rutina correspondiente al Eje Z del Acelermetro ***********************
Eje_Z = Adc_Read(2)
texto = "Z:"
Glcd_Write_Text(texto, 2, 6, 1)
232
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
FloatToStr(Volt_Eje_Z, DatoStr)
' Conversin de word a string
Glcd_Write_Text(DatoStr, 14, 6, 1) ' Escribimos el contenido de la variable.
' Calculamos la Aceleracin:
Volt_Acell_Z = Volt_Eje_Z - 1.66
FloatToStr(Acell_Z, DatoStr)
' Se convierte el resultado a string.
Glcd_Write_Text(DatoStr, 65, 6, 1) ' Se imprime el dato en pantalla.
GoTo Acelerometro
End.
Figura 8.29
Obviamente, estos valores estarn variando constantemente mientras estemos moviendo el
acelermetro en diferentes direcciones sobre cada eje.
233
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
8.3.- Termocupla.
A continuacin haremos una breve introduccin al estudio de un dispositivo que resulta ser
muy utilizado en la industria para el control de niveles de temperaturas de rangos muy
amplios, entre -200C y 1700C.
La termocupla o termopar es un sensor compuesto por dos diferentes tipos de metales
unidos en una de sus puntas, los cuales generan una diferencia de potencial que depende
de la temperatura aplicada a ella. Esta es una propiedad que se conoce con el nombre de
efecto Seebeck, efecto termoelctrico descubierto a inicios de la segunda dcada del siglo
dieciocho por Thomas Johann Seebeck.
Hoy en da se fabrican diferentes tipos de termocuplas, las cuales han sido clasificadas
segn ciertas caractersticas propias de cada metal. Podemos conseguir en el mercado
termocuplas tipo B, J, K, E, N, R y S. Las termocuplas tipo J y tipo K son las ms comunes
debido a que poseen caractersticas como una alta sensibilidad, en el rango de 40 uV/C a
52 uV/C aproximadamente, adems de un alto rango de temperaturas que pueden ser
medidas.
Los metales correspondientes a la termocupla tipo J son el hierro y el constantn. Su rango
de temperatura es de -200C hasta 750C.
Los metales correspondientes a la termocupla tipo K son el cromo y el aluminio. Su rango de
temperatura es de -200C hasta 1250C.
Resulta muy importante mencionar que el voltaje generado por la unin de estos metales no
es lineal, con respecto al rango de temperatura medido. Para solucionar este inconveniente,
utilizaremos un amplificador-compensador entre la termocupla y el microcontrolador:
10mV / C
0.0517 mV / C
= 193.42
Para una termocupla tipo K, el voltaje generado por la unin de sus metales es de 40.44
uV/C. Si calculamos la ganancia del amplificador en AD595, tenemos que:
Ganancia =
10mV / C
0.04044mV / C
= 247.27
-220
10
-8096
-210
-8096
-8076
-8057
-8037
-8017
-7996
-7976
-7955
-7934
-7912
-7890
-200
-7890
-7868
-7846
-7824
-7801
-7778
-7755
-7731
-7707
-7683
-7659
-190
-7659
-7634
-7609
-7584
-7559
-7533
-7508
-7482
-7455
-7429
-7402
-180
-7402
-7375
-7348
-7321
-7293
-7265
-7237
-7209
-7180
-7151
-7122
-170
-7122
-7093
-7064
-7034
-7004
-6974
-6944
-6914
-6883
-6852
-6821
-160
-6821
-6790
-6758
-6727
-6695
-6663
-6630
-6598
-6565
-6532
-6499
-150
-6499
-6466
-6433
-6399
-6365
-6331
-6297
-6263
-6228
-6194
-6159
-140
-6159
-6124
-6089
-6053
-6018
-5982
-5946
-5910
-5874
-5837
-5801
-130
-5801
-5764
-5727
-5690
-5653
-5615
-5578
-5540
-5502
-5464
-5426
-120
-5426
-5388
-5349
-5311
-5272
-5233
-5194
-5155
-5115
-5076
-5036
-110
-5036
-4996
-4956
-4916
-4876
-4836
-4795
-4755
-4714
-4673
-4632
-100
-4632
-4591
-4550
-4508
-4467
-4425
-4383
-4341
-4299
-4257
-4215
-90
-4215
-4172
-4130
-4087
-4044
-4001
-3958
-3915
-3872
-3829
-3785
-80
-3785
-3742
-3698
-3654
-3610
-3566
-3522
-3478
-3433
-3389
-3344
-70
-3344
-3299
-3255
-3210
-3165
-3120
-3074
-3029
-2984
-2938
-2892
-60
-2892
-2847
-2801
-2755
-2709
-2663
-2617
-2570
-2524
-2478
-2431
-50
-2431
-2384
-2338
-2291
-2244
-2197
-2150
-2102
-2055
-2008
-1960
-40
-1960
-1913
-1865
-1818
-1770
-1722
-1674
-1626
-1578
-1530
-1481
-30
-1481
-1433
-1385
-1336
-1288
-1239
-1190
-1141
-1093
-1044
-995
-20
-995
-945
-896
-847
-798
-748
-699
-650
-600
-550
-501
-10
-501
-451
-401
-351
-301
-251
-201
-151
-101
-50
50
101
151
202
253
303
354
405
456
507
10
507
558
609
660
711
762
813
865
916
967
1019
20
1019
1070
1122
1174
1225
1277
1329
1381
1432
1484
1536
30
1536
1588
1640
1693
1745
1797
1849
1901
1954
2006
2058
40
2058
2111
2163
2216
2268
2321
2374
2426
2479
2532
2585
50
2585
2638
2691
2743
2796
2849
2902
2956
3009
3062
3115
60
3115
3168
3221
3275
3328
3381
3435
3488
3542
3595
369
70
369
3702
3756
3809
3863
3917
3971
4024
4078
4132
4186
80
4186
4239
4293
4347
4401
4455
4509
4563
4617
4671
4725
90
4725
4780
4834
4888
4942
4996
5050
5105
5159
5213
5268
100
5268
5322
5376
5431
5485
5540
5594
5649
5703
5758
5812
110
5812
5867
5921
5976
6031
6085
6140
6195
6249
6304
6359
120
6359
6414
6468
6523
6578
6633
6688
6742
6797
6852
6907
130
6907
6962
7017
7072
7127
7182
7237
7292
7347
7402
7457
140
7457
7512
7567
7622
7677
7732
7787
7843
7898
7953
8008
236
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
150
8008
8063
8118
8174
8229
8284
8339
8394
850
8505
8560
160
8560
8616
8671
8726
8781
8837
8892
8947
9003
9058
9113
170
9113
9169
9224
9279
9335
9390
9446
9501
9556
9612
9667
180
9667
9723
9778
9834
9889
9944
10000
10055
10111
10166
10222
190
10222
10277
10333
10388
10444
10499
10555
10610
10666
10721
10777
200
10777
10832
10888
10943
10999
11054
11110
11165
11221
11276
11332
210
11332
11387
11443
11498
11554
11609
11665
11720
11776
11831
11887
220
11887
11943
11998
12054
12109
12165
12220
12276
12331
12387
12442
230
12442
12498
12553
12609
12664
12720
12776
12831
12887
12942
12998
240
12998
13053
13109
13164
13220
13275
13331
13386
13442
13497
13553
250
13553
13608
13664
13719
13775
13830
13886
13941
13997
14052
14108
260
14108
14163
14219
14274
14330
14385
14441
14496
14552
14607
14663
270
14663
14718
14774
14829
14885
14940
14995
15051
15106
15162
15217
280
15217
15273
15328
15383
15439
15494
15550
15605
15661
15716
15771
290
15771
15827
15882
15938
15993
16048
16104
16159
16214
16270
16325
300
16325
16380
16436
16491
16547
16602
16657
16713
16768
16823
16879
310
16879
16934
16989
17044
17100
17155
17210
17266
17321
17376
17432
320
17432
17487
17542
17597
17653
17708
17763
17818
17874
17929
17984
330
17984
18039
18095
18150
18205
18260
18316
18371
18426
18481
18537
340
18537
18592
18647
18702
18757
18813
18868
18923
18978
19033
19089
350
19089
19144
19199
19254
19309
19364
1920
19475
19530
19585
19640
360
19640
19695
19751
19806
19861
19916
19971
20026
20081
20137
20192
370
20192
20247
20302
20357
20412
20467
20523
20578
20633
20688
20743
380
20743
20798
20853
20909
20964
21019
21074
21129
21184
21239
21295
390
21295
21350
21405
21460
21515
21570
21625
21680
21736
21791
21846
400
21846
21901
21956
22011
22066
22122
22177
22232
22287
22342
22397
410
22397
22453
22508
22563
22618
22673
22728
22784
22839
22894
22949
420
22949
23004
23060
23115
23170
23225
23280
23336
23391
23446
23501
430
23501
23556
23612
23667
23722
23777
23833
23888
23943
23999
24054
440
24054
24109
24164
24220
24275
24330
24386
24441
24496
24552
24607
450
24607
24662
24718
24773
24829
24884
24939
24995
25050
25106
25161
460
25161
25217
25272
25327
25383
25438
25494
25549
25605
25661
25716
470
25716
25772
25827
25883
25938
25994
26050
26105
26161
26216
26272
480
26272
26328
26383
26439
26495
26551
26606
26662
26718
26774
26829
490
26829
26885
26941
26997
27053
27109
27165
27220
27276
27332
27388
500
27388
27444
27500
27556
27612
27668
27724
27780
27836
27893
27949
510
27949
28005
28061
28117
28173
28230
28286
28342
28398
28455
28511
520
28511
28567
28624
28680
28736
28793
28849
28906
28962
29019
29075
530
29075
29132
29188
29245
29301
29358
29415
29471
29528
29585
29642
540
29642
29698
29755
29812
29869
29926
29983
30039
30096
30153
30210
550
30210
30267
30324
30381
30439
30496
30553
30610
30667
30724
30782
560
30782
30839
30896
30954
31011
31068
31126
31183
31241
31298
31356
570
31356
31413
31471
31528
31586
31644
31702
31759
31817
31875
31933
580
31933
31991
32048
32106
32164
32222
32280
32338
32396
32455
32513
590
32513
32571
32629
32687
32746
32804
32862
32921
32979
33038
33096
600
33096
33155
33213
33272
33330
33389
33448
33506
33565
33624
33683
610
33683
33742
33800
33859
33918
33977
34036
34095
34155
34214
34273
620
34273
34332
34391
34451
34510
34569
34629
34688
3478
34807
34867
630
34867
34926
34986
35046
35105
35165
35225
35285
35344
35404
35464
640
35464
35524
35584
35644
35704
35764
35825
35885
35945
36005
36066
237
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
650
36066
36126
36186
36247
36307
36368
36428
36489
36549
36610
36671
660
36671
36732
36792
36853
36914
36975
37036
37097
37158
37219
37280
670
37280
37341
37402
37463
37525
37586
37647
37709
37770
37831
37893
680
37893
37954
38016
38078
38139
38201
38262
38324
38386
38448
38510
690
38510
38572
38633
38695
38757
38819
38882
38944
39006
39068
39130
700
39130
39192
39255
39317
39379
39442
39504
39567
39629
39692
39754
710
39754
39817
39880
39942
40005
40068
40131
40193
40256
40319
40382
720
40382
40445
40508
40571
40634
40697
40760
40823
40886
40950
41013
730
41013
41076
41139
41203
41266
41329
41393
41456
41520
41583
41647
740
41647
41710
41774
41837
41901
41965
42028
42092
42156
42219
42283
750
42283
42347
42411
42475
42538
42602
42666
42730
42794
42858
42922
760
42922
42980
43050
43114
43178
43242
43306
43370
43435
43499
43563
770
43563
43627
43692
43756
43820
43885
43949
44014
44078
44142
44207
780
44207
44271
44336
44400
44465
44529
44594
44658
44723
44788
44852
790
44852
44917
44981
45046
45111
45175
45240
45304
45369
45434
45498
800
45498
45563
45627
45692
45757
45821
45886
45950
46015
46080
46144
810
46144
46209
46273
46338
46403
46467
46532
46596
46661
46725
46790
820
46790
6854
46919
46983
47047
47112
47176
47241
47305
47369
47434
830
47434
47498
47562
47627
47691
47755
47819
47884
47948
48012
48076
840
48076
48140
48204
48269
48333
48397
48461
48525
48589
48653
48716
850
48716
48780
48844
48908
48972
49036
49099
49163
49227
49291
49354
860
49354
49418
49481
49545
49608
49672
49735
49799
49862
49926
49989
870
49989
50052
50116
50179
50242
50305
50369
50432
50495
50558
50621
880
50621
50684
50747
50810
50873
50936
50998
51061
51124
51187
51249
890
51249
51312
51375
51437
51500
51562
51625
51687
51750
51812
51875
900
51875
51937
51999
52061
52124
52186
52248
52310
52372
52434
52496
910
52496
52558
52620
52682
52744
52806
52868
52929
52991
53053
53115
920
53115
53176
53238
53299
53361
53422
53484
53545
53607
53668
53729
930
53729
53791
53852
53913
53974
54035
54096
54157
54219
54280
54341
940
54341
54401
54462
54523
54584
54645
54706
54766
54827
54888
54948
950
54948
55009
55070
55130
55191
55251
55312
55372
55432
55493
55553
960
55553
55613
55674
55734
55794
55854
55914
55974
56035
56095
56155
970
56155
56215
56275
56334
56394
56454
56514
56574
56634
56693
56753
980
56753
56813
56873
56932
56992
57051
57111
57170
57230
57289
57349
990
57349
57408
57468
57527
57586
57646
57705
57764
57824
57883
57942
1000
57942
58001
58060
58120
58179
58238
58297
58356
58415
58474
58533
1010
58533
58592
58651
58710
58769
58827
58886
58945
59004
59063
59121
1020
59121
59180
59239
59298
59356
59415
59474
59532
59591
59650
59708
1030
59708
59767
59825
59884
59942
60001
60059
60118
60176
60235
60293
1040
60293
60351
60410
60468
60527
60585
60643
60702
60760
60818
60876
1050
60876
60935
60993
61051
61109
61168
61226
61284
61342
61400
61459
1060
61459
61517
61575
61633
61691
61749
61807
61865
61923
61981
62039
1070
62039
62097
62156
62214
62272
62330
62388
62446
62504
62562
62619
1080
62619
62677
62735
62793
62851
62909
62967
63025
63083
63141
63199
1090
63199
63257
63314
63372
63430
63488
63546
63604
63662
63719
63777
1100
63777
63835
63893
63951
64009
64066
64124
64182
64240
64298
64355
1110
64355
64413
64471
64529
64586
64644
64702
64760
64817
64875
64933
1120
64933
64991
65048
65106
54164
65222
65279
65337
65395
65453
65510
1130
65510
65568
65626
65683
65741
65799
65856
65914
65972
66029
66087
1140
66087
66145
66202
66260
66318
66375
66433
66491
66548
66606
66664
238
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
1150
66664
66721
66779
66836
66894
66952
67009
67067
67124
67182
67240
1160
67240
67297
67355
67412
67470
67527
67585
67643
67700
67758
67815
1170
67815
67873
67930
67988
68042
68103
68160
68217
68275
68332
68390
1180
68390
68447
68505
68562
68619
68677
68734
68792
68849
68906
68964
1190
68964
69021
69078
69135
69193
69250
69307
69364
69422
69479
69536
1200
69536
Figura 8.31
239
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
10
-270
-6458
-6457
-6456
-6455
-6453
-6452
-6450
-6448
-6446
-6444
-6461
-260
-6441
-6438
-6435
-6432
-6429
-6425
-6421
-6417
-6413
-6408
-6404
-250
-6404
-6399
-6394
-6388
-6382
-6377
-6371
-6364
-6358
-6351
-6344
-240
-6344
-6337
-6329
-6322
-6314
-6306
-6297
-6289
-6280
-6271
-6262
-230
-6262
-6253
-6243
-6233
-6223
-6213
-6202
-6192
-6181
-6170
-6158
-220
-6158
-6147
-6135
-6123
-6111
-6099
-6087
-6074
-6061
-6048
-6035
-210
-6035
-621
-6007
-5994
-5980
-5965
-5951
-5936
-5922
-5907
-5891
-200
-5891
-5876
-5860
-5845
-5829
-5813
-5796
-5780
-5763
-5747
-5730
-190
-5730
-5712
-5695
-5678
-566
-5642
-5624
-5606
-5587
-5569
-5550
-180
-5550
-5531
-5512
-5493
-5474
-5454
-5434
-5414
-5394
-5374
-5354
-170
-5354
-5333
-5313
-5292
-5271
-5249
-5228
-5207
-5185
-5163
-5141
-160
-5141
-5119
-5097
-5074
-5051
-5029
-5006
-4983
-4959
-4936
-4912
-150
-4912
-4889
-4865
-4841
-4817
-4792
-4768
-4743
-4719
-4694
-4669
-140
-4669
-4644
-4618
-4593
-4567
-4541
-4515
-4489
-4463
-4437
-4410
-130
-4410
-4384
-4357
-4330
-4303
-4276
-4248
-4221
-4193
-4166
-4138
-120
-4138
-4110
-4082
-4053
-4025
-3997
-3968
-3939
-3910
-3881
-3852
-110
-3852
-3823
-3793
-3764
-3734
-3704
-3674
-3644
-3614
-3584
-3553
-100
-3553
-3523
-3492
-3461
-3430
-3399
-3368
-3337
-3305
-3274
-3242
-90
-3242
-3211
-3179
-3147
-3115
-3082
-3050
-3018
-2985
-2953
-2920
-80
-2920
-2887
-2584
-2821
-2788
-2754
-2721
-2687
-2654
-2620
-2586
-70
-2586
-2552
-2518
-2484
-2450
-2416
-2381
-2347
-2312
-2277
-2243
-60
-2243
-2208
-2173
-2137
-2102
-2067
-2032
-1996
-1961
-1925
-1889
-50
-1889
-1853
-1817
-1781
-1745
-1709
-1673
-1636
-1600
-1563
-1527
-40
-1527
-1490
-1453
-1416
-1379
-1342
-135
-1268
-1231
-1193
-1156
-30
-1156
-1118
-1081
-1043
-1005
-968
-930
-892
-854
-816
-777
-20
-777
-739
-701
-6621
-624
-585
-547
-508
-469
-431
-392
-10
-392
-353
-314
-275
-236
-197
-157
-118
-79
-39
39
79
119
158
198
238
277
317
357
397
10
397
437
477
517
557
597
637
677
718
758
798
20
798
838
879
919
960
1000
1041
1081
1122
1162
1203
30
1203
1244
1285
1325
1366
1407
1448
1489
1529
1570
1611
40
1611
1652
1693
1734
1776
1817
1858
1899
1940
1981
2022
50
2022
2064
2105
2146
2188
2229
2270
2312
2353
2394
2436
60
2436
2477
21519
2560
2601
2643
2684
2726
2767
2809
2850
70
2850
2892
2933
2975
3016
3058
3100
3141
3183
3224
3266
80
3266
3307
3349
3390
3432
3473
3515
3556
3598
3639
3681
90
3681
3722
3764
3805
3847
3888
3930
3971
4012
4054
4095
100
4095
4137
4178
4219
4261
4302
4343
4384
4426
4467
4508
110
4508
4549
4590
4632
4673
4714
4755
4796
4837
4878
4919
120
4919
4960
5001
5042
5083
5124
5164
5205
5246
5287
5327
130
5327
5368
5409
5450
5490
5531
5571
5612
5652
5693
5733
140
5733
5774
5814
5855
5895
5936
5976
6016
6057
6097
6137
150
6137
6177
6218
6258
6298
6338
6378
6419
6459
6499
6539
160
6539
6579
6619
6659
6699
6739
6779
6819
6859
6899
6939
170
6939
6979
7019
7059
7099
7139
7179
7219
7259
7299
7338
180
7338
7378
7418
7458
7498
7538
7578
7618
7658
7697
7737
190
7737
7777
7817
7857
7897
7937
7977
8017
8057
8097
8137
240
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
200
8137
8177
8216
8256
8296
8336
7276
8416
8456
8497
8537
210
8537
8577
8617
8657
8697
8737
8777
8817
8857
8898
8938
220
8938
8978
9018
9058
9099
9139
9179
9220
9260
9300
9341
230
9341
9381
9421
9462
9502
9543
9583
9624
9664
9705
9745
240
9745
9786
9826
9867
9907
9948
9989
250
10151 10192
10233
10274
10315
260
10560 10600
10641
10682
10723
270
10969 11010
11051
11093
11134
280
11381 11422
11463
11504
11546
290
11793 11835
11876
11918
11959
300
12207 12249
12290
12332
12373
310
12623 12664
12706
12747
12789
320
13039 13080
13122
13164
13205
330
13456 13497
13539
13581
16623
340
13874 13915
13597
13999
14041
350
14292 14334
14376
14418
14460
1452
360
14712 14754
14796
14838
14880
370
15132 15174
15216
15258
15300
380
15552 15594
15636
15679
15721
390
15974 16016
16058
16100
16142
400
16395 16438
16480
16522
16564
410
16818 16860
1692
16945
16987
420
17241 17283
17326
17368
17410
430
17664 17707
17749
17792
17834
440
18088 18131
18173
18216
18258
450
18513 18555
18598
18640
18683
460
18938 18980
19023
19065
19108
470
19363 19405
19448
19490
19533
480
19788 19831
19873
19916
19959
490
20214 20257
20299
20342
20385
20427
500
20640 20683
20725
2768
20811
510
21066 21109
21152
21194
21237
520
21493 21535
21578
21621
21663
530
21919 21962
22004
22047
22090
540
22346 22388
22431
22473
22516
550
22772 22815
22857
22900
22942
560
23198 23241
23284
23326
23369
570
23624 23667
23710
23752
23795
580
24050 24093
24136
24178
24221
2263
590
24476 24519
24561
24604
24646
600
24902 24944
24987
25029
25072
610
25327 25396
25412
25454
25497
620
25751 25794
25836
25879
25921
630
26176 26218
26260
26303
26345
640
26599 26642
26684
26726
26769
650
27022 27065
27107
27149
27192
660
27445 27487
27529
27572
27614
670
27867 27909
27951
27993
28035
680
28288 28330
28372
28414
28456
690
28709 28751
28793
28835
28877
2070
2691
2492
26133 26176
241
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
700
29128 29170
29212
29254
29296
710
29547 29589
29631
29673
29715
29756 29798
720
29965 30007
30049
30091
30132
730
30383 30424
30466
30508
30549
30591
740
30799 30840
30882
30924
3965
750
31214 31256
31297
31339
3138
760
31629 31670
31712
31753
31794
770
32042 32084
32125
32166
32207
780
32455 32496
32537
790
32866 32907
32948
32990
33031
800
33277 33318
33359
33400
33441
810
33686 33727
33768
33809
33850
820
34095 34136
34176
34217
34258
830
34502 34543
34583
34624
34665
840
34909 34949
34990
35030
35071
850
35314 35354
35395
35435
35476
860
35718 35758
35799
35839
35880
870
36121 36162
36202
36242
36282
880
36524 36564
36604
36644
36684
890
36925 36965
37005
37045
37085
37125 37165
900
37325 37365
27405
37445
37484
910
37724 37764
37803
37843
37883
920
38122 38162
38201
38241
38281
930
38519 38558
38598
38638
38677
940
38915 38954
38994
39033
39073
950
39310 39349
39388
39428
39467
960
39703 39743
39782
39821
39861
970
40096 40136
40175
4021
40253
980
40488 40527
40566
40605
40645
990
40879 40918
40957
40996
41035
1000
41269 41308
41347
41385
41424
1010
41657 41696
41735
41774
41813
1020
42045 42084
42123
42161
42200
1030
42432 42470
42509
42548
42586
1040
42817 42856
42894
42933
42971
1050
43202 43240
43279
43317
43356
1060
43585 43624
43662
43700
43739
1070
43968 44006
44044
44082
44121
1080
44349 44387
44425
44463
44501
1090
44729 44767
44805
44843
44881
1100
45108 45146
45184
45222
45260
1110
45486 45524
45561
45599
45637
1120
45863 45900
45938
45975
46013
1130
46238 46275
46313
46350
46388
1140
46612 46649
46687
46724
46761
1150
46985 47022
47059
47096
47134
1160
47356 47393
47430
47468
47505
1170
47726 47763
47800
47837
47874
1180
48095 48132
48169
48205
48242
1190
48462 48499
48536
48572
48609
3632
2980
3725
242
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
1200
48828 48865
48901
48937
48974
1210
49192 49229
49265
49301
49338
1220
49555 49591
49627
49663
49700
1230
49916 49952
49988
50024
50060
1240
50276 50311
50347
50383
50419
1250
50633 50669
50705
50741
50776
1260
50990 51025
51061
51096
51132
1270
51344 51380
51415
51450
51486
1280
51697 51733
51768
51803
51838
1290
52049 52084
52119
52154
52189
1300
52398 52433
52468
52503
52538
1310
52747 52781
52816
52851
52886
1320
53093 53128
53162
53197
53232
1330
53439 53473
53507
53542
53576
1340
53920
1350
54125 54159
54262
54193
54228
5201
52049
Figura 8.32
Veamos a continuacin una tabla la cual refleja los valores calculados en intervalos cortos
de temperaturas para las termocuplas tipo J y tipo K, correspondientes a los dispositivos
AD594 y AD595:
Temperatura en
Termocupla en C
200
180
160
140
120
100
80
60
40
20
10
0
10
20
25
30
40
50
60
80
100
120
1523
1428
1316
1188
1046
893
729
556
376
189
94
3.1
101
200
250
300
401
503
606
813
1022
1233
Tipo K - Voltaje
en mV
AD595 Voltaje
de Salida
5.891
5.550
5.141
4.669
4.138
3.553
2.920
2.243
1.527
.777
.392
0
.397
.798
1.000
1.203
1.611
2.022
2.436
3.266
4.095
4.919
1454
1370
1269
1152
1021
876
719
552
375
189
94
2.7
101
200
250
300
401
503
605
810
1015
1219
243
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
140
160
180
200
220
240
260
280
300
320
340
360
380
400
420
440
460
480
500
520
540
560
580
600
620
640
660
680
700
720
740
750
760
780
800
820
840
860
880
900
920
940
960
980
1000
1020
1040
1060
1080
1100
7.457
8.560
9.667
10.777
11.887
12.998
14.108
15.217
16.325
17.432
18.537
19.640
20.743
21.846
22.949
24.054
25.161
26.272
27.388
28.511
29.642
30.782
31.933
33.096
34.273
35.464
36.671
37.893
39.130
40.382
41.647
42.283
1445
1659
1873
2087
2302
2517
2732
2946
3160
3374
3588
3801
4015
4228
4441
4655
4869
5084
5300
5517
5736
5956
6179
6404
6632
6862
7095
7332
7571
7813
8058
8181
5.733
6.539
7.338
8.137
8.938
9.745
10.560
11.381
12.207
13.039
13.874
14.712
15.552
16.395
17.241
18.088
18.938
19.788
20.640
21.493
22.346
23.198
24.050
24.902
25.751
26.599
27.445
28.288
29.128
29.965
30.799
31.214
31.629
32.455
33.277
34.095
34.909
35.718
36.524
37.325
38.122
38.915
39.703
40.488
41.269
42.045
42.817
43.585
44.439
45.108
1420
1620
1817
2015
2213
2413
2614
2817
3022
3227
3434
3641
3849
4057
4266
4476
4686
4896
5107
5318
5529
5740
5950
6161
6371
6581
6790
6998
7206
7413
7619
7722
7825
8029
8232
8434
8636
8836
9035
9233
9430
9626
9821
10015
10209
10400
10591
10781
10970
11158
244
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
1120
1140
1160
1180
1200
1220
1240
1250
45.863
46.612
47.356
48.095
48.828
49.555
50.276
50.633
11345
11530
11714
11897
12078
12258
12436
12524
Figura 8.33
De esta forma el problema de la linealidad en el voltaje de salida est resuelto, de modo que
ahora podemos realizar la conversin de la salida analgica de los dispositivos AD594 o
AD595 segn sea el caso, a travs del conversor A/D del microcontrolador.
245
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 8.34
El pin RC0 del puesto C ser configurado como entrada para evaluar constantemente la
alarma de fallo de la termocupla del AD594. Los pines 12 y 13 (+ALM y ALM
respectivamente) son el colector y el emisor de un transistor NPN interno, el cual se activa al
producirse una falla en el circuito.
En el circuito de la figura 8.34, el pin +ALM mantiene un estado lgico alto gracias a la
resistencia Pull Up de 1K, lo cual significa que se mantiene un estado lgico alto en RC0
mientras la termocupla se encuentra conectada y funcionando. Cuando se produce una falla,
el AD594 activa el transistor y el estado lgico en RC0 pasa a ser bajo o cero, debido a
que el emisor en el transistor (pin -ALM) se encuentra conectado a tierra.
246
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
program Termocupla
' Configuracin de los pines de la LCD
Dim LCD_RS
LCD_EN
LCD_D4
LCD_D5
LCD_D6
LCD_D7
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
TRISA
TRISC
= $FF
= $FF
LCD_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)
While (TRUE)
dato = Adc_Read(2)
FloatToStr(Temp, DatoStr)
texto = "Temperatura:
"
Lcd_Out(1, 1, texto)
Lcd_Out(2, 1, DatoStr)
Lcd_Out(2, 11, "oC
")
'
'
'
'
If PortC.0 = 0 Then
GoTo Alarma
End If
Wend
Alarma:
' Escribimos el mensaje de alarma.
Lcd_Out(1, 1, "* Alarma de TC *")
Lcd_Out(2, 1, "Circuito Abierto")
Espera:
If PortC.0 = 1 Then
GoTo main
End If
247
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
GoTo Espera
End.
Debido a que el voltaje de referencia del conversor A/D es igual al voltaje de alimentacin
del circuito, es decir, +5 Vdc, la medida de la temperatura en este ejemplo se limita a un
rango aproximado de 0C a 460C.
En cuando al clculo de la temperatura, primero es necesario saber el valor de la resolucin
del conversor A/D en trminos de voltaje. Como el voltaje de referencia es igual al de la
fuente de poder, entonces tenemos que:
Resolucin =
Vimax
2n
Resolucin =
5V
210
Resolucin =
5V
1024
248
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Temperatura de TC-J =
Temperatura de TC-J =
Figura 8.35
Figura 8.36
249
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Acoplar el puerto serial de nuestro PC con estos niveles de voltaje y lgica invertida a
nuestros circuitos digitales de 5 voltios, resulta sencillo cuando utilizamos un circuito
integrado diseado para solucionar este inconveniente y el cual es posible encontrar en casi
todos los diseos electrnicos actuales.
El circuito integrado MAX232 de MAXIM, es una interfaz que traduce estos niveles de voltaje
y la lgica binaria entre el PC y el microcontrolador.
250
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.1
251
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
El microcontrolador elegido para las siguientes prcticas ha sido el PIC16F877, sin embargo
los programas que a continuacin vamos a realizar funcionan con cualquier otro modelo de
gama alta de Microchip, siempre y cuando hagamos los ajustes pertinentes en la ficha de
configuracin del proyecto que realicemos en mikroBasic.
Como perifricos emplearemos una pantalla LCD, un MAX232 para acoplar nuestro circuito
al puerto serial de PC, un modulo BlueTooth para comunicacin serial inalmbrica y un
mdulo GPS (OEM) cuyos modelos especificaremos mas adelante.
Figura 9.2
252
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Una forma sencilla de verificar si hay datos listos en el Buffer en forma de cdigo a travs de
esta rutina sera empleando el condicional If de la siguiente manera:
If (UART1_Data_Ready() = 1) Then ' Si recibimos datos en el puerto entonces,
' Capturamos los datos en una variable previamente definida.
End If
253
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Una vez verificado el Buffer de datos de la UART, procedemos a vaciar el mismo en una
variable previamente declarada en nuestro programa, y para verificar su contenido podemos
imprimir el resultado en la pantalla LCD o simplemente enviar el dato de vuelta por el puerto
serial del microcontrolador hacia la terminal de comunicaciones en el PC.
La rutina para leer los datos cargados en el Buffer de la UART es la siguiente:
9.2.3.- UART1_Read()
Esta rutina extrae del Buffer un Byte y lo carga en una variable definida:
' Area de declaracin de variables:
.
.
Los datos que enviamos desde una terminal de comunicaciones o desde cualquier otro
dispositivo va RS232 hacia el microcontrolador PIC16F877, son cargados Byte a Byte a
travs de un registro denominado RSR (Receive Shift Register), quien espera a que el Bit de
Stop de la transmisin llegue para pasar el Byte al Buffer o registro RCSTA, el cual tiene una
capacidad mxima de dos Bytes, por lo tanto podramos decir que podemos contar con tres
Bytes de informacin disponible en la UART antes de que el Buffer se desborde y perdamos
informacin en la transmisin.
254
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
El registro RCSTA es FIFO (Firts In, Firts Out), Es decir, el primer dato en entrar es
el primer dato en salir).
De lo anterior podemos deducir que slo hace falta un cuarto Byte en la transmisin antes
de descargar el Buffer, para que ste se desborde y deje de almacenar datos. Entonces, si
deseamos capturar una serie de datos continuos en la UART para ser procesados, debemos
descargar el buffer cada tres Bytes para no perder informacin en el proceso de transmisin
de datos.
program RS232
'--- Area de declaracin:
Dim Datos_RX As Byte
Dim LCD_RS
LCD_EN
LCD_D4
LCD_D5
LCD_D6
LCD_D7
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Programa Principal
UART1_Init(2400)
Delay_ms(100)
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
Recepcion:
If (UART1_Data_Ready() = 1) Then
Datos_RX = UART1_Read()
GoSub Imprime
Else
Lcd_Out(2, 1, "Buffer Vacio...") ' Mensaje de estado del Buffer.
255
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
End If
GoTo Recepcion
Imprime:
Lcd_Out(2, 1, "Vaciando Buffer")
Lcd_Chr(1, 8, Datos_RX)
Delay_ms(1000)
Return
End.
El primer paso en este ejemplo ha sido definir la variable en la cual almacenaremos los
datos enviados desde la terminal de comunicaciones, y los pines de control y datos de la
pantalla LCD. Seguidamente inicializamos la UART a 2400 bps e inicializamos la pantalla
LCD con el mensaje Datos: impreso en la primera lnea.
Analicemos ahora el contenido de la subrutina Recepcin:
256
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.3
Se puede ver en la figura anterior que hemos escrito la cadena en el campo correspondiente
a Comunicacin o envo de datos. Seguidamente hacemos clic en Send para enviar la
cadena al microcontrolador va RS232.
El Buffer en el microcontrolador se carga hasta su capacidad mxima de tres Bytes y se
desborda deteniendo la recepcin de datos. Al evaluar el Buffer a travs de la condicin If
(UART1_Data_Ready() = 1) Then, sabremos que ste ha sido cargado con nuevos datos, los
cuales podremos extraer uno a uno a travs de la rutina UART1_Read() en la variable
Datos_RX.
Observe que cada vez que extraemos un Byte del Buffer, hacemos un salto a la rutina
Imprimir para mostrar el mismo en la pantalla LCD. Un segundo despus, ocurre el retorno
a la rutina Recepcin y se evala nuevamente el Buffer para ver si an quedan datos en l.
El proceso se repite hasta que el Buffer queda vaco:
1 2 3
257
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Cuando enviamos una cadena de caracteres va RS232 al microcontrolador con mas de tres
Bytes, el Buffer se llena y se desborda deteniendo la recepcin, por lo tanto, en este caso
obtendremos de la cadena de caracteres solamente los tres primeros Bytes.
Para lograr almacenar y visualizar una cadena completa, debemos realizar algunos cambios
sobre el programa.
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
258
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Result = UART1_Read()
End sub
main:
UART1_Init(2400)
Delay_ms(100)
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
Recepcion:
Lcd_Out(2, 1, "Buffer Vacio...!")
acumulador = 1
do
Datos_RX[acumulador] = LeerCaracter ' Llama la sub-funcin "leerCaracter y
' y carga el dato en la variable.
acumulador = acumulador + 1
' Incrementa la variable "acumulador".
loop Until (acumulador = 10)
For X = 1 To 9
'
'
'
'
Lcd_Chr(1, 8, Datos_RX[X])
Delay_ms(1000)
Next X
Lcd_Out(2, 1, "
Fin
")
End.
Escribimos un mensaje de estado del Buffer; en este caso el mensaje ser Buffer
Vaco ya que an no hemos recolectado informacin del mismo.
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
En este punto podemos decir que si enviamos una cadena de nueve Bytes, entonces el
Buffer se habr vaciado tres veces al terminar el programa.
Next X
260
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Estas lneas pueden ser agregadas despus de la recoleccin de datos, o incluso despus
de presentar los mismos en la pantalla LCD:
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
do
loop Until UART1_Data_Ready = 1
Result = UART1_Read()
'
'
'
'
'
End sub
main:
'
Programa Principal
UART1_Init(2400)
Delay_ms(100)
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
Recepcion:
Lcd_Out(2, 1, "Buffer Vacio...!")
acumulador = 1
do
Datos_RX[acumulador] = LeerCaracter ' Llama la sub-funcin "leerCaracter y
' y carga el dato en la variable.
acumulador = acumulador + 1
' Incrementa la variable "acumulador".
loop Until (acumulador = 10)
For X = 1 To 9
'
'
'
'
261
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
UART1_Write(Datos_RX[X])
Next X
For X = 1 To 9
'
'
'
'
Lcd_Chr(1, 8, Datos_RX[X])
Delay_ms(1000)
Next X
Lcd_Out(2, 1, "
Fin
")
End.
Figura 9.4
262
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
XYZ sern la cabecera y nos ayudarn a identificar la posicin del bloque de datos que nos
interesa extraer, entonces, si el la cabecera y el bloque de datos estuviesen en esta posicin
u otra diferente de la cadena, seguramente podremos hacer un cdigo de programa para
identificar la cabecera XYZ y seguidamente almacenar los siguientes 20 caracteres en un
arreglo de variables:
1234567890/123456789XYZmikroBasic para PIC!01234
Bsicamente el procedimiento a seguir sera el siguiente:
263
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Si este primer valor coincide con un Byte en la cadena, entonces podremos pasar a
comparar el siguiente Byte con el valor 89 o Y. Si este valor no coincide,
simplemente debemos reiniciar todo el proceso de bsqueda debido a que los Bytes
de cabecera del bloque de informacin deseado debern estar siempre juntos, de otra
forma, estaramos capturando informacin errada dentro de la cadena.
Slo cuando encontremos los tres Bytes consecutivos de cabecera de la cadena ser
cuando procederemos a almacenar los 20 bytes del bloque de informacin en un
arreglo de variables que definiremos para este fin y que en nuestro ejemplo
llamaremos Datos_RX[n], donde n representa el numero de Bytes de informacin
dentro del bloque deseado.
Esta rutina enva el texto cargado dentro de las comillas, o caracteres almacenados en
variables tipo string, va RS232.
As
As
As
As
Byte[23]
Byte[48]
Byte
Byte
'
'
'
'
264
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
i As Byte
do
loop Until UART1_Data_Ready = 1
Result = UART1_Read()
'
'
'
'
'
End sub
main:
UART1_Init(2400)
Delay_ms(100)
UART1_Write_Text("Buffer Vacio...!")
' Mensaje de estado del Buffer enviado via RS232.
UART1_Write_Text("Esperando Datos...") ' Mensaje de estado del Buffer enviado via RS232.
Recepcion:
acumulador = 1
do
Cadena[acumulador] = LeerCaracter
acumulador = acumulador + 1
loop Until (acumulador = 48)
i = 0
verifica_1:
i = i + 1
If Cadena[i] = 88 Then
GoTo verifica_2
Else
If i = 48 Then
GoTo main
End If
GoTo verifica_1
End If
'
'
'
'
'
'
'
'
verifica_2:
i = i + 1
If Cadena[i] = 89 Then
GoTo verifica_3
Else
If i = 48 Then
GoTo main
End If
GoTo verifica_2
End If
'
'
'
'
'
'
'
'
verifica_3:
i = i + 1
If Cadena[i] = 90 Then
GoTo Almacena
'
'
'
'
265
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Else
If i = 48 Then
GoTo main
End If
GoTo verifica_3
End If
'
'
'
'
Almacena:
For X = 1 To 20
i = i + 1
Datos_RX[X] = Cadena[i]
UART1_Write(Datos_RX[X])
delay_ms(100)
'
'
'
'
Next X
UART1_Write_Text("Fin...!")
GoTo Recepcion
End.
Figura 9.5
266
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.6
En este momento, resulta importante mencionar que el ejemplo anterior ser la base para
establecer las comunicaciones entre el microcontrolador a travs de su UART y un mdulo
GPS (Global Positioning System), propuesto en uno de los prximos ejemplos de este
captulo y a travs del cual podremos obtener las coordenadas geogrficas del dispositivo
las cuales son transmitidas a una frecuencia conocida y bajo el protocolo RS232.
267
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.7
En caso de con contar con un mdulo Bluetooth integrado en nuestro PC, tambin es
posible utilizar un adaptador Bluetooth USB como el que mostramos a continuacin:
Figura 9.8
El mdulo Bluetooth recomendado para las comunicaciones desde el microcontrolador es el
siguiente:
Figura 9.10
Este mdulo de fcil conexionado maneja niveles de voltaje en sus pines de comunicaciones
RS232 de 5 voltios, por lo cual tambin podremos eliminar de nuestro circuito el MAX232
que venamos utilizando para acoplar el puerto serial del PC. El diagrama esquemtico
modificado segn los cambios planteados se vera de la siguiente forma:
Figura 9.11
269
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Enlazar el mdulo Bluetooth que proporciona Sparkfun con el mdulo Bluetooth de nuestro
PC es muy simple, siempre y cuando contemos con el software para la administracin de
dispositivos Bluetooth en nuestra PC. A continuacin veremos una breve explicacin acerca
de la instalacin de uno de tantos software disponibles para administrar dispositivos
Bluetooth desde Windows.
Figura 9.12
270
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.13
Figura 9.14
271
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.15
Figura 9.16
272
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.17
Figura 9.18
273
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.19
Figura 9.20
274
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.21
Figura 9.22
275
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
En este punto nos debemos asegurar de seleccionar la opcin Puerto de serie Bluetooth.
Figura 9.23
Figura 9.24
276
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.25
277
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.26
En la configuracin por defecto de este software se solicita que los dispositivos Bluetooth
encontrados sean emparejados a travs de un cdigo que por lo regular es suministrado
por el fabricante del equipo. En nuestro caso, el cdigo por defecto del mdulo Bluetooth
suministrado por Sparkfun es 1234.
278
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.27
Si no contamos con el cdigo de seguridad para emparejar el dispositivo, entrar en la
configuracin del puerto serial Bluetooth y deseleccionar la opcin Conexin segura.
Figura 9.28
279
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Tambin es de suma importancia observar cual ha sido el puerto COM asignado a este
servicio (Ver figura 9.30). En nuestro caso nos ha sido asignado el puerto COM6, el
tomaremos en cuenta a la hora de seleccionar el puerto serial en la terminal de
comunicaciones de mikroBasic.
Figura 9.29
Figura 9.30
280
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Terminado el proceso de configuracin, estamos listos para ver nuestro mdulo Bluetooth
conectado a nuestro PC, tal y como se observa en la siguiente figura:
Figura 9.31
Tambin es posible ver el estado de la conexin Bluetooth a travs de dos Leds en la base
del mdulo Bluetooth de nuestro circuito:
Un LED de color Rojo nos indicar que la conexin ha sido exitosa y que el mdulo se
encuentra preparado para transmitir y recibir datos.
281
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.32
282
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.33
283
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Si no est familiarizado con estos conceptos, sera recomendable leer al respecto en algn
libro especializado o a travs de Internet, donde podr encontrar suficiente informacin til y
detallada.
Sin embargo estudiemos un poco acerca del protocolo NMEA, coordenadas geogrficas y su
representacin numrica.
284
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
285
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Veamos:
El campo <7> almacena el nmero de satlites en uso, entre 00 y 12. Los ceros
siempre sern representados en la cadena de datos, es decir, si la cantidad de
satlites es igual a cero, entonces podremos ver los caracteres 00 en este campo.
(Esta caracterstica aplica para todos los campos de la cadena).
El campo <9> almacena la altitud del dispositivo sobre el nivel del mar.
Latitud: 50 42.52892.
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Altitud del dispositivo o antena sobre el nivel del mar: 9.7 metros.
Esta sentencia es una de varias sentencias que son entregadas por este dispositivo GPS a
travs de su salida digital, a una frecuencia constante de 5 Hz.
Si conectamos el dispositivo GPS directamente al puerto serial del computador,
configuramos correctamente los parmetros de comunicacin, podremos ver continuamente
las sentencias NMEA como se observa en la figura 9.34.
Figura 9.34
287
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.35
288
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.36
Para realizar esta tarea de extraer ciertos datos de la cadena de caracteres enviada por el
mdulo GPS a una frecuencia conocida, a travs de un microcontrolador PIC, debemos
analizar la cadena completa y observar cada cuantos caracteres se da una repeticin de la
misma.
En la siguiente imagen podemos ver la salida del mdulo GPS Garmin 18-5Hz. Si
observamos bien, notaremos que tenemos una larga cadena de datos que se repite
constantemente:
289
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.37
290
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
do
Cadena[acumulador] = LeerCaracter
acumulador = acumulador + 1
loop Until (acumulador = 184)
'
'
'
'
'
Lo primero que podemos ver en ella, es la variable acumulador inicializada con un valor
igual a 1.
Seguidamente, un lazo dentro del cual se llama a una sub-funcin, la cual habamos
denominado Leercaracter, encargada de extraer un byte del Buffer de la UART, el cual
ser cargado en la variable cadena[acumulador], o cadena[1]. Luego se realiza un
incremento de la variable acumulador y se verifica la condicin del lazo. Si la condicin no
se cumple, se procede a cargar el siguiente byte extrado del Buffer de la UART en la
variable cadena[acumulador], o cadena[2] y as sucesivamente hasta que la condicin
acumulador = 184 se cumpla.
Si se ha preguntado porqu la condicin es acumulador = 184, sabiendo de ante mano que
la cadena cuenta con tan solo 183 caracteres, la respuesta sera la siguiente:
Si la condicin fuese loop Until(acumulador = 183), el ltimo caracter de la cadena (es
decir, el carcter # 183), nunca se cargara en la variable cadena[183], debido a que la
carga de datos extrados del Buffer se realiza antes del incremento de la variable
acumulador.
Una vez almacenada la cadena, procedemos a realizar la bsqueda de los caracteres que
conforman la cabecera de la sentencia deseada, es decir, $GPGGA. En el programa de
ejemplo, estos caracteres se comparan uno por uno y en secuencia con los caracteres de la
cadena. Si uno de estos caracteres falla, la bsqueda se reinicia desde el primer caracter $
a partir del la posicin en la cual se hall la diferencia, esto con la finalidad de terminar de
analizar el resto de la cadena.
291
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
For X = 1 To 64
delay_ms(50)
Next X
$GPGGA,212529.4,5042.52892,N,12238.40770,W,2,09,1.1,9.7,M,-11.4,M,,*61
Esto significa que segn la subrutina de almacenamiento de datos que vimos anteriormente
y segn los caracteres correspondientes marcados en negrilla en la cadena, la variables
que debemos tomar para extraer estos campos seran las sealadas a continuacin dentro
del arreglo Datos_RX[X]:
292
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Datos_RX[1]
Datos_RX[33]
Datos_RX[2]
Datos_RX[34]
Datos_RX[3]
Datos_RX[35]
Datos_RX[4]
Datos_RX[36]
Datos_RX[5]
Datos_RX[37]
Datos_RX[6]
Datos_RX[38]
Datos_RX[7]
Datos_RX[39]
Datos_RX[8]
Datos_RX[40]
Datos_RX[9]
Datos_RX[41]
Datos_RX[10]
Datos_RX[42]
Datos_RX[11]
Datos_RX[43]
Datos_RX[12]
Datos_RX[44]
Datos_RX[13]
Datos_RX[45]
Datos_RX[14]
Datos_RX[46]
Datos_RX[15]
Datos_RX[47]
Datos_RX[16]
Datos_RX[48]
Datos_RX[17]
Datos_RX[49]
Datos_RX[18]
Datos_RX[50]
Datos_RX[19]
Datos_RX[51]
Datos_RX[20]
Datos_RX[52]
Datos_RX[21]
Datos_RX[53]
Datos_RX[22]
Datos_RX[54]
Datos_RX[23]
Datos_RX[55]
Datos_RX[24]
Datos_RX[56]
Datos_RX[25]
Datos_RX[57]
Datos_RX[26]
Datos_RX[58]
Datos_RX[27]
Datos_RX[59]
Datos_RX[28]
Datos_RX[60]
Datos_RX[29]
Datos_RX[61]
Datos_RX[30]
Datos_RX[62]
Datos_RX[31]
Datos_RX[63]
Datos_RX[32]
Datos_RX[64]
Figura 9.38
293
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.39
Dependiendo de las caractersticas tcnicas del mdulo GPS, es posible que ste pueda ser
alimentado directamente de la fuente de 5 voltios que alimenta nuestro circuito, as como
tambin es posible que debamos incluir en el diseo de nuestro circuito un MAX232 para
acoplar el mdulo al microcontrolador. Algunos otros modelos requerirn de un regulador de
voltaje de 3.3 voltios, he incluso podremos prescindir del MAX232, ya que la salida de datos
puede venir diseada de diferentes maneras en diferentes modelos o marcas.
Con esto queremos dar a entender que siempre ser importante estar seguros de cuales
son los parmetros suministrados por el fabricante para su conexionado, puesto que estos
mdulos suelen ser muy sensibles a los errores o niveles de voltaje que apliquemos a ellos.
294
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
End sub
main:
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
LCD_Out(1,1,"La:")
LCD_Out(2,1,"Lo:")
UART1_Init(19200)
Delay_ms(100)
Recepcion:
acumulador = 1
do
Cadena[acumulador] = LeerCaracter
acumulador = acumulador + 1
loop Until (acumulador = 184)
i = 0
'
'
'
'
'
295
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
verifica_1:
i = i + 1
If Cadena[i] = 36 Then
GoTo verifica_2
Else
If i = 184 Then
GoTo main
End If
GoTo verifica_1
End If
'
'
'
'
'
'
'
'
verifica_2:
i = i + 1
If Cadena[i] = 71 Then
GoTo verifica_3
Else
If i = 184 Then
GoTo main
End If
GoTo verifica_1
End If
'
'
'
'
'
'
'
'
verifica_3:
i = i + 1
If Cadena[i] = 80 Then
GoTo verifica_4
Else
If i = 184 Then
GoTo main
End If
GoTo verifica_1
End If
'
'
'
'
'
'
'
'
verifica_4:
i = i + 1
If Cadena[i] = 71 Then
GoTo verifica_5
Else
If i = 184 Then
GoTo main
End If
GoTo verifica_1
End If
'
'
'
'
'
'
'
'
verifica_5:
i = i + 1
If Cadena[i] = 71 Then
GoTo verifica_6
Else
If i = 184 Then
GoTo main
End If
'
'
'
'
'
'
'
'
296
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
GoTo verifica_1
End If
verifica_6:
i = i + 1
If Cadena[i] = 65 Then
'
'
'
'
'
'
'
'
GoTo Almacena
Else
If i = 184 Then
GoTo main
End If
GoTo verifica_1
End If
' Una vez identificada la cabecera completa de la sentencia NMEA, procedemos a cargar
' el resto de la informacin en el arreglo de variables Datos_RX[X]:
Almacena:
i = i + 1
For X = 1 To 64
delay_ms(50)
Next X
PantallaGLCD:
'
'
'
'
LCD_Cmd(_LCD_CLEAR)
LCD_Out(1,1,"La:")
LCD_Out(2,1,"Lo:")
Caracter = Datos_RX[22]
Lcd_Chr(1, 4, Caracter)
Caracter = Datos_RX[36]
Lcd_Chr(2, 4, Caracter)
Caracter = Datos_RX[12]
Lcd_Chr(1, 6, Caracter)
Y = 8
297
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
For X = 13 To 20
Caracter = Datos_RX[X]
Lcd_Chr(1, Y, Caracter)
Y = Y + 1
'
'
'
'
'
'
'
'
Next X
Caracter = Datos_RX[25]
Lcd_Chr(2, 6, Caracter)
Caracter = Datos_RX[26]
Lcd_Chr(2, 7, Caracter)
Y = 9
For X = 27 To 34
Caracter = Datos_RX[X]
Lcd_Chr(2, Y, Caracter)
'
'
'
'
'
Y = Y + 1
Next X
delay_ms(5000)
LCD_Out(1,1,"Satelites en Uso")
Caracter = Datos_RX[40]
Lcd_Chr(2, 8, Caracter)
Caracter = Datos_RX[41]
Lcd_Chr(2, 9, Caracter)
delay_ms(5000)
GoTo Recepcion
End.
298
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
9.6.- Programacin en Visual Basic 6.0 para ejemplos de comunicacin serial RS232.
Cuando se trata de proyectos de comunicacin serial RS232, es muy probable que
necesitemos de una interfase personalizada para el control de nuestros dispositivos
electrnicos. Una forma sencilla y efectiva de realizar esto es a travs de la programacin de
mdulos de control en Visual Basic.
A continuacin explicamos paso a paso como llegar a programar un sencillo mdulo de
comunicaciones encargado de enviar datos al microcontrolador PIC a travs del puerto serial
RS232 del PC.
Para esto emplearemos el diagrama esquemtico de la figura 9.54, a travs del cual
podremos observar los datos enviados desde el PC en la pantalla LCD.
Para crear un nuevo proyecto en Visual Basic, debemos empezar haciendo clic en el men
Archivo Nuevo Proyecto y seleccionamos la opcin EXE estndar (figura 9.40).
Figura 9.40
Figura 9.41
299
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.42
Una vez creado un nuevo proyecto, ser importante activar el componente para manejar la
comunicacin serial Microsoft Comm Control 6.0. Esto se realiza haciendo clic en el men
Proyectos Componentes Controles.
Figura 9.43
300
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.44
Figura 9.45
Figura 9.46
Figura 9.47
301
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Seguidamente haga doble clic sobre el formulario para visualizar la ventana de cdigo en la
cual introduciremos las siguientes lneas de programa, las cuales se encargarn de abrir el
puerto serial del PC (Figura 9.48).
Figura 9.48
Figura 9.49
302
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Para cambiar el nombre del botn, busque la celda Caption en la ventana de propiedades
del mismo (ver figura 9.50):
Figura 9.50
Este procedimiento se repite hasta lograr obtener un formulario con 12 botones debidamente
identificados como se observa en la figura 9.51:
Figura 9.51
Figura 9.52
303
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Por ltimo, haga clic en el botn Iniciar (ver figura 9.53), para hacer funcionar el teclado
3x4 desde el cual se enviarn datos hacia el microcontrolador.
Al hacer clic en cualquiera de los botones del teclado, estar enviando al microcontrolador el
dato correspondiente (Valor equivalente al caracter ASCII en la tecla)b el cual podr ser
observado en la pantalla LCD de su circuito.
Figura 9.53
304
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Por ltimo, generamos el archivo ejecutable desde el men Archivo Generar Nombre del
archivo.exe
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
Programa Principal
UART1_Init(9600)
Delay_ms(100)
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
Recepcion:
If (UART1_Data_Ready() = 1) Then
Datos_RX = UART1_Read()
GoSub Imprime
Else
Lcd_Out(1, 1, "Esperando Dato!") ' Mensaje de estado del Buffer.
End If
GoTo Recepcion
Imprime:
Lcd_Out(2, 1, "Tecla: ")
Lcd_Chr(2, 8, Datos_RX)
Delay_ms(1000)
Return
End.
305
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.54
306
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Del captulo de conversin A/D podemos extraer el programa base para llegar al objetivo de
este ejercicio. Lo nico que tendremos que hacer ser agregar una rutina para transmitir va
RS232 el resultado de la conversin A/D hacia el PC.
Antes de realizar la programacin en Excel, vamos a realizar las pruebas de conversin A/D
mostrando los resultados en la pantalla LCD y en el terminal de comunicaciones de
mikroBasic.
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
'
'
'
'
'
main:
UART1_Init(9600)
Delay_ms(100)
Lcd_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)
ADCON1 = 0
TRISA
= $FF
While (TRUE)
dato = Adc_Read(2)
wordtostr(dato, DatoStr)
Lcd_Out(2, 5, DatoStr)
307
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
UART1_Write_Text(DatoStr)
delay_ms(1000)
Wend
End.
Figura 9.55
308
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
En la siguiente imagen podemos ver los datos capturados por el PC desde la ventana de
recepcin en la terminal:
Figura 9.56
309
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.57
El primer paso para configurar la hoja de Excel, ser ubicar las herramientas de Visual Basic
y agregar a la hoja de clculo el control Microsoft communications control, Version 6.0.
Para esto debemos seguir los siguientes pasos:
1.- Al abrir la hoja de clculo, podemos ver un men de opciones en la parte superior de la
ventana denominado Herramientas. Haga clic en el men Herramientas y seleccione la
opcin Personalizar.
310
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.58
Al seleccionar esta opcin podr observar que en la ventana Personalizar hay tres fichas
de configuracin. Seleccione la ficha Barra de herramientas como se muestra en la figura
9.59.
Figura 9.59
311
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
En esta ficha encontrar una serie de opciones disponibles, de las cuales deber
seleccionar Visual Basic. Haga clic en al botn Cerrar y ver que aparece en la hoja de
clculo una caja de herramientas nueva llamada Visual Basic (Figura 9.60), la cual
podemos trasladar a la parte superior de la hoja de clculo, la cual contiene el resto de las
herramientas tpicas usadas en Excel (Figura 9.61).
Figura 9.60
312
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.61
313
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.62
En esta serie de botones, podremos encontrar uno denominado Mas controles (ver
Figura 12.35), el cual despliega una lista de opciones. Ubique el siguiente control:
Microsoft communications control, Version 6.0.
Al hacer doble clic en este control la lista de opciones desaparece y es en este momento en
el cual debemos agregar el mismo sobre la hoja de clculo. Para esto, debe mantener el
botn izquierdo del mouse activado y arrastrar el puntero hasta que aparezca un pequeo
recuadro. Al soltar el botn izquierdo el control aparece sobre la hoja. La figura de un
Telfono sobre un MODEM lo identifica claramente, como se muestra en la figura 9.63.
314
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.63
El siguiente paso ser agregar un botn en el cual se configura el cdigo necesario para la
apertura del puerto serial en el PC (Figura 9.64).
Figura 9.64
315
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Al hacer doble clic sobre el nuevo botn, estamos entrando al editor de Visual Basic, en el
cual podemos agregar las siguientes lneas de programa, las cuales permitirn abrir el
puerto al hacer clic sobre el botn que hemos agregado para tal fin:
Figura 9.65
316
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
En figura 9.65 tambin podemos apreciar las lneas de programacin agregadas al botn de
comando, y el icono que nos permitir regresar a la hoja de clculo para continuar con la
programacin.
Al regresar a la hoja de clculo podremos notar el cambio en la etiqueta del botn de
comando, como se muestra en la figura 9.66:
Figura 9.66
Ahora solo nos queda configurar el evento OnComm, relativo a la recepcin de datos,
haciendo doble clic sobre el control de comunicaciones (figura 9.67):
Figura 9.67
317
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.68
Recordemos que para almacenar datos en una variable, es importante considerar la
declaracin de la misma antes de ejecutar cualquier otra lnea de programa que as la
requiera. Es por esto que para este ejemplo, el primer paso en la configuracin del control
de comunicaciones ha sido la declaracin de dos variables, las cuales hemos denominado
Apuntador y datainput.
La variable Apuntador ser declarada como Byte y la variable datainput ser declarada
como String.
Analice el uso de la variable Apuntador en el cdigo del evento OnComm, el cual
detallamos unas lneas ms adelante. Esta variable se usa bsicamente como acumulador y
determina la posicin en un rango predeterminado de las filas en la hoja de clculo. Esto se
318
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
debe a que estamos interesados en mantener una muestra de los diez ltimos valores
capturados en el puerto para poder realizar una grfica de lneas suavizadas, la cual se
estar actualizando cada 500 milisegundos.
Para almacenar un dato presente en el puerto serial (Comm1), utilizamos el comando
MSComm1.Input, entonces, para almacenar un dato en la variable datainput, debemos
realizar el siguiente arreglo:
datainput = MSComm1.Input
Luego para llevar el dato almacenado en la variable a una celda en la hoja de clculo,
podemos utilizar el siguiente comando:
Hoja1.Cells(Fila, Columna)
Un punto importante a considerar es que la variable datainput por estar declarada como
String, almacenar una serie de datos consecutivos uno tras otro. Podemos extraer un
dato de la cadena de caracteres almacenada en la variable datainput de la siguiente
manera:
Hoja1.Cells(Fila, Columna) = Mid(Variable, Bit de inicio, longitud)
Ejemplo:
Si datainput = 643645650681701718745776
Para extraer los tres primeros caracteres y llevarlos por ejemplo a la celda (40,2) debemos
hacer el siguiente arreglo:
Hoja1.Cells(40, 2) = Mid(datainput, 1, 3)
Para mantener este dato y capturar uno mas actualizado, simplemente debemos hacer un
arreglo para desplazar el contenido de la celda (40,2) a la celda (39,2). Cuando llegue el
prximo dato actualizado, el contenido de esta celda deber pasar a la celda (38,2) y as
sucesivamente. Al repetir el desplazamiento de celdas diez veces, podremos tomar estos
valores y graficarlos en la hoja de clculo.
Veamos a continuacin el cdigo para el evento OnComm:
Private Sub MSComm1_OnComm()
'Declara variable
Dim Apuntador As Byte
Dim datainput As String
datainput = MSComm1.Input
For Apuntador = 30 To 40
Hoja1.Cells(Apuntador, 2) = Hoja1.Cells(Apuntador + 1, 2)
Next
319
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Hoja1.Cells(40, 2) = Mid(datainput, 1, 4)
End Sub
Figura 9.69
Analice cuidadosamente el contenido del cdigo en el evento OnComm. Verifique la rutina
encargada de apilar los datos entre las celdas (40,1) y (30, 1). Por ltimo, analice la
extraccin de datos de la cadena de caracteres almacenada en la variable datainput.
Completados todos estos pasos, lo siguiente ser volver a la hoja de clculo y salir del modo
de diseo, haciendo clic en el icono sealado en la siguiente figura:
Figura 9.70
320
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
=(B40*5)/1024
=(B39*5)/1024
=(B38*5)/1024
=(B37*5)/1024
=(B36*5)/1024
=(B35*5)/1024
=(B34*5)/1024
=(B33*5)/1024
=(B32*5)/1024
=(B31*5)/1024
=(B30*5)/1024
321
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.71
Figura 9.72
322
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Observe en la figura 9.72, la formula para la celda C40. Observe tambin que hemos
ocultado una serie de filas de la hoja de clculo, las cuales hemos reservado para agregar
un grfico de lneas suavizadas.
Para graficar esta serie de datos, seleccionamos las diez celdas (desde la celda C30 hasta
la celda C40) y hacemos clic en el icono Asistente para Grficos (Figura 9.73), donde
aparecer una ventana en la cual podremos elegir el tipo de grfico que deseamos utilizar.
Seleccione la ficha Tipos personalizados y haga clic en la opcin Lneas suavizadas de la
lista (Figura 9.74).
Figura 9.73
Figura 9.74
323
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
En la siguiente ventana podemos ver el rango de datos que ser graficado (Figura 9.75):
Figura 9.75
Figura 9.76
324
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 9.77
Finalmente podremos ver en la hoja de Excel los datos enviados desde el microcontrolador,
los cuales a su vez sern graficados constantemente, como se puede observar en la figura
9.78
Figura 9.78
325
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
protocolo
de
10.1.2.- Mmc_Read_Cid().
Lee los 16 bytes del registro CID de la tarjeta de memoria. Significado del
acrnimo CID: Card IDentification.
10.1.3.- Mmc_Read_Csd().
Lee los 16 bytes del registro CSD de la tarjeta de memoria. Significado del
acrnimo CSD: Card Specific Data.
326
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
10.1.4.- Mmc_Write_Sector().
Escribe en un sector de la tarjeta de memoria MMC\SD.
10.1.5.- Mmc_Read_Sector().
Lee un sector de la tarjeta de memoria MMC\SD.
10.2.- Registro CID.
Empecemos por analizar el registro CID de la memoria SD.
El registro CID posee informacin que podra ser til, dependiendo de la aplicacin que
vamos a querer dar a nuestros circuitos. Veamos a continuacin como sustraer el contenido
del registro CID, con un ejemplo sencillo y muy fcil de entender.
El anlisis a continuacin esta basado en una tarjeta de memoria SD SanDisk de
2 Gigabytes.
El registro CID esta compuesto por 16 Bytes, significa entonces que tenemos 128 bits los
cuales se descomponen segn se especifica en la siguiente tabla:
Nombre
Manufacturer ID
OEM/Application ID
Product Name
Product Revision
Product Serial Number
Reservado
Manufacturing Date
CRC7 checksum
Siempre en 1
Acrnimo
MID
OID
PNM
PRV
PSN
---MDT
CRC
----
Formato
Binario
ASCII
ASCII
BCD
Binario
---BCD
Binario
----
Cantidad de Bits
8 [bit 127 al 120]
16 [bit 119 al 104]
40 [bit 103 al 64]
8 [bit 63 al bit 56]
32 [bit 55 al bit 24]
4 [bit 23 al bit 20]
12 [bit 19 al bit 8]
7 [bit 7 al bit 1]
1 [bit 0]
Figura 10.1
Manufacturer ID (MID): Este nmero identifica el fabricante de la tarjeta de memoria. En
nuestro anlisis utilizaremos una memoria del fabricante SanDisk, por lo cual al leer el
registro CID, debemos obtener el numero de identificacin correspondiente a este fabricante,
el cual en binario sera 00000011, en decimal el nmero 3, o en hexadecimal 0x03, asignado
por el SD-3C, LLC. (http://www.sd-3c.com)
OIM/Application ID (OID): Son dos caracteres ASCII que identifican la tarjeta de memoria. El
OID es asignado a un fabricante de tarjetas por el SD-3C, LLC. Para SanDisk, al leer el
registro CID tenemos que estos dos bytes se corresponden con los caracteres SD.
327
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Product Name (PNM): Esta conformado por 5 caracteres ASCII. Los dos primeros identifican
el tipo de memoria (SD), los tres ltimos identifican la capacidad de la tarjeta de memoria.
Por ejemplo, para una tarjeta SanDisk de 2 GB de capacidad, el nombre del producto (PNM)
seria: SD02G.
Product Revision (PRV): Representa el nmero de revisin del producto. Est codificado en
BCD y su formato n.m seria el siguiente: Revisin Numero 8.0, es decir, 1000 0000b
Product Serial Number (PSN): Son 32 bits del registro CID, que expresan el serial del
producto.
Manufacturing Date (MDT): Devuelve el valor correspondiente al ao y mes de fabricacin
del producto. Los bits 19 al 12 representan el ao. Los bits 11 al 8 representan el mes,
donde 1 es Enero.
CRC7 Checksum: Es una suma de verificacin para proteger la integridad de los datos.
328
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
!
!
La memoria fue encontrada, por lo cual podremos realizar el procedimiento
Correspondiente a la extraccin de datos del Registro CID en este espacio.
Else
!
!
Entonces enviamos un mensaje de error, por ejemplo:
Memoria no Encontrada!
End If
329
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.2
El microcontrolador elegido para realizar todos los ejemplos a continuacin ha
sido el PIC18F458.
Veamos a continuacin el programa completo:
program RegistroCid
' Area de declaracin:
Dim MMC_chip_select As sbit At RC2_bit
Dim MMC_chip_select_direction As sbit At TRISC2_bit
Dim dataBuffer As Byte[16]
error_Mmc As Byte
i As Byte
main:
Uart1_Init(9600)
330
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
If (error_Mmc = 0) Then
delay_ms(1000)
For i = 0 To 15
Uart1_Write(dataBuffer[i])
Next i
Else
End If
GoTo main
End.
Figura 10.3
331
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Recuerde tambin establecer los parmetros o ajustes del proyecto haciendo clic
en el botn Default, como lo muestra la siguiente imagen:
Figura 10.4
La ventana anterior la puede ubicar fcilmente presionando simultneamente las
teclas Shift+Ctrl+E en su teclado.
Para ver los datos enviados desde el puerto serial del microcontrolador, utilice el
terminal de comunicaciones de mikroBasic. Esta ventana la podemos desplegar
utilizando el acceso rpido Ctrl-T, o a travs del men Tools, como se
muestra en la siguiente imagen:
Figura 10.5
332
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Recuerde configurar los parmetros de comunicacin del puerto serial que tenga
disponible en su PC, asi como la velocidad de transmisin, la cual deber ser de
9600 bps, ya que en el ejemplo propuesto la hemos declarado as:
Uart1_Init(9600)
Figura 10.6
El formato en la ventana de recepcin de datos tambien es importante si
deseamos ver cada caracter en formato ASCII, Hexadecimal o Decimal.
333
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.7
Una vez detectada e inicializada, el contenido del registro CID aparece en
pantalla como una serie de caracteres ASCII.
334
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.8
Los valores hexadecimales mostrados en la figura anterior, se corresponden con
el mensaje de error enviado cuando no es posible encontrar la tarjeta de
memoria.
En el mensaje Memoria no Encontrada, cada caracter ASCII tiene su equivalente
hexadecimal, en cual podremos asociar fcilmente si observamos la tabla ASCII, y
convertimos sus valores decimales en hexadeimales. Podemos encontrar esta tabla en el
men Tools, haciendo clic en la opcin ASCII Chart:
335
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.9
Por ejemplo, la letra M tiene un valor equivalente en la tabla expresado en
formato decimal igual a 77.
Al hacer la conversin de decimal a hexadecimal, tenemos que: 77 0x4D
La siguiente letra es la e, la cual tiene un valor equivalente en la tabla
expresado en formato decimal igual a 101.
336
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.10
Como podemos observar, la cadena de datos encerrada en el primer recuadro,
representa el valor hexadecimal de cada carcter del mensaje de error Memoria
no Encontrada
337
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
MID OID OID PNM PNM PNM PNM PNM PRV PSN PSN PSN PSN
0x85 0x13
0x03 SanDisk
OEM/Application ID (OID):
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.11
En este punto, ya hemos visto como inicializar la tarjeta de memoria SD, y cmo
extraer la cadena de caracteres del registro CID.
339
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Reservado
Device size
Reservado
erase single block enable
erase sector size
write protect group size
write protect group enable
Reservado
write speed factor
max. write data block length
partial blocks for write allowed
Reservado
File format group
copy flag (OTP)
permanent write protection
temporary write protection
File format
Reservado
CRC
Siempre en uno 1
Ancho
(TRAN_SPEED)
CCC
8
12
(READ_BL_LEN)
(READ_BL_PARTIAL)
4
1
1
1
1
6
22
1
1
7
7
1
2
3
4
1
5
1
1
1
1
2
2
7
1
(WRITE_BLK_MISALIGN)
(READ_BLK_MISALIGN)
DSR_IMP
C_SIZE
(ERASE_BLK_EN)
(SECTOR_SIZE)
(WP_GRP_SIZE)
(WP_GRP_ENABLE)
(R2W_FACTOR)
(WRITE_BL_LEN)
(WRITE_BL_PARTIAL)
(FILE_FORMAT_GRP)
COPY
PERM_WRITE_PROTECT
TMP_WRITE_PROTECT
(FILE_FORMAT)
CRC
2
6
8
8
Valor
01b
00 0000b
26h (1.5 ms)
00h
Bits
127 al 126
125 al 120
119 al 112
111 al 104
32h o 5Ah
103 al 96
95 al 84
01x11011010
1b
9
0
0
0
x
00 0000b
00 xxxxh
0
1
7Fh
0000000b
0
00b
010b
9
0
00000b
0
x
x
x
00b
00b
xxxxxxxb
1
83 al 80
79
78
77
76
75 al 70
69 al 48
47
46
45 al 39
38 al 32
31
30 al 29
28 al 26
25 al 22
21
20 al 16
15
14
13
12
11 al 10
9 al 8
7 al 1
0
Figura 10.12
340
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
TAAT: Define la parte asncrona del tiempo de acceso a los datos. En este
caso, el valor obtenido con nuestra tarjeta de memoria SD ha sido 0x26, lo
cual equivale a un tiempo de acceso a los datos de 1.5 ms.
Posicin del Bit en TAAT
Valor y Unidad
Bit 2 al 0
Unidades:
0=1ns, 1=10ns, 2=100ns, 3=1s, 4=10s,
5=100s, 6=1ms, 7=10ms
Bit 6 al 3
Valores:
0 = reservado, 1=1.0, 2=1.2, 3=1.3, 4=1.5, 5=2.0,
6=2.5, 7=3.0, 8=3.5, 9=4.0, A=4.5, B=5.0, C=5.5,
D=6.0, E=7.0, F=8.0
Bit 7
Reservado
Figura 10.13
Tenemos que el valor TAAT obtenido al leer el registro CSD fue: 26h
El equivalente binario de 26h es: 0010 0110
Bit 2 al 0: 110b en decimal este nmero equivale a 6, que se corresponde al
valor expresado en la tabla de 1 ms.
Bit 6 al 3: 0100b en decimal este nmero equivale a 4, que se corresponde al
valor expresado en la tabla de 1.5
Entonces, tenemos el valor y la unidad de tiempo, igual a 1.5 ms.
NSAC: Este campo es fijado en 00h. NSAC no debera ser usado para calcular
valores de intervalo de espera.
TRAN_SPEED: Este campo define la mxima velocidad de transferencia en una
lnea de datos. Slo hay dos valores posibles en este caso, 32h equivalente a
25Mhz, que es la frecuencia mxima obligatoria para una tarjeta de memoria SD,
y para el modo de alta velocidad, el valor siempre es 5Ah, equivalente a 50 Mhz.
341
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Valor y Unidad
Bit 2 al 0
Unidades:
0=100kbit/s, 1=1Mbit/s, 2=10Mbit/s,
3=100Mbit/s, 4... 7=reserved
Bit 6 al 3
Valores:
0 = reservado, 1=1.0, 2=1.2, 3=1.3, 4=1.5,
5=2.0, 6=2.5, 7=3.0, 8=3.5, 9=4.0, A=4.5,
B=5.0, C=5.5, D=6.0, E=7.0, F=8.0
Bit 7
Reservado
Figura 10.14
Es decir, si Trans_Speed es 32h
El equivalente de 32h en binario es: 00110010b
Bit 2 al 0: 010b en decimal, este valor equivale a 2 y se corresponde con la
unidad Mbit/s.
Bit 6 al 3: 0110b en decimal, equivale a 6 y se corresponde con el valor 2.5
Entonces tenemos que, el valor y la unidad de tiempo es igual a 2.5 Mbit/s, o 25
Mhz.
CCC: Define las clases de comandos de la memoria. El conjunto de comandos del
sistema de Tarjeta de Memoria SD, est dividido en varias clases y cada clase
apoya un juego de funcionalidades de tarjeta.
READ_BL_LEN
Figura 10.15
342
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
WRITE_BL_LEN
343
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
TMP_WRITE_PROTECT: Protege temporalmente el contenido de sobreescritura o borrado, todos los comandos para escritura o borrado de la tarjeta
son
temporalmente deshabilitados. Este Bit puede ser seleccionado o
reiniciado. El valor por defecto es 0, es decir, la No escritura est deshabilitada.
FILE_FORMAT: Indica el formato del archivo en la tarjeta de memoria.
FILE_FORMAT_GRP FILE_FORMAT
Tipo
Otros Desconocidos.
0, 1, 2, 3
Reservado.
Figura 10.16
344
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
If (error_Mmc = 0) Then
delay_ms(1000)
For i = 0 To 15
Uart1_Write(dataBuffer[i])
Next i
Else
End If
GoTo main
End.
345
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Este es el resultado con nos ha dado con la tarjeta de memoria SD que hemos
utilizado para la prueba:
Figura 10.17
Los datos en el primer recuadro corresponden al mensaje de error Memoria no
Encontrada.
Los datos dentro del segundo recuadro corresponden al registro CSD, y los datos
en el tercer recuadro son la repeticin del mismo:
346
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
0x00 0x26 0x00 0x32 0x5F 0x5A 0x83 0xC9 0x3E 0xFB 0xCF 0xFF 0x92 0x80 0x40 0xCB
Bit 127
Bit 0
00000000 00100110 00000000 00110010 01011111 01011010 10000011 11001001 00111110 11111011 11001111 11111111 10010010 10000000 01000000 11001011
CSD Structure:
127-126 --> 00
Reservado:
TAAC:
NSAC:
TRAN_SPEED:
CCC:
95-84
--> 010111110101
READ_BL_LEN:
83-80
--> 1010
READ_BL_PARTIAL:
79
--> 1
WRITE_BLK_MISALIGN:
78
--> 0
READ_BLK_MISALIGN:
77
--> 0
DSR implemented:
76
--> 0
Reservado:
75-70
--> 001111
C_SIZE:
69-48
--> 0010010011111011111011
Reservado:
47
--> 1
ERASE_BLK_EN:
46
--> 1
SECTOR_SIZE:
45-39
--> 0011111
WP_GRP_SIZE:
38-32
--> 1111111
WP_GRP_ENABLE:
31
--> 1
Reservado:
30-29
--> 00
R2W_FACTOR:
28-26
--> 100
WRITE_BL_LEN:
25-22
--> 1010
WRITE_BL_PARTIAL:
21
--> 0
Reservado:
20-16
--> 00000
FILE_FORMAT_GRP:
15
--> 0
COPY:
14
--> 1
PERM_WRITE_PROTECT: 13
--> 0
TMP_WRITE_PROTECT:
12
--> 0
FILE_FORMAT:
11-10
--> 00
Reservado:
9-8
--> 00
CRC:
7-1
--> 1100101
347
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.18
348
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Para realizar las siguientes pruebas, debemos contar con una unidad de lectura
de memorias SD en nuestro computador. Normalmente podemos encontrar estas
unidades de lectura en el mercado como una unidad externa USB, cuando de
computadoras tipo DeskTop se trata (Figura 10.19).
Figura 10.19
A continuacin insertamos la tarjeta de memoria SD en la ranura ExpressCard
de la computadora, y seguidamente abrimos el men Herramientas en el cual
encontraremos la opcin Abrir Disco.
Tambin podemos acceder a esta opcin presionando la tecla de acceso rpido
F9 en el teclado.
Figura 10.20
349
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.21
350
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.22
Si anteriormente hemos dado formato a la tarjeta, entonces podremos ver en el
sector cero 0 de la misma datos almacenados como lo demuestra la imagen
anterior.
Tambin contamos con informacin til en la barra ubicada en el lado izquierdo
de la ventana de WinHex. Por ejemplo, podemos ver la capacidad total de la
memoria, el espacio libre y el espacio utilizado, bytes por clster, bytes por
sector, bytes por pgina, entre otros.
En este punto ser bueno recordar que el tamao de un sector puede variar
entre 0,5K bytes y 64K bytes. Comnmente podremos encontrar que el tamao
estndar de un sector es de 512 bytes, y este es el caso en este ejemplo.
Para ubicar un sector especfico en WinHex, tenemos una herramienta de
bsqueda rpida en el men Posicin, llamada Ir a Sector. Tambin podemos
acceder a ella con las teclas de acceso rpido Ctrl+G.
351
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.23
Adems tenemos disponible un botn de acceso rpido a esta funcin,
identificado claramente en la imagen anterior. Al seleccionar esta opcin
podremos ver la siguiente ventana:
Figura 10.24
Esta herramienta resulta muy til cuando tenemos una gran cantidad de datos
almacenados en nuestra memoria SD, posiblemente provenientes de dispositivos
perifricos que suministrarn datos importantes para algn propsito especfico.
Al escribir el nmero del sector y hacer clic en el botn Aceptar, podremos
llegar directamente a la posicin solicitada, haciendo mucho mas fcil el trabajo
de bsqueda de datos en una memoria de alta capacidad.
352
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Dato Hexadecimal
0x6D
0x69
0x6B
0x72
0x6F
0x42
0x61
0x73
0x69
0x63
Equivalente ASCII
M
i
k
r
o
B
a
s
i
c
Dato Hexadecimal
0x4C
0x69
0x62
0x72
0x65
0x72
0x69
0x61
Equivalente ASCII
L
i
b
r
e
r
i
a
353
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Dato Hexadecimal
0x4D
0x4D
0x43
0x2F
0x53
0x44
Equivalente ASCII
M
M
C
/
S
D
Dato Hexadecimal
0x77
0x72
0x69
0x74
0x65
Equivalente ASCII
W
r
i
t
e
Dato Hexadecimal
0x53
0x65
0x63
0x74
0x6F
0x72
Equivalente ASCII
S
e
c
t
o
r
354
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
If (error_Mmc = 0) Then
=
=
=
=
=
=
=
=
=
=
0x6D
0x69
0x6B
0x72
0x6F
0x42
0x61
0x73
0x69
0x63
For i = 10 To 15
dato[i] = 0
Next i
dato[16]
dato[17]
dato[18]
dato[19]
dato[20]
dato[21]
dato[22]
dato[23]
=
=
=
=
=
=
=
=
0x4C
0x69
0x62
0x72
0x65
0x72
0x69
0x61
For i = 24 To 31
dato[i] = 0
Next i
dato[32]
dato[33]
dato[34]
dato[35]
dato[36]
dato[37]
=
=
=
=
=
=
0x4D
0x4D
0x43
0x2F
0x53
0x44
For i = 38 To 47
dato[i] = 0
Next i
'
'
'
'
'
'
'
'
'
'
m
i
k
r
o
B
a
s
i
c
'
'
'
'
'
'
'
'
L
i
b
r
e
r
i
a
'
'
'
'
'
'
M
M
C
/
S
D
355
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
dato[48]
dato[49]
dato[50]
dato[51]
dato[52]
=
=
=
=
=
0x77
0x72
0x69
0x74
0x65
For i = 53 To 63
dato[i] = 0
Next i
dato[64]
dato[65]
dato[66]
dato[67]
dato[68]
dato[69]
=
=
=
=
=
=
'
'
'
'
'
W
r
i
t
e
0x53
0x65
0x63
0x74
0x6F
0x72
'
'
'
'
'
'
S
e
c
t
o
r
mmc_write_sector(2, dato)
End.
356
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Escribimos los 512 bytes del sector # 2 con los datos cargados en las
variables.
Enviamos un mensaje final por el puerto serial para saber que el proceso
de grabacin de datos ha culminado.
357
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.25
358
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
program Mmc_Read_Sector
' Area de declaracin:
Dim MMC_chip_select As sbit At RC2_bit
Dim MMC_chip_select_direction As sbit At TRISC2_bit
Dim error_Mmc As Byte
i
As Word
lectura
As Byte[512]
main:
UART1_init(9600)
Else
UART1_Write_Text("Memoria no Encontrada")
delay_ms(1000)
359
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
GoTo main
End If
fin:
GoTo fin
End.
Re-escribir un archivo.
Borrar un archivo.
Iniciamos esta interesante parte del libro comentando que cuando vamos a
emplear tarjetas de memoria MMC/SD en nuestros proyectos, existen ciertas
reglas que debemos tener siempre en mente a la hora de realizar nuestros
programas. Una de ellas siempre ser la inicializacin del mdulo SPI y de la
tarjeta de memoria.
360
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.26
En este punto, sabemos como inicializar y re-inicializar el mdulo SPI para una
comunicacin a alta velocidad entre el microcontrolador y el dispositivo
conectado al bus SPI que en este caso es una tarjeta de memoria SD. Pero
cuando se trata del sistema de archivos FAT16, la inicializacin de la tarjeta se
debe hacer con la siguiente rutina de programacin:
10.5.1.- Mmc_Fat_Init()
Esta rutina nos devolver tres posibles estados los cuales describiremos a
continuacin:
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Siempre ser conveniente para nuestros diseos incluir un condicional que nos
permita tomar una decisin en caso de presentarse uno de estos tres estados.
Un ejemplo de ello sera determinar a travs de un condicional si la tarjeta de
memoria se encuentra conectada e inicializada correctamente:
main:
.
.
If (Mmc_Fat_Init() = 0) Then
.
.
Rutina principal
.
.
Else
.
Mensaje de Error, por ejemplo: No se ha insertado la Memoria
.
End If
.
GoTo main
Para dar formato FAT a la tarjeta de memoria MMC/SD desde nuestro circuito y
no desde el computador, contamos una rutina dentro de la librera MMC/SD de
mikroBasic:
10.5.2.- Mmc_Fat_QuickFormat(Etiqueta)
Esta rutina es capaz de inicializar y dar formato FAT a una tarjeta de memoria
asignando una etiqueta o nombre a la unidad de memoria. Al igual que la rutina
anterior, no devuelve los tres posibles estados comentados anteriormente:
362
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.27
363
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
GoTo fin
Else
' de lo contrario...
End If
GoTo main
fin:
GoTo fin
End.
364
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Enviamos un mensaje que nos indique que ya esta listo el formato FAT en
la unidad.
Figura 10.28
El mensaje de error Memoria no Encontrada estar apareciendo continuamente
hasta que insertemos la tarjeta de memoria en el circuito. Seguidamente
pasaran algunos segundos hasta que recibamos el mensaje Formato FAT Listo!.
Para comprobar que ciertamente hemos formateado la tarjeta de memoria,
copiaremos un archivo de texto en la misma desde nuestro computador:
365
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.29
Seguidamente, abrimos el terminal de comunicaciones de mikroBasic, insertamos
la tarjeta de memoria en nuestro circuito y por ultimo reiniciamos el
microcontrolador. Esperamos hasta que el microcontrolador enve el mensaje
Formato FAT Listo! y por ltimo verificamos el contenido de la tarjeta desde el
PC. El resultado debe ser el siguiente:
Figura 10.30
366
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
ARCHIVO1TXT
367
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
MASK
Descripcin
0x01
0x02
Archivo Oculto
0x04
Sistema
0x08
0x10
0x20
0x40
0x80
Crear un Archivo
4
5
6
7
Figura 10.31
Observando la tabla, podemos ver que este campo lo ocupa una palabra de 8
bits, es decir, 1 byte:
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
Figura 10.32
Bit 7: Es una bandera de creacin de un archivo. Si el archivo no existe, y la
bandera es activada (1), entonces ser creado un nuevo archivo bajo un
nombre especfico.
Bit 6: Solo para uso interno.
Bit 5: Este bit corresponde al atributo Archivo. Un archivo que no tenga este
atributo activo, nos indica que el mismo nunca ha sido modificado desde su
creacin. Una vez modificado el archivo, veremos automticamente activo este
atributo.
Bit 4: Este bit es un atributo para designar un archivo como carpeta o
subdirectorio.
Bit 3: Atributo para designar el nombre de un volumen.
Bit 2: Cuando activamos este bit (1), o atributo, podremos ver que el archivo
se convierte en un archivo de sistema.
368
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
Figura 10.33
10.5.6.- Ejemplo de programacin #61:
Veamos a continuacin algunos ejemplos prcticos en los cuales haremos uso de
algunos de estos atributos. El siguiente programa es capaz de crear un archivo
en el directorio raz de la tarjeta de memoria SD, con el atributo de solo lectura
activo:
program Formato_FAT
'--- Area de declaracin:
Dim MMC_chip_select As sbit At RC2_bit
Dim MMC_chip_select_direction As sbit At TRISC2_bit
Dim filename As string[11]
main:
Uart1_Init(9600)
filename = "DATOSTXT"
369
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Else
fin:
GoTo main
End If
GoTo fin
End.
Declaramos una variable tipo String para el nombre del archivo, la cual
hemos llamado filename.
370
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Es siguiente paso ser explorar la tarjeta de memoria en nuestro PC. Este ser el
resultado:
Figura 10.34
371
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.35
Observe que el atributo de Slo lectura se encuentra activo.
372
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
Figura 10.36
Este byte expresado en forma hexadecimal equivale al valor 0x83. Sustituimos
este valor en el campo de atributos de la funcin Mmc_Fat_Assign, compilamos
y grabamos el programa en el microcontrolador y por ltimo repetimos el
procedimiento para crear y verificar el archivo desde nuestro PC.
El programa modificado con estos atributos quedara de la siguiente forma:
program Formato_FAT
'--- Area de declaracin:
Dim MMC_chip_select As sbit At RC2_bit
Dim MMC_chip_select_direction As sbit At TRISC2_bit
Dim filename As string[11]
main:
Uart1_Init(9600)
filename = "DATOSTXT"
373
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
fin:
GoTo main
End If
GoTo fin
End.
Figura 10.37
374
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.38
375
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.39
Figura 10.40
376
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
Figura 10.41
El valor a cargar en el campo Atributo de la funcin Mmc_Fat_Assign es 0x90.
Verifique los cambios en siguiente programa:
program Formato_FAT
'--- Area de declaracin:
Dim MMC_chip_select As sbit At RC2_bit
Dim MMC_chip_select_direction As sbit At TRISC2_bit
Dim filename As string[11]
main:
Uart1_Init(9600)
filename = "DATOSTXT"
377
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
delay_ms(1000)
fin:
GoTo main
End If
GoTo fin
End.
Figura 10.42
378
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
Figura 10.43
El valor equivalente en hexadecimal es 0xA0.
program Formato_FAT
'--- Area de declaracin:
Dim MMC_chip_select As sbit At RC2_bit
Dim MMC_chip_select_direction As sbit At TRISC2_bit
Dim filename As string[11]
main:
Uart1_Init(9600)
filename = "DATOSTXT"
379
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
fin:
GoTo fin
End.
Observe que los cambios realizados, al igual que en ejemplo anterior, han sido el
campo Atributo y el mensaje de confirmacin.
Al compilar y grabar el programa en el microcontrolador, y finalmente explorar el
contenido de la tarjeta de memoria SD en Windows despus de grabar el archivo
desde nuestro circuito, tenemos que el atributo Archivo se encontrar activo
como lo muestra la siguiente imagen:
Figura 10.44
380
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Dim cadena
As string[41]
acumulador As Byte
do
' Cuando el dato esta listo, carga el
resultado
loop Until Uart1_Data_Ready = 1 ' en el buffer del puerto serial, de lo contrario
' se queda en el lazo esperando.
result = Uart1_Read
End sub
381
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
do
cadena[acumulador] = LeerCaracter
acumulador = acumulador + 1
loop Until (acumulador = 41)
do
' Cuando el dato esta listo, carga el resultado
loop Until UART1_Data_Ready = 1 ' en la variable "LeerCaracter", de lo contrario
382
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
result = UART1_Read
End sub
main:
Uart1_Init(9600)
delay_ms(100)
do
cadena[acumulador] = LeerCaracter
acumulador = acumulador + 1
loop Until (acumulador = 41)
GoTo fin
End.
383
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.45
384
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 10.46
385
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Para verificar el contenido del archivo, hacemos doble clic sobre el mismo y este
deber ser el resultado final:
Figura 10.47
1980 al 2107.
1 al 12.
1 al 31.
Horas:
Minutos:
Segundos:
0 al 23.
0 al 59.
0 al 59.
386
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Anio
Mes
Dia
Horas
Minutos
Segundos
As
As
As
As
As
As
Word
Byte
Byte
Byte
Byte
Byte
Luego cargamos los valores en las variables, en la rutina principal del programa:
Anio
Mes
Dia
Horas
Minutos
Segundos
=
=
=
=
=
=
2008
1
1
12
30
0
Por ltimo, agregamos la funcin para asignar la fecha y la hora al archivo, justo
despus de la funcin Mmc_Fat_Assign:
.
.
Mmc_Fat_Assign(filename, 0xA0)
' Asignamos Fecha y Hora al Archivo CADENA.TXT:
Mmc_Fat_Set_File_Date(Anio, Mes, Dia, Horas, Minutos, Segundos)
387
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Anio
Mes
Dia
Horas
Minutos
Segundos
As
As
As
As
As
As
Word
Byte
Byte
Byte
Byte
Byte
do
' Cuando el dato esta listo, carga el resultado
loop Until UART1_Data_Ready = 1 ' en la variable "LeerCaracter", de lo contrario
' se queda en el lazo esperando.
result = UART1_Read
' Lee el dato en la USART y lo carga en la
' variable "LeerCaracter".
End sub
main:
' Cargamos cada valor correspondientes a la Fecha y Hora en las variables:
Anio
Mes
Dia
Horas
Minutos
Segundos
=
=
=
=
=
=
2008
1
1
12
30
0
Uart1_Init(9600)
delay_ms(100)
do
cadena[acumulador] = LeerCaracter
acumulador = acumulador + 1
loop Until (acumulador = 41)
388
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Mmc_Fat_Write(cadena, 41)
Uart1_Write_Text("Archivo Creado") ' Enviamos un mensaje para confirmar que el
' archivo ha sido creado.
GoTo fin
' Saltamos a la etiqueta "fin"
Else
GoTo fin
End.
Figura 10.48
389
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
0, si el archivo no existe.
1, si el archivo existe.
390
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
filename = "CADENATXT"
391
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
fin:
GoTo fin
End.
ms
datos
con
la
funcin
393
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Anio
Mes
Dia
Horas
Minutos
Segundos
As
As
As
As
As
As
Word
Byte
Byte
Byte
Byte
Byte
espacio_en_blanco
As string[1]
=
=
=
=
=
=
2008
1
2
19
50
0
Uart1_Init(9600)
delay_ms(100)
do
cadena[acumulador] = LeerCaracter ' Llama la sub-funcin "leerCaracter y
' y carga el dato en la variable.
acumulador = acumulador + 1
' Incrementa la variable "acumulador".
loop Until (acumulador = 41)
394
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
fin:
GoTo fin
End.
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
396
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
11.1.- Qu es un Servomotor?
Un servomotor es un dispositivo electromecnico capaz de rotar su eje a una posicin
especfica a lo largo de su recorrido, inyectando un tren de pulsos controlados, a un circuito
de control que posee dentro de su caja o chasis. Esta seal se introduce a travs de un
cable de control que se distingue entre los tres cables que posee y que segn la marca del
servomotor puede ser de color blanco, amarillo o anaranjado. Los cables de alimentacin se
distinguen por sus colores rojo (Positivo), y negro o marrn (Negativo).
Un servomotor estndar tiene dimensiones muy apropiadas para realizar proyectos de
robtica, y aunque se pueden encontrar en diferentes tamaos, es importante resaltar que la
fuerza de un servo en su eje no es directamente proporcional al tamao del mismo. Esto
significa que su fuerza depende en gran sentido de su diseo interior, es decir, de la
mecnica y material que componen sus engranajes.
Veamos a continuacin algunas caractersticas tcnicas importantes en un servomotor
estndar:
Control: Control por ancho de pulso.
Pulso: 3-5 Voltios Pico a Pico.
Voltaje de operacin: 4.8 a 6.0 Voltios.
Torque (4.8V): 3.0 kg/cm (42 oz/in)
Torque (6.0V): 4.5 kg/cm (48.60 oz/in)
Rango de Temperatura Operacional: -20 a +60 C.
Velocidad (4.8V): 0.19sec/60 grados.
Velocidad (6.0V): 0.15sec/60 grados.
Corriente (4.8V): 7.4mA activo y 160mA al aplicar fuerza.
Corriente (6.0V): 7.7mA activo y 180mA al aplicar fuerza.
397
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 11.1
Para controlar la posicin del eje de un servomotor, hace falta enviar un tren de pulsos,
donde el ancho de cada pulso determina el punto en el cual el eje mantiene su posicin,
siempre y cuando el tren de pulsos est presente. El recorrido ser en la mayora de los
modelos de 180 y los tiempos correspondientes al pulso en la seal para las posiciones
principales (0, 90 y 180) se especifican en la figura 11.2. (Estos tiempos pueden variar de
acuerdo al modelo y marca del servomotor).
Figura 11.2
398
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 11.3
A medida que aumentamos gradualmente el tiempo T1, el eje del servomotor se ir
moviendo en sentido horario. Cuando T1 = 1.5 ms podremos ver que el eje forma un ngulo
de 90 con respecto al punto de inicio (0). En la figura 11.4 se puede observar la seal
correspondiente a esta posicin (90), donde T2 se mantiene en 20 milisegundos.
Figura 11.4
La seal correspondiente a la posicin mxima (180) en un servomotor estndar, tendra
entonces valores para T1 = 2.6 ms y T2 = 20 ms.
399
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 11.5
Se puede crear un programa en mikroBasic que cumpla con estas caractersticas,
cambiando el valor correspondiente a T1 a travs de una variable declarada, podemos
modificar el ngulo de giro de un servomotor.
11.1.1.- Ejemplo de programacin #69:
Veamos el siguiente ejemplo:
Figura 11.6
400
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
program Servo1
' Area de declaracin.
Symbol Servo = PORTB.0
main:
TRISB = %11111110
Centro:
Servo = 1
Delay_Us(1500)
Servo = 0
Delay_ms(20)
'
'
'
'
GoTo Centro
End.
Figura 11.7
Volt/Div: 2V
Time/Div: 5ms
Perodo: 21,55 ms
T1: 1,55 ms (Ancho de pulso positivo).
T2: 20 ms
Vpp: 5,44 Voltios.
Ciclo de trabajo: 8,16%
Tiempo de subida: 160,0 us
Tiempo de bajada: 160,0 us
Al aplicar el tren de pulsos al servomotor, su eje rotar hasta una posicin en el punto medio
de su recorrido total.
401
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 11.8
402
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Dim X As Byte
main:
TRISB = %11111110
Centro:
For X = 1 To 100
Servo = 1
Delay_Us(1500)
Servo = 0
Delay_ms(20)
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
Next X
For X = 1 To 100
Servo = 1
Delay_Us(1000)
Servo = 0
Delay_ms(20)
Next X
For X = 1 To 100
Servo = 1
Delay_Us(2000)
Servo = 0
Delay_ms(20)
Next X
GoTo Centro
End.
403
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
12.1.- PWM.
PWM es una abreviacin de Pulse Width Modulation, o modulacin por ancho de pulso, y es
un mtodo utilizado normalmente para el control de velocidad de motores elctricos, o para
regular voltajes en fuentes conmutadas entre otras aplicaciones. Este control se lleva a cabo
modificando el ancho de pulso o ciclo de trabajo de la seal generada.
Algunos microcontroladores como los que estamos utilizando en esta edicin (PIC16F877,
PIC18F452, entre otros) tienen en su hardware dos mdulos CCP (Capture-Compare-PWM).
A travs de estos mdulos y con la ayuda de la librera PWM de mikroBasic, el trabajo de
generar una seal de modulacin por ancho de pulso resulta muy sencillo y rpido.
Una seal PWM se ve de siguiente forma:
Figura 12.1
El ciclo de trabajo representa el tiempo que la seal permanece activa. En otras palabras, si
quisiramos controlar la velocidad en un motor DC, y aplicamos una seal PWM a ste, un
momento o tiempo en alto de la seal significara que estamos aplicando energa al motor
durante este tiempo, y un momento en bajo significara que no hay energa aplicada a ste.
Si hacemos el momento, tiempo o ciclo de trabajo mayor, entonces estaramos aplicando
energa durante un tiempo mayor, lo cual significa que el motor tomara mayor velocidad.
Esto sugiere que si tenemos control sobre el ciclo de trabajo de la seal aplicada al motor,
entonces tenemos control sobre la velocidad.
404
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
La frecuencia de la seal PWM y el ciclo de trabajo son dos parmetros que pueden ser
controlados a travs de las rutinas proporcionadas por la librera PWM de mikroBasic.
Tambin es posible especificar cual de los dos mdulos PWM en el hardware del
microcontrolador deseamos utilizar. Cada mdulo es independiente, lo cual nos da la libertad
de configurar la frecuencia y ciclo de trabajo de cada uno por separado.
12.2.- Librera PWM.
Veamos a continuacin las rutinas de la librera PWM para cada mdulo.
Mdulo PWM 1:
12.2.1.- PWM1_Init(freq).
Inicializa el mdulo PWM1 con un ciclo de trabajo igual a 0. El parmetro freq representa la
frecuencia en Hz deseada para la seal de salida PWM. El valor mnimo de la frecuencia
cuando usamos un oscilador externo de 4 Mhz es de 245 Hz. El valor mnimo de la
frecuencia cuando usamos un oscilador externo de 20 Mhz es 1221 Hz. Estos valores se
calculan segn las especificaciones de cada microcontrolador en su hoja de datos. En este
caso, hemos tomado la resolucin mxima de 10 bits, Timer Prescaler = 16, y el valor del
registro PR2 = 0xFFh.
12.2.2.- PWM1_Set_Duty(ciclo de trabajo).
El parmetro ciclo de trabajo lo podemos medir en trminos de porcentaje sobre una
escala que vara entre 0 y 255, donde 255 equivale al 100% del ciclo de trabajo.
12.2.3.- PWM1_Start().
Inicia la seal PWM en el mdulo PWM1, segn su ciclo de trabajo y frecuencia definida.
12.2.4.- PWM1_Stop().
Detiene la seal PWM en el mdulo PWM1.
12.2.5.- Mdulo PWM2:
Slo se debe cambier el indice n en las rutinas de la librera PWMn_ para el control del
mdulo PWM2.
PWM2_Init(freq).
PWM2_Set_Duty(ciclo de trabajo).
PWM2_Start().
PWM2_Stop().
405
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Para calcular el valor que debemos cargar en el parmetro ciclo de trabajo en base a un
porcentaje conocido, podemos aplicar la siguiente formula:
Valor =
255 Porcentaje
100%
255 5%
= 12.75 13
100%
Figura 12.2
Si calculamos el valor del ciclo de trabajo para un 50%, la seal se ver de la siguiente
forma:
Valor =
255 50%
= 127.5 128
100%
Figura 12.3
Si calculamos el valor del ciclo de trabajo para un 95%, la seal se ver de la siguiente
forma:
Valor =
255 95%
= 242.25 242
100%
406
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 12.4
Mida el voltaje en la salida PWM del microcontrolador con un multmetro digital. Para
generar un voltaje especfico en una de las salidas de un microcontrolador a travs de la
instruccin PWM, podemos aplicar la siguiente frmula:
Vout =
Vfuente nivel
255
Donde,
Vout: voltaje de salida.
Vfuente: voltaje de la fuente de alimentacin del circuito.
Nivel: constante entre 0 y 255.
Por ejemplo, si deseamos obtener Vout = 3.5V, entonces,
nivel =
407
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Figura 12.5
Verifique el voltaje de salida en el pin RC2 para cada valor calculado del ciclo de trabajo de
la seal PWM.
El siguiente programa genera una seal PWM con un ciclo de trabajo del 50% a travs del
pin RC2:
program PWM1
' Area de declaracin.
Dim Duty As Byte
main:
PWM1_Init(5000)
Duty = 127
PWM1_Start()
PWM1_Set_Duty(Duty)
End.
408
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Si deseamos generar dos seales PWM simultneas, pero con diferentes frecuencias y
ciclos de trabajo, entonces debemos agregar las lneas correspondientes al segundo mdulo
PWM:
program PWM2
' Area de declaracin.
Dim Duty1 As Byte
Dim Duty2 As Byte
main:
PWM1_Init(5000)
PWM2_Init(2000)
Duty1 = 100
Duty2 = 200
PWM1_Start()
PWM2_Start()
PWM1_Set_Duty(Duty1)
PWM2_Set_Duty(Duty2)
End.
Las salidas RC2 para PWM1 (Seal Verde), y RC1 para PWM2 (Seal Roja) se veran de la
siguiente forma en un osciloscopio para los valores cargados en las variables Duty1 y Duty2:
Figura 12.6
409
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
P1: Al activar este pulsador, debemos incrementar en una unidad el valor del ciclo de
trabajo de la seal PWM. Esto se traducir en aumento de la velocidad del motor DC.
P2: Al activar este pulsador, debemos decrementar en una unidad el valor del ciclo
de trabajo de la seal PWM.
Se deber inicializar el valor del ciclo de trabajo para que la seal PWM arranque en un 50%
al iniciar el programa.
Figura 12.7
410
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction
RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit
As
As
As
As
As
As
sbit
sbit
sbit
sbit
sbit
sbit
At
At
At
At
At
At
TRISB4_bit
TRISB5_bit
TRISB0_bit
TRISB1_bit
TRISB2_bit
TRISB3_bit
LCD_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)
Pulsadores:
ByteToStr(Duty1, txt)
Lcd_Out(2, 8, txt)
Duty1 = Duty1 + 1
Duty1 = Duty1 - 1
411
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
End If
Estado = Button(PortD, 2, 50, 1) ' Verificamos si P3 fue presionado, estado activo = 1.
If Estado = 255 Then
GoSub IniciaPWM
End If
GoTo Pulsadores
IniciaPWM:
PWM1_Start()
Delay_ms(100)
Return
DetienePWM:
PWM1_Stop()
Delay_ms(100)
Return
End.
412
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Apndice A.
Tabla ASCII
413
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Apndice B
http://www.conexionelectronica.com/download/Ejemplos.rar
Bibliografa
414
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva
Internet:
MikroElektronika., http://www.mikroe.com
Sparkfun., http://www.sparkfun.com
Wikipedia, http://es.wikipedia.org
Empresas:
MikroElektronika
Viegradska 1A
11000 Belgrade
Address Code: 111701, Europa
http://www.mikroe.com
Microchip Technology Inc.
2355 W. Chandler Blvd.
Chandler AZ 85224-6199
Tel. (602) 786-7200
Fax. (602) 899-9210
http://www.microchip.com
415
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva