You are on page 1of 425

Copyright 2010 Christian Bodington

Todos los derechos reservados. Esta publicacin no puede ser reproducida,


ni en todo ni en partes, ni registrada en o transmitida por un sistema de
recuperacin de informacin, en ninguna forma ni por ningn medio, sea
mecnico, fotoqumico, electrnico, magntico, electroptico, por fotocopia
o cualquier otro, sin permiso previo por escrito del autor.

Ilustrado y Editado por: Christian Bodington Esteva


Diseo de la portada / Arte por: Christian Bodington Esteva

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.-

Arquitectura Bsica del microcontrolador PIC16F877.


El oscilador externo.
Circuito de Reset.
Consideraciones tcnicas de diseo.
2.4.1.2.4.2.2.4.3.2.4.4.-

Estado lgico de un pin I/O.


Lectura de un estado lgico en un pin I/O.
El opto-acoplador como dispositivo de enlace.
Fuente de poder 5Vdc 3.3Vdc.

2.5.- Configuracin de puertos de entrada y salida en un microcontrolador PIC.


2.6.- Primeros ejemplos de programacin en mikroBasic.
2.6.1.- Ejemplo #1. Control de Leds.
2.6.2.- Ejemplo #2. Control de Leds con pulsadores.
2.6.3.- Ejemplo #3. Librera Button.

Capitulo III. Pantallas LCD y GLCD.


3.1.- Pantallas LCD, estudio de la librera LCD de mikroBasic.
3.1.1.3.1.2.3.1.3.3.1.4.3.1.5.-

Identificacin de los pines de una pantalla LCD.


Conexin y configuracin de una pantalla LCD.
Rutina Lcd_Init().
Rutina Lcd_Cmd().
Rutina Lcd_Out().

3.1.5.1.- Ejemplo #4. Imprimir mensaje en pantalla LCD.


3.1.5.2.- Ejemplo #5. Uso de comandos en pantalla LCD.
3.1.5.3.- Ejemplo #5.1. Uso de comandos en pantalla LCD.
3.1.6.- Rutina Lcd_Out_Cp().
3.1.6.1.- Ejemplo #6. Uso de la rutina Lcd_Out_Cp().
3.1.7.- Rutina Lcd_Chr().
3.1.8.- Rutina Lcd_Chr_Cp().
3.1.8.1.- Ejemplo #7. Uso de rutinas Lcd_Chr() y Lcd_Chr_Cp().
3.2.- Parmetros de rutinas cargados en variables.
3.2.1.- Ejemplo #8. Uso de variables como parmetros.
3.2.2.- Ejemplo #9. Imprime el contenido de dos variables tipo String.
3.3.- Imprimir el contenido de una variable en una pantalla LCD.
3.3.1.- Ejemplo #10. Imprimir el contenido de una variable.
3.3.2.- Ejemplo #11. Imprime el resultado de una operacin,
suma y resta de un nmero cargado en una variable
a travs de pulsadores.
3.3.3.- Ejemplo #12. Crear un men de opciones en la pantalla.
3.4.- Pantalla Grfica o GLCD (Graphic Liquid Crystal Display).
3.4.1.- Conexin y configuracin de una pantalla GLCD.
3.5.- Librera GLCD.
3.5.1.- Rutina Glcd_Init().
3.5.2.- Ejemplo #13. Uso de la rutina Glcd_Init().
3.5.3.- Mdulo de Fuentes en mikroBasic.
ii

3.5.3.1.- Ejemplo #14. Cmo incluir un mdulo de fuentes.


3.5.4.- Rutina Glcd_Fill().
3.5.5.- Rutina Glcd_Set_Font().
3.5.6.- Rutina Glcd_Write_Text().
3.5.6.1.- Ejemplo #15. Imprimir el contenido de una
variable tipo Word.
3.5.7.- Rutina Glcd_Dot(x, y, color).
3.5.7.1.- Ejemplo #16. Encender o apagar un pixel especfico.
3.5.7.2.- Ejemplo #17. Cambio de color o color inverso en la pantalla.
3.5.7.3.- Ejemplo #18. Cambio de estado de un pixel.
3.5.8.- Rutina Glcd_Line(x1, y1, x2, y2, color).
3.5.8.1.- Ejemplo #19. Dibuja lnea entre coordenadas especficas.
3.5.8.2.- Ejemplo #20. Dibuja lnea entre coordenadas, color inverso.
3.5.9.- Rutina Glcd_V_Line(y1, y2, x, color).
3.5.9.1.- Ejemplo #21. Dibuja lnea vertical entre
coordenadas especficas.
3.5.10.- Rutina Glcd_H_Line(x1, x2, y, color).
3.5.10.1.- Ejemplo #22. Dibuja lnea horizontal entre coordenadas.
3.5.11.- Rutina Glcd_Rectangle(x1, y1, x2, y2, color).
3.5.11.1.- Ejemplo #23. Dibuja un cuadrado o rectngulo.
3.5.11.2.- Ejemplo #24. Dibuja una serie de rectngulos consecutivos.
3.5.12.- Rutina Glcd_Box(x1, y1, x2, y2, color).
3.5.12.1.- Ejemplo #25. Dibuja un cuadrado o rectngulo slido.
3.5.12.2.- Ejemplo #26. Dibuja un cuadrado o rectngulo slido,
color inverso.
3.5.13.- Glcd_Circle(x, y, radio, color).
3.5.13.1.- Ejemplo #27. Dibuja un crculo en la pantalla.
3.5.13.2.- Ejemplo #28. Dibuja un crculo, color inverso.
3.5.13.3.- Ejemplo #29. Dibuja crculos consecutivos.
iii

Captulo IV. Librera Trigon Funciones Trigonomtricas.


4.1.- Funciones Trigonomtricas. Sin(x), Sinh(x), Cos(x), Cosh(x), Tan(x), Tanh(x)
Asin(x), Acos(x), Atan(x), Atan2(x, y), Log(x), Log10(x), Sqrt(x), Exp(x),
Pow(x, y), fabs(x).
4.1.1.- Ejemplo #30. Clculo del seno de un valor x.
4.1.2.- Ejemplo #31. Clculo del coseno de un valor x.
4.1.3.- Ejemplo #32. Clculo de la tangente de un valor x.
4.1.4.- Ejemplo #33. Calculadora.

Captulo V. Librera Sound.


5.1.- Rutinas de la librera de sonido de mikroBasic. Clculos de frecuencias de la
escala musical.
5.1.1.- Ejemplo #34. Reproduce las notas de la escala musical en la octava A4,
y muestra las frecuencias a travs de la pantalla LCD.
5.1.2.- Ejemplo #35. Elaboracin de un piano de una octava musical.

Captulo VI. Teclado Matricial y Teclado PS/2.


6.1.- Teclado Matricial.
6.2.- Librera KeyPad.
6.2.1.- Rutina KeyPad_Init().
6.2.2.- Rutina KeyPad_Key_Press().
6.2.2.1.- Ejemplo #36. Lectura de un teclado matricial.
6.2.2.2.- Ejemplo #37. Como enmascarar el resultado de la lectura
del teclado matricial.
6.3.- Teclado PS/2.
6.4.- Librera PS/2.
6.4.1.- Rutina Ps2_Config().
6.4.2.- Rutina Ps2_Key_Read().
6.4.2.1.- Ejemplo #38. Lectura de un teclado PS/2.
6.4.2.2.- Ejemplo #39. Lectura de teclas de funciones especiales.
6.4.2.3.- Ejemplo #40. Mostrar smbolo ASCII y valor correspondiente
a una tecla presionada.

iv

Captulo VII. Memoria de Datos EEPROM.


7.1.- Memoria de datos EEPROM.
7.2.- Librera EEPROM.
7.1.1.- Rutina EEPROM_Read().
7.2.2.- Rutina EEPROM_Write().
7.2.2.1.- Ejemplo #41. Sistema de control de acceso con clave de 6
dgitos almacenada en la memoria EEPROM.
7.2.2.2.- Ejemplo #42. Sistema de control de acceso mejorado. Se
permite el cambio de clave desde el teclado.
Captulo VIII. Conversor A/D.
8.1.- El conversor A/D.
8.1.1.8.1.2.8.1.3.8.1.4.8.1.5.-

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.

9.3.- Cmo extraer informacin especfica de una cadena de datos?.


9.3.1.- Ejemplo #52. Extraer informacin de una cadena de datos.
9.4.- Mdulo de comunicaciones BlueTooth.
9.4.1.- Widcomm BlueTooth Software 5.0.1.3900.
9.4.2.- Comunicacin Serial inalmbrica BlueTooth.
9.5.- Mdulo GPS (OEM), comunicacin serial RS232.
9.5.1.- Protocolo NMEA.
9.5.2.- Ejemplo #53. Extrae coordenadas geogrficas y nmero de
satlites utilizador por el mdulo GPS.
9.6.- Programacin en Visual Basic 6.0 para ejemplos de comunicacin serial
RS232.
9.6.1.- Ejemplo #54. Captura de datos enviados desde un mdulo VB.
9.6.2.- Ejemplo #55. Captura de datos enviados desde un microcontrolador
a una hoja de clculo de Microsoft Excel.
Captulo X. Multi Media Card (MMC) y Secure Card (SD) Memory.
10.1.- Librera MMC/SD.
10.1.1.10.1.2.10.1.3.10.1.4.10.1.5.-

Rutina
Rutina
Rutina
Rutina
Rutina

Mmc_Init().
Mmc_Read_Cid().
Mmc_Read_Csd().
Mmc_Write_Sector().
Mmc_Read_Sector().

10.2.- Registro CID.


10.2.1.- Ejemplo #56. Lectura del registro CID en una memoria SD.
10.3.- Registro CSD Versin 2.0.
10.3.1.- Ejemplo #57. Lectura del registro CSD en una memoria SD.
vi

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

Captulo XI. Servomotores.


11.1.- Qu es un Servomotor?.
11.1.1.- Ejemplo #69. Control de un servomotor.
11.1.2.- Ejemplo #70. Posiciones pre-definidas.

Captulo XII. PWM.


12.1.- PWM.
12.2.- Librera PWM.
12.2.1.12.2.2.12.2.3.12.2.4.12.2.5.12.2.6.12.2.7.-

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.

Apndice A. Tabla ASCII.


Apndice B. Prcticas en formato digital.
Bibliografa.

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.

Christian Bodington Esteva

Capitulo I

1.1.- Herramientas de Diseo


En la elaboracin de proyectos electrnicos con microcontroladores PIC, resulta muy
importante considerar una serie de herramientas que vamos a describir a continuacin y las
cuales pueden ser proporcionadas en su gran mayora por la empresa Mikroelektronika
(www.mikroe.com). Esta empresa se ha dado a la tarea de disear tanto el software de
programacin para microcontroladores PIC, como el hardware necesario para poder
aprender todo lo relacionado al tema que a continuacin estaremos abordando a travs de
muchos ejemplos prcticos los cuales tienen una gran variedad de perifricos disponibles,
tales como pantallas LCD, GLCD, teclados matriciales, teclados PS/2, dispositivos de
comunicacin serial, entre otros.
Software: para la programacin en Lenguaje Basic, contamos con el Ambiente Integrado de
Desarrollo MikroBasic de MikroElektronika. Con esta herramienta estaremos realizando la
programacin en cada uno de los proyectos propuestos a partir del captulo II.

Figura 1.1 (Fuente: http://www.mikroe.com)

2
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Programador de Microcontroladores PIC de MikroElektronika: es un programador de


la familia Flash de Microchip, de conexin universal USB, el cual puede ser acoplado
a una placa de circuito impreso la cual contiene todas las bases disponibles del tipo
DIP como lo demuestra la figura 1.2. Tambin es posible hacer arreglos en nuestros
circuitos para dejar un puerto de conexin para el programador, y as poder realizar
cambios en nuestros programas sin retirar el microcontrolador de nuestros diseos.
Esta opcin, denominada ICSP (In-Circuit Serial Programming), simplifica el trabajo a
la hora de reprogramar nuestros diseos.

Figura 1.2 (Fuente: http://www.mikroe.com)

3
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Placa entrenadora de Mikroelektronika: una herramienta diseada para trabajar en


conjunto con los compiladores de mikroElektronika, proporcionan diferentes mdulos
interconectados entre ellos, facilitando la elaboracin de prcticas con
microcontroladores. Estos entrenadores de microcontroladores adems incorporan su
propio programador de microcontroladores PIC de conexin USB 2.0. El entrenador
recomendado en esta edicin es el EasyPIC5.

Figura 1.3 (Fuente: http://www.mikroe.com/en/tools/easypic5)

Herramientas de corte, extractor de circuitos integrados, cable rgido para conexiones


en la placa de prototipos.

Figura 1.4

4
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Osciloscopio: este instrumento se requiere para el desarrollo de algunas prcticas en


las cuales se hace necesario medir las seales generadas desde el microcontrolador.

Figura 1.5

Componentes electrnicos: microcontroladores PIC en los modelos definidos en cada


ejemplo prctico, resistencias, diodos, servomotores, condensadores, cristales y otros
componentes de fcil adquisicin. Cada proyecto cuenta con una tabla en la cual se
describen los componentes electrnicos que debern ser utilizados en el cada
montaje.

Figura 1.6

5
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

1.2.- Entorno de Desarrollo Integrado de mikroBasic.


MikroBasic cuenta con su propia interfaz de programacin la cual podemos descargar de la
pagina oficial http://www.mikroe.com en su versin de demostracin y con sus respectivas
limitaciones. Para obtener una versin completa de este compilador, ser necesario efectuar
la compra on-line, la cual puede ser tangible o no tangible, es decir, para descargar on-line
una vez aprobada la compra, o para recibir en nuestros hogares en fsico.
El link para la descarga es el siguiente:
http://www.mikroe.com/en/download/

Figura 1.7

El archivo descargado del link anteriormente mencionado luce como se muestra a


continuacin:

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

Para poder continuar con la instalacin, seleccionamos la opcin de aceptacin de los


trminos explicados en el acuerdo de licencia, y seguidamente hacemos clic en Next.
A continuacin veremos los componentes del programa disponibles para la instalacin:

El compilador.

Los archivos de ayuda del compilador.

Ejemplos de programas desarrollados para los mdulos del circuito entrenador


de Mikroelektronika.

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

Podemos dejar la ruta sugerida o podemos cambiarla segn convenga. Al haber


seleccionado anteriormente todos los componentes en la instalacin, podemos observar que
el espacio requerido se acerca a los 75 MB.
Ahora para iniciar la instalacin, hacemos clic en el botn Install, accin con la cual
veremos el progreso de la instalacin en nuestro disco, como lo demuestran las siguientes
imgenes:

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

Al hacer clic en el botn Finish, el programa de instalacin nos preguntar si deseamos


instalar el soporte ICD (In-Circuit Debugger) de mikroBasic:

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

El siguiente paso ser la instalacin para el soporte Lv18PICFLASH:

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

Tambin ser necesaria la instalacin de los drivers para el programador de


microcontroladores de mikroelektronika:

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

En la figura 1.35 se puede observar la estructura bsica de un programa hecho en


mikroBasic, y en la cual hemos identificado las cuatro secciones que consideramos ms
importantes para lograr un programa bien estructurado.
Seccin A: Corresponde al encabezado del programa, en el cual siempre es conveniente
incorporar informacin bsica del mismo, como el nombre, la identificacin de autor,
Copyright, fecha de elaboracin o fecha de los ltimos cambios realizados, versin del
programa que se est realizando, e incluso una breve descripcin acerca del objetivo del
programa y su aplicacin en un determinado circuito electrnico.
Seccin B: Esta seccin empieza en la columna cero del editor de texto de mikroBasic, y en
ella se pueden declarar variables, sub-funciones, configuraciones de dispositivos perifricos
y etiquetas de cada una de las subrutinas que sern programadas.
Las etiquetas identifican puntos especficos o subrutinas dentro de un programa. Son
definidas por el programador y deben tener al final de cada una de ellas el smbolo de dos
puntos, que definen el final de la misma.
21
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

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.

Cuando un comentario es demasiado extenso, podemos continuar el mismo en la siguiente


lnea, siempre que la frase comience con su respectiva comilla.
Los comentarios ayudan al diseador a identificar cada lnea de programa o cada una de las
funciones de cada subrutina, garantizando as una buena documentacin en cada uno de
los programas que realizamos.

22
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

1.4.- Crear un nuevo proyecto en mikroBasic:


Saber como crear un proyecto en mikroBasic es un paso sencillo pero muy importante, ya
que de ello depende que nuestros programas sean compilados correctamente.
Veamos a continuacin los pasos a seguir:

Desplegamos el men Project y seguidamente seleccionamos la opcin New


Project. Enseguida veremos la ventana de bienvenida.

Figura 1.36

En el paso 1, seleccionamos la opcin Next para pasar a la siguiente ventana en la


cual elegiremos el modelo de microcontrolador que deseamos utilizar en nuestro
proyecto.

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

En el paso 3, debemos seleccionar la ruta sobre la cual deseamos grabar el proyecto,


al igual que el nombre del proyecto. Para esto, simplemente seleccionamos la carpeta
sealada en la figura 1.39, a travs de la cual podremos acceder a cualquiera de las
unidades de almacenamiento en nuestro PC.

Figura 1.39

Figura 1.40

25
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Figura 1.41

En el paso 4 es posible agregar a nuestros proyectos archivos que contengan cdigo


creado con anterioridad, los cuales pudieran contener subrutinas generalizadas para
el control de perifricos comunes como pantallas LCD o teclados. En caso de no
disponer de ningn archivo adicional para el proyecto, simplemente continuamos
seleccionando la opcin Next.

Figura 1.42
26
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

En el paso 5 tenemos la opcin de incluir todas las libreras disponibles para el


microcontrolador anteriormente seleccionado en nuestro proyecto. Tambin tenemos
la opcin de no incluir ninguna de ellas. Esto se debe a que mikroBasic cuenta con
una amplia seleccin de libreras para el control de dispositivos perifricos o procesos
de clculo o conversin de datos que nos permitirn hacer de la programacin algo
fcil y rpida a la hora de disear un programa, pero no necesariamente
necesitaremos de todas las libreras en un solo proyecto. Si elegimos la opcin
Include All podremos estar seguros de que cada librera empleada en nuestro
programa funcionar correctamente. Si elegimos la opcin Include None (Advance)
tendremos que realizar la seleccin de las libreras que deseamos utilizar desde el
administrador de libreras de mikroBasic, el cual veremos mas adelante.

Figura 1.43

El paso 6 en la creacin de un nuevo proyecto nos dice que hemos finalizado la


configuracin del mismo. MikroBasic esta ahora listo para empezar a programar
nuestro primer proyecto, tal y como se puede observar en la figura 1.44.

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

1.5.- Conociendo el entorno de desarrollo integrado.


MikroBasic cuenta con un entorno de desarrollo integrado bastante completo y apropiado.
En l podremos encontrar una serie de opciones y herramientas, de las cuales hemos
resaltado las que consideramos ms importantes a la hora de elaborar un programa.

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

En la seccin C se puede observar el administrador de libreras, el cual deber ser tomado


en cuenta siempre que nuestros proyectos incluyan el uso de cualquiera de las libreras
disponibles en mikroBasic.
En la seccin D se encuentra en explorador de cdigo el cual resulta my til cuando
realizamos programas muy extensos. En l se muestra cada elemento declarado en un
programa. Podremos acceder directamente a uno de estos elementos haciendo doble clic en
ellos.
La seccin E muestra dos pestaas importantes. La primera pestaa se llama Messages o
Mensajes, contiene un rea en la cual se mostrarn los resultados del procedimiento de
compilacin de un programa. Si se genera un error de compilacin, ste ser mostrado en
esta ventana mostrando el tipo de error y su ubicacin en la ventana de edicin. La segunda
pestaa se llama Quick Converter y contiene una herramienta de conversin de unidades
en diferentes formatos.
Veamos a continuacin la descripcin de cada men en la seccin A de la imagen 1.46.

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.

Open: A travs de esta opcin podremos abrir cualquier archivo asociado a


nuestros proyectos de programacin.

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

Save: Salva o guarda los cambios realizados en la ventana de programacin.

Save As: Salva o guarda los cambios realizados en la ventana de programacin


con un nombre o ruta diferente.

Close: Cierra la ventana de cdigo activa.


Print Preview: Una vista previa de la ventana de cdigo activa antes de la
impresin.

Print: Imprime la ventana de cdigo Activa.

Exit: Cierra el entorno de programacin de mikroBasic.

Men Edit:

Figura 1.48

Undo: Deshace el ltimo cambio en el editor.

Redo: Rehace el ltimo cambio en el editor.


31

_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Cut: Corta el texto seleccionado y lo coloca en el portapapeles.

Copy: Copia el texto seleccionado y lo coloca en el portapapeles.

Paste: Pega el contenido del portapapeles en el editor.

Delete: Borra el texto seleccionado.

Select All: Selecciona todo el texto en la ventana activa del editor.


Find: Despliega la ventana de bsqueda del editor de texto.
Find Next: Busca la siguiente coincidencia de texto en la ventana activa del
editor.
Find Previous: Busca la coincidencia anterior en la ventana activa del editor.

Replace: Reemplaza el texto especificado por el usuario en la ventana activa del


editor.

Find In Files: Busca un texto en la ventana o ventanas activas, e incluso de


alguna carpeta especificada por el usuario.

Goto Line: Va a la lnea deseada en la ventana activa del editor.

Sub-Men Advanced:

Figura 1.49
32
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Comment: Convierte lneas de cdigo de programa previamente seleccionadas en


comentarios. Si no hemos seleccionado ninguna lnea de cdigo, simplemente
aparece una comilla simple, asignando el resto de la lnea como un espacio
disponible para realizar comentarios.

Uncomment: Remueve la propiedad de comentario de una o varias lneas


seleccionadas.

Indent: Aplica una tabulacin o sangra al texto seleccionado.

Outdent: Elimina una tabulacin o sangra al texto seleccionado.

Lowercase: Cambia todo el texto seleccionado a minsculas.

Uppercase: Cambia todo el texto seleccionado a maysculas.

Titlecase: Cambia a mayscula la primera letra del texto seleccionado.

Men View:

Figura 1.50

Sub-Men Toolbars: A travs de este sub-men podemos seleccionar cuales


herramientas estarn visibles o disponibles en la seccin A del entorno de desarrollo
integrado.

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

Routine List o Lista de Rutinas: Muestra la ventana en la cual podremos ver


una lista de todas las rutinas que hemos creado en un programa. Al hacer doble clic
sobre el nombre de la rutina, el editor posiciona el cursor al inicio de sta.

34
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Figura 1.53

Project Settings: Despliega la ventana de configuracin del proyecto, en la cual


podemos seleccionar el modelo de microcontrolador PIC que deseamos utilizar en
nuestro proyecto, la frecuencia o valor del cristal del oscilador externo, y por ltimo las
opciones disponibles para la compilacin y ventana de depuracin de mikroBasic.

Figura 1.54

35
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Code Explorer o Explorador de Cdigo: Despliega la ventana del explorador de


cdigo de mikroBasic.

Figura 1.55

Project Manager o Administrador de Proyectos: A travs de esta ventana es


posible acceder a todo el contenido del proyecto.

Figura 1.56

Esta ventana posee adems botones de acceso rpido a algunas funciones importantes:
o

Salvar un grupo de proyectos: En mikroBasic es posible tener ms de


un proyecto abierto en entorno de desarrollo integrado. Este botn nos
permitir almacenar este grupo de proyectos bajo un nico nombre. En la
36

_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

siguiente figura se muestra un ejemplo de un grupo de proyectos disponibles


en la ventana de administracin de proyectos.

Figura 1.57

Abrir un grupo de proyectos: A travs de esta opcin podremos abrir un


grupo de proyectos previamente creado.

Cerrar un Proyecto.

Cerrar un grupo de proyectos.

Agregar un proyecto al grupo de proyectos actual.

Eliminar un proyecto del grupo de proyectos actual.

Agregar un archivo al proyecto activo.

Eliminar un archivo del proyecto activo.

Compilar un proyecto.

Inicia el software de programacin de microcontroladores PIC de


mikroElektronika.
37

_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Library Manager o Administrador de Libreras: El administrador de libreras de


mikroBasic contiene todas las libreras disponibles para un microcontrolador
previamente seleccionado.

Figura 1.58

Actualiza el administrador de libreras.

Compila todas las libreras disponibles.

Incluye todas las libreras en un proyecto.

No incluye ninguna de las libreras en el proyecto.

Restaura el estado de las libreras justo antes de la ltima grabacin del


proyecto.

Bookmarks o Marcadores: Esta opcin despliega una ventana en la cual podremos


agregar accesos directos a puntos especficos en un programa. Al hacer doble clic en
alguno de estos accesos directos, el cursor se ubicar automticamente en la lnea o
direccin especificada.

38
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Figura 1.59

Quick Converter o Conversor rpido de datos: Despliega la ventana de conversin


de datos de mikroBasic.

Messages o Mensajes: Despliega la ventana de mensajes de error del compilador.

Macro Editor o Editor de Macros: Despliega una ventana en la cual podremos


grabar una secuencia de acciones sobre el entorno de desarrollo integrado, es decir,
podramos grabar una secuencia de ordenes que nos permita por ejemplo abrir el
terminal de comunicaciones de mikroBasic y hacer que se conecte bajo ciertos
parmetros especficos con tan solo activar su Macro correspondiente.

Figura 1.60

Inicia el proceso de grabacin en la secuencia de pulsaciones de teclas


sobre el entorno de desarrollo integrado de mikroBasic.

Detiene el proceso de grabacin de la secuencia de pulsaciones de teclas.


39

_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Permite ejecutar una Macro previamente grabada.

Crea un nuevo Macro.

Borra la Macro seleccionada.

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

Build: Compila el proyecto activo en el entorno de desarrollo de integrado.

Build All Projects: Compila todos los proyectos abiertos.

Build + Program: Compila y programa el proyecto activo.

View Assembly: Muestra el cdigo generado en lenguaje ensamblador.

View Statistics: Muestra las estadsticas del proyecto activo.

View Listing: Muestra el listado de asignacin de memoria del PIC: direcciones


de instrucciones, registros, las rutinas y las etiquetas.

Edit Search Paths: Edita rutas de bsqueda.

Clean Project Folder: Esta opcin limpia o borra de la carpeta de proyecto los
archivos generados cuando se realiza la compilacin del mismo.

Add File To Project: Permite agregar cualquier tipo de archivo relacionado a un


proyecto en desarrollo.

Remove File From Project: Borra un archivo especfico de un proyecto.


Import Project: Permite importar proyectos de versiones anteriores de
mikroBasic.

New Project: Abre el asistente para la creacin de nuevos proyectos.

Open Project: Abre un proyecto existente.

Save Project: Salva un proyecto activo en el entorno de desarrollo integrado.

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

Open Project Group: Abrir un grupo de proyectos: A travs de esta opcin


podremos abrir un grupo de proyectos previamente creado.

Close Project Group: Cerrar un grupo de proyectos.

Save Project As: Permite salvar un proyecto con un nombre diferente.

Recent Projects: Muestra un listado de los proyectos abiertos ltimamente.


Close Project: Cierra un proyecto activo.

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

Men Tools: Contiene todas las herramientas disponibles en mikroBasic.

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

1.6.- Componentes y operadores en mikroBasic.


1.6.1.- Subrutinas: Una subrutina se presenta como un algoritmo separado del algoritmo
principal, y estar destinado a resolver una tarea especfica. Las subrutinas pueden ser
referidas cada vez que sea necesario, llamando a la etiqueta que corresponde a sta, la cual
debe ir siempre al inicio de la misma.

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

1.17549435082 * 10-38 .. 6.80564774407 * 1038

Figura 1.67

El nombre de la variable es elegido por el programador y el tipo de variable se define segn


el tipo de dato que se desea almacenar temporalmente.
45
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

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.

1.6.4.- Constantes: Ayudan a identificar un valor constante en nuestro programa, facilitando


an ms la comprensin del mismo a la hora de verificar su funcionamiento. Las constantes
deben ser siempre declaradas al inicio de un programa, junto con las variables (rea de
declaracin).
La sintaxis para declarar una constante es la siguiente:
Const nombre de la constante As tipo = Valor
Ejemplo:
Const

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

1.6.5.- Alias: Proveen un nombre nico y especfico a elementos o variables dentro de


nuestro programa. Para definir un smbolo, utilizamos la palabra Symbol, seguida del alias
del elemento, el smbolo de igualdad =, y por ltimo el elemento en cuestin:
Symbol

{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

Veamos otros ejemplos:


Symbol

Relay = PORTB.0

Symbol

Sensor = PORTA.0

Symbol

LED

= PORTA.1

Symbol

RC0

= PORTC.0

1.6.6.- Operadores Aritmticos: Entre los operadores aritmticos ms utilizados tenemos


los que se muestran en la siguiente tabla:

Operadores

Operacin

Operandos

Resultado

Suma

byte, short, word, integer,


longint, longword, float

byte, short, word, integer,


longint, longword, float

Resta

byte, short, word, integer,


longint, longword, float

byte, short, word, integer,


longint, longword, float

multiplicacin

byte, short, word, integer,


longint, longword, float

word, integer, longint,


longword, float

Divisin, en punto flotante.

byte, short, word, integer,


longint, longword, float

float

div

Divisin, redondea hacia el


entero mas cercano.

byte, short, word, integer,


longint, longword

byte, short, word, integer,


longint, longword

mdulo, devuelve el resto de


la divisin entera (no se
byte, short, word, integer,
longint, longword
puede utilizar con punto
flotante)

byte, short, word, integer,


longint, longword

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

1.6.8.- Operadores de Comparacin: Los operadores de comparacin normalmente son


utilizados con la instruccin IfThem para realizar comparaciones entre variables o datos
extrados de alguna operacin aritmtica.

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

2.1.- Arquitectura bsica del microcontrolador PIC16F877.


Para iniciar con el estudio de la programacin en mikroBasic, nos plantearemos tres
objetivos que consideramos importantes para entrar en materia:

Familiarizarse con la arquitectura bsica de los microcontroladores que estaremos


empleando a lo largo de esta edicin.

Familiarizarse con la estructura de programa de mikroBasic, muy importante a la hora


de realizar un programa ordenado y libre de errores, por muy pequeo que este sea.

El estudio de las primeras prcticas, cortas y de fcil comprensin con el fin de


adquirir confianza en el uso de instrucciones y libreras de mikroBasic.

Arquitectura Bsica del microcontrolador PIC16F877:


Uno de los microcontroladores seleccionados para el estudio de la programacin de
microcontroladores en lenguaje Basic ha sido el PIC16F877. Veamos a continuacin
algunas de sus caractersticas tcnicas ms importantes:

CPU: Risc (Reduced Instruction Set Computer).

Frecuencia Mxima: 20 Mhz.

Memoria RAM: 368 x 8 Bytes de memoria de Datos.

EEPROM: 256 x 8 Bytes de memoria EEPROM de datos.

Memoria de programa Flash: 8KB x 14 Bits.

Proteccin de cdigo programable.

Voltaje de Operacin: 2.0 voltios a 5.5 voltios.

Bajo consumo de potencia: < 0.6 mA typical @ 3V, 4 Mhz / 20 A typical @ 3V, 32
kHz.

5 puertos digitales programables como entrada/salida: A, B, C, D, E.

1 conversor A/D de 8 canales x 10 Bits.

Puerto Serial Sncrono (SSP) con SPI e I2C.

49
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Puerto Serial Universal (USART/SCI).

2 Mdulos CCP (Capture, Compare, PWM)

3 Timers: Timer0 8 Bits contador/temporizador y pre-escalador de 8 Bits; Timer1 16


Bits contador/temporizador y pre-escalador; Timer2 8 Bits contador/temporizador con
registro de 8 Bits, pre-escalador y Post-Escalador.

Figura 2.1

50
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Descripcin de los pines del microcontrolador PIC16F877:

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

Descripcin del Pin


Reset y entrada de voltaje de programacin.
Pin de Entrada/Salida (I/O) del puerto A
Pin de Entrada/Salida (I/O) del puerto A
Pin de Entrada/Salida (I/O) del puerto A
Pin de Entrada/Salida (I/O) del puerto A
Pin de Entrada/Salida (I/O) del puerto A
Pin de Entrada/Salida (I/O) del puerto A
Pin de Entrada/Salida (I/O) del puerto E
Pin de Entrada/Salida (I/O) del puerto E
Pin de Entrada/Salida (I/O) del puerto E
Pin de Alimentacin de 5Vdc
Pin de Alimentacin a Tierra (GND)
Salida del oscilador a cristal.
Entrada del oscilador a cristal o fuente externa de reloj.
Pin de Entrada/Salida (I/O) del puerto C
Pin de Entrada/Salida (I/O) del puerto C
Pin de Entrada/Salida (I/O) del puerto C
Pin de Entrada/Salida (I/O) del puerto C
Pin de Entrada/Salida (I/O) del puerto D
Pin de Entrada/Salida (I/O) del puerto D
Pin de Entrada/Salida (I/O) del puerto D
Pin de Entrada/Salida (I/O) del puerto D
Pin de Entrada/Salida (I/O) del puerto C
Pin de Entrada/Salida (I/O) del puerto C
Pin de Entrada/Salida (I/O) del puerto C
Pin de Entrada/Salida (I/O) del puerto C
Pin de Entrada/Salida (I/O) del puerto D
Pin de Entrada/Salida (I/O) del puerto D
Pin de Entrada/Salida (I/O) del puerto D
Pin de Entrada/Salida (I/O) del puerto D
Pin de Alimentacin a Tierra (GND)
Pin de Alimentacin de 5Vdc
Pin de Entrada/Salida (I/O) del puerto B
Pin de Entrada/Salida (I/O) del puerto B
Pin de Entrada/Salida (I/O) del puerto B
Pin de Entrada/Salida (I/O) del puerto B
Pin de Entrada/Salida (I/O) del puerto B
Pin de Entrada/Salida (I/O) del puerto B
Pin de Entrada/Salida (I/O) del puerto B
Pin de Entrada/Salida (I/O) del puerto B

Figura 2.2

51
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

2.2.- El Oscilador externo.

Figura 2.3

Es un circuito indispensable para el funcionamiento del microcontrolador y el cual adems,


define la velocidad a la cual va a trabajar. Para hacer funcionar nuestro diseo podemos
elegir entre las siguientes cuatro opciones:

Oscilador LP: Oscilador de bajo consumo (Low Power).

Oscilador XT: Cristal / Resonador.

Oscilador HS: Oscilador de alta velocidad (High Speed).

Oscilador RC: Resistencia / Condensador.

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

La lectura de la frecuencia y perodo en este caso sera la siguiente:

Frecuencia: 3,972 Mhz


Perodo: 251,71 ns

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

La lectura de la frecuencia y perodo en este caso sera la siguiente:

Frecuencia: 3,999 Mhz

Perodo: 250,013 ns

El oscilador externo en modo RC resulta ser el ms sencillo de todos y por ende el ms


econmico. Su configuracin lo hace menos preciso debido a que existe una tolerancia de
error en sus componentes, sin olvidar tambin que la temperatura puede afectar la
operacin de este tipo de oscilador.
Los valores recomendados para este oscilador son los siguientes:

5 Kohm R1 100 Kohm

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

2.4.- Consideraciones tcnicas de diseo.


A continuacin veremos algunos circuitos bsicos que deben ser tomados en cuenta para el
desarrollo de prcticas con microcontroladores PIC. Estos circuitos son muy tiles cuando
deseamos visualizar el resultado de una accin programada en el microcontrolador.
2.4.1.- Estado Lgico de un pin I/O.
Una manera muy sencilla de ver el estado lgico de un pin configurado como salida en
cualquiera de los puertos de microcontrolador es a travs del uso de Leds, como se observa
en los circuitos de la figura 3.11.
En el circuito, el Led D1 se iluminar solo cuando el estado lgico del pin de salida del
puerto (RB1) sea igual a 1, es decir, 5 voltios.
El Led D2 se iluminar solo cuando el estado lgico de la salida del puerto (RB0) sea igual
a 0, es decir, 0 voltios.

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

2.4.2.- Lectura de un estado lgico en un pin I/O:


El microcontrolador tambin nos permite capturar datos o seales externas para luego ser
procesadas y convertidas en respuestas que pueden definir una accin especfica en
nuestros circuitos de prueba. Un ejemplo comn podra ser el uso de un pulsador para hacer
destellar un led cada vez que ste sea presionado.
Si deseamos introducir un nivel lgico bajo (0V), o alto (5V), a una de las entradas de un
microcontrolador a travs de un pulsador, podramos considerar los circuitos de la figura
2.12, los cuales nos proporcionan dos formas diferentes de hacerlo:

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

2.4.3.- El Opto-acoplador como dispositivo de enlace:


El opto-acoplador es un componente muy til cuando se requiere acoplar circuitos
electrnicos digitales con etapas de manejo de potencia o con otros circuitos.
Este componente en una de sus versiones, se compone bsicamente de un diodo LED el
cual se encarga de iluminar un fototransistor, para que ste conduzca corriente a travs del
colector.

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

2.4.4.- Fuente de poder, 5Vdc / 3.3Vdc:

En caso de no disponer de una fuente de poder regulada, proponemos la construccin de un


diseo sencillo que podemos implementar en todos los proyectos propuestos. En la figura
2.16 se puede observar el diseo de una fuente regulada con salidas de voltaje de +5 Vdc y
+3.3 Vdc:

Figura 2.16

61
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

2.5.- Configuracin de Puertos como Entrada o Salida en un microcontrolador PIC.


Como los pines de los puertos pueden ser configurados como entradas o como salidas,
es importante tomar en cuenta los registros de configuracin de puertos, los cuales para el
caso especfico del PIC16F877 son cinco:

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:

Si configuramos un Bit de un registro TRIS con un 1, el pin del puerto


correspondiente a este Bit se comportar como una entrada.

Si configuramos un Bit de un registro TRIS con un 0,


correspondiente a este Bit se comportar como una salida.

el pin del puerto

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

Un ejemplo de configuracin de los pines I/O del puerto A es el siguiente:

Registro TrisA
1
1
1

Bit menos
significativo

RA4 RA3 RA2 RA1 RA0

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

(% para expresar la configuracin en Binario), :

TrisA = $1E ($ para expresar la configuracin en Hexadecimal)

62
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Esto significa que el puerto A se comportar de la siguiente forma:

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

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

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.

RB1 a RB7 = Entradas.

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

2.6.- Primeros ejemplos de programacin en mikroBasic:


2.6.1.- Ejemplo de programacin #1: Un ejemplo sencillo para determinar que hemos
iniciado de forma correcta todo lo referente a la configuracin de un nuevo proyecto en
mikroBasic, es intentar realizar el encendido de uno o dos Leds a travs de uno de los
puertos disponibles en el microcontrolador. Normalmente los pasos que vamos a realizar
para lograr este objetivo son los pasos bsicos para realizar el resto de nuestros proyectos.
Estos pasos sern descritos a continuacin y el programa para el encendido de dos Leds
estar basado en el diagrama esquemtico de la figura 2.19.

Figura 2.19

Dos puntos importantes a considerar sobre este diagrama esquemtico son:

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

Empecemos con la creacin de un nuevo proyecto, siguiendo los pasos comentados en la


seccin Crear un nuevo proyecto en mikroBasic.
Una vez creado el proyecto podremos ver en el entorno de desarrollo integrado de
mikroBasic la siguiente ventana de programacin:

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

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

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:

' Programa Principal

TRISB = %11111100

' Configuracin del Puerto "B"

End.

Este paso se ver de la siguiente manera en la pantalla de nuestro PC:

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:

Para referirnos al Pin RB0: PortB.0 = (estado deseado del pin).

Para referirnos al Pin RB1: PortB.1 = (estado deseado del pin).

66
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Veamos:
program Ejemplo1
' Area de declaracin.
main:

' Programa Principal

TRISB = %11111100

' Configuracin del Puerto "B"

PORTB.0 = 1

' El Led D2 enciende con un "0".

PORTB.1 = 1

' El Led D1 enciende con un "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

2.6.2.- Ejemplo de programacin #2: En este ejemplo hemos cambiado el conexionado de


los Leds y hemos incluido dos pulsadores. P1 est conectado entre Vcc y una resistencia
Pull Down al igual que P2. El estado de los pulsadores ser medido a travs de los pines
RD0 y RD1 del puerto D.
Esto significa que debemos configurar los pines RD0 y RD1 como entradas a travs de
registro TRISD, para poder tomar lectura del estado en el cual se encuentran, de tal forma
que podamos tomar una decisin y generar una salida en los pines RB0 y RB1.
Es importante observar que cuando los dos pulsadores se encuentran normalmente
abiertos, el estado de los pines es el siguiente:

RD0 = 0
RD1 = 0

Al presionar cada pulsador, el estado en estos pines cambia:

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.

El Led D1, enciende cuando presionamos el pulsador P1.


El Led D2, enciende cuando presionamos el pulsador P2.

Analicemos el siguiente programa leyendo detenidamente cada lnea de cdigo y sus


respectivos comentarios:
program Ejemplo2
' Area de declaracin.

main:

'

Programa Principal.

TRISB = %11111100 ' Configuracin del Puerto "B"


TRISD = %11111111 ' Configuracin del Puerto "D"

PORTB.0 = 0

' Inicializamos el pin RB0, para asegurar que el


' el Led D1 est apagado.

PORTB.1 = 0

' Inicializamos el pin RB1, para asegurar que el


' el Led D2 est apagado.

Pulsadores:
If PortD.0 = 1 Then
GoSub Led1
End If

' Verificamos el estado del pulsador "P1".


' Si P1 es presionado, llama a la subrutina "Led1".

If PortD.1 = 1 Then
GoSub Led2
End If

' Verificamos el estado del pulsador "P2".


' Si P1 es presionado, llama a la subrutina "Led2".

GoTo Pulsadores

' Salta a la etiqueta "Pulsadores" para iniciar el


' proceso de verificacin de los pulsadores.

Led1:
PORTB.0 = 1
delay_ms(2000)
PORTB.0 = 0
Return

'
'
'
'

Enciende el Led D1, conectado en RB0


Hace una pausa de 2 segundos o 2000 milisegundos.
Apaga el Led D1.
Retorno del llamado Gosub.

'
'
'
'

Enciende el Led D2, conectado en RB1


Hace una pausa de 2 segundos o 2000 milisegundos.
Apaga el Led D2.
Retorno del llamado Gosub.

Led2:
PORTB.1 = 1
delay_ms(2000)
PORTB.1 = 0
Return
End.

Para comprobar su correcto funcionamiento, compilamos el programa y grabamos el


microcontrolador PIC. Observe siempre la ventana de errores de mikroBasic; esta ventana
provee buena informacin en caso de errores de sintaxis en el cuerpo del programa.

70
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Si todo ha funcionado correctamente, pasaremos ahora a mejorar la estructura del programa


haciendo uso de Alias, a travs de los cuales daremos nombres a los pines de los puertos
que estamos utilizando en el circuito. Es decir, en vez de dirigirnos a ellos como PortB.0,
PortB.1, PortD.0 y PortD.1, sustituiremos estos por los siguientes Alias:

El pin RB0 PortB.0 lo llamaremos D1


El pin RB1 PortB.1 lo llamaremos D2
El pin RD0 PortD.0 lo llamaremos P1
El pin RD1 PortD.1 lo llamaremos P2

Verifique estos cambios en el siguiente cdigo de programa:


program Ejemplo2
' Area de declaracin.
Symbol D1 = PORTB.0
Symbol D2 = PORTB.1

' Alias del Pin RB0


' Alias del Pin RB1

Symbol P1 = PortD.0
Symbol P2 = PortD.1

' Alias del Pin RD0


' Alias del Pin RD1

main:

'

Programa Principal.

TRISB = %11111100 ' Configuracin del Puerto "B"


TRISD = %11111111 ' Configuracin del Puerto "D"
D1 = 0

' Inicializamos el pin RB0, para asegurar que el


' el Led D1 est apagado.

D2 = 0

' Inicializamos el pin RB1, para asegurar que el


' el Led D2 est apagado.

Pulsadores:
If P1 = 1 Then
GoSub Led1
End If

' Verificamos el estado del pulsador "P1".


' Si P1 es presionado, llama a la subrutina "Led1".

If P2 = 1 Then
GoSub Led2
End If

' Verificamos el estado del pulsador "P2".


' Si P1 es presionado, llama a la subrutina "Led2".

GoTo Pulsadores

' Salta a la etiqueta "Pulsadores" para iniciar el


' proceso de verificacin de los pulsadores.

Led1:
D1 = 1
delay_ms(2000)
D1 = 0
Return

'
'
'
'

Enciende el Led D1, conectado en RB0


Hace una pausa de 2 segundos o 2000 milisegundos.
Apaga el Led D1.
Retorno del llamado Gosub.

'
'
'
'

Enciende el Led D2, conectado en RB1


Hace una pausa de 2 segundos o 2000 milisegundos.
Apaga el Led D2.
Retorno del llamado Gosub.

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)

Puerto: En este campo debemos especificar en cual de los puertos estaremos


conectando el pulsador o interruptor.

Pin: Este campo representa un pin especfico del puerto que estaremos utilizando
para tomar lectura de un pulsador o interruptor.

Tiempo: Este campo es un perodo de anti-rebote en milisegundos. Este valor puede


variar entre 1 y 255. Cada unidad de tiempo mide aproximadamente 0.98
milisegundos, por lo tanto, si usamos el valor mximo para el perodo de anti-rebote,
es decir 255, el tiempo de anti-rebote ser de 250 milisegundos.

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

' Alias del Pin RB0


' Alias del Pin RB1

Dim Estado As Byte


main:

'

Programa Principal.

TRISB = %11111100 ' Configuracin del Puerto "B"


TRISD = %11111111 ' Configuracin del Puerto "D"
D1 = 0

' Inicializamos el pin RB0, para asegurar que el


' el Led D1 est apagado.

D2 = 0

' Inicializamos el pin RB1, para asegurar que el


' el Led D2 est apagado.

Pulsadores:
Estado = Button(PortD, 0, 255, 1) ' Verificamos si P1 fue presionado, estado activo = 1.
If Estado = 255 Then
GoSub Led1
End If

' Verificamos el resultado de la rutina Button.


' Si P1 es presionado, llama a la subrutina "Led1".

72
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Estado = Button(PortD, 1, 255, 1) ' Verificamos si P2 fue presionado, estado activo = 1.


If Estado = 255 Then
GoSub Led2
End If

' Verificamos el resultado de la rutina Button.


' Si P1 es presionado, llama a la subrutina "Led2".

GoTo Pulsadores

' Salta a la etiqueta "Pulsadores" para iniciar el


' proceso de verificacin de los pulsadores.

Led1:
D1 = 1
delay_ms(1000)
D1 = 0
Return

'
'
'
'

Enciende el Led D1, conectado en RB0


Hace una pausa de 1 segundo o 1000 milisegundos.
Apaga el Led D1.
Retorno del llamado Gosub.

'
'
'
'

Enciende el Led D2, conectado en RB1


Hace una pausa de 1 segundo o 1000 milisegundos.
Apaga el Led D2.
Retorno del llamado Gosub.

Led2:
D2 = 1
delay_ms(1000)
D2 = 0
Return
End.

Observando los cambios realizados en el programa, tenemos que:

Hemos eliminado los Alias de los pulsadores.

Declaramos la variable Estado tipo Byte, para almacenar el estado de la rutina


Button. Si un pulsador permanece activo durante el tiempo de anti-rebote
especificado, la rutina Button nos devolver el valor 255 el cual es almacenado en
la variable Estado.

Evaluamos el contenido de la variable Estado y seguidamente tomamos una


decisin con respecto al puerto de salida.

Para comprender mejor el funcionamiento de esta rutina, analizaremos la seal generada


por el pulsador y la salida generada por el microcontrolador para encender o apagar los
Leds.
En la siguiente imagen, hemos representado el estado del pulsador P1 en el canal Rojo del
osciloscopio, y el Led D1 en el canal Verde del osciloscopio.

Cuando activamos momentneamente el pulsador P1, pero no lo mantenemos activo el


tiempo suficiente para cumplir con el perodo de tiempo de anti-rebote, ocurre que el valor
devuelto por la rutina Button es igual a cero (0). En este caso, podremos observar que en
la salida correspondiente al Led D1 no hay actividad alguna, como lo demuestra la figura
2.26.

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

El canal verde de la figura 2.27 muestra un pulso de 1 segundo de duracin, generado


desde la subrutina Led1 del programa.
Si medimos con el osciloscopio el tiempo de anti-rebote, podremos observar que es igual o
aproximado a 250 milisegundos:

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.

Tambin es posible utilizar la rutina Button de la siguiente manera:


program Ejemplo_3_1
' Area de declaracin.
Symbol D1 = PORTB.0
Symbol D2 = PORTB.1
main:

'

' Alias del Pin RB0


' Alias del Pin RB1

Programa Principal.

TRISB = %11111100 ' Configuracin del Puerto "B"


TRISD = %11111111 ' Configuracin del Puerto "D"
D1 = 0

' Inicializamos el pin RB0, para asegurar que el


' el Led D1 est apagado.

D2 = 0

' Inicializamos el pin RB1, para asegurar que el


' el Led D2 est apagado.

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

' Si P1 es presionado, llama a la subrutina "Led1".

If Button(PortD, 1, 255, 1) Then ' Verificamos si P2 fue presionado, estado activo = 1.


GoSub Led2
' Si P1 es presionado, llama a la subrutina "Led2".
End If
GoTo Pulsadores

' Salta a la etiqueta "Pulsadores" para iniciar el


' proceso de verificacin de los pulsadores.

Led1:
D1 = 1
delay_ms(1000)
D1 = 0
Return

'
'
'
'

Enciende el Led D1, conectado en RB0


Hace una pausa de 1 segundo o 1000 milisegundos.
Apaga el Led D1.
Retorno del llamado Gosub.

'
'
'
'

Enciende el Led D2, conectado en RB1


Hace una pausa de 1 segundo o 1000 milisegundos.
Apaga el Led D2.
Retorno del llamado Gosub.

Led2:
D2 = 1
delay_ms(1000)
D2 = 0
Return
End.

Observe que hemos eliminado la variable Estado en el programa y hemos simplificado la


subrutina Pulsadores.

76
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Capitulo III. Pantallas LCD y GLCD

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.

Pantalla LCD Alfanumrica

Pantalla Grfica GLCD

3.1.- Pantallas LCD, estudio de la librera LCD de mikroBasic.


El primer paso siempre ser tener un diagrama de pines de la pantalla LCD y a su vez definir
de una vez el conexionado con los puertos del microcontrolador, incluso antes de realizar
cualquier programacin. Al hacer esto, entonces tendremos una base sobre la cual trabajar
el programa, en el cual debemos definir los pines de conexin de la misma, de manera que
el microcontrolador sepa donde dirigir la informacin y las instrucciones que controlarn
estos mdulos.
3.1.1.- Identificacin de los pines de una pantalla LCD: Veamos a continuacin la
descripcin de cada uno de los pines de una pantalla LCD:

Figura 3.1. Pinout de un mdulo LCD con


conexin a Vcc, Gnd y Control de contraste.

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

mximo comnmente soportado es de 5 Vdc. El Pin No.3 corresponde al control de


contraste de la pantalla.
Pin 4: "RS" (trabaja paralelamente al Bus de datos del modulo LCD, Pines 7 al 14, es decir,
cuando RS es cero, el dato presente en el bus corresponde a un registro de control o
instruccin, pero cuando RS es uno, el dato presente en el bus corresponde a un registro de
datos o caracter alfanumrico.
Pin 5: "R/W" (Read/Write), este pin es utilizado para leer un dato desde la pantalla LCD o
para escribir un dato en la pantalla LCD. Si R/W = 0, esta condicin indica que podemos
escribir un dato en la pantalla. Si R/W = 1, esta condicin nos permite leer un dato desde la
pantalla LCD.
Pin 6: "E" (Enable), este es el pin de habilitacin, es decir, si E = 0 el mdulo LCD se
encuentra inhabilitado para recibir datos, pero si E = 1, el mdulo LCD se encuentra
habilitado para trabajar, de tal manera que podemos escribir o leer desde el modulo LCD.
Pin 7 al14: "Bus de Datos, el Pin 7 hasta el Pin 14 representan 8 lneas que se utilizan para
colocar el dato que representa una instruccin para el modulo LCD o un carcter
alfanumrico.
Pin 15-16: "BackLight", en muchos modelos de LCD, los pines 15 y 16 son respectivamente
el nodo y el Ctodo, aunque se pueden encontrar en el mercado modelos de pantallas
LCD donde esta condicin es configurable desde la parte posterior del circuito impreso a
travs de Jumpers, o conexiones donde podemos invertir los Pines, de manera tal que el
Pin 15 sea el Ctodo y el Pin 16 el nodo, como se muestra en la figura 3.2.

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:

La primera configuracin es a 4 bits de datos, lo cual reduce a la mitad la cantidad de


pines a ser utilizados en un puerto de un microcontrolador PIC. MikroBasic cuenta con
una librera para el control de pantallas LCD a 4 bits, denominada LCD Library.

La segunda configuracin posible es a 8 bits de datos, lo cual requiere que conectemos


todos los pines del bus (D0 hasta D7 en la pantalla LCD), en uno de los puertos
disponibles de un microcontrolador PIC. Esta configuracin ser descartada en esta
ocasin, ya que la idea es optimizar los recursos disponibles en nuestro hardware
utilizando la menor cantidad de puertos en nuestros circuitos.

Comenzaremos a realizar las prcticas basadas en la configuracin de 4 bits, como se


sugiere en el siguiente diagrama esquemtico. Diagrama de conexin entre un mdulo LCD
y un PIC16F877 en configuracin de 4 bits:

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:

' 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

' Fin de la configuracin de conexiones

La configuracin anterior puede ser interpretada de la siguiente manera:


Pin de Control en la LCD: RS
Pin de Control en la LCD: E

PortB.4
PortB.5

Pin de datos en la LCD: D4


Pin de datos en la LCD: D5
Pin de datos en la LCD: D6
Pin de datos en la LCD: D7

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

Mueve el cursor a la primera columna

_Lcd_Second_Row

Mueve el cursor a la segunda columna

_Lcd_Third_Row

Mueve el cursor a la tercera columna

_Lcd_Fourth_Row

Mueve el cursor a la cuarta columna

_Lcd_Clear

Limpia la pantalla LCD

_Lcd_Return_Home

Cursor a la posicin de inicio

_Lcd_Cursor_Off

Apaga el cursor en la pantalla LCD

_Lcd_Underline_On

Cursor Underline encendido

_Lcd_Blink_Cursor_On

Activa la intermitencia en el cursor

_Lcd_Move_Cursor_Left

Mueve el cursor a la izquierda sin alterar el contenido de la RAM

_Lcd_Move_Cursor_Right Mueve el cursor a la derecha sin alterar el contenido de la RAM


_Lcd_Turn_On

Activa o enciende la pantalla LCD

_Lcd_Turn_Off

Desactiva o apaga la pantalla LCD

_Lcd_Shift_Left

Desplazamiento a la izquierda sin alterar el contenido de la RAM

_Lcd_Shift_Right

Desplazamiento a la derecha sin alterar el contenido de la RAM

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.

3.1.5.- Lcd_Out(Fila, Columna, Texto)


La rutina Lcd_Out() nos permite escribir en una posicin especfica de la pantalla LCD, su
estructura es muy sencilla y se ve como sigue a continuacin:
Ejemplo:
Lcd_Out(1, 4, mikroBasic)
Este ejemplo se interpreta de la siguiente forma: Escribir la palabra mikroBasic (sin incluir
las comillas) en la lnea 1 de la pantalla, empezando en la columna 4.
Si deseamos escribir en la segunda lnea de la pantalla, pero a partir de la primera columna,
entonces el cambio en la rutina sera el siguiente:
Lcd_Out(2, 1, mikroBasic)
81
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

3.1.5.1.- Ejemplo de programacin #4: Veamos a continuacin un ejemplo de


programacin, basados en el diagrama esquemtico 3.3, y utilizando las rutinas hasta ahora
comentadas:
program Proyecto_LCD_1
' 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

' Fin de la configuracin de conexiones


main: '

Programa Principal

LCD_Init()
LCD_Cmd(_LCD_CLEAR)

' Limpia la pantalla LCD

LCD_Cmd(_LCD_CURSOR_OFF)

' Apaga el cursor en la pantalla

Delay_ms(1000)

' Retardo de 1 segundo

LCD_Out(1,4,"mikroBasic")

' Imprime en la linea 1 y columna 4

End.

El resultado de este ejemplo se puede observar en la figura 3.5.

Figura 3.5

Antes de compilar y analizar el programa, es importante verificar si la librera LCD ha sido


incluida al crear el proyecto. Esto lo sabremos fcilmente desplegando la pestaa del
administrador de libreras, en la cual debern estar seleccionadas las libreras
correspondientes a este ejercicio:

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.

Inicializamos la pantalla LCD a travs de la rutina LCD_Init().

Limpiamos la pantalla LCD con el comando correspondiente, segn la tabla de la


figura 3.4.

Apagamos el cursor en la pantalla.

Hacemos una pausa de 1000 milisegundos o 1 segundo.

Escribimos la palabra mikroBasic en la lnea 1, columna 4 de la pantalla LCD.


84

_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

3.1.5.2.- Ejemplo de programacin #5:


Veamos otro ejemplo utilizando otros comandos de la tabla:
program Proyecto_LCD_2
' Seccin de Declaracin
Dim I As Byte
' 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

' Fin de la configuracin de conexiones


main: '

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)

' Retardo de 2 segundo


' Encendemos el Cursor en la Pantalla LCD

Delay_ms(3000)

' Retardo de 3 segundo

For I = 0 To 10

'
'
'
'

Lazo For-Next para realizar 10 repeticiones


del siguiente comando:
Mueve el cursor un espacio a la Izquierda
Retardo de 300 milisegundos

'
'
'
'

Lazo For-Next para realizar 10 repeticiones


del siguiente comando:
Mueve el cursor un espacio a la derecha
Retardo de 300 milisegundos

LCD_Cmd(_Lcd_Move_Cursor_Left)
Delay_ms(300)

Limpia la pantalla LCD


Apaga el cursor en la pantalla
Retardo de 1 segundo
Imprime en la linea 1 y columna 4

Next I
For I = 0 To 10
LCD_Cmd(_Lcd_Move_Cursor_Right)
Delay_ms(300)
Next I
Delay_ms(1000)

' Retardo de 1 segundo

Lcd_Cmd(_Lcd_Turn_Off)
delay_ms(2000)
GoTo main

' Apagamos la pantalla LCD


' Retardo de 2 segundos
' Salto a la etiqueta 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

apagamos la pantalla LCD a travs del comando _Lcd_Turn_Off, esperamos 2 segundos y


comenzamos el proceso haciendo un salto a la etiqueta main.
Tambin podemos desplazar el contenido impreso en la pantalla LCD hacia la izquierda o
hacia la derecha, utilizando los dos ltimos comandos de la figura 3.4:

_Lcd_Shift_Left
_Lcd_Shift_Right

3.1.5.3.- Ejemplo de programacin #5.1: Verifique el siguiente programa y lea


detenidamente sus comentarios. Rpidamente podr notar los cambios con respecto al
ejemplo anterior:
program Proyecto_LCD_3
' Seccin de Declaracin
Dim I As Byte
' 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

' Fin de la configuracin de conexiones


main:
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Inicializamos la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

Delay_ms(1000)
LCD_Out(1,4,"mikroBasic")

' Retardo de 1 segundo


' Imprime en la fila 1 y columna 4

Delay_ms(2000)
LCD_Cmd(_Lcd_Blink_Cursor_On)

' Retardo de 2 segundo

Delay_ms(3000)

' Retardo de 3 segundo

For I = 0 To 10

'
'
'
'

Lazo For-Next para realizar 10 repeticiones


del siguiente comando:
desplaza el contenido hacia la Izquierda
Retardo de 300 milisegundos

'
'
'
'

Lazo For-Next para realizar 10 repeticiones


del siguiente comando:
desplaza el contenido hacia la derecha
Retardo de 300 milisegundos

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)

' Retardo de 1 segundo

Lcd_Cmd(_Lcd_Turn_Off)
delay_ms(2000)
GoTo main

' Apagamos la pantalla LCD


' Retardo de 2 segundos
' Salto a la etiqueta 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.

3.1.6.1.- Ejemplo de programacin #6:


program Proyecto_LCD_4
' 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

' Fin de la configuracin de conexiones


main:
LCD_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)

' Inicializamos la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

Delay_ms(1000)
LCD_Out(1,3,"mikro")

' Retardo de 1 segundo


' Imprime en la fila 1 y columna 3

LCD_Cmd(_Lcd_Move_Cursor_Right)

' Mueve el cursor un espacio a la derecha

Lcd_Out_Cp("Basic")

' Imprime la palabra "Basic" en la posicin


' en la cual qued el cursor

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

' Fin de la configuracin de conexiones


main:
LCD_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)

' Inicializa la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

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

El resultado ser el siguiente:

Figura 3.9

3.2.- Parmetros de rutinas cargados en variables:


Los parmetros de las rutinas son los campos que debemos completar dentro de ellas, para
obtener un resultado especfico segn la funcin para la cual ha sido creada. Por ejemplo,
los parmetros dentro de la rutina Lcd_Out(fila, columna, texto) los cuales hemos
estudiado anteriormente, pueden ser cargados en forma de variables, y el tipo de variable
a definir depender de sus funciones especficas dentro de la misma. Para visualizar este
concepto de forma clara, supongamos que deseamos imprimir en la primera lnea de la
pantalla e iniciando en la primera columna la palabra mikro. La forma ms directa y sencilla
de hacer esto sera:
LCD_Out(1,1,"mikro")

' Imprime en la linea 1 y columna 3

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

3.2.1.- Ejemplo de programacin #8:


program Proyecto_LCD_6
' Seccin de Declaracin
Dim fila As Byte
columna As Byte

' declaracin de la variable "fila" tipo byte


' declaracin de la variable "columna" tipo byte

' 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

' Fin de la configuracin de conexiones


main:
fila = 1
columna = 3

' cargamos la variable con el numero de la fila


' cargamos la variable con el numero de la columna

LCD_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)

' Inicializamos la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

Delay_ms(1000)

' Retardo de 1 segundo

LCD_Out(fila,columna,"mikro Basic")

' Imprime en la fila 1, columna 3

LCD_Cmd(_Lcd_Move_Cursor_Right)

' Mueve el cursor un espacio a la derecha

Lcd_Out_Cp("Basic")

' Imprime la palabra "Basic" en la posicin


' en la cual qued el cursor

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

3.2.2.- Ejemplo de programacin #9:


program Proyecto_LCD_7
' Seccin de Declaracin
Dim fila
columna
texto1
texto2

As
As
As
As

Byte
Byte
string[8]
string[8]

'
'
'
'

declaracin de la variable "fila" tipo byte


declaracin de la variable "columna" tipo byte
Variable tipo String "texto1"
Variable tipo String "texto2"

' 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

' Fin de la configuracin de conexiones


main:
fila = 1
' cargamos la variable
columna = 3
' cargamos la variable
texto1 = "mikro"
' cargamos el texto
texto2 = "Basic"
' cargamos el texto

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)

' Inicializamos la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

Delay_ms(1000)

' Retardo de 1 segundo

LCD_Out(fila,columna,texto1)

' Imprime en la fila 1, columna 3

LCD_Cmd(_Lcd_Move_Cursor_Right)
Lcd_Out_Cp(texto2)

' Mueve el cursor un espacio a la derecha


' Imprime la palabra "Basic" en la posicin
' en la cual qued el cursor

End.

Figura 3.10

91
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

3.3.- Imprimir el contenido de una variable numrica en una pantalla LCD:


Es muy importante tomar en cuenta que para visualizar el contenido de una variable
numrica a travs de la pantalla LCD, debemos seguir un procedimiento sencillo el cual
involucra una de las libreras de mikroBasic denominada Conversions.
Esta librera contiene varias rutinas a travs de las cuales podremos convertir el contenido
de una variable en un string de datos, los cuales podrn ser presentados en la pantalla con
la ayuda de la rutina Lcd_Out(), tal y como lo estudiamos en el ejemplo de programacin #9.
Para comprender de forma clara este punto, supongamos que se desea visualizar el
contenido numrico de las siguientes variables en la pantalla LCD:
' Area de declaracin.
Dim Var_1 As Byte
Var_2 As Word
Var_3 As Float

.
.
main:

' Programa Principal.


Var_1 = 127
Var_2 = 15000
Var_3 = 3.1416

.
.
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

Incompatible types (complex type to simples type)

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:

ByteToStr(variable tipo Byte a convertir, variable tipo string): convierte una


variable tipo Byte en una cadena de caracteres los cuales sern almacenados en
una variable tipo string previamente declarada.

WordToStr(variable tipo Word a convertir, variable tipo string): convierte una


variable tipo Word en una cadena de caracteres los cuales sern almacenados en
una variable tipo string previamente declarada.
92

_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

FloatToStr(variable tipo Float a convertir, variable tipo string): convierte una


variable tipo Float en una cadena de caracteres los cuales sern almacenados en
una variable tipo string previamente declarada.

IntToStr(variable tipo Integer a convertir, variable tipo string): convierte una


variable tipo Integer en una cadena de caracteres los cuales sern almacenados en
una variable tipo string previamente declarada.

Veamos a continuacin un ejemplo de conversin de datos almacenados en tres diferentes


tipos de variables, Byte, Word y Float.

3.3.1.- Ejemplo de programacin #10:


program Proyecto_LCD_8
' Seccin de Declaracin
Dim Var_1
Var_2
Var_3
Txt

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.

' 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

' Fin de la configuracin de conexiones


main:
Var_1 = 127
Var_2 = 15000
Var_3 = 3.14159265

' Inicializamos la variable Var_1.


' Inicializamos la variable Var_2.
' Inicializamos la variable Var_3.

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)

' Inicializamos la pantalla LCD.


' Limpia la pantalla LCD.
' Apaga el cursor en la pantalla.
")

Delay_ms(2000)
Lcd_Out(1, 1, "Variable Word:
WordToStr(Var_2, Txt)
LCD_Out(2, 6, Txt)
Delay_ms(2000)

' Imprime mensaje en la pantalla LCD.


' Convierte el contenido de la variable.
' Imprime en la fila 1, columna 1.
' Retardo de 2 segundos.

")

' Imprime mensaje en la pantalla LCD.


' Convierte el contenido de la variable.
' Imprime en la fila 1, columna 1.
' Retardo de 2 segundos.

93
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Lcd_Out(1, 1, "Variable Float:


FloatToStr(Var_3, Txt)
LCD_Out(2, 5, Txt)

")

' Imprime mensaje en la pantalla LCD.


' Convierte el contenido de la variable.
' Imprime en la fila 1, columna 1.

Delay_ms(2000)

' Retardo de 2 segundos.

GoTo Variables

' Salta a la etiqueta Variables.

End.

3.3.2.- Ejemplo de programacin #11:


Para hacer un poco ms interesante la tarea de mostrar datos en la pantalla LCD, vamos a
agregar un par de pulsadores normalmente abiertos en el puerto D del microcontrolador.
Especficamente en los puertos RD0 y RD1, los cuales debemos de configurar como
entrada, y los cuales cuentan adems con una resistencia Pull Down de 10 kohm, como se
demuestra en el siguiente diagrama esquemtico:

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

Puerto B: se inicializa segn la configuracin de la pantalla LCD, la cual en este caso


se mantiene con respecto al diagrama esquemtico 3.11.

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.

La segunda condicin al pulsar P2 para disminuir el valor cargado en la variable es:


cuando la variable dato sea igual a cero (0), actualizamos su valor a uno (1), de tal
manera que su valor mnimo a ser mostrado en la pantalla siempre sea igual a uno
(1), el cual es el lmite inferior propuesto.

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

tipo String "texto1"


tipo String "texto2"
de contenido temporal tipo String
tipo Byte para cargar datos

' 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

' Fin de la configuracin de conexiones


TRISD = $FF

' Configuracin del puerto C como entrada.

main:
dato = 25
texto1 = "P1 Suma P2 Resta"
texto2 = "Dato = "

' cargamos el texto en la variable


' cargamos el texto en la variable

95
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

LCD_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)

' Inicializamos la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

LCD_Out(1, 1,texto1)

' Imprime en la fila 1, columna 1

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)

'
'
'
'

Imprime en la fila 1, columna 1


Convierte el valor numrico en String.
Imprime el contenido cargado en "txt" en la fila 2,
columna 8.

'
'
'
'
'

Verifica si la condicin expresada se cumple,


es decir, pregunta si RD0 fue presionado. Si
RD0 no es igual a 1, significa que el pulsador P1 no
ha sido presionado, por lo tanto no se ejecutan las
instrucciones dentro de while-wend.

'
'
'
'

Incrementa en una unidad el valor de la variable "dato"


Realiza una pausa de 300 milisegundos para evitar que
el incremento de la variable sea muy acelerado mientras
el pulsador P1 est presionado.

ByteToStr(dato, txt)' Convierte el valor numrico en String.


Lcd_Out(2, 8, txt) ' Imprime el contenido cargado en "txt" en la fila 2,
' columna 8.
If dato = 51 Then

' Fijamos un lmite superior (50) a la variable dato y se


' se interpreta asi: si dato es igual a 51, entonces
' volvemos a hacer a "dato" igual a 50:

dato = 50
End If
Wend
While PortD.1 = 1

dato = dato - 1
delay_ms(300)

'
'
'
'
'

Verifica si la condicin expresada se cumple,


es decir, pregunta si RD1 fue presionado. Si
RD0 no es igual a 1, significa que el pulsador P2 no
ha sido presionado, por lo tanto no se ejecutan las
instrucciones dentro de while-wend.

'
'
'
'

Decrementa en una unidad el valor de la variable "dato"


Realiza una pausa de 300 milisegundos para evitar que
el decremento de la variable sea muy acelerado mientras
el pulsador P1 est presionado.

ByteToStr(dato, txt)' Convierte el valor numrico en String.


Lcd_Out(2, 8, txt) ' Imprime el contenido cargado en "txt" en la fila 2,
' columna 8.
If dato = 0 Then

' Fijamos un lmite inferior (1) a la variable dato y se


' se interpreta asi: si dato es igual a 0, entonces
' volvemos a hacer a "dato" igual a 1:

dato = 1
End If
Wend
Wend
End.

96
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Al compilar y grabar este ejemplo en el microcontrolador, el resultado inicial ser el que


vemos en la siguiente figura:

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)

' Imprime en la fila 1, columna 1

ByteToStr(dato, txt)
Lcd_Out(2, 8, txt)

' Convierte el valor numrico en String.


' Imprime el contenido cargado en "txt" en la fila 2,
' columna 8.

While PortD.0 = 1

.
.
.

Se observa adems en el programa que estamos realizando una conversin de la variable


que almacena el dato, de byte a string, debido a que no podemos representar directamente
el contenido de una variable tipo byte como caracteres ASCII en la pantalla LCD.

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

Lo siguiente ser verificar si al presionar P1, la variable dato aumenta su valor:

While PortD.0 = 1

dato = dato + 1
delay_ms(300)

'
'
'
'
'

Verifica si la condicin expresada se cumple,


es decir, pregunta si RD0 fue presionado. Si
RD0 no es igual a 1, significa que el pulsador P1 no
ha sido presionado, por lo tanto no se ejecutan las
instrucciones dentro de while-wend.

'
'
'
'

Incrementa en una unidad el valor de la variable "dato"


Realiza una pausa de 300 milisegundos para evitar que
el incremento de la variable sea muy acelerado mientras
el pulsador P1 est presionado.

ByteToStr(dato, txt)' Convierte el valor numrico en String.


Lcd_Out(2, 8, txt) ' Imprime el contenido cargado en "txt" en la fila 2,
' columna 8.

98
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

If dato = 51 Then

' Fijamos un lmite superior (50) a la variable dato y se


' se interpreta asi: si dato es igual a 51, entonces
' volvemos a hacer a "dato" igual a 50:

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

3.3.3.- Ejemplo de programacin #12:

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

Al accionar el pulsador P1, se deber mostrar el siguiente submen (figura 3.15), el


cual deber permanecer visible durante 5 segundos para luego retornar al men
inicial:

Figura 3.15

Al accionar el pulsador P2, se deber mostrar el siguiente submen (figura 3.16), el


cual tambin deber permanecer visible durante 5 segundos para luego retornar al
men inicial:

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

' Alias para RD0


' Alias para RD1

Dim texto1
texto2

' Variable tipo String "texto1"


' Variable tipo String "texto2"

As string[16]
As string[16]

' 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

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

LCD_D6_Direction As sbit At TRISB2_bit


LCD_D7_Direction As sbit At TRISB3_bit
' Fin de la configuracin de conexiones
TRISD = $FF

' Configuracin del puerto D como entrada.

main:
LCD_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)

' Inicializamos la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

Delay_ms(1000)

' Retardo de 1 segundo

menu:
texto1 = "P1: Ver Mensaje1"
texto2 = "P2: Ver Mensaje2"

' cargamos el texto en la variable


' cargamos el texto en la variable

LCD_Out(1, 1,texto1)
LCD_Out(2, 1,texto2)

' Imprime en la fila 1, columna 1


' Imprime en la fila 1, columna 1

If Pulsador_1 = 1 Then
GoSub menu1
End If

' Pregunta si RD0 fue presionado.


' Si fu presionado, salta a la subrutina "menu1"

If Pulsador_2 = 1 Then
GoSub menu2
End If

' Pregunta si RD1 fue presionado.


' Si fu presionado, salta a la subrutina "menu2"

GoTo menu

' Repite el proceso a partir de la etiqueta "menu"

menu1:
texto1 = "
Menu #1
"
texto2 = "Mensaje #1 aqui!"

' cargamos el texto en la variable


' cargamos el texto en la variable

LCD_Out(1, 1,texto1)
LCD_Out(2, 1,texto2)
delay_ms(5000)

' Imprime en la fila 1, columna 1


' Imprime en la fila 1, columna 1
' Retardo o pausa de 5 segundos

Return

' retorna a la siguiente linea despues del ltimo llamado


' a la etiqueta "menu1"

menu2:
texto1 = "
Menu #2
"
texto2 = "Mensaje #2 aqui!"

' cargamos el texto en la variable


' cargamos el texto en la variable

LCD_Out(1, 1,texto1)
LCD_Out(2, 1,texto2)
delay_ms(5000)

' Imprime en la fila 1, columna 1


' Imprime en la fila 1, columna 1
' Retardo o pausa de 5 segundos

Return

' retorna a la siguiente linea despues del ltimo llamado


' a la etiqueta "menu2"

End.

101
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Analizando el programa tenemos que:

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.

Declaracin de las variables en las cuales deseamos almacenar el texto a ser


mostrado en la pantalla LCD.

Configuracin de pines de la pantalla LCD con respecto al puerto elegido en el


microcontrolador.
Inicializamos y limpiamos la pantalla, apagamos el cursor y realizamos una pausa de
1 segundo.

Cargamos el mensaje del men principal en las variables designadas para cada lnea
de la pantalla LCD.

Imprimimos el contenido de las variables en la pantalla LCD, en las posiciones


especificadas en la rutina Lcd_Out.

Preguntamos si algunos de los pulsadores ha accionado. Si uno de ellos fue


accionado, se realiza un salto con retorno a la rutina correspondiente. Si ninguno ha
sido accionado, se repite todo el proceso a partir de la etiqueta menu.

102
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

3.4.- Pantalla Grfica o GLCD (Graphic Liquid Crystal Display).


MikroBasic cuenta con libreras para el control de pantallas GLCD, facilitando la tarea y
haciendo que nuestros proyectos se vean mejor, ofreciendo adems funciones que no
podramos tener con una pantalla alfanumrica convencional.
Por su puesto, el uso de una pantalla grfica se justifica cuando es necesario incluir en
nuestros proyectos mas espacio para la visualizacin de datos, sin dejar atrs el hecho de
que podremos realizar grficos o dibujos que complementen dicha informacin, y los cuales
nunca podremos realizar en una pantalla alfanumrica convencional.
Para realizar el estudio de estas libreras, hemos realizado el siguiente diagrama de
conexin entre un mdulo GLCD y un microcontrolador PIC16F877.
La pantalla GLCD utilizada para estos ejemplos es la LGM12864B-NSW-BBS, la cual se
puede adquirir al igual que muchos otros componentes en http://www.mikroe.com

Figura 3.17

103
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

3.5.- Configuracin de pines de control y datos en mikroBasic.

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:

' 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

' Fin de la configuracin del mdulo Glcd

Puerto de Control PortD


CS1 0 (RB0)
CS2 1 (RB1)
RS 2 (RB2)
RW 3 (RB3)
EN 4 (RB4)
RST 5 (RB5)
Puerto de datos PortD

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

Si deseamos escribir una palabra o el contenido de una variable en la pantalla, incluso si


deseamos graficar algo, se tomar como pagina de inicio la primera. Por ejemplo, si
deseamos escribir la palabra mikroBasic en la lnea 4, columna 0 de la pantalla Glcd
(usando la rutina Glcd_Write_Text("mikroBasic", 0, 4, 1) la cual estudiaremos mas
adelante), y declaramos los pines CS1 y CS2 como se sugiere a continuacin, con respecto
al diagrama esquemtico de la figura 3.17:
Dim GLCD_CS1 As sbit At RB0_bit
GLCD_CS2 As sbit At RB1_bit

Entonces, la palabra mikroBasic aparecer en la pgina de la izquierda, es decir, en la


pgina 1.

Figura 3.19

Pero si llegramos a invertir esta configuracin, ya sea por software:


Dim GLCD_CS1 As sbit At RB1_bit
GLCD_CS2 As sbit At RB0_bit

105
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Tambin por hardware, invirtiendo el conexionado de pines entre el microcontrolador y la


pantalla, y manteniendo la ubicacin de la palabra mikroBasic en la pantalla, es decir, lnea
4 y columna 0, el resultado sera que la palabra mikroBasic sigue estando en la primera
pgina, solo que esta vez se encontrar a la derecha de la pantalla, tal y como se muestra a
continuacin:

Figura 3.20

3.5.- Librera GLCD.


La librera GLCD nos ofrece un repertorio de rutinas muy tiles que nos permiten hacer de la
programacin para el control de estos dispositivos una tarea sencilla y de fcil comprensin.
Realizaremos un estudio detenido de cada rutina aplicando su funcin especfica en
ejemplos cortos y sencillos para tener una base clara y prctica sobre el tema y la cual ser
empleada en varios nuevos proyectos en los captulos posteriores a ste.

3.5.1.- Rutina Glcd_Init().


Para inicializar la pantalla Glcd se debe usar la rutina Glcd_Init(), como lo demostraremos
mas adelante con un programa de ejemplo. Una vez inicializada la pantalla, podremos
escribir o a dibujar en ella, utilizando algunas rutinas disponibles en la librera Glcd de
mikroBasic.
El tamao de la fuente por defecto, cuando utilizamos la rutina para escribir texto es de 5 x 7
pixeles. Esto significa que podremos escribir texto en la pantalla en una ubicacin
especfica, sin necesidad de llamar a un archivo de fuentes en el programa.
Un ejemplo de esto se puede ver a continuacin en el siguiente ejemplo. La rutina que
utilizaremos para escribir en la pantalla en este ejemplo est explicada detalladamente mas
adelante.

106
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

3.5.2.1.- Ejemplo de programacin #13:


program pantalla_glcd_01
' 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

' Fin de la configuracin del mdulo Glcd


main:
Glcd_Init()
Glcd_Fill(0)

' Inicializamos la pantalla


' Limpiamos la pantalla

Glcd_Write_Text("Lenguaje Basic", 22, 1, 1)


Glcd_Write_Text("para", 54, 2, 1)
Glcd_Write_Text("Microcontroladores", 8, 3, 1)
Glcd_Write_Text("PIC", 55, 4, 1)
Glcd_Write_Text("''Pantalla GLCD''", 16, 6, 1)
End.

El resultado de este ejemplo se ver de la siguiente manera en la pantalla Glcd:

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.

3.5.3.- Mdulo de Fuentes en mikroBasic.


Este mdulo de fuentes es un archivo de extensin .mbas el cual podemos crear para definir
el estilo de caracteres que deseamos mostrar en la pantalla LCD.
Por ejemplo, podramos crear un archivo de fuentes de nombre mis_fuentes.mbas, y en l
definir el estilo de cada caracter que deseamos mostrar en la pantalla Glcd.
Para crear este archivo de fuentes, es importante saber como crear la fuente para cada
caracter.
Al igual que en la primera edicin del libro Basic para microcontroladores PIC, vamos a
apoyarnos en una pequea tabla cuadriculada para generar un caracter de estilo
personalizado. Los caracteres que a continuacin vamos a definir sern de 5 columnas por 8
filas. Empecemos creando un font para la letra A:

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

Esta columna deber generar un byte el cual representaremos en el archivo


mis_fuentes.mbas, en su forma hexadecimal, donde el bit menos significativo ser la fila 1
y el bit mas significativo ser la fila 8, siendo la x un pxel activo y recordando del sistema
numrico binario lo siguiente:

c1 c2 c3 c4 c5
f1
f2
f3
f4
f5
f6
f7
f8

1
2
4
8
16
32
64
128

Figura 3.24

Sumando los pxeles activos o marcados por la x tenemos que:


2 + 4 + 8 + 16 + 32 + 64 = 126, en hexadecimal: $7E

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

Para recordar un poco esta conversin, acostemos la columna 1 en sentido horario y


veamos lo siguiente:

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

Entonces, el valor del byte en Hexadecimal es 7Eh, en formato hexadecimal para


mikroBasic, $7E.
Calculando los valores para el resto de las columnas, tenemos que:

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

C1 = 2 + 4 + 8 + 16 + 32 + 64 = 126 (dec) = $7E (hex)


C2 = 1 + 16 = 17 (dec) = $11 (hex)
C3 = 1 + 16 = 17 (dec) = $11 (hex)
C4 = 1 + 16 = 17 (dec) = $11 (hex)
C5 = 2 + 4 + 8 + 16 + 32 + 64 = 126 (dec) = $7E (hex)
110
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Veamos a continuacin un mdulo de fonts ya creado, y ubiquemos el caracter A en el


cdigo:
module mis_fuentes
const Fuentes5x8 As Byte[490] = (
$00,$00,$00,$00,$00,
$00,$00,$4f,$00,$00,
$00,$07,$00,$07,$00,
$14,$7f,$14,$7f,$14,
$24,$2a,$7f,$2a,$12,
$23,$13,$08,$64,$62,
$36,$49,$55,$22,$20,
$00,$05,$03,$00,$00,
$00,$1c,$22,$41,$00,
$00,$41,$22,$1c,$00,
$14,$08,$3e,$08,$14,
$08,$08,$3e,$08,$08,
$50,$30,$00,$00,$00,
$08,$08,$08,$08,$08,
$00,$60,$60,$00,$00,
$20,$10,$08,$04,$02,
$3e,$51,$49,$45,$3e,
$00,$42,$7f,$40,$00,
$42,$61,$51,$49,$46,
$21,$41,$45,$4b,$31,
$18,$14,$12,$7f,$10,
$27,$45,$45,$45,$39,
$3c,$4a,$49,$49,$30,
$01,$71,$09,$05,$03,
$36,$49,$49,$49,$36,
$06,$49,$49,$29,$1e,
$00,$36,$36,$00,$00,
$00,$56,$36,$00,$00,
$08,$14,$22,$41,$00,
$14,$14,$14,$14,$14,
$00,$41,$22,$14,$08,
$02,$01,$51,$09,$06,
$3e,$41,$5d,$55,$1e,
$7e,$11,$11,$11,$7e,
$7f,$49,$49,$49,$36,
$3e,$41,$41,$41,$22,
$7f,$41,$41,$22,$1c,
$7f,$49,$49,$49,$41,
$7f,$09,$09,$09,$01,
$3e,$41,$49,$49,$7a,
$7f,$08,$08,$08,$7f,
$00,$41,$7f,$41,$00,
$20,$40,$41,$3f,$01,
$7f,$08,$14,$22,$41,
$7f,$40,$40,$40,$40,
$7f,$02,$0c,$02,$7f,
$7f,$04,$08,$10,$7f,
$3e,$41,$41,$41,$3e,
$7f,$09,$09,$09,$06,
$3e,$41,$51,$21,$5e,
$7f,$09,$19,$29,$46,
$26,$49,$49,$49,$32,
$01,$01,$7f,$01,$01,
$3f,$40,$40,$40,$3f,
$1f,$20,$40,$20,$1f,
$3f,$40,$38,$40,$3f,
$63,$14,$08,$14,$63,
$07,$08,$70,$08,$07,
$61,$51,$49,$45,$43,
$00,$7f,$41,$41,$00,
$02,$04,$08,$10,$20,
$00,$41,$41,$7f,$00,
$04,$02,$01,$02,$04,
$40,$40,$40,$40,$40,
$00,$00,$03,$05,$00,

'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*
'*

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] = (

Se puede observar claramente que el caracter A tiene asignado los 5 bytes,


correspondientes a los clculos que hemos efectuado anteriormente. De igual forma
debern existir los bytes calculados para cada uno de los caracteres que deseamos mostrar
en la pantalla Glcd.
Una vez que hemos realizado todos los clculos para cada uno de los caracteres,
procedemos a dar el formato adecuado al archivo de fonts que hemos creado. Este
archivo, el cual llevar el nombre de mis_fuentes.mbas (este nombre puede ser tambin
personalizado), deber ser grabado en una ruta conocida, por ejemplo, en la misma carpeta
en la cual crearemos el proyecto para visualizar caracteres en la pantalla.
Hagamos el ejercicio tomando como punto de partida la creacin del archivo de fuentes
personalizadas mostrado anteriormente:

112
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

1.- Abrimos mikroBasic:

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

texto As String[20] ' Declaramos una variable tipo String en la cual


' cargaremos un mensaje de un mximo de 20 caracteres.

' 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

' Fin de la configuracin del mdulo Glcd


main:
Glcd_Init()
Glcd_Fill(0x00)

' Limpiamos la pantalla

Glcd_Set_Font(@fuentes5x8, 5, 8, 32) ' Elegimos el mdulo de fuentes


texto = "mikroBasic"
Glcd_Write_Text(texto, 35, 3, 1)

' cargamos la variable con un mensaje


' Escribimos el contenido de la
' variable "texto"

End.

Figura 3.32
116
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Analicemos el programa:

Incluimos el mdulo de fuentes mis_fuentes.mbas en el programa a travs de la


instruccin include. No es necesario escribir la extensin del archivo.

Declaramos una variable tipo string, en cual almacenaremos el contenido del mensaje
que deseamos mostrar en la pantalla.

Configuramos e inicializamos la pantalla Glcd, basados en el diagrama de conexin


de la figura 3.17.

Limpiamos la pantalla Glcd, llenando cada pxel con un cero lgico a travs de la
rutina Glcd_Fill(), la cual detallaremos a continuacin.

Cargamos el mdulo de fuentes de 5x8 a travs de la rutina Glcd_Set_Font(), la cual


detallaremos a continuacin.

Cargamos el mensaje en la variable texto.

Enviamos el mensaje cargado en la variable texto a la pantalla Glcd a travs de la


rutina Glcd_Write_Text() 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

const Fuentes5x8 As Byte[490] = (


$00,$00,$00,$00,$00, '* Espace
.
.
.
.
$06,$09,$09,$06,$00 ' oC $81
)

$20 */

const Fuentes3x6 as byte[195] = (


$00,$00,$00, '* Espace
$20 */
.
.
.
.
$04,$08,$00 '* `
$60 */
)
implements
End.

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

de la fuente, ancho, alto, posicin inicial en la tabla ASCII)

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().

La rutina Glcd_Write_Text() escribe un texto previamente cargado en el campo


correspondiente de la rutina, en la pantalla Glcd. La rutina cuenta con cuatro campos los
cuales describiremos a continuacin:
Glcd_Write_Text(texto, posicin en x, lnea, color)
En el campo texto podemos escribir directamente un mensaje entre comillas, o podemos
escribir la variable tipo string en la cual hemos cargado el mensaje.
El campo Posicin en x, indica a partir de que pxel en el eje X de la pantalla empezaremos
a escribir nuestro mensaje. En nuestro ejemplo hemos utilizado una pantalla de 128 x 64
pixeles, siendo 128 la cantidad de pixeles del eje X. Entonces, si observamos el programa,
podremos observar que el punto de partida de nuestro mensaje con respecto al eje X de la
pantalla ser el pxel nmero 35.
El campo lnea, indica el nmero de lnea en la cual vamos a escribir, a partir de la lnea 0
hasta la lnea 7. La cantidad de lneas en este tipo de pantallas al escribir texto, depende
slo del tamao de la fuente que hemos creado. En nuestro caso, tendremos un total de 8
lneas para una fuente de 5x8 pixeles.
En el campo color, escribimos 1 cuando deseamos que los caracteres tengan sus pixeles
encendidos y el fondo apagado, y escribimos 0 cuando deseamos que el fondo de los
caracteres tengan sus pixeles encendidos y los pixeles del los caracteres apagados.
Es decir, si el campo color es igual a 1, el resultado ser el siguiente:

Figura 3.33

119
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Es decir, si el campo color es igual a 0, el resultado ser el siguiente:

Figura 3.34

Realice los cambios necesarios en la rutina Glcd_Write_Text() en el programa anteriormente


expuesto de tal manera que pueda mostrar un mensaje personalizado no mayor a 20
caracteres, en diferentes posiciones variando los campos de sta.
Veamos ahora la forma de presentar el contenido almacenado en una variable en la pantalla
Glcd. En este caso es importante mencionar nuevamente que esto ser posible si utilizamos
la librera Conversions, la cual nos permite convertir el contenido de una variable tipo
byte, Word, LongWord, LongInt, Float, Int, todas en un string de datos listos para ser
visualizados.

Veamos algunos ejemplos prcticos de conversin.


Para una variable tipo byte:
Dim

dato
As Byte
datoStr As String[3]

dato = 20 Conversin: byteToStr(dato, datoStr)

Para una variable tipo word:


Dim

dato
As Word
datoStr As String[5]

dato = 1023 Conversin: wordToStr(dato, datoStr)

120
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Para una variable tipo float:


Dim

dato
As Float
datoStr As String[16]

dato = 3.1415161718 Conversin: floatToStr(dato, datoStr)

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.

3.5.6.1.- Ejemplo de programacin #15:


program Proyecto_Glcd_03
Include mis_fuentes ' Incluimos el archivo de fuentes
Dim texto As String[20]

' Declaramos una variable tipo String en la cual


' cargaremos un mensaje de un mximo de 20 caracteres.

Dim dato As Word


' Declaramos una variable tipo Word.
datoStr As String[5] ' Declaramos una variable tipo String.
' 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

' Fin de la configuracin del mdulo Glcd


main:
dato = 32768
wordToStr(dato, datoStr)

' Cargamos un valor en la variable dato


' Convertimos la variable de word a string.

Glcd_Init()
Glcd_Fill(0x00)

' Inicializamos la pantalla


' Limpiamos la pantalla

Glcd_Set_Font(@fuentes5x8, 5, 8, 32) ' Elegimos el mdulo de fuentes


texto = "Variable Dato: "
Glcd_Write_Text(texto, 5, 1, 1)
Glcd_Write_Text(datoStr, 94, 1, 1)

'
'
'
'
'

cargamos la variable con un mensaje


Escribimos el contenido de la
variable "texto"
Escribimos el contenido de la
variable "datoStr"

End.

121
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

El resultado ser el siguiente:

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.

3.5.7.- Glcd_Dot(x, y, color).


Esta rutina nos permite encender o apagar un pxel especfico en la pantalla, a travs de sus
coordenadas (x, y).
El campo color tiene tres posibles estados:

0, apaga el pxel especificado.


1, enciende el pxel especificado.
2, invierte el estado del pxel especificado.

Veamos el siguiente ejemplo, basado en el diagrama esquemtico de la figura 3.17.


3.5.7.1.- Ejemplo de programacin #16:
program Proyecto_Glcd_04
' Configuracin de coneccin del mdulo Glcd
Dim GLCD_DataPort As Byte At PORTD
Dim GLCD_CS1 As sbit At RB0_bit
GLCD_CS2 As sbit At RB1_bit

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

' Fin de la configuracin del mdulo Glcd


main:
Glcd_Init()
Glcd_Fill(0)
Glcd_Dot(64, 32, 1)

' Inicializamos la pantalla


' Limpiamos la pantalla
' activamos el pxel en X = 0 , Y = 0

End.

El resultado es el siguiente:

Figura 3.36

El programa enciende el pxel de coordenadas X = 64, Y = 32, es decir, en el centro de la


pantalla GLCD la cual es de 128 x 64 pixeles.
Para poder observar el efecto opuesto, en vez de limpiar la pantalla a travs de la rutina
Glcd_Fill(0), llenaremos con un 1 lgico en cada pxel, utilizando la rutina Glcd_Fill($FF), y
seguidamente apagaremos un pxel especfico de coordenada (64, 32).

3.5.7.2.- Ejemplo de programacin #17:


program Proyecto_Glcd_05
' Configuracin de coneccin del mdulo Glcd
Dim GLCD_DataPort As Byte At PORTD
Dim GLCD_CS1 As sbit At RB0_bit
GLCD_CS2 As sbit At RB1_bit
GLCD_RS As sbit At RB2_bit

123
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

GLCD_RW As sbit At RB3_bit


GLCD_EN As sbit At RB4_bit
GLCD_RST As sbit At RB5_bit
Dim GLCD_CS1_Direction
GLCD_CS2_Direction
GLCD_RS_Direction
GLCD_RW_Direction
GLCD_EN_Direction
GLCD_RST_Direction

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

' Fin de la configuracin del mdulo Glcd


main:
Glcd_Init()
Glcd_Fill($FF)

' Inicializamos la pantalla


' Llenamos la pantalla

Glcd_Dot(64, 32, 0)

' activamos el pxel en X = 0 , Y = 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.

3.5.7.3.- Ejemplo de programacin #18:


program Proyecto_Glcd_06
' 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

' Fin de la configuracin del mdulo Glcd


main:
Glcd_Init()
Glcd_Fill($FF)

' Inicializamos la pantalla


' Llenamos la pantalla con un 1 lgico en cada pixel

intermitencia:
Glcd_Dot(64, 32, 2)
Delay_ms(1000)
GoTo intermitencia

' cambiamos el estado del pxel en X = 64 , Y = 32


' retardo de 1 segundo
' salto a la etiqueta "intermitencia"

End.

124
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

3.5.8.- Glcd_Line(x1, y1, x2, y2, color).


Esta rutina dibuja una lnea entre dos coordenadas especficas, (x1, y1) y (x2, y2). El estado
de los pxeles de la lnea, al igual que en la rutina anterior est definido por el campo color.
Es decir, cuando el campo color es igual a:

0, apaga los pxeles de la lnea.


1, enciende los pxeles de la lnea.
2, invierte el estado de los pxeles en la lnea.

Veamos un ejemplo prctico.

3.5.8.1.- Ejemplo de programacin #19:


program Proyecto_Glcd_07
' 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

' Fin de la configuracin del mdulo Glcd


main:
Glcd_Init()
Glcd_Fill(0)

' Inicializamos la pantalla


' Limpiamos la pantalla

Glcd_Line(30, 15, 100, 15, 1)

' Linea Horzontal:


' (x1=30, y1=15)(x2=100, y2=15)

Glcd_Line(20, 20, 20, 50, 1)

' Linea Vertical:


' (x1=20, y1=20)(x2=20, y2=50)

Glcd_Line(25, 58, 100, 20, 1)

' Linea Diagonal:


' (x1=25, y1=58)(x2=100, y2=20)

End.

125
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

El resultado ser el siguiente:

Figura 3.37
Veamos como sera el efecto inverso.

3.5.8.2.- Ejemplo de programacin #20:


program Proyecto_Glcd_08
' 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

' Fin de la configuracin del mdulo Glcd


main:
Glcd_Init()
Glcd_Fill($FF)

' Inicializamos la pantalla


' Llenamos la pantalla

Glcd_Line(30, 15, 100, 15, 0)

' Linea Horzontal:


' (x1=30, y1=15)(x2=100, y2=15)

Glcd_Line(20, 20, 20, 50, 0)

' Linea Vertical:


' (x1=20, y1=20)(x2=20, y2=50)

Glcd_Line(25, 58, 100, 20, 0)

' Linea Diagonal:


' (x1=25, y1=58)(x2=100, y2=20)

End.

126
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

El resultado ser el siguiente:

Figura 3.38

3.5.9.- Glcd_V_Line(y1, y2, x, color).


Esta rutina nos permite dibujar una lnea vertical en la pantalla Glcd. Para esto, solo ser
necesario indicar los dos valores entre los cuales se dibujar la lnea, y el valor
correspondiente al eje x, en el cual estar ubicada dicha lnea.
Al igual que en la rutina anterior, cuando el campo color es igual a:

0, apaga los pxeles de la lnea.


1, enciende los pxeles de la lnea.
2, invierte el estado de los pxeles en la lnea.

Veamos un ejemplo prctico.


3.5.9.1.- Ejemplo de programacin #21:
program Proyecto_Glcd_09
' 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

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

GLCD_RST_Direction As sbit At TRISB5_bit


' Fin de la configuracin del mdulo Glcd
main:
Glcd_Init()
Glcd_Fill(0)

' Inicializamos la pantalla


' Limpiamos la pantalla

Glcd_V_Line(1, 62, 63, 1)

' Linea Vertical:


' (y1=1)(Y2=62)(x=63)

End.

El resultado ser el siguiente:

Figura 3.39

3.5.10.- Glcd_H_Line(x1, x2, y, color).


Esta rutina nos permite dibujar una lnea horizontal en la pantalla Glcd. Para esto, solo ser
necesario indicar los dos valores entre los cuales se dibujar la lnea, y el valor
correspondiente al eje y, en el cual estar ubicada dicha lnea.
Al igual que en la rutina anterior, cuando el campo color es igual a:

0, apaga los pxeles de la lnea.


1, enciende los pxeles de la lnea.
2, invierte el estado de los pxeles en la lnea.

Veamos un ejemplo prctico.

3.5.10.1.- Ejemplo de programacin #22:


program Proyecto_Glcd_10
' Configuracin de coneccin del mdulo Glcd

128
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

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

' Fin de la configuracin del mdulo Glcd


main:
Glcd_Init()
Glcd_Fill(0)

' Inicializamos la pantalla


' Limpiamos la pantalla

Glcd_H_Line(1, 127, 32, 1)

' Linea Horizontal:


' (y1=1)(Y2=62)(x=63)

End.

El resultado ser el siguiente:

Figura 3.40

129
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

3.5.11.- Glcd_Rectangle(x1, y1, x2, y2, color).


Esta rutina nos permite dibujar un cuadrado o rectngulo especificando tan solo dos
esquinas opuestas diagonales, Las coordenadas de estas dos esquinas determinarn el
tamao en pxeles, y el campo color aplica las mismas reglas de las rutinas anteriores:

0, apaga los pxeles de la lnea.


1, enciende los pxeles de la lnea.
2, invierte el estado de los pxeles en la lnea.

Veamos a continuacin dos ejemplos prcticos.


3.5.11.1.- Ejemplo de programacin #23:
program Proyecto_Glcd_11
' 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

' Fin de la configuracin del mdulo Glcd


main:
Glcd_Init()
Glcd_Fill(0)

' Inicializamos la pantalla


' Limpiamos la pantalla

Glcd_Rectangle(26, 26, 102, 38, 1)

' Rectngulo:
' (x1=26)(Y1=26)(x2=102)(y2=38)

End.

El resultado ser el siguiente:

Figura 3.41
130
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Analice cuidadosamente el siguiente ejemplo.


3.5.11.2.- Ejemplo de programacin #24:
program pantalla_glcd_12
Dim x1
x2
y1
y2

As
As
As
As

Byte
Byte
Byte
Byte

' Declaracin de variables para coordenadas de puntos.


'
'
'

' 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

' Fin de la configuracin del mdulo Glcd


main:
x1
y1
x2
y2

=
=
=
=

0
0
127
63

' Inicializamos las variables con los datos necesarios


' para generar un rectangulo de coordenadas mximas en una
' pantalla de 128 x 64 pxeles.

Glcd_Init()
Glcd_Fill(0)

' Inicializamos la pantalla


' Limpiamos la pantalla

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

' Incrementamos en dos unidades el valor de x1


' Incrementamos en dos unidades el valor de y1

x2 = x2 - 2
y2 = y2 - 2

' Decrementamos en dos unidades el valor de x2


' Decrementamos en dos unidades el valor de x2

If x1 > 30 Then
GoSub inicializa
End If

'
'
'
'

Imponemos un lmite en el tamao del cuadro.


Si el lmite se cumple, inicializamos las
coordenadas y limpiamos la pantalla para
repetir todo el proceso.

GoTo rectangulo

' Salta a la etiqueta "rectangulo"

inicializa:
delay_ms(500)

' Retardo de 500 milisegundos

x1 = 0
y1 = 0
x2 = 127
y2 = 63
Glcd_Fill(0)
Return

' Inicializamos las variables:


'
'
'
' Limpia la pantalla
' Retorno

End.

131
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

El resultado ser el siguiente:


Cada 500 milisegundos se formar un rectngulo de menor tamao que el anterior hasta
llegar al lmite especificado en el programa para luego limpiar la pantalla y repetir el proceso
ilimitadamente.

Figura 3.42

3.5.12.- Glcd_Box(x1, y1, x2, y2, color).

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.

3.5.12.1.- Ejemplo de programacin #25:


program pantalla_glcd_13
' 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

' Fin de la configuracin del mdulo Glcd

132
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

main:
Glcd_Init()
Glcd_Fill(0)

' Inicializamos la pantalla


' Limpiamos la pantalla

Glcd_Box(26, 26, 102, 38, 1)

' Rectngulo:
' (x1=26)(Y1=26)(x2=102)(y2=38)

End.

El resultado ser el siguiente:

Figura 3.43
Si invertimos el fondo de la pantalla y cambiamos el campo color en la rutina a 0 tenemos
que:

3.5.12.2.- Ejemplo de programacin #26:


program pantalla_glcd_14
' 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

' Fin de la configuracin del mdulo Glcd


main:
Glcd_Init()
Glcd_Fill($FF)

' Inicializamos la pantalla


' Limpiamos la pantalla

Glcd_Box(26, 26, 102, 38, 0)

' Rectngulo:
' (x1=26)(Y1=26)(x2=102)(y2=38)

End.

133
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

El resultado ser el siguiente:

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.

3.5.13.1.- Ejemplo de programacin #27:


program pantalla_glcd_15
' 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

' Fin de la configuracin del mdulo Glcd


main:
Glcd_Init()
Glcd_Fill(0)
Glcd_Circle(63, 31, 25, 1)

' Inicializamos la pantalla


' Limpiamos la pantalla
' Crculo.

End.

134
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

El resultado ser el siguiente:

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).

La solucin respectiva para su forma inversa sera la siguiente:

3.5.13.2.- Ejemplo de programacin #28:


program pantalla_glcd_16
' 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

' Fin de la configuracin del mdulo Glcd


main:
Glcd_Init()
Glcd_Fill($FF)

' Inicializamos la pantalla


' Limpiamos la pantalla

Glcd_Circle(63, 31, 25, 0)

' Crculo.

End.

135
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

El resultado ser el siguiente:

Figura 3.46

Otro ejemplo interesante podra ser dibujar una secuencia de crculos utilizando la
instruccin For Next:

3.5.13.3.- Ejemplo de programacin #29:


program pantalla_glcd_17
Dim Radio As Byte
I

As Byte

'
'
'
'

Declaramos la variable "Radio" para poder modificar


el tamao de los circulos consecutivos.
Variable para generar repeticiones a travs de la
instruccin For-Next.

' 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

' Fin de la configuracin del mdulo Glcd


main:
Radio = 26

' Establecemos el radio del primer circulo.

Glcd_Init()
Glcd_Fill(0)

' Inicializamos la pantalla


' Limpiamos la pantalla

For I = 0 To 10

' Dez repeticiones de la siguiente rutina:

Glcd_Circle(63, 31, Radio, 1)

' Crculo

Radio = Radio - 2

' Decrementamos el radio en 2 unidades.

136
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

delay_ms(500)

' Retardo de 500 milisegundos.

Next I
End.

El resultado es el siguiente:

Figura 3.47

137
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Captulo IV. Librera Trigon Funciones Trigonomtricas

4.1.- Funciones Trigonomtricas.


Veamos a continuacin algunas funciones trigonomtricas disponibles en mikroBasic que
nos permitirn realizar algunos clculos complejos de una forma sencilla y prctica:

sin(x): calcula el seno del valor de x. Retorna un valor en radianes entre -1 y 1.

sinh(x): calcula el seno hiperblico de x, definido matemticamente como

cos(x): calcula el coseno del valor de x. Retorna un valor en radianes entre -1 y 1.

cosh(x): calcula el coseno hiperblico de x, definido matemticamente como

tan(x): calcula el valor de la tangente de x en radianes.

tanh(x): calcula la
sinh(x)/cosh(x).

Asin(x): calcula el arco seno del valor de x en el intervalo de -1 a 1. Retorna un valor


en radianes entre /2 y /2.

Acos(x): calcula el arco coseno del valor de x en el intervalo de -1 a 1. Retorna un


valor en radianes entre 0 y .

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.

Atan2(x, y): Es similar a calcular la arcotangente de Y / X, excepto que los signos de


ambos argumentos se utilizan para determinar el cuadrante del resultado y X se le
permite ser cero.

Log(x): calcula el logaritmo natural o neperiano (ln) de x.

Log10(x): calcula el logaritmo base 10 de x.

sqrt(x): calcula la raz cuadrada de x.

exp(x): La funcin devuelve el valor de e, la base de los logaritmos naturales, elevado


a la potencia x, es decir, e x .

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

pow(x, y): devuelve el valor de x elevado a la potencia y, es decir, x y .

fabs(x): retorna el valor absoluto de x.

4.1.1.- Ejemplo de programacin #30:


Veamos un ejemplo de programacin para el uso de funciones trigonomtricas, basados en
el diagrama esquemtico de la figura 4.1:

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]

' Variable del tipo punto flotante.


' Variable del tipo punto flotante.
' Arreglo tipo string para visualizar datos en pantalla.

' 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

RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit

LCD_RS_Direction As sbit At TRISB4_bit


LCD_EN_Direction As sbit At TRISB5_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

' Fin de la configuracin de coneciones


main: '

Programa Principal

LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Inicializamos la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

X = -0.5

' Cargamos el valor de X en la variable.

Y = Sin(X)

'
'
'
'

floatToStr(Y, txt)

Calculamos el seno de "X", el resultado se carga


en la variable "Y".
Convertimos el resultado de Float a String para
mostrarlo en la pantalla LCD.

' A continuacin escribimos los resultados en la pantalla LCD:


Lcd_Out(1, 1, "Trigon. sin(x): ")
Lcd_Out(2, 1, "sin(0.5)=")
Lcd_Out(2, 10, txt)
End.

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]

' Variable del tipo punto flotante.


' Variable del tipo punto flotante.
' Arreglo tipo string para visualizar datos en pantalla.

' 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

' Fin de la configuracin de coneciones


main: '

Programa Principal

LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Inicializamos la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

X = 1

' Cargamos el valor de X en la variable.

Y = Cos(X)

'
'
'
'

floatToStr(Y, txt)

Calculamos el coseno de "X", el resultado se carga


en la variable "Y".
Convertimos el resultado de Float a String para
mostrarlo en la pantalla LCD.

' A continuacin escribimos los resultados en la pantalla LCD:


Lcd_Out(1, 1, "Trigon. cos(x): ")
Lcd_Out(2, 1, "cos(1) = ")
Lcd_Out(2, 10, txt)
End.

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]

' Variable del tipo punto flotante.


' Variable del tipo punto flotante.
' Arreglo tipo string para visualizar datos en pantalla.

' 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

' Fin de la configuracin de coneciones


main: '

Programa Principal

LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Inicializamos la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

X = 0.6

' Cargamos el valor de X en la variable.

Y = tan(X)

'
'
'
'

floatToStr(Y, txt)

Calculamos la tangente de "X", el resultado se carga


en la variable "Y".
Convertimos el resultado de Float a String para
mostrarlo en la pantalla LCD.

' A continuacin escribimos los resultados en la pantalla LCD:


Lcd_Out(1, 1, "Trigon. tan(x): ")
Lcd_Out(2, 1, "tan(0.6)=")
Lcd_Out(2, 10, txt)
End.

El resultado:

Figura 4.4

142
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

4.1.4.- Ejemplo de programacin #33: En el siguiente ejemplo de programacin


realizaremos un programa para el control de una calculadora sencilla, cuya funcin principal
ser realizar las siguientes operaciones en base a dos valores introducidos desde un
teclado:

Suma.
Resta.
Multiplicacin.
Divisin.
Raz Cuadrada de un valor.

El procedimiento para realizar una operacin en la calculadora es el siguiente:


1.
2.
3.
4.

Ingresamos el primer valor de la operacin.


Pulsamos el botn correspondiente al tipo de operacin: + - * /
Ingresamos el segundo valor de la operacin.
Pulsamos el botn de "Igualdad" para obtener el resultado.

En el caso del clculo de la raz cuadrada de un nmero:


1. Ingresamos el valor de la operacin.
2. Pulsamos el botn correspondiente al clculo de la raz cuadrada Sqrt.

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

' Variable para almacenar el resultado de


' la rutina "keypad".

txt As String[25]

' Variable para la conversin de Byte a String.

Digito As Byte[15]

'
'
'
'
'
'

Arreglo para almacenar los digitos introducidos desde


cada pulsador.
Variable tipo punto flotante para almacenar cada valor
de una operacin, ejemplo, si la operacin es una suma:
5485 + 3654 = Resultado, entonces almacenaremos 5485 en
la variable "Valor[1]" y 3654 en la variable "Valor[2]"

Operacion As Byte

'
'
'
'
'

Para determinar que tipo de operacin vamos a hacer


con los valores, es decir, si Operacin = 1 ser una
suma; si Operacin = 2 ser una resta; si Operacin = 3
ser una multiplicacin; si Operacin = 4 ser una
divisin.

Resultado As Float

' Variable tipo punto flotante para almacenar el Resultado

Valor As Float[3]

144
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

' de una operacin matemtica. Es Punto Flotante ya que en


' algunos operaciones vamos a obtener un resultado con no
' entero, o con decimales. Ejemplo: 45 / 2 = 22.50
I As Byte

' Variable para controlar el indice del arrego "Digito[n]"

X As Byte

' Variable para controlar el indice del arreglo "Valor[n]"

' 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

' Fin de la configuracin de coneciones


main: '

Programa Principal

Operacion = 0
pulsador = 0

' Inicializamos la variable "Operacion"


' Inicializamos la variable "Pulsador"

LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Inicializamos la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

I = 1

' Inicializamos el indice del arreglo Digito[n]


' en 1.

X = 1

' Inicializamos el indice del arreglo Valor[n]


' en 1.

Valor[1] = 0
Valor[2] = 0

' Inicializamos la variable Valor[1]


' Inicializamos la variable Valor[2]

Lcd_Out(1, 1, "Calculadora:
Lcd_Out(2, 1, "

")
")

' Escribimos un mensaje en la pantalla.

inicio:
GoTo Teclado

'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'

' Llamamos a la subrutina "Teclado" para verificar si alguno de


' los pulsadores ha sido presionado.

Cada dgito que introducimos desde el Teclado para un Valor de la operacin


matemtica que deseamos realizar, es almacenado en el arreglo Digito[n],
iniciando desde Digito[1], es decir, si quisieramos hacer una suma:
1521 + 50 = Resultado.
los dgitos del primer valor (1500) se almacenarn en las variables:
Digito[1] = 1, Digito[2] = 5, Digito[3] = 2 y Digito[4] = 1
Es muy importante recordar que el procedimiento para realizar una operacin en
una calculadora comn, es el siguiente:
1ro.2do.3ro.4to.-

Ingresamos el primer valor de la operacin.


Pulsamos el botn correspondiente al tipo de operacin: + - * /
Ingresamos el segundo valor de la operacin.
Pulsamos el botn de "Igualdad" para obtener el resultado.

Cada vez que introducimos un nuevo dgito, incrementamos el indice de referencia


del arreglo Digito[I], es decir, I = I + 1. De esta forma nos aseguramos que
cada dgito de un valor de la operacin queda almacenado en su propia variable.
Luego para llevar este valor (1500) a una sola variable de tipo punto flotante,

145
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'

realizamos la siguiente operacin:

'
'
'
'

La siguiente subrutina, realiza este clculo hasta el dgito numero nueve de un


valor, y los clculos de la explicacin que acabamos de ver se realizan diferente
pero generan el mismo resultado. Analice cmo se realiza el clculo del valor[1] a
continuacin:

Si I = 1, osea, si solo hemos introducido un digito, entonces:


Valor[1] = Digito[1] = 1
Si I = 2, entonces hemos introducido un segundo digito:
Valor[1] = (Digito[1] * 10) + Digito[2]), con valores sera:
Valor[1] = (
1
* 10) +
5
) = 15
Si I = 3, entonces hemos introducido un tercer digito:
Valor[1] = ((Digito[1] * 100) + (Digito[2] * 10) + Digito[3]), con valores sera:
Valor[1] = (( 1
* 100) + (
5
* 10) +
2
) = 152
Si I = 4, entonces hemos introducido un cuarto digito:
Valor[1] = ((Digito[1] * 1000) + (Digito[2] * 100) + (Digito[3] * 10) + Digito[4])
Valor[1] = (( 1
* 1000) + (
5
* 100) + (
2
* 10) +
1)
Valor[1] = 1521

sigue:
If I = 1 Then
Valor[X] = Digito[1]
End If

' Si I = 1, significa que hemos introducido el


' primer dgito del Valor, entonces, Valor[X] ser igual
' al valor cargado en Digito[1] en la subrutina "Teclado".

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

' Incrementa el indice del arreglo "Digito[n]" cada


' vez que introducimos un dgito.

' A medida que vamos introduciendo dgitos al valor deseado para la operacin

146
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

' matemtica, es bueno ir mostrando los mismos en la pantalla LCD:


WordToStr(Valor[X], txt)

' Convertimos el valor actual de "Valor[X]" en string.

Lcd_Out(1, 1, "Calculadora:
Lcd_Out(2, 1, txt)
GoTo inicio
Suma:

'
'
'
'
'
'
'

")

' Mostramos el mensaje en pantalla.


' Mostramos el valor convertido.

' Salta a inicio para esperar un nuevo dgito.

Esta subrutina se ejecuta cuando pulsamos la tecla "Suma" conectada al


pin RD2 del puerto "D" del microcontrolador. Cuando llegamos a esta
subrutina, significa que ya hemos terminado de introducir los dgitos
de la variable "Valor[1]", por lo tanto, lo que hacemos en adelante es
mantener en memoria qu tipo de operacin deseamos realizar a travs
de la asignacin de un valor cargado en la variable "Operacin" el cual
se corresponder al tipo de operacin asignada.

Operacion = 1

' 1 nos indicar que deberemos sumar Valor[1] y Valor[2].

I = 1

' Inicializamos el indice del arreglo Digito[n], ya que en adelante


' estas variables sern utilizadas para almacenar los dgitos del
' segundo valor de la operacin matemtica.

X = 2

' X = 2 debido a que el resultado de introducir los dgitos del


' segundo valor de la operacin ser almacenado en "Valor[2]".

Lcd_Out(1, 1, "Calculadora: +
Lcd_Out(2, 1, "

GoTo inicio

Resta:

")
")

' Anunciamos el tipo de operacin en la LCD,


' en este caso se observa que hemos agregado
' el smbolo "+".

' Salta a la etiqueta "inicio" para recibir los digitos del


' segundo valor de la operacin matemtica.

' Esta subrutina se ejecuta cuando pulsamos la tecla "Resta" conectada al


' pin RD3 del puerto "D" del microcontrolador.

Operacion = 2

' 2 nos indicar que deberemos restar Valor[1] y Valor[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

' 3 nos indicar que deberemos multiplicar Valor[1] y Valor[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

' 4 nos indicar que deberemos dividir Valor[1] y Valor[2].

I = 1
X = 2
Lcd_Out(1, 1, "Calculadora: /
Lcd_Out(2, 1, "

")
")

GoTo inicio
RaizCuadrada:

' Esta subrutina se ejecuta cuando pulsamos la tecla "Sqrt"


' conectada al pin RD6 del puerto "D" del microcontrolador.

147
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Resultado = Sqrt(Valor[1])

' Calcula la raiz cuadrada de Valor[1] y almacena


' el resultado en la variable.

FloatToStr(Resultado, txt)

' Convierte el resultado en un string para poder


' mostrarlo en la pantalla LCD.

Lcd_Out(1, 1, "Calculadora:Sqrt") ' Especificamos el tipo de operacin.


Lcd_Out(2, 1, txt)
' Mostramos el resultado en la pantalla LCD.
GoTo Fin
Igualdad:

' Salta a la rutina de Lazo Infinito.

' Esta subrutina se ejecuta cuando pulsamos la tecla "Igualdad"


' conectada al pin RD7 del puerto "D" del microcontrolador.

' En esta rutina es cuando identificamos el tipo de operacin (+ - * /) que


' deseamos para los dos valores cargados en Valor[1] y Valor[2].

' Si Operacion = 1 entonces Suma los dos valores.


If Operacion = 1 Then
Resultado = Valor[1] + Valor[2]
End If
' Si Operacion = 2 entonces Resta los dos valores.
If Operacion = 2 Then
Resultado = Valor[1] - Valor[2]
End If
' Si Operacion = 3 entonces Multiplica los dos valores.
If Operacion = 3 Then
Resultado = Valor[1] * Valor[2]
End If
' Si Operacion = 4 entonces Divide los dos valores.
If Operacion = 4 Then
Resultado = Valor[1] / Valor[2]
End If
FloatToStr(Resultado, txt)

' Convierte el resultado en un string para poder


' mostrarlo en la pantalla LCD.

Lcd_Out(1, 1, "Calculadora: =
Lcd_Out(2, 1, txt)

")

' Especificamos el tipo de operacin.


' Mostramos el resultado en la pantalla LCD.

Fin: GoTo Fin ' Lazo Infinito. Si deseamos realizar una nueva operacin matemtica
' entoces debemos reiniciar el microcontrolador a travs del pulsador
' "Reset" del circuito.
'
'
'
'
'

La siguiente subrutina se encarga de verificar si uno de los pulsadores en el


circuito ha sido presionado.
Cuando un pulsador es presionado, se carga el valor correspondiente a la tecla
en la variable "Digito[I]".

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

If Button(PortC, 3, 150, 1) Then


Digito[I] = 4
GoTo sigue
End If
If Button(PortC, 4, 150, 1) Then
Digito[I] = 5
GoTo sigue
End If
If Button(PortC, 5, 150, 1) Then
Digito[I] = 6
GoTo sigue
End If
If Button(PortC, 6, 150, 1) Then
Digito[I] = 7
GoTo sigue
End If
If Button(PortC, 7, 150, 1) Then
Digito[I] = 8
GoTo sigue
End If
If Button(PortD, 0, 150, 1) Then
Digito[I] = 9
GoTo sigue
End If
If Button(PortD, 1, 150, 1) Then
Digito[I] = 0
GoTo sigue
End If
' Los siguientes pulsadores estn asignados para realizar un salto a las
' subrutinas correspondientes a la operacin matemtica deseada:
' Si pulsamos el botn "Suma", entonces el programa salta a la subrutina "Suma":
If Button(PortD, 2, 150, 1) Then
GoTo Suma
End If
' Si pulsamos el botn "Resta", entonces el programa salta a la subrutina "Resta":
If Button(PortD, 3, 150, 1) Then
GoTo Resta
End If
' Si pulsamos el botn "Mult.", entonces el programa salta a la subrutina "Multiplicacion":
If Button(PortD, 4, 150, 1) Then
GoTo Multiplica
End If
' Si pulsamos el botn de "Div.", entonces el programa salta a la subrutina "Divide":
If Button(PortD, 5, 150, 1) Then
GoTo Divide
End If
' Si pulsamos el botn "Sqrt", entonces el programa salta a la subrutina "RaizCuadrada":
If Button(PortD, 6, 150, 1) Then
GoTo RaizCuadrada
End If
' Si pulsamos el botn "Igualdad", entonces el programa salta a la subrutina "Igualdad":
If Button(PortD, 7, 150, 1) Then
GoTo Igualdad
End If

149
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

GoTo inicio

' Salta a la etiqueta incio.

End.

Al ejecutar el programa anterior, podremos ver en la pantalla LCD el siguiente mensaje:

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

Seguidamente elegimos en el teclado el tipo de operacin:

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

Captulo V. Librera Sound

5.1.- Rutinas de la librera de sonido de mikroBasic.


A travs de esta librera, mikroBasic nos facilita la generacin de sonidos de frecuencias
predefinidas y con una duracin que podemos especificar fcilmente. Esta librera cuenta
con dos nicas rutinas:

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

5.1.1.- Ejemplo de programacin #34:


En el siguiente programa de ejemplo, hemos declarado los valores de las frecuencias
correspondientes a cada nota principal de la octava A4 como constantes (No se
reproducirn los semitonos en este ejemplo, por lo tanto no se declaran). Estos valores
sern visualizados en la pantalla LCD mientras cada una de las notas es reproducida a
travs del parlante o Speaker conectado al pin RD0 del puerto D. Recuerde verificar que
la librera Sound ha sido seleccionada para su proyecto para no tener errores al momento
de compilar este ejemplo.
program Sound1
' 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

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

' Fin de la configuracin de conexiones


txt As String[6]

' Variable de contenido temporal tipo String

' Frecuencias de notas principales de la "octava" A4:


Const
Const
Const
Const
Const
Const
Const
Const

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

' Nota "Do" de cuarta octava musical.

' Nota "Do" de quinta octava musical.

main:
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Limpia la pantalla LCD


' Apaga el cursor en la pantalla

Sound_Init(PORTD, 0)

' Asignamos el pin RD0 para generar los tonos.

FloatToStr(nota_Do, txt)
Lcd_Out(1, 1, "Nota Do: ")
Lcd_Out(1, 10, txt)
Sound_Play(nota_Do, 500)

'
'
'
'
'

Convertimos la constante "nota_Do" en un "string"


Visualizamos el mensaje correspondiente en la LCD.
Se imprime el contenido de la variable "txt"
Se reproduce el sonido correspondiente a la nota
durante 500 milisegundos.

FloatToStr(nota_Re, txt)
Lcd_Out(1, 1, "Nota Re: ")
Lcd_Out(1, 10, txt)
Sound_Play(nota_Re, 500)

'
'
'
'
'

Convertimos la constante "nota_Re" en un "string"


Visualizamos el mensaje correspondiente en la LCD.
Se imprime el contenido de la variable "txt"
Se reproduce el sonido correspondiente a la nota
durante 500 milisegundos.

FloatToStr(nota_Mi, txt)
Lcd_Out(1, 1, "Nota Mi: ")
Lcd_Out(1, 10, txt)
Sound_Play(nota_Mi, 500)

'
'
'
'
'

Convertimos la constante "nota_Mi" en un "string"


Visualizamos el mensaje correspondiente en la LCD.
Se imprime el contenido de la variable "txt"
Se reproduce el sonido correspondiente a la nota
durante 500 milisegundos.

FloatToStr(nota_Fa, txt)
Lcd_Out(1, 1, "Nota Fa: ")
Lcd_Out(1, 10, txt)
Sound_Play(nota_Fa, 500)

'
'
'
'
'

Convertimos la constante "nota_Fa" en un "string"


Visualizamos el mensaje correspondiente en la LCD.
Se imprime el contenido de la variable "txt"
Se reproduce el sonido correspondiente a la nota
durante 500 milisegundos.

FloatToStr(nota_Sol, txt)
Lcd_Out(1, 1, "Nota Sol: ")
Lcd_Out(1, 10, txt)
Sound_Play(nota_Sol, 500)

'
'
'
'
'

Convertimos la constante "nota_Sol" en un "string"


Visualizamos el mensaje correspondiente en la LCD.
Se imprime el contenido de la variable "txt"
Se reproduce el sonido correspondiente a la nota
durante 500 milisegundos.

FloatToStr(nota_La, txt)
Lcd_Out(1, 1, "Nota La: ")
Lcd_Out(1, 10, txt)
Sound_Play(nota_La, 500)

'
'
'
'
'

Convertimos la constante "nota_La" en un "string"


Visualizamos el mensaje correspondiente en la LCD.
Se imprime el contenido de la variable "txt"
Se reproduce el sonido correspondiente a la nota
durante 500 milisegundos.

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)

'
'
'
'
'

Convertimos la constante "nota_Si" en un "string"


Visualizamos el mensaje correspondiente en la LCD.
Se imprime el contenido de la variable "txt"
Se reproduce el sonido correspondiente a la nota
durante 500 milisegundos.

FloatToStr(nota_Do5, txt)
Lcd_Out(1, 1, "Nota Do5: ")
Lcd_Out(1, 10, txt)
Sound_Play(nota_Do5, 500)

'
'
'
'
'

Convertimos la constante "nota_Do5" en un "string"


Visualizamos el mensaje correspondiente en la LCD.
Se imprime el contenido de la variable "txt"
Se reproduce el sonido correspondiente a la nota
durante 500 milisegundos.

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.

Constantes para la octava A4 completa:


' Frecuencias de notas de la "octava" A4:
Const
Const
Const
Const
Const
Const
Const
Const
Const
Const
Const
Const

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" de cuarta octava musical.

Constantes para la quinta octava:


' Frecuencias de notas de la quinta "octava":
Const
Const
Const
Const
Const
Const
Const
Const
Const
Const
Const
Const

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

' Nota "Do" de quinta octava musical.

156
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

5.1.2.- Ejemplo de programacin #35:

El siguiente ejercicio es la representacin de un pequeo piano con una octava A4


completa. En este caso hemos eliminado la pantalla LCD y hemos agregado 12 pulsadores
los cuales estarn conectados a los puertos C y D del microcontrolador PIC. Observe que el
parlante ha sido conectado en el pin RD7.

Figura 5.4
157
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Analice el siguiente programa, leyendo detenidamente los comentarios en cada lnea.


program Piano
' Frecuencias de notas principales de la "octava" A4:
Const
Const
Const
Const
Const
Const
Const
Const
Const
Const
Const
Const

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" de cuarta octava musical.

main:
TRISC = $FF
TRISD = $7F

' Configuracin de pines del puerto C.


' Configuracin de pines del puerto D.

Sound_Init(PORTD, 7)

' Asignamos el pin RD7 para generar los tonos.

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)

' Se reproduce el sonido correspondiente a la nota


' durante 200 milisegundos.

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

Captulo VI. Teclado Matricial y Teclado PS/2

6.1.- Teclado Matricial.


Para introducir datos de forma manual en un microcontrolador, nada mejor que un teclado
matricial para este fin. Los teclados matriciales ms comunes son de 3 columnas por 4 filas,
y de 4 columnas por 4 filas, como los mostrados en la figura 6.1:

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

Por ejemplo, al presionar la tecla 1, estaremos conectando la columna 1 con la fila 1; si


pulsamos la tecla 4, estaremos conectando nuevamente la columna 1, esta ves con la fila
2; si pulsamos la tecla 9, entonces estaremos conectando la columna 3 con la fila 3.
Existen diversas formas de conectar e interpretar el funcionamiento de un teclado matricial.
En el diagrama de la figura 6.4 se puede apreciar un teclado matricial 4x4 conectado a los
pines del puerto D, los cuales se han distribuido y configurado de la siguiente manera:

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

Los primeros ejercicios los estaremos programando en base al diagrama esquemtico de la


figura 6.4, por lo tanto el puerto de conexin del teclado ser el puerto D del
microcontrolador PIC16F877.
Antes de empezar, debemos recordar verificar que hemos seleccionado las libreras
correspondientes a los perifricos que tenemos conectados al microcontrolador. En este
caso, la pestaa de libreras del proyecto se debera ver de la siguiente forma:

Figura 6.5

163
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

6.2.- Librera KeyPad.


La configuracin del puerto correspondiente al teclado matricial se debe hacer de la
siguiente manera:
dim keypadPort as byte at PORTC

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

Estos valores se corresponden con las teclas de la siguiente manera:

Tecla Presionada
1
2
3
A
4
5
6
B
7
8
9
C
*
0
#
D

Valor cargado en la variable


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

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

Veamos a continuacin el programa que captura el valor correspondiente a una tecla


presionada. El resultado cargado en la variable se ver en la pantalla LCD.

6.2.2.1.- Ejemplo de programacin #36:


program Proyecto_KeyPad_01
' Seccin de Declaracin
Dim keypadPort

As Byte At PORTD '


'
pulsador As Byte
'
'
pulsadorStr As String[5]
'

Declaramos en puerto en el cual estar


conectado el Teclado matricial.
Variable para almacenar el resultado de
la rutina "keypad".
Variable para la conversin de Byte a String.

' 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

' Fin de la configuracin de coneciones

main: '

Programa Principal

pulsador = 0

' Inicializamos la variable "Pulsador"

LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)
Delay_ms(500)

'
'
'
'

Inicializamos la pantalla LCD


Limpia la pantalla LCD
Apaga el cursor en la pantalla
Retardo de 500 milisegundos

GoSub Teclado
byteToStr(pulsador, pulsadorStr)
Lcd_Out(1, 1, "Tecla:")
Lcd_Out(1, 7,pulsadorStr)

'
'
'
'

Llamamos a la subrutina del Teclado.


Convertimos el resultado a "String".
Escribimos la palabra "Tecla:"
Imprime el resultado de la rutina KeyPad.

GoTo inicio

' Saltamos a la etiqueta "inicio".

inicio:

Teclado:
pulsador = Keypad_Key_Press()

' Si un pulsador ha sido, captura el valor


' decimal correspondiente a ste.

delay_ms(300)

' Retardo de 300 milisegundos.

Return

' Retorna una lnea despues del llamado a la


' rutina "teclado".

End.

166
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Al compilar y grabar el programa en el microcontrolador, el resultado mientras ninguna tecla


haya sido presionada ser el siguiente:

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()

' Si un pulsador ha sido, captura el valor


' decimal correspondiente a ste.

delay_ms(300)

' Retardo de 300 milisegundos.

Return

' Retorna una lnea despues del llamado a la


' rutina "teclado".

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

6.2.2.2.- Ejemplo de programacin #37:


program Proyecto_KeyPad_02
' Seccin de Declaracin
Dim keypadPort
pulsador

As Byte At PORTD '


'
As Byte
'
'

Declaramos en puerto en el cual estar


conectado el Teclado matricial.
Variable para almacenar el resultado de
la rutina "keypad".

' 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

' Fin de la configuracin de coneciones


main: '

Programa Principal

pulsador = 0

' Inicializamos la variable "Pulsador"

LCD_Init()

' Inicializamos la pantalla LCD

LCD_Cmd(_LCD_CLEAR)

' Limpia la pantalla LCD

LCD_Cmd(_LCD_CURSOR_OFF)

' Apaga el cursor en la pantalla

inicio:
GoSub Teclado

' Llamamos a la subrutina del 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

' 49 en Ascii es " "

If pulsador = 1 Then
pulsador = 49
End If

' 49 en Ascii es "1"

If pulsador = 2 Then
pulsador = 50
End If

' 50 en Ascii es "2"

If pulsador = 3 Then
pulsador = 51
End If

' 51 en Ascii es "3"

If pulsador = 4 Then
pulsador = 65
End If

' 65 en Ascii es "A"

If pulsador = 5 Then

169
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

pulsador = 52
End If

' 52 en Ascii es "4"

If pulsador = 6 Then
pulsador = 53
End If

' 53 en Ascii es "5"

If pulsador = 7 Then
pulsador = 54
End If

' 54 en Ascii es "6"

If pulsador = 8 Then
pulsador = 66
End If

' 66 en Ascii es "B"

If pulsador = 9 Then
pulsador = 55
End If

' 55 en Ascii es "7"

If pulsador = 10 Then
pulsador = 56
End If

' 56 en Ascii es "8"

If pulsador = 11 Then
pulsador = 57
End If

' 57 en Ascii es "9"

If pulsador = 12 Then
pulsador = 67
End If

' 67 en Ascii es "C"

If pulsador = 13 Then
pulsador = 42
End If

' 42 en Ascii es "*"

If pulsador = 14 Then
pulsador = 48
End If

' 48 en Ascii es "0"

If pulsador = 15 Then
pulsador = 35
End If

' 35 en Ascii es "#"

If pulsador = 16 Then
pulsador = 68
End If

' 68 en Ascii es "D"

Lcd_Out(1, 1, "Tecla:")
Lcd_Chr(1, 8, pulsador)

' Escribimos la palabra "Tecla:"


' Imprime el caracter Ascii del valor en la variable.

GoTo inicio

' Saltamos a la etiqueta "inicio".

Teclado:
pulsador = Keypad_Key_Press()

' Si un pulsador ha sido, captura el valor


' decimal correspondiente a ste.

delay_ms(300)

' Retardo de 300 milisegundos.

Return

' Retorna una lnea despues del llamado a la


' rutina "teclado".

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

Si presionamos la tecla #, veremos este mismo smbolo en la pantalla:

Figura 6.12
Lo mismo aplica para resto de las teclas.

171
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

6.3.- Teclado PS/2.


MikroBasic posee una librera para el control de un teclado QWERTY - PS/2, a travs del
cual podremos introducir datos a nuestros proyectos. Al igual que muchas de las libreras
anteriormente estudiadas, posee una rutina de inicializacin y una rutina de captura de datos
para el teclado.

Figura 6.13

Bsicamente la librera PS/2 resuelve la comunicacin entre el microcontrolador y un


teclado Qwerty en una sola va, ya que slo se utilizan dos lneas denominadas Data t Clk.
Esto significa que cuando presionamos una tecla, la informacin de sta es enviada hacia el
microcontrolador para ser procesada por el mismo (no hay comunicacin desde el
microcontrolador hacia el teclado). Para que esta librera funcione correctamente, es
importante mencionar que el oscilador externo del microcontrolador debe ser igual o mayor a
6 Mhz. Otro punto importante a considerar ser el uso de dos resistencias Pull Up en los
pines de comunicacin del teclado, data y Clk.
Un teclado qwerty consta por lo regular de 101 teclas entre letras, nmeros, smbolos o
teclas de funciones especiales. Cuando hacemos uso de esta librera, la rutina encargada de
realizar la comunicacin y extraccin de datos del teclado nos devuelve un valor numrico
que corresponder a la tecla presionada, o dicho de otra manera, nos devolver el valor
ASCII del smbolo correspondiente en la tecla; incluso es capaz de detectar mas de un
smbolo en una misma tecla, cuando hacemos uso de las funciones Shift o Alt.

172
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Una configuracin comn de un teclado Qwerty la podemos observar en la siguiente figura:

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.16. (Fuente: www.mikroe.com)


174
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Los ejemplos de programacin estarn basados en el siguiente diagrama esquemtico:

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:

Figura 6.18 (Fuente: www.mikroe.com)

175
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

6.4.- Librera PS/2.


Siempre ser imprescindible realizar la declaracin al inicio de un programa de los pines de
comunicacin del teclado PS/2, como se muestra a continuacin:
Dim PS2_Data
Dim PS2_Clock

As sbit At PORTC.0
As sbit At PORTC.1

Dim PS2_Data_Direction As sbit At TRISC.0


Dim PS2_Clock_Direction As sbit At TRISC.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.

6.4.2.- Ps2_Key_Read(valor, funcin, estado)


Esta rutina tiene tres campos que hemos denominado valor, especial y estado.

Valor: almacena el valor correspondiente al smbolo en la tecla presionada.

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

Antes de empezar a programar, recordemos que cuando creamos un nuevo proyecto en


mikroBasic, siempre es importante verificar hemos seleccionado las libreras
correspondientes a los perifricos que estaremos utilizando en la prctica. En este caso, las
libreras a seleccionar debern ser las siguientes:

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

PS2_Data_Direction As sbit At TRISC.0


PS2_Clock_Direction As sbit At TRISC.1
' 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

RB4_bit
RB5_bit
RB0_bit
RB1_bit
RB2_bit
RB3_bit

LCD_RS_Direction As sbit At TRISB4_bit


LCD_EN_Direction As sbit At TRISB5_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

' Fin de la configuracin de coneciones

Dim Valor, funcion, estado As Byte


Dim txt As String[4]
main:
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Inicializamos la pantalla LCD.


' Limpiamos la pantalla LCD.
' Apagamos el Cursor.

Ps2_Config()
Delay_ms(100)

' Inicializamos MCU para comunicacin con PS/2.


' Retardo de 100 milisegundos.

Lcd_Out(1, 1, "Caracter: ")


Lcd_Out(2, 1, "ASCII: ")

' Escribimos la palabra "Caracter:" en la primera lnea.


' Escribimos la palabra "ASCII:" en la segunda lnea

While TRUE
Ps2_Key_Read(Valor, funcion, estado)

' Verificamos si ha sido presionada una tecla.

' Seguidamente, verificamos el estado de cada campo o variable en la rutina,


' y entregamos un resultado slo si se cumple la condicin planteada:
' si el campo o variable "estado" es diferente de cero (lo cual significa que ha sido
' presionada una tecla), y...
' si el campo o variable "funcion" es igual a cero (lo cual significa que ninguna
' tecla de funcin especial ha sido presionada) y...
' si el campo o variable "valor" es diferente de cero...

entonces:

If (estado <> 0) And (funcion = 0) And (Valor <> 0) Then


ByteToStr(Valor, txt)
Lcd_Out(1, 11, txt)

' Convertimos la variable "valor" en un string de datos.


' Mostramos el string de datos en la pantalla LCD, en la
' posicin especificada, lnea 1, columna 11.

LCD_Chr(2, 12, Valor)

' Mostramos el equivalente ASCII en la posicin


' especificada, lnea 2, columna 12.

End If
Delay_ms(10)

' Hacemos una pausa de 10 milisegundos.

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.

A partir de la etiqueta main, hacemos lo necesario para inicializar la pantalla LCD y


para preparar las comunicaciones entre el teclado y el microcontrolador. En este
punto es recomendable realizar una pausa de al menos 100 milisegundos, para dar
tiempo suficiente sobre la inicializacin de los perifricos.
178

_______________________________________________________________________________________
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.

Realizamos el resto del programa en un ciclo infinito, en el cual estaremos


capturando los datos provenientes del teclado PS/2, para luego ser almacenados y
mostrados en la pantalla LCD.

Veamos los resultados de este ejercicio si presionamos la siguiente tecla de ejemplo:

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

Pero si presionamos la tecla Shift o Mayscula y luego la misma tecla sealada,


entonces el resultado cambia:

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

Debido a que las teclas de funciones especiales no retornan un valor equivalente a un


smbolo (ASCII), eliminaremos del ejemplo anterior las lneas correspondientes a la
informacin presentada en la segunda lnea de la pantalla LCD.

180
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

6.4.2.2.- Ejemplo de programacin #39:


program PS2_02
' Declaracin de variables y puertos para Librera PS/2:
Dim PS2_Data
PS2_Clock

As sbit At PORTC.0
As sbit At PORTC.1

PS2_Data_Direction As sbit At TRISC.0


PS2_Clock_Direction As sbit At TRISC.1
' 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

' Fin de la configuracin de coneciones


Dim Valor, funcion, estado As Byte
Dim txt As String[4]
main:
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Inicializamos la pantalla LCD.


' Limpiamos la pantalla LCD.
' Apagamos el Cursor.

Ps2_Config()
Delay_ms(100)

' Inicializamos MCU para comunicacin con PS/2.

Lcd_Out(1, 1, "Tecla Func.: ") ' Escribimos la palabra "Caracter:" en la primera lnea.
While TRUE
Ps2_Key_Read(Valor, funcion, estado)

' Verificamos si ha sido presionada una tecla.

' Seguidamente, verificamos el estado de cada campo o variable en la rutina,


' y entregamos un resultado slo si se cumple la condicin planteada:
' si el campo o variable "estado" es diferente de cero (lo cual significa que ha sido
' presionada una tecla), y...
' si el campo o variable "funcion" es igual a uno (lo cual significa que una de las
' teclas de funcin especial ha sido presionada) y...
' si el campo o variable "valor" es diferente de cero...

entonces:

If (estado <> 0) And (funcion = 1) And (Valor <> 0) Then


ByteToStr(Valor, txt)
Lcd_Out(1, 13, txt)

' Convertimos la variable "valor" en un string de datos.


' Mostramos el string de datos en la pantalla LCD, en la
' posicin especificada, lnea 1, columna 13.

End If
Delay_ms(10)

' Hacemos una pausa de 10 milisegundos.

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

Si presionamos la tecla Print Screen, el valor correspondiente segn la tabla de la figura


6.16 cargado en la variable valor sera:

Figura 6.24

Veamos el siguiente ejemplo en el cual mostraremos el smbolo ASCII correspondiente a


una tecla en la primera lnea de la pantalla LCD, y el valor correspondiente a las teclas de
funciones especiales en la segunda lnea de la pantalla.

182
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

6.4.2.3.- Ejemplo de programacin #40:


program PS2_03
' Declaracin de variables y puertos para Librera PS/2:
Dim PS2_Data
PS2_Clock

As sbit At PORTC.0
As sbit At PORTC.1

PS2_Data_Direction As sbit At TRISC.0


PS2_Clock_Direction As sbit At TRISC.1
' 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

' Fin de la configuracin de coneciones


Dim Valor, funcion, estado As Byte
Dim txt As String[4]
main:
LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Inicializamos la pantalla LCD.


' Limpiamos la pantalla LCD.
' Apagamos el Cursor.

Ps2_Config()
Delay_ms(100)

' Inicializamos MCU para comunicacin con PS/2.


' Retardo de 100 milisegundos.

Lcd_Out(1, 1, "ASCII: ")


' Escribimos la palabra "Caracter:" en la primera lnea.
Lcd_Out(2, 1, "Tecla Func.: ") ' Escribimos la palabra "ASCII:" en la segunda lnea
While TRUE
Ps2_Key_Read(Valor, funcion, estado)

' Verificamos si ha sido presionada una tecla.

' Seguidamente, verificamos el estado de cada campo o variable en la rutina,


' y entregamos un resultado slo si se cumple la condicin planteada:
' si el campo o variable "estado" es diferente de cero (lo cual significa que ha sido
' presionada una tecla), y...
' si el campo o variable "funcion" es igual a cero (lo cual significa que ninguna
' tecla de funcin especial ha sido presionada) y...
' si el campo o variable "valor" es diferente de cero...

entonces:

If (estado <> 0) And (funcion = 0) And (Valor <> 0) Then


Lcd_Chr(1, 8, Valor)

' Mostramos el equivalente ASCII en la posicin


' especificada, lnea 2, columna 12.

Else
If (estado <> 0) And (funcion = 1) And (Valor <> 0) Then
ByteToStr(Valor, txt)
Lcd_Out(2, 13, txt)

' Convertimos la variable "valor" en un string de datos.


' Mostramos el string de datos en la pantalla LCD, en la
' posicin especificada, lnea 1, columna 13.

183
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

End If
End If
Delay_ms(10)

' Hacemos una pausa de 10 milisegundos.

Wend
End.

184
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Captulo VII. Memoria de Datos EEPROM

7.1.- La Memoria de Datos EEPROM.


La memoria EEPROM de datos resulta muy importante cuando necesitamos almacenar
informacin que no queremos que se pierda al desconectar la energa de nuestros
proyectos. La capacidad de esta memoria vara segn el modelo de microcontrolador que
escojamos, y no todos cuentan con esta caracterstica. Sin embargo los microcontroladores
que hemos estado utilizando en esta edicin cuentan con este hardware en su arquitectura
interna.
Por ejemplo, un PIC16F877 cuenta con una memoria de datos de 256 bytes al igual que la
serie de la familia PIC18FXX2 y la serie de la familia PIC18FXX8. Esta es una informacin
puede ser verificada directamente en la hoja de caractersticas tcnicas de cada
microcontrolador. Sin embargo, haremos un mapa de memoria de datos para el
microcontrolador PIC16F877, a travs del cual explicaremos la forma de almacenar
informacin en posiciones predeterminadas en la programacin de cada ejemplo propuesto.
Mapa de memoria de un microcontrolador PIC16F877:
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:

Memoria de Datos PIC16F877


00 01 02 03 04 05 06 07
08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17
18 19 1A 1B 1C 1D 1E 1F
20 21 22 23 24 25 26 27
28 29 2A 2B 2C 2D 2E 2F
30 21 32 33 34 35 36 37
38 39 3A 3B 3C 3D 3E 3F
40 41 42 43 44 45 46 47
48 49 4A 4B 4C 4D 4E 4F
50 51 52 53 54 55 56 57
58 59 5A 5B 5C 5D 5E 5F
60 61 62 63 64 65 66 67
68 69 6A 6B 6C 6D 6E 6F
70 71 72 73 74 75 76 77
78 79 7A 7B 7C 7D 7E 7F
80 81 82 83 84 85 86 87
88 89 8A 8B 8C 8D 8E 8F
90 91 92 93 94 95 96 97
98 99 9A 9B 9C 9D 9E 9F
A0 A1 A2 A3 A4 A5 A6 A7
A8 A9 AA AB AC AD AE AF
B0 B1 B2 B3 B4 B5 B6 B7
B8 B9 BA BB BC BD BE BF
C0 C1 C2 C3 C4 C5 C6 C7
C8 C9 CA CB CC CD CE CF
D0 D1 D2 D3 D4 D5 D6 D7
D8 D9 DA DB DC DD DE DF
E0 E1 E2 E3 E4 E5 E6 E7
E8 E9 EA EB EC ED EE EF
F0 F1 F2 F3 F4 F5 F6 F7
F8 F9 FA FB FC FD FE FF

Figura 7.1
185
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

7.2.- Librera EEPROM.


Guardar y leer datos resulta muy sencillo al trabajar en mikroBasic. Este compilador cuenta
con una librera para el control de la memoria EEPROM, la cual tiene una rutina para la
lectura de datos y otra para la escritura de datos en posiciones especficas dentro del mapa
de memoria.
Veamos a continuacin la sintaxis de estas dos rutinas.
Lectura de la memoria EEPROM de datos:
7.2.1.- EEPROM_Read(Direccin).
El campo Direccin se refiere a la posicin dentro del mapa de memoria que deseamos
leer.
Ejemplo:

Dato = EEPROM_Read(0x01)

' Lectura de la memoria EEPROM de datos en la


' direccin 0x01 del mapa de memoria.

Escritura de la memoria EEPROM de datos:


7.2.2.- EEPROM_Write(Direccin, Dato).
El campo Direccin se refiere a la posicin dentro del mapa de memoria que deseamos
escribir o re-escribir.
El campo Dato se refiere a la informacin que deseamos almacenar, la cual podr estar
cargada en una variable tipo Byte previamente definida.
Ejemplo:
EEPROM_Write(0x01,Dato)

' Escribe el contenido de la variable Dato en la


' direccin 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:

Memoria de Datos PIC16F877


00 01 02 03 04 05 06 07
08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17
18 19 1A 1B 1C 1D 1E 1F
20 21 22 23 24 25 26 27
28 29 2A 2B 2C 2D 2E 2F
30 21 32 33 34 35 36 37
38 39 3A 3B 3C 3D 3E 3F
40 41 42 43 44 45 46 47
48 49 4A 4B 4C 4D 4E 4F
50 51 52 53 54 55 56 57
58 59 5A 5B 5C 5D 5E 5F
60 61 62 63 64 65 66 67
68 69 6A 6B 6C 6D 6E 6F
70 71 72 73 74 75 76 77
78 79 7A 7B 7C 7D 7E 7F
80 81 82 83 84 85 86 87
88 89 8A 8B 8C 8D 8E 8F
90 91 92 93 94 95 96 97
98 99 9A 9B 9C 9D 9E 9F
A0 A1 A2 A3 A4 A5 A6 A7
A8 A9 AA AB AC AD AE AF
B0 B1 B2 B3 B4 B5 B6 B7
B8 B9 BA BB BC BD BE BF
C0 C1 C2 C3 C4 C5 C6 C7
C8 C9 CA CB CC CD CE CF
D0 D1 D2 D3 D4 D5 D6 D7
D8 D9 DA DB DC DD DE DF
E0 E1 E2 E3 E4 E5 E6 E7
E8 E9 EA EB EC ED EE EF
F0 F1 F2 F3 F4 F5 F6 F7
F8 F9 FA FB FC FD FE FF

Tabla 7.3

7.2.2.1.- Ejemplo de programacin #41.


Ahora analice detenidamente el siguiente programa tomando en cuenta cada comentario.
Notar que la clave que hemos establecido en el programa es una serie de dgitos
consecutivos 123456.
program EEPROM_1
' Seccin de Declaracin
Dim keypadPort
pulsador

As Byte At PORTD '


'
As Byte
'
'

Declaramos en puerto en el cual estar


conectado el Teclado matricial.
Variable para almacenar el resultado de
la rutina "keypad".

' Configuracin de los pines de la LCD


Dim LCD_RS
LCD_EN
LCD_D4
LCD_D5
LCD_D6

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

LCD_D7 As sbit At RB3_bit


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

' Fin de la configuracin de coneciones


Dim Clave
As Byte[7]
Digito
As Byte[7]
Contador As Byte
main: '

' Arreglo para almacenar temporalmente la Clave.


' Arreglo para comparar la Clave con los digitos pulsados.
' Variable para acumulador temporal.

Programa Principal

LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Inicializamos la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

Sound_Init(PORTE, 0)

' Asignamos el pin RE0 para generar los tonos de confirmacin


' cuando se introduce un dgito en el teclado.

inicio:
pulsador = 0

' Inicializamos la variable "Pulsador"

' Almacenamos los digitos de la contrasea en la memoria EEPROM, en las


' posiciones asignadas por el diseador del programa.
' La contrasea inicial ser: 123456
EEPROM_Write(10,
EEPROM_Write(11,
EEPROM_Write(12,
EEPROM_Write(13,
EEPROM_Write(14,
EEPROM_Write(15,

1)
2)
3)
5)
6)
7)

'
'
'
'
'
'

1er
2do
3er
4to
5to
6to

digito
digito
digito
digito
digito
digito

de
de
de
de
de
de

Lcd_Out(1, 1, "Control - Acceso")


Lcd_Out(2, 1, "** Bienvenido **")
Delay_Ms(2000)

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.

' Escribimos un mensaje en la lnea 1.


' Escribimos un mensaje en la lnea 2.

' Pausa de 2 segundoa para poder visualizar en mensaje en la


' pantalla LCD.

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.

' Escribimos un mensaje en la lnea 1.


' Escribimos un mensaje en la lnea 2.

Delay_Ms(2000)

' Pausa de 2 segundoa para poder visualizar en mensaje en la


' pantalla LCD.

Contador = 0

' Inicializamos la variable del Contador temporal.

espera:
GoSub Teclado

' Verificamos si una tecla ha sido presionada.

If pulsador = 0 Then
GoTo espera
End If

' Si no se presion ninguna tecla, la variable "Pulsador"


' permanece en cero, y ocurre un salto a "espera".

Sound_Play(880, 80)

' Genera un sonido para anunciar la tecla presionada.

Contador = Contador + 1

' Aumentamos en una unidad el Contador. De esta manera


' es posible llevar la cuenta de la cantidad de dgitos
' que necesitamos introducir desde el Teclado.

189
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Digito[Contador] = pulsador

'
'
'
'

El valor cargado desde el teclado es almacenado


en la variable de indice igual a "Contador", para
luego ser comparada con el digito correspondiente
a la clave almacenada en la EEPROM.

If Contador = 6 Then
GoTo Comprobar
End If

' Si Contador = 6, entonces el ltimo digito de la


' clave fu introducido desde el teclado.

GoTo espera

' Salta a la etiqueta "espera" si la clave no ha


' sido completada.

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

'
'
'
'

Comparamos el 1er digito de la clave.


Si es correcto, pasa a comparar el siguiente.
de lo contrario...
salta al mensaje de error de clave.

'
'
'
'

Comparamos el 2do digito de la clave.


Si es correcto, pasa a comparar el siguiente.
de lo contrario...
salta al mensaje de error de clave.

'
'
'
'

Comparamos el 3er digito de la clave.


Si es correcto, pasa a comparar el siguiente.
de lo contrario...
salta al mensaje de error de clave.

'
'
'
'

Comparamos el 4to digito de la clave.


Si es correcto, pasa a comparar el siguiente.
de lo contrario...
salta al mensaje de error de clave.

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

'
'
'
'

Comparamos el 5to digito de la clave.


Si es correcto, pasa a comparar el siguiente.
de lo contrario...
salta al mensaje de error de clave.

'
'
'
'

Comparamos el 6to digito de la clave.


Si es correcto, salta al mensaje de clave correcta.
de lo contrario...
salta al mensaje de error de clave.

pase5:
If Digito[6] = Clave[6] Then
GoTo ClaveCorrecta
Else
GoTo ErrorClave
End If

' Si los seis dgitos han sido correctos


' se ejecuta la subrutina correspondiente.
ErrorClave:
Lcd_Out(1, 1, "Error de Acceso!")
Lcd_Out(2, 1, "****************")

' Escribimos un mensaje en la lnea 1.


' Escribimos un mensaje en la lnea 2.

Delay_ms(2000)

' Pausa de 2 segundoa para poder visualizar

190
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

' en mensaje en la pantalla LCD.


GoTo Clave

' Saltamos a la etiqueta "inicio".

ClaveCorrecta:
Lcd_Out(1, 1, " Clave Correcta ")
Lcd_Out(2, 1, "****************")

' Escribimos un mensaje en la lnea 1.


' Escribimos un mensaje en la lnea 2.

Delay_ms(2000)

' Pausa de 2 segundoa para poder visualizar


' en mensaje en la pantalla LCD

Final:
GoTo Final

' Lazo infinito.

Teclado:
pulsador = Keypad_Key_Press()

' Si un pulsador ha sido, captura el valor


' decimal correspondiente a ste.

delay_ms(300)

' Retardo de 300 milisegundos.

Return

' Retorna una lnea despues del llamado a la


' rutina "teclado".

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

Valor cargado en la variable


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

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.

7.2.2.2.- Ejemplo de programacin #42.


Veamos ahora algunas modificaciones importantes en el ejemplo anterior, en el cual se ha
creado la posibilidad de cambiar la clave de fbrica del sistema por una clave
personalizada de seis dgitos, la cual deber quedar almacenada en las mismas posiciones
de la memoria EEPROM de datos.
Para lograr este objetivo, debemos tomar en cuenta lo siguiente:

En el programa anterior, la clave de fbrica es almacenada en sus respectivas


posiciones cada vez que el microcontrolador es reiniciado. En este nuevo ejemplo,
esta situacin deber ser controlada, debido a que si realizamos un cambio de clave
en el sistema, y ste es reiniciado, lo correcto sera mantener la nueva clave y no la
de fbrica. Para evitar que la nueva clave sea re-escrita por la clave de fbrica,
tomaremos la posicin cero 0 de la memoria EEPROM de datos para crear una
bandera que nos indique si la clave ha sido modificada por primera vez. Entonces, si
iniciamos el sistema y su clave nunca ha sido modificada, el valor en la posicin cero
de la memoria EEPROM ser siempre igual a $FF. Una vez que decidamos cambiar
la clave en el sistema a travs de un nuevo men de opciones que vamos a crear,
entonces tendremos que modificar esta bandera asignando un valor (por ejemplo 1)
en la posicin cero de la memoria EEPROM de datos.

Una vez introducida la nueva clave, a travs de un procedimiento que est


detalladamente explicado en los comentarios del programa, procederemos a
almacenar la clave en las mismas posiciones de la memoria EEPROM de datos en
las cuales se encuentra la clave de fbrica.

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 Byte At PORTD '


'
As Byte
'
'

Declaramos en puerto en el cual estar


conectado el Teclado matricial.
Variable para almacenar el resultado de
la rutina "keypad".

' 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

' Fin de la configuracin de coneciones


Dim Clave
As Byte[7]
Digito
As Byte[7]
Contador As Byte

' Arreglo para almacenar temporalmente la Clave.


' Arreglo para comparar la Clave con los digitos pulsados.
' Variable para acumulador temporal.

ClavedeFabrica As Byte ' Bandera para determinar si la Clave ha sido modificada.


main: '

Programa Principal

LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Inicializamos la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

Sound_Init(PORTE, 0)

' Asignamos el pin RE0 para generar los tonos.

inicio:
pulsador = 0
'
'
'
'
'
'
'

' Inicializamos la variable "Pulsador"

Es importante verificar si la "Clave de fbrica" ha sido cambiada, ya que sino


realizamos esta comprobacin, la clave de fbrica ser re-escrita cada vez que
reiniciemos el sistema. Para esto, crearemos una bandera en la posicin 0 de
la memoria de datos. Entonces, si el sistema es iniciado por primera vez, esta
posicin ser igual a $FF (Cuando tenemos un microcontrolador nuevo, y no hemos
almacenado datos en su EEPROM, esta contiene en cada una de sus posiciones este
valor, $FF).

' 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

' Carga el valor almacenado en la posicin 0


' de la EEPROM en la variable.

' Si el valor es igual a 1, la Clave fue cambiada,


' y se salta la grabacin de la clave de fbrica.

194
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

' Si la bandera o valor de la posicin 0 de la EEPROM no ha sido modificada,


' almacenamos los digitos de la contrasea en la memoria EEPROM, en las
' posiciones asignadas por el diseador del programa.
' La contrasea o clave de fbrica ser: 123456
EEPROM_Write(10,
EEPROM_Write(11,
EEPROM_Write(12,
EEPROM_Write(13,
EEPROM_Write(14,
EEPROM_Write(15,

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)

' Escribimos un mensaje en la lnea 1.


' Escribimos un mensaje en la lnea 2.

' Pausa de 2 segundoa para poder visualizar en mensaje en la


' pantalla LCD.

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.

' Escribimos un mensaje en la lnea 1.


' Escribimos un mensaje en la lnea 2.

Delay_Ms(2000)

' Pausa de 2 segundoa para poder visualizar en mensaje en la


' pantalla LCD.

Contador = 0

' Inicializamos la variable del Contador temporal.

espera:
GoSub Teclado

' Verificamos si una tecla ha sido presionada.

If pulsador = 0 Then
GoTo espera
End If

' Si no se presion ninguna tecla, la variable "Pulsador"


' permanece en cero, y ocurre un salto a "espera".

Sound_Play(880, 80)

' Genera un sonido para anunciar la tecla presionada.

Contador = Contador + 1

' Aumentamos en una unidad el Contador. De esta manera


' es posible llevar la cuenta de la cantidad de dgitos
' que necesitamos introducir desde el Teclado.

Digito[Contador] = pulsador

'
'
'
'

El valor cargado desde el teclado es almacenado


en la variable de indice igual a "Contador", para
luego ser comparada con el digito correspondiente
a la clave almacenada en la EEPROM.

If Contador = 6 Then
GoTo Comprobar
End If

' Si Contador = 6, entonces el ltimo digito de la


' clave fu introducido desde el teclado.

GoTo espera

' Salta a la etiqueta "espera" si la clave no ha


' sido completada.

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

'
'
'
'

Comparamos el 1er digito de la clave.


Si es correcto, pasa a comparar el siguiente.
de lo contrario...
salta al mensaje de error de clave.

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

'
'
'
'

Comparamos el 2do digito de la clave.


Si es correcto, pasa a comparar el siguiente.
de lo contrario...
salta al mensaje de error de clave.

'
'
'
'

Comparamos el 3er digito de la clave.


Si es correcto, pasa a comparar el siguiente.
de lo contrario...
salta al mensaje de error de clave.

'
'
'
'

Comparamos el 4to digito de la clave.


Si es correcto, pasa a comparar el siguiente.
de lo contrario...
salta al mensaje de error de clave.

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

'
'
'
'

Comparamos el 5to digito de la clave.


Si es correcto, pasa a comparar el siguiente.
de lo contrario...
salta al mensaje de error de clave.

'
'
'
'

Comparamos el 6to digito de la clave.


Si es correcto, salta al mensaje de clave correcta.
de lo contrario...
salta al mensaje de error de clave.

pase5:
If Digito[6] = Clave[6] Then
GoTo ClaveCorrecta
Else
GoTo ErrorClave
End If

' Si los seis dgitos han sido correctos


' se ejecuta la subrutina correspondiente.
ErrorClave:
Lcd_Out(1, 1, "Error de Acceso!")
Lcd_Out(2, 1, "****************")

' Escribimos un mensaje en la lnea 1.


' Escribimos un mensaje en la lnea 2.

Delay_ms(2000)

' Pausa de 2 segundoa para poder visualizar


' en mensaje en la pantalla LCD.

GoTo Clave

' Saltamos a la etiqueta "inicio".

ClaveCorrecta:
Lcd_Out(1, 1, " Clave Correcta ")
Lcd_Out(2, 1, "****************")

' Escribimos un mensaje en la lnea 1.


' Escribimos un mensaje en la lnea 2.

Delay_ms(2000)

' Pausa de 2 segundoa para poder visualizar


' en mensaje en la pantalla LCD
' Inicializamos la variable "Pulsador"

Pulsador = 0
Menu:
Lcd_Out(1, 1, "Cambio de Clave ")
Lcd_Out(2, 1, "****************")

' Escribimos un mensaje en la lnea 1.


' Escribimos un mensaje en la lnea 2.

Delay_ms(2000)

' Pausa de 2 segundoa para poder visualizar


' en mensaje en la pantalla LCD

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")

' Escribimos un mensaje en la lnea 1.


' Escribimos un mensaje en la lnea 2.

GoSub Teclado

' Verificamos si ha sido presionada una tecla.

If Pulsador = 0 Then
GoTo Opcion_1
End If

' Si pulsador = 0, significa que ninguna tecla


' ha sido presionada. Entonces salta a Opcion_1

Sound_Play(880, 80)

' Genera un sonido para anunciar la tecla presionada.

If Pulsador = 12 Then
GoTo CambiodeClave
Else
GoTo Menu
End If

'
'
'
'

Si pulsador = 12, entonces hemos presionado la


tecla "C" en el Teclado matricial.
De lo contrario...
Salta al men de inicio.

CambiodeClave:
Lcd_Out(1, 1, " Introduzca la
Lcd_Out(2, 1, " clave nueva
Contador = 0

")
")

' Escribimos un mensaje en la lnea 1.


' Escribimos un mensaje en la lnea 2.

' Inicializamos la variable del Contador temporal.

espera_2:
GoSub Teclado

' Verificamos si una tecla ha sido presionada.

If pulsador = 0 Then
GoTo espera_2
End If

' Si no se presion ninguna tecla, la variable "Pulsador"


' permanece en cero, y ocurre un salto a "espera_2".

Sound_Play(880, 80)

' Genera un sonido para anunciar la tecla presionada.

Contador = Contador + 1

' Aumentamos en una unidad el Contador. De esta manera


' es posible llevar la cuenta de la cantidad de dgitos
' que necesitamos introducir desde el Teclado.

Digito[Contador] = pulsador

'
'
'
'

El valor cargado desde el teclado es almacenado


en la variable de indice igual a "Contador", para
luego ser comparada con el digito correspondiente
a la clave almacenada en la EEPROM.

If Contador = 6 Then
GoTo GrabarClave
End If

' Si Contador = 6, entonces el ltimo digito de la


' clave fu introducido desde el teclado.

GoTo espera_2

' Salta a la etiqueta "espera" si la clave no ha


' sido completada.

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

' Escribimos un mensaje en la lnea 1.


' Escribimos un mensaje en la lnea 2.
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.

' Ponemos un 1 en la posicin elegida para la bandera que


' determina si hemos cambiado la clave de fbrica.
' Generamos un sonido de confirmacin de 2 segundos.
")
")

' Escribimos un mensaje en la lnea 1.


' Escribimos un mensaje en la lnea 2.

197
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Fin: GoTo Fin

' Lazo infinito.

Teclado:
pulsador = Keypad_Key_Press()

' Si un pulsador ha sido, captura el valor


' decimal correspondiente a ste.

delay_ms(300)

' Retardo de 300 milisegundos.

Return

' Retorna una lnea despues del llamado a la


' rutina "teclado".

End.

El resultado en este ejemplo es el siguiente:


Al iniciar el programa, veremos una pantalla de bienvenida durante dos segundos y luego la
pantalla que nos indica cuando podremos ingresar la clave.

Figura 7.7

Figura 7.8

198
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Si al ingresar la clave cometemos un error, el mensaje ser el siguiente:

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

En este punto, el programa ha entrado en un lazo infinito.

201
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Captulo VIII. Conversor A/D.

8.1.- El conversor A/D.


Los microcontroladores de las familias PIC16F87x y PIC18Fxxx de los cuales estaremos
hablando a continuacin, poseen un convertidor Analgico-Digital que convierte una seal
analgica en un nmero de 8 o 10 bits, segn sea la configuracin elegida por el diseador.
En los microcontroladores PIC de 28 pines como el PIC16F870, encontraremos que solo
poseen 5 entradas para la conversin A/D, y en el caso particular de los microcontroladores
de 40 pines como el PIC16F877 o el PIC18F442 por ejemplo, se puede observar que
poseen 8 canales para conversin A/D, identificadas por las siglas AN(n), las cuales se
encuentran distribuidas entre el puerto A y el puerto E, como se muestra en el diagrama de
pines de la figura 8.1:

Figura 8.1

En el microcontrolador PIC16F877, cada canal de conversin A/D est conectado a un pin


ubicado en el puerto A y en el puerto E. Por ejemplo, el canal AN0 corresponde al pin # 2
del microcontrolador, o expresado de otra manera, al pin RA0 del puerto A. El canal AN1
corresponde al pin # 3; el canal AN2 corresponde al pin # 4 y as sucesivamente; entonces
se puede ver claramente que el puerto A cuenta con cinco de los ocho canales del conversor
A/D, y los otros tres canales estn ubicados en los pines correspondientes al puerto E del
microcontrolador.

202
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

El conversor A/D de estos microcontroladores es de 10 bits, lo cual significa que tenemos


210 = 1024 datos de conversin, como se puede observar en la tabla de la figura 8.2.

REGISTRO ALTO (ADRESH)


BIT 6

BIT 5

BIT 4

BIT 3

BIT 2

REGISTRO BAJO (ADRESL)

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

Resolucin = 0.0196 0.02 V

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

Resolucin = 0.00488 0.0049 V

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

Resolucin = 0.00244 0.0025 V

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

En mikroBasic, la conversin de datos A/D es posible gracias a su librera ADC, la cual


podemos ubicar fcilmente en la pestaa de libreras, y la cual cuenta con tan solo una
rutina, capaz de hacer todo el trabajo fcilmente y sin complicaciones.

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:

Dim humedad As Word


humedad = Adc_Read(2)
Significa que el resultado de la conversin de una seal presente en la entrada AN0 ser
almacenado en la variable humedad, la cual ha sido previamente definida en el programa,
tipo Word, debido a que el conversor est configurado a 10 bits.
Aunque la rutina Adc_Read(canal) se encarga de controlar el registro ADCON0 ahorrando
algunas lneas de programa, consideramos conveniente hacer una revisin de los registros
de control del conversor A/D.

8.1.1.- El registro ADCON0.


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.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 2: Estado de la conversin.


GO/DONE: Solo funciona si ADON = 1
1 = Conversin A/D en progreso.
0 = Conversin A/D detenida.
Bit 1: Este bit no est implementado.
Bit 0: Enciende el conversor A/D.
1 = conversor A/D encendido.
0 = conversor A/D apagado.

8.1.2..- El registro ADCON1.


Bit 7

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

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.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)

REGISTRO BAJO (ADRESL)

BIT 7 BIT 6 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

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:

REGISTRO ALTO (ADRESH)

REGISTRO BAJO (ADRESL)

BIT 7 BIT 6 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

Figura 8.14

REGISTRO ALTO (ADRESH)

REGISTRO BAJO (ADRESL)

BIT 7 BIT 6 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

Figura 8.15

Cuando justificamos el resultado de la conversin A/D a la izquierda, el bit menos


significativo de ste es el bit 6 del registro ADRESL, y el bit ms significativo es el bit 7 del
registro ADRESH.
Para realizar los siguientes ejemplos de programacin, hemos propuesto un circuito inicial
en el cual tendremos conectado al microcontrolador una pantalla Glcd para visualizar los
resultados de la conversin, y un potencimetro con el cual estaremos variando el nivel de
voltaje entre 0 voltios y 5 voltios en una de las entradas del conversor, especficamente en
RA2.
A medida que vayamos avanzando, iremos incorporando nuevas caractersticas a cada
ejercicio, de tal manera que podamos generar algunas nuevas ideas que sirvan en el
desarrollo de proyectos que requieran de una conversin A/D.
209
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

8.1.3.- Ejemplo de programacin #43:


El diagrama esquemtico de la figura 8.16 muestra el conexionado entre en
microcontrolador y sus perifricos:

Figura 8.16

Recordemos los pasos a seguir cuando de una pantalla Glcd se trata:


1. Ya que vamos a imprimir texto en la pantalla Glcd, lo primero ser invocar al archivo
de fuentes creado anteriormente, en el captulo de Pantallas LCD y GLCD.
2. Realizamos la configuracin de pines de control y datos de la pantalla Glcd.

3. Declaramos algunas variables, en las cuales estaremos almacenando los datos


producto de la conversin A/D y el texto a ser mostrado en la pantalla.
4. Configuramos los registros correspondientes al conversor A/D y puertos.

210
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

5. Inicializamos la pantalla Glcd e invocamos el mdulo de fuentes deseado, pues


recordemos que en un archivo de fuentes, podemos tener ms de un mdulo.
6. En un lazo infinito, realizamos la conversin A/D y la cargamos en una variable tipo
Word. El valor convertido desde la entrada analgica y almacenado en la variable, lo
convertimos de Word a string para poder visualizarlo correctamente en la pantalla.
7. Finalmente, cargamos el texto y el contenido de la variable tipo string en una posicin
predeterminada de la pantalla Glcd.
Veamos a continuacin la solucin al planteamiento.
program ADC_01
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

' Fin de la configuracin del mdulo Glcd


Dim texto As String[20]
Dim dato As Word
Dim DatoStr As string[4]

'
'
'
'
'

Declaramos una variable tipo String en la cual


cargaremos un mensaje de un mximo de 20 caracteres.
Variable de 16 bits para cargar el valor de la
conversin A/D.
Variable para conversin datos.

main:
ADCON1 = 0
TRISA

= $FF

' Configura el puerto A como analgico,


' VDD es el voltaje de referencia --> Vref.
' Configura el puerto A como entrada.

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)

' Carga el resultado de la conversin de


' 10 bits en la variable.

wordtostr(dato, DatoStr)

' Conversin de word a string

texto = "Conversion A/D: "


Glcd_Write_Text(texto, 6, 1, 1)
Glcd_Write_Text(DatoStr, 92, 1, 1)

' Cargamos la variable con un mensaje.


' Escribimos el contenido
' Escribimos el contenido

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

8.1.4.- Ejemplo de programacin #44:

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:

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.19
La configuracin de los bits en el registro ADCON1 entonces deber ser igual a:
ADCON1 = %00000001

(en binario)

o visto de otra manera:


ADCON1 = 1

(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

El clculo de la resolucin se vera as:


Resolucin =

Vimax
2n

Resolucin =

5V
210

Resolucin =

5V
1024

Resolucin = 0.00488 0.0049 V


Resolucin = 4.9 mV

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

Resolucin = 0.00244 0.0025 V


Resolucin = 2.5 mV

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

' Fin de la configuracin del mdulo Glcd


Dim texto As String[20]
Dim dato As Word
Dim DatoStr As string[8]

'
'
'
'
'

Declaramos una variable tipo String en la cual


cargaremos un mensaje de un mximo de 20 caracteres.
Variable de 16 bits para cargar el valor de la
conversin A/D.
Variable para conversin datos.

main:
ADCON1 = 1
TRISA

= $FF

' Configura el puerto A como analgico,


' RA3 es el voltaje de referencia --> Vref.
' Configura el puerto A como entrada.

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)

' Carga el resultado de la conversin de


' 10 bits en la variable.

wordtostr(dato, DatoStr)

' Conversin de word a string

texto = "Conversion A/D: "


Glcd_Write_Text(texto, 6, 1, 1)
Glcd_Write_Text(DatoStr, 92, 1, 1)

' Cargamos la variable con un mensaje.


' Escribimos el contenido
' Escribimos el contenido

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

en RA3 y el valor de la resolucin calculada, podemos saber cual es el voltaje aplicado en la


entrada RA2, para luego presentar el mismo en la pantalla Glcd.
Esto es posible gracias a un sencillo clculo, como lo demostraremos a continuacin:
1. Sabemos que la conversin genera datos entre 0 y 1023 los cuales son almacenados
temporalmente en una variable que hemos llamado dato.
2. sabemos adems el valor calculado de la resolucin para un voltaje de referencia
igual al voltaje aplicado en RA3.

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:

8.1.5.- Ejemplo de programacin #45:


program ADC_03
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

' Fin de la configuracin del mdulo Glcd


Dim Voltaje As Float
VoltajeStr As string[8]
datoflt As Float

' Variable para almacenar el valor a calcular, el


' cual deber ser tipo Float.
' Variable para presentar la informacin en la Glcd
' Esta variable se ha decladaro para cargar el valor
' de la conversin en formato de punto flotante,

217
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

' debido a que haremos clculos de punto flotante a


' travs de la formula planteada en la explicacin.
Dim texto As String[20]
Dim dato As Word

Dim DatoStr As string[8]

'
'
'
'

Declaramos una variable tipo String en la cual


cargaremos un mensaje de un mximo de 20 caracteres.
Variable de 16 bits para cargar el valor de la
conversin A/D.

' Variable para conversin datos.

main:
ADCON1 = 1
TRISA

= $FF

' Configura el puerto A como analgico,


' VDD es el voltaje de referencia --> Vref.
' Configura el puerto A como entrada.

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)

' Carga el resultado de la conversin de


' 10 bits en la variable.

datoflt = dato
wordtostr(dato, DatoStr)

' Conversin de word a string

texto = "Conversion A/D: "


Glcd_Write_Text(texto, 6, 1, 1)
Glcd_Write_Text(DatoStr, 92, 1, 1)

' Cargamos la variable con un mensaje.


' Escribimos el contenido
' Escribimos el contenido

Voltaje = datoflt * 0.0049

' Calculamos el valor del voltaje, sabiendo que


' la resolucin es igual a 0.0049 voltios.

FloatToStr(Voltaje, VoltajeStr)

' Convertimos el valor de Float a String

texto = "Volt. RA2: "


' Cargamos la variable con un mensaje.
Glcd_Write_Text(texto, 6, 2, 1)
' Escribimos el contenido en la lnea 2
Glcd_Write_Text(VoltajeStr, 72, 2, 1) ' Escribimos el contenido de la variable
Wend
End.

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

Veamos a continuacin algunos de los resultados de la conversin en la pantalla Glcd:

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

Figura 8.23 (Fuente: http://www.dimensionengineering.com/DE-ACCM3D2.htm)

Antes de empezar, veamos resumidamente que es un acelermetro y que utilidad tendra en


nuestros proyectos electrnicos.
Bsicamente, un acelermetro es un instrumento capaz de medir aceleraciones y fuerzas
inducidas por la gravedad. Es un dispositivo muy utilizado hoy en da en equipos como
cmaras fotogrficas, juegos de video, reproductores porttiles entre otros, para detectar el
movimiento o giro del mismo.

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.

Veamos a continuacin algunas caractersticas importantes de este modelo:

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.

Si decidimos utilizar el regulador de voltaje, podremos utilizar el punto de conexin


(regulador bypass), para tomar el voltaje de referencia para el conversor A/D, el cual
en este caso ser de 3.3V.

El circuito posee proteccin en su entrada, en caso de una conexin de polaridad


invertida en la entrada al 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:

Para un voltaje de operacin = 3.6V, la sensibilidad = 760 mV/g.

Para un voltaje de operacin = 3.33V, la sensibilidad = 666 mV/g.

Para un voltaje de operacin = 3.0V, la sensibilidad = 600 mV/g.

Para un voltaje de operacin = 2.4V, la sensibilidad = 480 mV/g.

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

Figura 8.24 (Fuente: http://www.dimensionengineering.com/DE-ACCM3D2.htm)

Veamos algunos ejemplos proporcionados por el fabricante.


Calculo de la aceleracin en base a un voltaje medido en la salida X del acelermetro.
Datos conocidos:

Voltaje de alimentacin = 3.3V


Voltaje en la salida X = 1.95V
A 3.3V, el punto de 0g en el acelermetro es equivalente a 1.66V en su salida.

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:

Voltaje de alimentacin = 3.3V

El voltaje en la salida Y cuando el circuito est orientado en paralelo con respecto al


suelo es igual a 1.66V (ver figura 8.25).

Figura 8.25

El voltaje en la salida Y = 1.85V:

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.

En base a los datos proporcionados anteriormente, realizaremos los siguientes ejercicios de


programacin, partiendo del diagrama esquemtico propuesto en la figura 8.27.

Figura 8.27

Lo primero que debemos observar en el diagrama esquemtico, es que la configuracin


entre la pantalla Glcd y el microcontrolador no ha cambiado, por lo cual continuamos con la
misma configuracin de pines de control y datos en nuestros programas.
En este caso, podemos ver que las salidas del acelermetro han sido conectadas en el
puerto A, incluyendo el pin denominado bypass o BP en el acelermetro, del cual
tomaremos el voltaje de referencia para el conversor A/D.

225
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

8.2.1.- Ejemplo de programacin #46:


program ADC_04
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

' Fin de la configuracin del mdulo Glcd


Dim texto As String[20]

' Declaramos una variable tipo String en la cual


' cargaremos un mensaje de un mximo de 20 caracteres.

Eje_X As Word

' Variable de 16 bits para cargar el valor de la


' conversin A/D de la salida X del Acelermetro.

Eje_Y As Word

' Variable de 16 bits para cargar el valor de la


' conversin A/D de la salida Y del Acelermetro.

Eje_Z As Word

' Variable de 16 bits para cargar el valor de la


' conversin A/D de la salida Z del Acelermetro.

Dim DatoStr As string[8]

' Variable para conversin datos.

main:
ADCON1 = 1

' Configura el puerto A como analgico,


' RA3 es el voltaje de referencia --> Vref.

TRISA

' Configura el puerto A como entrada.

= $FF

Glcd_Init()
Glcd_Fill(0)
Glcd_Set_Font(@fuentes5x8, 5, 8, 32)

' Inicializamos la pantalla


' Limpiamos la pantalla
' Elegimos el mdulo de fuentes

While (TRUE)
texto = "Acelerometro"
Glcd_Write_Text(texto, 25, 0, 1)

' Cargamos la variable con un titulo.


' Escribimos el contenido en la lnea 0

texto = "Eje Dato"


Glcd_Write_Text(texto, 2, 2, 1)

' Cargamos la variable con un Sub-titulo.


' Escribimos el contenido en la lnea 2

Eje_X = Adc_Read(0)

' Carga el resultado de la conversin de


' de 10 bits en la variable.

wordtostr(Eje_X, DatoStr)

' Conversin de word a string

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)

' Carga el resultado de la conversin de


' 10 bits en la variable.

226
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

wordtostr(Eje_Y, DatoStr)

' Conversin de word a string

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)

' Carga el resultado de la conversin de


' 10 bits en la variable.

wordtostr(Eje_Z, DatoStr)

' Conversin de word a string

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

' Variable de 16 bits para cargar el valor de la


' conversin A/D de la salida X del Acelermetro.

Eje_Y As Word

' Variable de 16 bits para cargar el valor de la


' conversin A/D de la salida Y del Acelermetro.

Eje_Z As Word

' Variable de 16 bits para cargar el valor de la


' conversin A/D de la salida Z del Acelermetro.

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

' Configura el puerto A como analgico,


' RA3 es el voltaje de referencia --> Vref.

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)

' Cargamos la variable con un titulo.


' Escribimos el contenido en la lnea 0

texto = "Eje Dato"


Glcd_Write_Text(texto, 2, 2, 1)

' Cargamos la variable con un Sub-titulo.


' Escribimos el contenido en la lnea 2

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)

' Carga el resultado de la conversin de


' de 10 bits en la variable.

wordtostr(Eje_X, DatoStr)

' Conversin de word a string

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)

' Carga el resultado de la conversin de


' 10 bits en la variable.

wordtostr(Eje_Y, DatoStr)

' Conversin de word a string

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)

' Carga el resultado de la conversin de


' 10 bits en la variable.

wordtostr(Eje_Z, DatoStr)

' Conversin de word a string

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.

El resultado de este programa se deber ver de esta manera:

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:

Voltaje en RA0 = Valor de la conversin cargado en la variable Eje_X x 0.003222 V


Voltaje en RA1 = Valor de la conversin cargado en la variable Eje_Y x 0.003222 V
Voltaje en RA2 = Valor de la conversin cargado en la variable Eje_Z x 0.003222 V

229
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

8.2.3.- Calculo de la aceleracin en base al voltaje calculado en cada eje.


Datos conocidos:

Voltaje de alimentacin = 3.3V


Voltajes calculados en cada entrada analgica.
A 3.3V, el punto de 0g en el acelermetro es equivalente a 1.66V en su salida.

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.

La aceleracin para el Eje Y:


Voltaje en RA1 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 Y.

La aceleracin para el Eje Z:


Voltaje en RA2 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

8.2.4.- Ejemplo de programacin #47:


program ADC_05
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

' Fin de la configuracin del mdulo Glcd


Dim texto As String[20]

' Declaramos una variable tipo String en la cual


' cargaremos un mensaje de un mximo de 20 caracteres.

Eje_X As Word

' Variable de 16 bits para cargar el valor de la


' conversin A/D de la salida X del Acelermetro.

Eje_Y As Word

' Variable de 16 bits para cargar el valor de la


' conversin A/D de la salida Y del Acelermetro.

Eje_Z As Word

' Variable de 16 bits para cargar el valor de la


' conversin A/D de la salida Z del Acelermetro.

' Variables para calculos de voltaje y aceleracin en cada Eje del


' acelermetro. Todas las variables son declaradas tipo "Float" ya que
' los clculos realizados generan decimales en el resultado.
Volt_Eje_X
Volt_Acell_X
Acell_X

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

Dim DatoStr As string[8]

' Variable para conversin de datos.

main:
ADCON1 = 1

' Configura el puerto A como analgico,


' RA3 es el voltaje de referencia --> Vref.

TRISA

' Configura el puerto A como entrada.

= $FF

Glcd_Init()
Glcd_Fill(0)
Glcd_Set_Font(@fuentes5x8, 5, 8, 32)

' Inicializamos la pantalla


' Limpiamos la pantalla
' Elegimos el mdulo de fuentes

Acelerometro:
texto = "Acelerometro"

' Cargamos la variable con un titulo.

231
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Glcd_Write_Text(texto, 25, 0, 1)

' Escribimos el contenido en la lnea 0

texto = "
Volt.
Acell."
Glcd_Write_Text(texto, 2, 2, 1)

' Cargamos la variable con un Sub-titulo.


' Escribimos el contenido en la lnea 2.

'*************************************************************************
' Rutina correspondiente al Eje X del Acelermetro ***********************
Eje_X = Adc_Read(0)

' Carga el resultado de la conversin de


' de 10 bits en la variable.

texto = "X:"
Glcd_Write_Text(texto, 2, 4, 1)

' Cargamos la variable con un mensaje.


' Escribimos el contenido en la lnea 4

' Calculamos el Voltaje en RA0:


Dato_Temp = Eje_X
Volt_Eje_X = Dato_Temp * 0.003222

' Cargamos el valor de la conversion A/D


' en una variable temporal tipo "Float".
' Calculamos el voltaje en RA0.

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

Acell_X = Volt_Acell_X / 0.666

' Voltaje con respecto al punto de 0g


' del acelermetro.
' Se calcula la aceleracin.

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)

' Carga el resultado de la conversin de


' 10 bits en la variable.

texto = "Y:"
Glcd_Write_Text(texto, 2, 5, 1)

' Cargamos la variable con un mensaje.


' Escribimos el contenido en la lnea 5.

' Calculamos el Voltaje en RA1:


Dato_Temp = Eje_Y
Volt_Eje_Y = Dato_Temp * 0.003222

' Cargamos el valor de la conversion A/D


' en una variable temporal tipo "Float".
' Calculamos el voltaje en RA1.

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

Acell_Y = Volt_Acell_Y / 0.666

' Voltaje con respecto al punto de 0g


' del acelermetro.
' Se calcula la aceleracin.

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)

' Carga el resultado de la conversin de


' 10 bits en la variable.

texto = "Z:"
Glcd_Write_Text(texto, 2, 6, 1)

' Cargamos la variable con un mensaje.


' Escribimos el contenido en la lnea 6.

232
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

' Calculamos el Voltaje en RA2:


Dato_Temp = Eje_Z
Volt_Eje_Z = Dato_Temp * 0.003222

' Cargamos el valor de la conversion A/D


' en una variable temporal tipo "Float".
' Calculamos el voltaje en RA2.

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

' Voltaje con respecto al punto de 0g


' del acelermetro.

Acell_Z = Volt_Acell_Z / 0.666

' Se calcula la aceleracin.

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.

El resultado de este programa se puede observar en la siguiente figura:

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:

Figura 8.30 (Fuente: hoja de datos del dispositivo AD594/AD595)


234
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

8.3.1.- AD594/AD595, clculo de la linealidad.


Veamos como se resuelve el problema de linealidad en estos dispositivos.
El AD594 es un amplificador-compensador para termocuplas tipo J, y el AD595 es un
amplificador-compensador para termocuplas tipo K. Estos dispositivos generan en su salida
10 mV/C. Debido a que sabemos el voltaje que generan las uniones en las termocuplas tipo
J y K, podemos hallar la ganancia de salida del amplificador fcilmente:
Para una termocupla tipo J, el voltaje generado por la unin de sus metales es de 51.7
uV/C. Si calculamos la ganancia del amplificador en AD594, tenemos que:
Ganancia =

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

La no linealidad se produce cuando aplicamos el voltaje generado por las termocuplas en la


entrada del amplificador operacional. Esta accin un induce un desplazamiento de entrada
con respecto a la de salida del amplificador de 16 uV para el AD594, y de 11 uV para el
AD595.
El AD594 y el AD595 estn calibrados de fbrica para generar un voltaje igual a 250mV en
su salida cuando aplicamos una temperatura de 25C en la unin de las termocuplas.
Para compensar este desplazamiento, el AD594 realiza el clculo del voltaje en su salida en
base a la siguiente formula:
Salida en AD594 = (Voltaje de Termocupla tipo J + 16uV) * Ganancia
Veamos un ejemplo numrico suponiendo que aplicamos una temperatura ideal de 30C en
una termocupla tipo J. El valor correspondiente al voltaje generado por la unin de los
metales en la termocupla tipo J se especifica en una tabla de valores publicada por la norma
IEC 584 (IEC es el acrnimo de International Electrotechnical Commission), Figura 8.31.
1. Segn la tabla de la figura 8.31, sabemos que una termocupla tipo J genera 1536 uV
a una temperatura de 30C.
2. Adems sabemos que la ganancia del amplificador es igual a 193.42
Entonces,
Salida en AD594 = (1536 uV + 16uV) * 193.42
235
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Salida en AD594 = 1552 uV * 193.42


Salida en AD594 = 300187.84 uV
Salida en AD594 = 300 mV.

Tabla de valores de voltajes de una termocupla tipo J


Temp
C

-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

El AD595 realiza el clculo del voltaje en su salida en base a la siguiente formula:


Salida en AD595 = (Voltaje de Termocupla tipo K + 11 uV) * Ganancia
Veamos un ejemplo numrico suponiendo que aplicamos una temperatura ideal de 160C en
una termocupla tipo K. El valor correspondiente al voltaje generado por la unin de los
metales en la termocupla tipo K se especifica en una tabla de valores publicada por la norma
IEC 584 (IEC es el acrnimo de International Electrotechnical Commission), Figura 8.32.
3. Segn la tabla de la figura 8.32, sabemos que una termocupla tipo K genera 6539 uV
a una temperatura de 160C.
4. Sabemos que la ganancia del amplificador es igual a 247.27
Entonces,
Salida en AD594 = (6539 uV + 11uV) * 247.27
Salida en AD594 = 6550 uV * 247.27
Salida en AD594 = 1619618.5 uV
Salida en AD595 = 1619.6 mV

239
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Tabla de valores de voltajes de una termocupla tipo K


Temp
C

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

10029 10070 10111 10151

250

10151 10192

10233

10274

10315

10355 10396 10437 10478 10519 10560

260

10560 10600

10641

10682

10723

10764 10805 10846 10887 10928 10969

270

10969 11010

11051

11093

11134

11175 11216 11257 11298 11339 11381

280

11381 11422

11463

11504

11546

11587 11628 11669 11711 11752 11793

290

11793 11835

11876

11918

11959

12000 12042 12083 12125 12166 12207

300

12207 12249

12290

12332

12373

12415 12456 12498 12539 12581 12623

310

12623 12664

12706

12747

12789

12831 12872 12914 12955 12997 13039

320

13039 13080

13122

13164

13205

13247 13289 13331 13372 13414 13456

330

13456 13497

13539

13581

16623

13665 13706 13748 13790 13832 13874

340

13874 13915

13597

13999

14041

14083 14125 14167 14208 14250 14292

350

14292 14334

14376

14418

14460

1452

360

14712 14754

14796

14838

14880

14922 14964 15006 15048 15090 15132

370

15132 15174

15216

15258

15300

15342 15384 15426 15468 15510 15552

380

15552 15594

15636

15679

15721

15763 15805 15847 15889 15931 15974

390

15974 16016

16058

16100

16142

16184 16227 16269 16311 16353 16395

400

16395 16438

16480

16522

16564

16607 16649 16691 16733 16776 16818

410

16818 16860

1692

16945

16987

17029 17072 17114 17156 17199 17241

420

17241 17283

17326

17368

17410

17453 17495 17537 17580 17622 17664

430

17664 17707

17749

17792

17834

17876 17919 17961 18004 18046 18088

440

18088 18131

18173

18216

18258

18301 18343 18385 18428 18470 18513

450

18513 18555

18598

18640

18683

18725 18768 18810 18853 18895 18938

460

18938 18980

19023

19065

19108

19150 19193 19235 19278 19320 19363

470

19363 19405

19448

19490

19533

19576 19618 19661 19703 19746 19788

480

19788 19831

19873

19916

19959

20001 20044 20086 20129 20172 20214

490

20214 20257

20299

20342

20385

20427

500

20640 20683

20725

2768

20811

20853 20896 20938 20981 21024 21066

510

21066 21109

21152

21194

21237

21280 21322 21365 21407 21450 21493

520

21493 21535

21578

21621

21663

21706 21749 21791 21834 21876 21919

530

21919 21962

22004

22047

22090

22132 22175 22218 22260 22303 22346

540

22346 22388

22431

22473

22516

22559 22601 22644 22687 22729 22772

550

22772 22815

22857

22900

22942

22985 23028 23070 23113 23156 23198

560

23198 23241

23284

23326

23369

23411 23454 23497 23539 23582 23624

570

23624 23667

23710

23752

23795

23837 23880 23923 23965 24008 24050

580

24050 24093

24136

24178

24221

2263

590

24476 24519

24561

24604

24646

24689 24731 24774 24817 24859

600

24902 24944

24987

25029

25072

25114 25157 25199 25242 25284 25327

610

25327 25396

25412

25454

25497

25539 25582 25624 25666 25709 25751

620

25751 25794

25836

25879

25921

25964 26006 26048

630

26176 26218

26260

26303

26345

26387 26430 26472 26515 26557 26599

640

26599 26642

26684

26726

26769

26811 26853 26896 26938 26980 27022

650

27022 27065

27107

27149

27192

27234 27276 27318 27361 27403 27445

660

27445 27487

27529

27572

27614

27656 27698 27740 27783 27825 27867

670

27867 27909

27951

27993

28035

28078 28120 28162 28204 28246 28288

680

28288 28330

28372

28414

28456

28498 28540 28583 28625 28667 28709

690

28709 28751

28793

28835

28877

28919 28961 29002 29044 29086 29128

14544 14586 14628 14670 14712

2070

20512 20555 20598 20640

24306 24348 24391 24434 24476

2691

2492

26133 26176

241
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

700

29128 29170

29212

29254

29296

29338 29380 29422 29464 29505 29547

710

29547 29589

29631

29673

29715

29756 29798

720

29965 30007

30049

30091

30132

30174 30216 30257 30299 30341 30383

730

30383 30424

30466

30508

30549

30591

740

30799 30840

30882

30924

3965

31007 31048 31090 31131 31173 31214

750

31214 31256

31297

31339

3138

31422 31463 31504 31546 31587 31629

760

31629 31670

31712

31753

31794

31836 31877 31918 31960 32001 32042

770

32042 32084

32125

32166

32207

32249 32290 32331 32372 32414 32455

780

32455 32496

32537

32578 329619 32661 32702 32743 32784 32825 32866

790

32866 32907

32948

32990

33031

33072 33113 33154 33195 33236 33277

800

33277 33318

33359

33400

33441

33482 33523 33564 33604 33645 33686

810

33686 33727

33768

33809

33850

33891 33931 33972 34013 34054 34095

820

34095 34136

34176

34217

34258

34299 34339 34380 34421 34461 34502

830

34502 34543

34583

34624

34665

34705 34746 34787 34827 34868 34909

840

34909 34949

34990

35030

35071

35111 35152 35192 35233 35273 35314

850

35314 35354

35395

35435

35476

35516 35557 35597 35637 35678 35718

860

35718 35758

35799

35839

35880

35920 35960 36000 36041 36081 36121

870

36121 36162

36202

36242

36282

36323 36363 36403 36443 36483 36524

880

36524 36564

36604

36644

36684

36724 36764 36804 36844 36885 36925

890

36925 36965

37005

37045

37085

37125 37165

900

37325 37365

27405

37445

37484

37524 37564 37604 37644 37684 37724

910

37724 37764

37803

37843

37883

37923 37963 38002 38042 38082 38122

920

38122 38162

38201

38241

38281

38320 38360 38400 38439 38479 38519

930

38519 38558

38598

38638

38677

38717 38756 38796 38836 38875 38915

940

38915 38954

38994

39033

39073

39112 39152 39191 39231 39270 39310

950

39310 39349

39388

39428

39467

39507 39546 39585 39625 39664 39703

960

39703 39743

39782

39821

39861

39900 39939 39979 40018 40057 40096

970

40096 40136

40175

4021

40253

40292 40332 40371 40410 40449 40488

980

40488 40527

40566

40605

40645

40684 40723 40762 40801 40840 40879

990

40879 40918

40957

40996

41035

41074 41113 41152 41191 41230 41269

1000

41269 41308

41347

41385

41424

41463 41502 41541 41580 41619 41657

1010

41657 41696

41735

41774

41813

41851 41890 41929 41968 42006 42045

1020

42045 42084

42123

42161

42200

42239 42277 42316 42355 42393 42432

1030

42432 42470

42509

42548

42586

42625 42663 42702 42740 42779 42817

1040

42817 42856

42894

42933

42971

43010 43048 43087 43125 43164 43202

1050

43202 43240

43279

43317

43356

43394 43432 43471 43509 43547 43585

1060

43585 43624

43662

43700

43739

43777 43815 43853 43891 43930 43968

1070

43968 44006

44044

44082

44121

44159 44198 44235 44273 44311 44349

1080

44349 44387

44425

44463

44501

44539 44577 44615 44653 44691 44729

1090

44729 44767

44805

44843

44881

44919 44957 44995 45033 45070 45108

1100

45108 45146

45184

45222

45260

45297 45335 45373 45411 45448 45486

1110

45486 45524

45561

45599

45637

45675 45712 45750 45787 45825 45863

1120

45863 45900

45938

45975

46013

46051 46088 46126 46163 46201 46238

1130

46238 46275

46313

46350

46388

46425 46463 46500 46537 46575 46612

1140

46612 46649

46687

46724

46761

46799 46836 46873 46910 46948 46985

1150

46985 47022

47059

47096

47134

47171 47208 47245 47282 47319 47356

1160

47356 47393

47430

47468

47505

47542 47579 47616 47653 47689 47726

1170

47726 47763

47800

47837

47874

47911 47948 47985 48021 48058 48095

1180

48095 48132

48169

48205

48242

48279 48316 48352 48389 48426 48462

1190

48462 48499

48536

48572

48609

48645 48682 48718 48755 48792 48828

3632

2980

29882 29924 29965

30674 30716 30757 30799

3725

37245 37285 37325

242
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

1200

48828 48865

48901

48937

48974

49010 49047 49083 49120 49156 49192

1210

49192 49229

49265

49301

49338

49374 49410 49446 49483 49519 49555

1220

49555 49591

49627

49663

49700

49736 49772 49808 49844 49880 49916

1230

49916 49952

49988

50024

50060

50096 50132 50168 50204 50240 50276

1240

50276 50311

50347

50383

50419

50455 50491 50526 50562 50598 50633

1250

50633 50669

50705

50741

50776

50812 50847 50883 50919 50954 50990

1260

50990 51025

51061

51096

51132

51167 51203 51238 51274 51309 51344

1270

51344 51380

51415

51450

51486

51521 51556 51592 51627 51662 51697

1280

51697 51733

51768

51803

51838

51873 51908 51943 51979

1290

52049 52084

52119

52154

52189

52224 52259 52294 52329 52364 52398

1300

52398 52433

52468

52503

52538

52573 52608 52642 52677 52712 52747

1310

52747 52781

52816

52851

52886

52920 52955 52989 53024 53059 53093

1320

53093 53128

53162

53197

53232

53266 53301 53335 53370 53404 53439

1330

53439 53473

53507

53542

53576

53611 53645 53679 53714 53748 53782

1340

53782 53817 553851 53885

53920

53954 53988 54022 54057 54091 54125

1350

54125 54159

54262

54296 54330 54364 54398 54432 54466

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

Tipo J - Voltaje AD594 Voltaje


en mV
de Salida
7.890
7.402
6.821
6.159
5.426
4.632
3.785
2.892
1.960
.995
.501
0
.507
1.019
1.277
1.536
2.058
2.585
3.115
4.186
5.268
6.359

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

8.3.2.- Ejemplo de programacin #48:


Utilizaremos para el ejemplo de programacin una termocupla tipo J con su respectivo
amplificador-compensador AD594, cuya configuracin bsica veremos a continuacin,
adems de una caracterstica adicional que nos ayudar a determinar si la termocupla
conectada al circuito se ha fallado ya sea por corrosin o desgaste tras soportar altas
temperaturas durante un tiempo determinado.

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

' Fin de la configuracin de conexiones


Dim texto As String[20]

' Declaramos una variable tipo String en la cual


' cargaremos un mensaje de un mximo de 20 caracteres.
Dim dato As Word
' Variable de 16 bits para cargar el valor de la
' conversin A/D.
Dim DatoStr As string[16] ' Variable para conversin datos.
Dim Temp As Float
main:
ADCON1 = 0

' Configura el puerto A como puerto analgico,


' VDD es el voltaje de referencia --> Vref.

TRISA
TRISC

' Configura el puerto A como entrada.


' Configura el puerto C como entrada.

= $FF
= $FF

LCD_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)

' Inicializamos la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

While (TRUE)
dato = Adc_Read(2)

' Carga el resultado de la conversin de


' 10 bits en la variable.

Temp = (dato * 4.9) / 10

' Calculamos la Temperatura de TC-J.

FloatToStr(Temp, DatoStr)

' Conversin de Float a String

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

Cargamos la variable con un mensaje.


Escribimos el contenido de la variable.
Escribimos el resultado de la conversin.
Escribimos la unidad de temperatura "C".

' Verificamos si la alarma del AD594 se ha activado.


' Si la termocupla falla, salta a la subrutina "Alarma".

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

' Verificamos si la alarma fu solucionada.


' Salta a la rutina principal del programa si la
' termocupla funciona correctamente.

247
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

GoTo Espera

' Si la termocupla sigue daada, vuelve a verificar


' la alarma hasta que la termocupla sea reemplazada.

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

Resolucin = 0.00488 0.0049 V


Resolucin = 4.9 mV
Entonces, si por ejemplo tenemos una temperatura en la unin de la termocupla de 30C,
tendremos en la salida del AD594 un voltaje igual a 300 mV. Al convertir este voltaje a travs
de conversor A/D de microcontrolador, el valor cargado en la variable Dato ser
aproximadamente igual a 62, en el rango de conversin de 0 a 1023.
Ahora bien, si tenemos el valor de la conversin y el valor de la resolucin en la conversin,
podremos calcular el valor del voltaje de entrada en RA2 y por consiguiente el valor de la
temperatura en la termocupla:

Voltaje en RA2 = Valor de la conversin A/D x Resolucin


Voltaje en RA2 = 62 x 4.9 mV
Voltaje en RA2 = 303.8 mV

248
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Recordemos que el AD594 genera en su salida 10mV/C, por lo tanto:

Temperatura de TC-J =

Temperatura de TC-J =

Valor de la conversin A/D x 4.9 mV


10mV / C
303.8mV
10mV / C

Temperatura de TC-J = 30.38 C.

El resultado del programa anterior es el siguiente:

Figura 8.35

Si desconectamos uno de los terminales de la termocupla, el mensaje en la pantalla ser el


siguiente:

Figura 8.36

249
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Captulo IX. Comunicacin Serial Asncrona RS232.

9.1.- Comunicacin Serial Asncrona RS232.


La librera que a continuacin vamos a estudiar nos permite hacer uso del hardware
encargado de las comunicaciones bajo el protocolo RS-232 (UART - Universal
Asynchronous Receiver/Transmitter) de una serie de microcontroladores que disponen de
ste. Para esto debemos siempre verificar que hemos elegido el microcontrolador correcto,
es decir, que tenga en su arquitectura el hardware correspondiente, y el cual se encuentra
comnmente en microcontroladores de gama alta como por ejemplo, en el PIC16F877,
PIC18F442, PIC18F458 entre otra buena cantidad de microcontroladores disponibles en el
mercado.
La comunicacin serial asncrona resulta muy til cuando necesitamos transmitir o recibir
datos entre circuitos gobernados por microcontroladores PIC, o inclusive cuando deseamos
establecer una comunicacin entre nuestros circuitos y un PC.
Este protocolo define estndares como la velocidad de transmisin en baudios (110, 300,
1200, 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200, 128000 y 256000
bps), niveles de voltaje, distancia entre dispositivos, entre otros.
Cuando se trata de comunicacin serial entre un microcontrolador y un PC, es importante
tomar en cuenta que los niveles de voltaje entre ambos dispositivos deben ser acoplados, ya
que en el puerto serial de un PC, los niveles de voltaje estn comprendidos entre +12V y 12V, y en un microcontrolador los niveles de voltaje estn comprendidos entre 0V y 5V.
Las seales en el puerto del PC son digitales y la tensin con la cual trabaja, +12V y -12V,
poseen una lgica invertida, la cual es de suma importancia tomar en cuenta a la hora de
realizar el diseo de un circuito.
+12 V Lgica = 0
-12 V Lgica = 1

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

La siguiente figura muestra el diagrama de pines del MAX232 y la configuracin para la


conexin de cinco condensadores de 1uF necesarios para su funcionamiento:

Figura 9.1

Es importante tomar en cuenta la polaridad de los condensadores de 1uF, ya que una


polaridad invertida afectar negativamente el funcionamiento del MAX232.
A travs del uso de libreras de mikroBasic, podemos concentrarnos bsicamente en el
desarrollo de las funciones que deseamos realizar en nuestros proyectos. Esto significa que
todo el trabajo que anteriormente se realizaba referente al manejo de registros especficos
de la UART en un microcontrolador, ha sido simplificado a travs de rutinas de inicializacin,
captura y envo de datos, entre otras, y las cuales estaremos estudiando a continuacin.

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.

Veamos a continuacin el diagrama esquemtico sobre el cual estaremos desarrollando los


siguientes ejemplos prcticos:

Figura 9.2

252
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

9.2.- Librera UART.


El primer paso en el estudio de la librera UART se refiere a la rutina de inicializacin del
mdulo:
9.2.1.- UART1_Init(Velocidad de transmisin de datos)
Esta rutina inicializa automticamente algunos parmetros en los registros internos de la
UART. Esta inicializacin comprende la habilitacin de la transmisin y recepcin de datos,
el tamao de la cadena de bits a ser transmitidos (8 bits), configura 1 bit de parada, la
paridad y selecciona el modo de transmisin asncrono.
La velocidad de transmisin de datos puede ser configurada entre 2400 bps y 115000 bps a
travs del campo denominado Velocidad de transmisin de datos en la rutina de
inicializacin.
Entonces, si deseramos realizar una comunicacin serial entre un microcontrolador y un
PC a una velocidad de 2400 bps, la rutina de inicializacin en nuestros programas deber
ser configurada de la siguiente forma:
UART1_Init(2400)
Es importante tomar en cuenta que el valor de la velocidad de transmisin deber ser
siempre una constante y nunca un valor cargado en una variable.
Otro punto importante a considerar sobre la rutina de inicializacin, ser que sta deber
estar siempre antes del uso de cualquier otra rutina correspondiente a la librera UART.
La siguiente rutina que debemos tomar siempre en cuenta es la responsable de verificar si
hay datos en el Buffer de la UART listos para ser ledos y cargados en una variable
previamente definida:
9.2.2.- UART1_Data_Ready()
Esta funcin nos devuelve dos posibles estados:

1, si el Buffer de la UART contiene datos listos para ser ledos.


0, si no hay datos en el Buffer de la UART.

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

Tambin podramos hacerlo de la siguiente manera:


If (UART1_Data_Ready() <> 0) Then ' Si recibimos datos en el puerto entonces,
' Capturamos los datos en una variable previamente definida.
End If

Nota: Los smbolos <> significan diferente a

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:

Dim Datos_RX As Byte


.
.
main:
.
.
Datos_RX = UART1_Read()

' Descargamos el Buffer en la variable.

.
.

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.

9.2.4.- Ejemplo de programacin #49:


Veamos a continuacin un ejemplo de transmisin y recepcin de datos, basado en el
diagrama esquemtico de la figura 9.2. Este ejemplo muestra a travs de la pantalla LCD los
datos enviados desde la terminal de comunicaciones de mikroBasic, a una velocidad de
transmisin de 2400 bps.

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

' Fin de la configuracin de conexiones


main: '

Programa Principal

UART1_Init(2400)
Delay_ms(100)

' Inicializamos el mdulo UART a 2400 bps.


' Pausa de 100 milisegundos para estabilizacin.

LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Inicializa la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

Lcd_Out(1, 1, "Datos: ")

' Se imprime "Datos: " en la primera lnea de la pantalla.

Recepcion:
If (UART1_Data_Ready() = 1) Then
Datos_RX = UART1_Read()
GoSub Imprime

' Si recibe datos en el puerto...


' Almacena el dato en la variable "Datos_RX"
' Salta a la subrutina de Impresin.

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

' Repetimos el proceso.

Imprime:
Lcd_Out(2, 1, "Vaciando Buffer")
Lcd_Chr(1, 8, Datos_RX)

' Mensaje de estado del Buffer.


' Transmitimos de vuelta el valor cargado
' en la variable "Datos_RX"

Delay_ms(1000)
Return

' Retardo de 1.5 segundos.

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:

A travs de la rutina UART1_Data_Ready(), preguntamos si tenemos datos


disponibles en el Buffer. Si se cumple la condicin, cargamos el primer dato
almacenado en el Buffer en la variable Dato_RX. Si no se cumple la condicin, se
imprime en la segunda lnea de la pantalla un mensaje de estado del Buffer.

Al cumplirse la condicin y almacenar el primer Byte en la variable Datos_RX,


hacemos un salto con retorno a la subrutina Imprime, la cual actualiza el mensaje de
estado en la segunda lnea de la pantalla y muestra el dato almacenado en la variable
Dato_RX en la posicin especificada en la rutina Lcd_Chr(), luego hace una pausa
de 1 segundo para poder ver la informacin presentada antes de proceder a cargar el
siguiente Byte almacenado en el Buffer, en la variable correspondiente.

Cuando el tiempo de espera de 1 segundo vence, retornamos a la subrutina


Recepcin y se produce un salto incondicional a la etiqueta Recepcin.

Si existe ms de un Byte almacenado en el Buffer, se repite el proceso anterior hasta


que el Buffer se encuentre vaco.

Hagamos una prueba enviando la siguiente cadena de caracteres desde la terminal de


comunicaciones:
123456789

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.

9.2.5.- Ejemplo de programacin #50:


El primer cambio importante que hemos hecho, ha sido la creacin de una sub-funcin, la
cual deber ir antes del cuerpo principal del programa, es decir, antes de la etiqueta main,
y la cual se encargar de recoger los datos uno a uno, almacenados en el Buffer de la UART
cada vez que sta sea llamada a cumplir con su tarea.
Asumiendo que en este ejemplo enviaremos una cadena de nueve caracteres, hemos
realizado una pequea rutina de recoleccin de datos la cual se ejecutar hasta que se
cumpla una condicin conocida. Las instrucciones dentro de un lazo do-loop
Until(condicin) se repetirn hasta que dicha condicin sea verdadera.
Por ltimo, creamos una rutina de visualizacin de datos a travs de un lazo For-Next, la
cual imprimir cada caracter almacenado en el arreglo de variables definidas previamente en
la pantalla LCD.
Analice y lea detenidamente los comentarios del siguiente programa:
program RS232
'--- Area de declaracin:
Dim Datos_RX As Byte[10]
acumulador As Byte
X As Byte

' Arreglo de variables para almacenar los datos.


' Variable para condicional "loop Until..."
' Variable para lazo For-Next.

' Configuracin de pines de control y datos de la pantalla 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

' Fin de la configuracin de conexiones

sub function LeerCaracter As Byte


do
loop Until UART1_Data_Ready = 1

' Recoje un caracter de UART


' Cuando el dato esta listo, carga el resultado
' en la variable "LeerCaracter", de lo contrario
' se queda en el lazo esperando.

258
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Result = UART1_Read()

' Lee el dato en la USART y el resultado es cargado en la


' variable "LeerCaracter".

End sub

main:

' Programa Principal.

UART1_Init(2400)
Delay_ms(100)

' Inicializamos el mdulo UART a 2400 bps.


' Pausa de 100 milisegundos para estabilizacin.

LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Inicializa la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

Lcd_Out(1, 1, "Datos: ")

' Se imprime "Datos: " en la primera lnea


' de la pantalla.

Recepcion:
Lcd_Out(2, 1, "Buffer Vacio...!")

' Mensaje de estado del Buffer.

acumulador = 1

' inicializamos la variable "acumulador"

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)

' Si la variable no es igual a 10,


' contina cargando caracteres.

Lcd_Out(2, 1, "Mostrando Datos!")

' Mensaje de estado del Buffer.

For X = 1 To 9

'
'
'
'

Lcd_Chr(1, 8, Datos_RX[X])

Delay_ms(1000)

For-Next para presentar los datos desde


la primera variable hasta la ltima cargada.
Mostramos el equivalente ASCII del valor cargado
en la variable "Datos_RX"

' Retardo de 1 segundo.

Next X
Lcd_Out(2, 1, "

Fin

")

' Mensaje de finalizacin del proceso.

End.

Analizando el programa a partir de la etiqueta Recepcin tenemos que:

Escribimos un mensaje de estado del Buffer; en este caso el mensaje ser Buffer
Vaco ya que an no hemos recolectado informacin del mismo.

Inicializamos la variable acumulador = 1, la cual nos ayudar a llevar la cuenta de la


cantidad de Bytes almacenados en el Buffer.

En el lazo do-loop Until(condicin), podemos observar que el primer paso ser


almacenar el primer dato en la variable que corresponda segn el valor que trae
cargado el acumulador, es decir, si acumulador es igual a 1, entonces el valor
extrado desde la sub-funcin LeerCaracter ser almacenado en la variable
Datos_RX[1].
259

_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Aumentamos en una unidad la variable acumulador, y verificamos si se cumple la


condicin loop Until(acumulador = 10). Si la variable acumulador viene con un
valor cargado igual a 1 y la incrementamos en una unidad, es decir, acumulador = 2,
entonces podremos ver que la condicin no se cumple an, por lo tanto el programa
vuelve a hacer un llamado a la sub-funcin LeerCaracter, cargando el siguiente Byte
capturado del Buffer en la variable que corresponda en este momento segn el valor
del acumulador. Esto significa que este segundo Byte ser cargado en
Dato_RX[2].

El proceso se repite hasta que la condicin loop Until(acumulador = 10) se cumpla.

Al terminar el proceso de captura de datos en el arreglo de variables Datos_RX[n],


mostramos un nuevo mensaje en la segunda lnea de la pantalla LCD (Mostrando
Datos), y a travs de un lazo For-Next presentamos el contenido de cada variable,
desde Datos_RX[1] hasta Datos_RX[9], con un intervalo de tiempo de un segundo.
Al terminar, cambiamos el mensaje que indica el estado del proceso y el programa
termina.

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.

La rutina para enviar datos desde el microcontrolador a travs de la UART es:

9.2.6.- UART1_Write(Variable tipo Byte)


A travs de esta rutina podemos enviar datos almacenados en una variable tipo Byte a
travs del puerto serial hacia el PC o cualquier otro dispositivo o circuito que soporte
comunicacin RS232.
Para comprobar su funcionamiento y dar continuidad al ejemplo anterior, enviaremos de
vuelta al PC la cadena de caracteres que hemos estado recibiendo desde la terminal de
comunicaciones de mikroBasic.
En vista de que estamos recibiendo una cadena de nueve caracteres en este ejemplo,
haremos un lazo For-Next adicional, a travs del cual enviaremos el contenido almacenado
en el arreglo de variables, Datos_RX[1] hasta Datos_RX[9]. Hacer este lazo simplifica en
gran medida el cdigo de programa, ya que de otra forma tendramos que escribir una rutina
de envo de datos para cada una de las variables.
El cdigo a aadir en nuestro programa sera el siguiente:
For X = 1 To 9
UART1_Write(Datos_RX[X])

' For-Next para enviar los datos desde


' la primera variable hasta la ltima cargada.
' Enviamos el dato cargado en la variable.

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:

9.2.7.- Ejemplo de programacin #51:


program RS232
'--- Area de declaracin:
Dim Datos_RX As Byte[10]
acumulador As Byte
X As Byte

' Arreglo de variables para almacenar los datos.


' Variable para condicional "loop Until..."
' Variable para lazo For-Next.

' Configuracin de pines de control y datos de la pantalla 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

' Fin de la configuracin de conexiones


sub function LeerCaracter As Byte

' Recoje un caracter de UART

do
loop Until UART1_Data_Ready = 1
Result = UART1_Read()

'
'
'
'
'

Cuando el dato esta listo, carga el resultado


en la variable "LeerCaracter", de lo contrario
se queda en el lazo esperando.
Lee el dato en la USART y lo carga en la
variable "LeerCaracter".

End sub
main:

'

Programa Principal

UART1_Init(2400)
Delay_ms(100)

' Inicializamos el mdulo UART a 2400 bps.


' Pausa de 100 milisegundos para estabilizacin.

LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Inicializa la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

Lcd_Out(1, 1, "Datos: ")

' Se imprime "Datos: " en la primera lnea


' de la pantalla.

Recepcion:
Lcd_Out(2, 1, "Buffer Vacio...!")

' Mensaje de estado del Buffer.

acumulador = 1

' inicializamos la variable "acumulador"

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

'
'
'
'

Si la variable no es igual a 10,


contina cargando caracteres.
For-Next para enviar los datos desde
la primera variable hasta la ltima cargada.

261
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

UART1_Write(Datos_RX[X])

' Enviamos el dato cargado en la variable.

Next X

Lcd_Out(2, 1, "Mostrando Datos!")

' Mensaje de estado del Buffer.

For X = 1 To 9

'
'
'
'

Lcd_Chr(1, 8, Datos_RX[X])

Delay_ms(1000)

For-Next para presentar los datos desde


la primera variable hasta la ltima cargada.
Mostramos el equivalente ASCII del valor cargado
en la variable "Datos_RX"

' Retardo de 1 segundo.

Next X

Lcd_Out(2, 1, "

Fin

")

' Mensaje de finalizacin del proceso.

End.

Al enviar la cadena de datos desde la terminal de comunicaciones hacia el microcontrolador,


podremos ver que los datos almacenados en la variables Datos_RX[1] a Datos_RX[9] han
sido reenviados de vuelta al PC, tal y como se demuestra en la figura 9.4, comprobando de
esta manera que la transmisin y recepcin ha sido exitosa.

Figura 9.4
262
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

9.3.- Cmo extraer informacin especfica de una cadena de datos.


En muchos diseos electrnicos en los cuales requeriremos de comunicacin serial,
seguramente vamos a necesitar extraer de una cadena larga de caracteres cierta
informacin especfica atrapada en ella. En otras palabras, se pudiera dar el caso en el cual
tenemos un dispositivo perifrico entregando constantemente informacin de la cual solo
nos interesa cierta parte de ella.
Para entender claramente lo planteado, observe la siguiente cadena de caracteres de
ejemplo:
1234567890/XYZmikroBasic para PIC!12345678901234
sta es una cadena de 48 caracteres, dentro de los cuales encontraremos la frase
mikroBasic para PIC!, la cual consta de tan solo 20 caracteres y la cual es precisamente el
bloque de informacin que deseamos extraer. Sin importar su ubicacin dentro de la cadena,
como podramos lograr extraer estos 20 caracteres y desechar el resto?
En muchos casos podremos tambin observar que estos dispositivos envan algunos
caracteres dentro de la cadena que identifican cada bloque de informacin, por ejemplo, en
nuestra cadena de 48 caracteres podremos ver que hemos asignado como caracteres de
cabecera del bloque de informacin los siguientes:
1234567890/XYZmikroBasic para PIC!12345678901234

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:

Almacenamos toda la cadena en un arreglo de variables a las cuales llamaremos


Cadena[n], donde n representa el nmero de caracteres conocido de la cadena.

Seguidamente, analizamos la cadena desde el primer Byte, buscando los caracteres


de cabecera de nuestro bloque de informacin deseado. Esto significa que debemos
hacer una rutina de descarte de informacin, en la cual estaremos comparando cada
Byte en la cadena con el valor decimal correspondiente a cada caracter de la
cabecera, es decir, en nuestra cadena de ejemplo, deberamos comparar cada Byte
con el primer valor conocido de cabecera, que en este caso ser X o su valor
decimal correspondiente 88 (Ver tabla ASCII).

263
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Comparando cada Byte con el primer valor de cabecera 88 o X, podremos saber si


debemos continuar con la bsqueda del mismo, o si finalmente algn Byte en la
cadena coincide con ste valor.

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.

En este ejemplo, nuestro dispositivo perifrico conectado al puerto serial del


microcontrolador PIC ser nuestro PC, y la cadena de datos la estaremos enviando desde la
terminal de comunicaciones de mikroBasic.
Este ejemplo podr ser verificado en base al diagrama esquemtico de la figura 9.2. Sin
embargo, no haremos uso de la pantalla LCD debido a que estaremos enviando los datos
extrados de la cadena de caracteres va RS232 hacia la terminal de comunicaciones de
mikroBasic.
La velocidad de transmisin ser de 2400 bps.
Adicionalmente a esto, haremos uso de una nueva rutina de la librera UART para transmitir
texto directamente a la terminal y de esta forma poder saber en que estado se encuentra el
proceso de transmisin y recepcin de datos:

UART1_Write_Text(Texto a enviar va RS232)

Esta rutina enva el texto cargado dentro de las comillas, o caracteres almacenados en
variables tipo string, va RS232.

9.3.1.- Ejemplo de programacin #52:


Analice detenidamente el siguiente programa, leyendo los comentarios en cada lnea:
program RS232
'--- Area de declaracin:
Dim Datos_RX
Cadena
acumulador
X

As
As
As
As

Byte[23]
Byte[48]
Byte
Byte

'
'
'
'

Arreglo de variables para almacenar los datos.


Arreglo de variables para almacenar la cadena.
Variable para llevar conteo en condicional "loop Until..."
Variable para lazo For-Next.

264
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

i As Byte

' Variable auxiliar para conteo en subrutinas.

sub function LeerCaracter As Byte

' Recoje un caracter de la UART.

do
loop Until UART1_Data_Ready = 1
Result = UART1_Read()

'
'
'
'
'

Cuando el dato esta listo, carga el resultado


en la variable "LeerCaracter", de lo contrario
se queda en el lazo do-loop esperando.
Lee el dato en la USART y lo carga en la
variable "LeerCaracter".

End sub
main:

' Programa Principal.

UART1_Init(2400)
Delay_ms(100)

' Inicializamos el mdulo UART a 2400 bps.


' Pausa de 100 milisegundos para estabilizacin.

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

' inicializamos la variable "acumulador"

do
Cadena[acumulador] = LeerCaracter
acumulador = acumulador + 1
loop Until (acumulador = 48)

i = 0

' Llama la sub-funcin "leerCaracter y


' y carga el dato obtenido del Buffer en la variable.
' Incrementa la variable "acumulador".
'
'
'
'
'

Si la variable acumulador no es igual a 10,


contina cargando datos en el arreglo Cadena[n].
Cuando acumulador sea igual a 48, entonces ya
tendremos cardados todos los Bytes de la cadena en
en el arreglo cadena[n]

' Inicializamos la variable 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

'
'
'
'
'
'
'
'

Incrementamos en una unidad la variable "i".


88 equivale al simbolo ASCII "X". Si el Valor
cargado en Cadena[i] es 88, verifica el siguiente
caracter en la subrutina "verifica_2".
Si no ha sido el dato correcto, verifica si "i"
es mayor a la cantidad de bytes de la Cadena.
Si "i" es mayor al numero de bytes de la Cadena,
entonces reiniciamos todo el proceso desde "main".

' Si "i" no ha superado el valor de la cantidad de


' bytes de la Cadena, entonces contina verificando
' en busca del caracter "X".

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

'
'
'
'
'
'
'
'

Incrementamos en una unidad la variable "i".


89 equivale al simbolo ASCII "Y". Si el Valor
cargado en Cadena[i] es 89, verifica el siguiente
caracter en la subrutina "verifica_2".
Si no ha sido el dato correcto, verifica si "i"
es mayor a la cantidad de bytes de la Cadena.
Si "i" es mayor al numero de bytes de la Cadena,
entonces reiniciamos todo el proceso desde "main".

' Si "i" no ha superado el valor de la cantidad de


' bytes de la Cadena, entonces contina verificando
' en busca del caracter "Y".

verifica_3:
i = i + 1
If Cadena[i] = 90 Then
GoTo Almacena

'
'
'
'

Incrementamos en una unidad la variable "i".


90 equivale al simbolo ASCII "Z". Si el Valor
cargado en Cadena[i] es 90, verifica el siguiente
caracter en la subrutina "verifica_2".

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

'
'
'
'

Si no ha sido el dato correcto, verifica si "i"


es mayor a la cantidad de bytes de la Cadena.
Si "i" es mayor al numero de bytes de la Cadena,
entonces reiniciamos todo el proceso desde "main".

' Si "i" no ha superado el valor de la cantidad de


' bytes de la Cadena, entonces contina verificando
' en busca del caracter "Z".

Almacena:
For X = 1 To 20
i = i + 1

' Incremento de una unidad en "i".

Datos_RX[X] = Cadena[i]
UART1_Write(Datos_RX[X])
delay_ms(100)

'
'
'
'

Carga el dato de la Cadena en "Datos_RX[X]"


Enviamos el dato cargado en la variable va RS232.
Retardo de 100 ms para visualizar mejor los datos
en la terminal de comunicaciones.

Next X
UART1_Write_Text("Fin...!")
GoTo Recepcion

' Mensaje de estado de la transmisin.

' Hace un salto a Rcepcin para quedar a la espera de


' una nueva cadena de datos.

End.

Para comprobar el funcionamiento de este programa, enviamos la cadena de caracteres del


ejemplo travs de la terminal de comunicaciones de mikroBasic como se observa en la
siguiente figura:

Figura 9.5
266
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Tambin podremos ver en la figura anterior el mensaje de estado enviado desde el


microcontrolador hacia el PC cuando ste se encuentra a la espera de la cadena de
caracteres.
Al enviar la cadena desde el PC hacia el microcontrolador, los caracteres contenidos en el
bloque de datos anteriormente especificado, aparecern uno a uno en la pantalla hasta
recibir finalmente el mensaje de estado final de la transmisin.

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

9.4.- Mdulo de comunicaciones BlueTooth.


Haciendo uso de un mdulo para comunicaciones inalmbricas Bluetooth, de tal manera que
podamos eliminar la conexin fsica entre nuestro circuito y nuestro PC la cual por cierto
tambin deber contar con un mdulo de comunicaciones Bluetooth que por lo regular viene
integrado de fbrica.

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.9 (Fuente: www.sparkfun.com)


268
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Empresa: Sparkfun Electronics


Website: http://www.sparkfun.com
Modelo: Bluetooth Modem - BlueSMiRF Gold
Cdigo: WRL-00582

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.

9.4.1.- Widcomm Bluetooth Software 5.0.1.3900


Este software nos permitir escanear dispositivos Bluetooth como el mdulo recomendado
para este ejemplo prctico. A travs de l podremos administrar algunos servicios
disponibles como transferencia de archivos, servicios de impresin, acceso a Red, pasarela
de audio, auriculares, puerto serial Bluetooth entre otros. Veamos a continuacin la
secuencia de instalacin del software. Lea los mensajes en las ventanas del software para
seguir correctamente los pasos:

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

Al reiniciar la sesin de Windows, contina el proceso de configuracin del software:

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

Cuando se realiza la bsqueda de dispositivos Bluetooth, es probable que aparezcan otros


como nuestros telfonos mviles, mouse o teclados Bluetooth, auriculares y todo aquel
dispositivo que est al alcance de nuestro PC. Podremos identificar el nuestro bajo el
nombre de BlueRadios como se observa en la siguiente figura. Seleccionamos el
dispositivo y continuamos, haciendo clic en Siguiente.

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 verde estar en un estado de intermitencia mientras el mdulo se


encuentra a la espera de una conexin.

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

9.4.2.- Comunicacin Serial inalmbrica BlueTooth.


Sin realizar ninguna modificacin sobre el ltimo programa que hemos cargado en el
microcontrolador, podremos ver en funcionamiento las comunicaciones a travs de esta
pasarela inalmbrica, cuando enviamos la cadena de datos desde la terminar de
comunicaciones de mikroBasic hasta el microcontrolador PIC.
En la siguiente figura se puede observar que lo nico que hemos cambiado ha sido la
configuracin para la conexin del puerto, donde COM6 representa la conexin a travs del
mdulo Bluetooth del PC.

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

9.5.- Mdulo GPS (OEM), comunicacin serial RS232.

Hoy en da es posible adquirir a travs de Internet mdulos


GPS (OEM, abreviatura del ingls Original Equipment
Manufacturer) de muy bajo costo y con una eficiencia que
puede sorprender a cualquiera que desee incluirlos en sus
proyectos electrnicos, debido a que son sumamente precisos y
muy fciles de acoplar.
Bsicamente, estos mdulos son capaces de capturar la
informacin necesaria de una red de satlites, a travs de los
cuales determinan su posicin geogrfica en el planeta. Esta
informacin es entregada por el dispositivo a travs de un protocolo estndar denominado
NMEA 0183. Esta informacin sale del puerto serial del dispositivo a una frecuencia
conocida, que por lo regular es igual a 1 Hz. Esto significa que podemos obtener la
ubicacin geogrfica actualizada de nuestro dispositivo cada 1 segundo. Tambin existen
mdulos GPS que entregan dicha informacin a frecuencias mayores, por ejemplo a 5Hz, 10
Hz e incluso a 20 Hz.
Los mdulos GPS que utilizaremos a continuacin tienen una salida de datos Serial
Asncrona con niveles de voltaje en su salida entre 0 y 5 voltios. Requieren adems de una
antena activa la cual podremos encontrar en dos modalidades; montada directamente
sobre el mdulo GPS, o separada y encapsulada para protegerla del clima cuando
deseamos que la misma est lejos del circuito principal o circuito de control.
El objetivo principal en los prximos ejemplos ser la obtencin de los siguientes datos
extrados del string o cadena de datos en la salida del GPS:

UTC Time (Universal Time Coordinated) o Tiempo Universal Coordinado. Este es el


tiempo de la zona horaria a travs del cual se calcula el tiempo en diferentes partes
del mundo.

Ubicacin geogrfica (Latitud y Longitud). Es la ubicacin del dispositivo sobre el


planeta, medida en ngulos; grados, minutos y segundos de arco.

Satlites detectados. Es la cantidad de satlites que el dispositivo GPS ha podido


capturar en momento determinado.

Altura del dispositivo sobre el nivel del mar.

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

9.5.1.- Protocolo NMEA.


Como dijimos anteriormente, podemos obtener la ubicacin geogrfica del dispositivo en
trminos de Latitud y Longitud.
La latitud determina la distancia angular entre un punto en el planeta y el ecuador y puede
pertenecer tanto al hemisferio Norte como al hemisferio Sur.
La longitud geogrfica determina la distancia angular entre un punto del planeta y el
meridiano de Greenwish. En este caso y segn su ubicacin en el planeta, podremos extraer
del dispositivo una longitud Este o una longitud Oeste segn sea el caso.
Esta informacin la podemos extraer a travs una cadena de caracteres ASCII en formato
de comunicacin NMEA.
NMEA cuenta con varias sentencias las cuales empiezan con los caracteres $GP seguidas
del nombre de la misma, adems de los datos capturados por el dispositivo desde la red de
satlites, cada uno de ellos presentados en campos separados por comas. Tambin
podremos encontrar al final de la sentencia el resultado de una operacin de dos dgitos
denominada Checksum justo despus del smbolo *.
El Checksum se calcula a travs de una operacin lgica (XOR) realizada tantas veces
como sea necesario segn la cantidad de dgitos en la cadena, a travs de la cual podemos
determinar si la transmisin de datos desde el modulo GPS hacia el microcontrolador PIC ha
sido correcta. El resultado de esta operacin queda expresado a travs de dos caracteres
ASCII, los cuales representan un valor Hexadecimal.
Cada vez que el modulo GPS enva una de estas sentencias a travs de su salida,
automticamente termina la misma con <CR> y <LF> (Carrie Return y Line Feed), lo cual
resulta ser muy til cuando deseamos ver esta informacin en un terminal de
comunicaciones, ya que cada sentencia ser visualizada en una nueva lnea en el rea de
recepcin de datos, y no de forma continua y desordenada.
Uno de los mdulos o dispositivos GPS que hemos utilizado como ejemplo ha sido el
Garmin 18-5Hz, de Garmin International Inc., en su versin OEM.
Veamos una de las sentencias NMEA que nos entrega este dispositivo en su salida:
GGA = Global Positioning System Fix Data
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh
Los campos representados por nmeros, contienen informacin en un formato conocido el
cual podremos encontrar detallado en la hoja de especificaciones tcnicas del fabricante.

285
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Veamos:

El campo <1> para la sentencia GGA almacena el Tiempo Universal Coordinado o


UTC Time bajo un formato predefinido: hhmmss.s

El campo <2> almacena la latitud bajo el formato: ddmm.mmmmm

El campo <3> almacena el hemisferio Norte o Sur, es decir: N S.

El campo <4> almacena la longitud bajo el formato: ddmm.mmmmm

El campo <5> almacena el hemisferio Este hemisferio Oeste: E W.

El campo <6> almacena el estado de la sincronizacin con el sistema de


posicionamiento global. 0 = no hay posicin, 1 = posicin disponible para GPS nodiferencial, 2 = posicin disponible para DGPS o GPS diferencial.

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 <8> almacena la Imprecisin en el plano de superficie.

El campo <9> almacena la altitud del dispositivo sobre el nivel del mar.

Seguidamente veremos la unidad de medida del campo <9>, M o metros.

El campo <10> almacena la Superficie gravitacional equipotencial, seguida de su


unidad M o metros.

Los campos <11> y <12> son reservados o nulos.

Veamos un ejemplo de esta sentencia con valores reales:


$GPGGA,212529.4,5042.52892,N,12238.40770,W,2,09,1.1,9.7,M,-11.4,M,,*61

UTC Time: 21 horas, 25 minutos, 29.4 segundos.

Latitud: 50 42.52892.

Hemisferio de Latitud: Norte.

Longitud: 112 38.40770.

Hemisferio de Longitud: Oeste.


286

_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Estado de la sincronizacin: 2, posicin disponible para DGPS.

Satlites en uso: 9 satlites.

Imprecisin en el plano de superficie: 1.1

Altitud del dispositivo o antena sobre el nivel del mar: 9.7 metros.

Superficie equipotencial gravitacional: -11.4 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

La latitud y longitud estn calculadas normalmente bajo el sistema centesimal en el sistema


de medidas relativas a ngulos.
Las coordenadas expresadas en sistema centesimal son completamente compatibles con
sistemas de informacin geogrfica (GIS), como Google Earth (http://earth.google.com).
Descargue este programa gratuitamente de la direccin sealada.
Con este programa podremos tomar informacin relativa a coordenadas geogrficas e
introducirlas en Google Earth para obtener la ubicacin geogrfica del dispositivo sobre el
mapa.
Dicho esto, tomemos las coordenadas de la cadena de caracteres de ejemplo, y demos el
formato adecuado para que Google Earth sea capaz de reconocerlas:
Coordenada Geogrfica: N50 42.52892 W112 38.40770
Al introducir estos datos bajo este formato en la casilla de bsqueda de Google Earth, el
programa nos llevar a la posicin exacta en la cual se encuentra nuestro dispositivo GPS
(Figura 9.36).

N50 42.52892 W112 38.40770

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

La cadena de datos sealada ser la que estaremos analizando en busca de la sentencia


NMEA que mas nos interesa, y a travs de la cual obtendremos los datos anteriormente
comentados, como coordenadas geogrficas, nmero de satlites en uso, altitud entre otros.
Los mdulos GPS vienen configurados de fbrica para enviar una cierta cantidad de
sentencias NMEA a travs de su salida. Esta configuracin podra ser cambiada a travs de
un software proporcionado por el fabricante, en caso de que estemos interesados en obtener
una sentencia NMEA especfica de todo el repertorio que encontraremos en el manual del
mdulo GPS que estemos usando. Pero en nuestro caso, la cadena de caracteres o datos
esta compuesta por tan solo cuatro sentencias NMEA: VTG, RMC, GGA y GSA. Juntas
conforman una solo cadena de caracteres que se repite constantemente, no mayor a 256
bytes, y de la cual slo deseamos extraer los datos de la sentencia GGA para la prxima
prctica de programacin.

290
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

9.5.2.- Ejemplo de programacin #53:

En este ejemplo se requiere extraer de la cadena de caracteres proporcionada por el mdulo


GPS las coordenadas geogrficas (latitud y longitud) y el nmero de satlites en uso. Lo
primero que debemos tomar en cuenta para extraer los datos, ser almacenar la cadena
completa dentro de un arreglo de variables de tamao conocido, segn la cantidad de
caracteres totales en ella. En nuestro ejemplo, tenemos una cadena de 183 caracteres, por
lo cual estaremos declarando en nuestro programa un arreglo de variables que cubra esta
cantidad.
Repacemos del programa anterior la subrutina encargada de almacenar una cadena de
caracteres:
acumulador = 1

' inicializamos la variable "acumulador"

do
Cadena[acumulador] = LeerCaracter
acumulador = acumulador + 1
loop Until (acumulador = 184)

'
'
'
'
'

Llama la sub-funcin "leerCaracter y


y carga el dato en la variable.
Incrementa la variable "acumulador".
Si la variable no es igual a 184,
contina cargando caracteres.

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

Al encontrar la cabecera completa, procedemos entonces a almacenar el resto de los


caracteres de la sentencia GGA, para luego ser mostrados a travs de algn perifrico
conectado al microcontrolador y el cual en nuestro caso ser una pantalla LCD.

' La variable i representa el valor de una pocisin de la cadena, a partir


' del ltimo caracter de la cabecera de la sentencia GGA.
Almacena:
i = i + 1

' Incrementamos de una unidad la variable "i".

For X = 1 To 64

' En esta lnea definimos cuantos datos deseamos de


' obtener de la Cadena a partir de la cabecera "$GPGGA"
' Retardo de 50 milisegundos.

delay_ms(50)

Datos_RX[X] = Cadena[i] ' Carga el dato de la Cadena en "Datos_RX[X]"


i = i + 1

' Incrementamos de una unidad la variable "i".

Next X

Si extraemos la cadena de caracteres de la figura 9.37, podremos notar que la sentencia


NMEA deseada, es decir, GGA, se encuentra ubicada entre otras dos sentencias; RMC y
GSA.
$GPVTG,,T,,M,,N,,K*4E
$GPRMC,004013.0,V,5042.52892,N,12238.40770,W,,,071209,008.4,W*71
$GPGGA,212529.4,5042.52892,N,12238.40770,W,2,09,1.1,9.7,M,-11.4,M,,*61
$GPGSA,A,1,,,,,,,,,,,,,,,*E1

Al realizar el anlisis de la cadena tal y como lo hicimos en el ejemplo de programacin


anterior, estaremos desechando las sentencias VTG, RMC y GSA junto con sus datos.
Si por ejemplo quisiramos extraer tan solo los campos de coordenadas geogrficas y
cantidad de satlites en uso de la sentencia GGA para mostrados por la pantalla LCD, lo
apropiado sera mostrar tan slo el contenido de las variables correspondientes a cada
carcter.

$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

Al tomar cada una de estas variables e imprimirlas en pantalla ordenadamente, y de una


forma personalizada, entonces estaremos cumpliendo con el objetivo principal del tema
planteado anteriormente.
En esta ocasin utilizaremos un microcontrolador PIC18F452, debido a que requerimos de
una mayor capacidad en memoria RAM, adems de hecho de que seguramente se buscar
expandir las funciones programadas para realizar tareas mas avanzadas.

293
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Toda la programacin se har en base al siguiente diagrama esquemtico:

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

Analice el siguiente programa que a continuacin presentamos y lea detenidamente los


comentarios en cada lnea:
program GPS_RS232
'--- Area 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

' Fin de la configuracin de conexiones.


Caracter As Byte
Y As Byte

' Variable para almacenar datos temporalmente.


' Variable para ubicar datos en una posicin determinada
' de la pantalla LCD

Dim Datos_RX As Byte[64]


Cadena As Byte[184]
acumulador As Byte
X As Byte
i As Byte

' Arreglo de variables para almacenar los datos del GPS.


' Arreglo de variables para almacenar los cadena completa del GPS.
' Variable para condicional "loop Until..."
' Variable para lazo For-Next.
' Variable para acumulador temporal.

sub function LeerCaracter As Byte


do
loop Until UART1_Data_Ready = 1
Result = UART1_Read()

' Recoje un caracter de la UART.


'
'
'
'
'

Cuando el dato esta listo, carga el resultado


en la variable "LeerCaracter", de lo contrario
se queda en el lazo esperando.
Lee el dato en la USART y lo carga en la
variable "LeerCaracter".

End sub
main:

' Programa Principal.

LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Limpia la pantalla LCD


' Apaga el cursor en la pantalla

LCD_Out(1,1,"La:")
LCD_Out(2,1,"Lo:")

' Imprime en la linea 1 y columna 1


' Imprime en la linea 2 y columna 1

UART1_Init(19200)
Delay_ms(100)

' Inicializamos el mdulo UART a 2400 bps.


' Pausa de 100 milisegundos para estabilizacin.

Recepcion:
acumulador = 1

' inicializamos la variable "acumulador"

do
Cadena[acumulador] = LeerCaracter
acumulador = acumulador + 1
loop Until (acumulador = 184)

i = 0

'
'
'
'
'

Llama la sub-funcin "leerCaracter y


y carga el dato en la variable.
Incrementa la variable "acumulador".
Si la variable no es igual a 185,
contina cargando caracteres.

' Inicializamos la variable 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

'
'
'
'
'
'
'
'

Incrementamos en una unidad la variable "i".


36 equivale al simbolo ASCII "$". Si el Valor
cargado en Cadena[i] es 36, verifica el siguiente
caracter en la subrutina "verifica_2".
Si no ha sido el simbolo correcto, verifica si "i"
es mayor a la cantidad de bytes de la Cadena.
Si "i" es mayor al numero de bytes de la Cadena,
entonces reiniciamos todo el proceso desde "main".

' Si "i" no ha superado el valor de la cantidad de


' bytes de la Cadena, entonces contina verificando
' en busca del caracter "$".

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

'
'
'
'
'
'
'
'

Incrementamos en una unidad la variable "i".


71 equivale al simbolo ASCII "G". Si el Valor
cargado en Cadena[i] es 71, verifica el siguiente
caracter en la subrutina "verifica_2".
Si no ha sido el simbolo correcto, verifica si "i"
es mayor a la cantidad de bytes de la Cadena.
Si "i" es mayor al numero de bytes de la Cadena,
entonces reiniciamos todo el proceso desde "main".

' Si "i" no ha superado el valor de la cantidad de


' bytes de la Cadena, entonces contina verificando
' en busca del caracter "G".

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

'
'
'
'
'
'
'
'

Incrementamos en una unidad la variable "i".


80 equivale al simbolo ASCII "P". Si el Valor
cargado en Cadena[i] es 80, verifica el siguiente
caracter en la subrutina "verifica_2".
Si no ha sido el simbolo correcto, verifica si "i"
es mayor a la cantidad de bytes de la Cadena.
Si "i" es mayor al numero de bytes de la Cadena,
entonces reiniciamos todo el proceso desde "main".

' Si "i" no ha superado el valor de la cantidad de


' bytes de la Cadena, entonces contina verificando
' en busca del caracter "P".

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

'
'
'
'
'
'
'
'

Incrementamos en una unidad la variable "i".


71 equivale al simbolo ASCII "G". Si el Valor
cargado en Cadena[i] es 71, verifica el siguiente
caracter en la subrutina "verifica_2".
Si no ha sido el simbolo correcto, verifica si "i"
es mayor a la cantidad de bytes de la Cadena.
Si "i" es mayor al numero de bytes de la Cadena,
entonces reiniciamos todo el proceso desde "main".

' Si "i" no ha superado el valor de la cantidad de


' bytes de la Cadena, entonces contina verificando
' en busca del caracter "G".

verifica_5:
i = i + 1
If Cadena[i] = 71 Then
GoTo verifica_6
Else
If i = 184 Then
GoTo main
End If

'
'
'
'
'
'
'
'

Incrementamos en una unidad la variable "i".


71 equivale al simbolo ASCII "G". Si el Valor
cargado en Cadena[i] es 71, verifica el siguiente
caracter en la subrutina "verifica_2".
Si no ha sido el simbolo correcto, verifica si "i"
es mayor a la cantidad de bytes de la Cadena.
Si "i" es mayor al numero de bytes de la Cadena,
entonces reiniciamos todo el proceso desde "main".

296
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

GoTo verifica_1
End If

' Si "i" no ha superado el valor de la cantidad de


' bytes de la Cadena, entonces contina verificando
' en busca del caracter "G".

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

Incrementamos en una unidad la variable "i".


65 equivale al simbolo ASCII "A". Si el Valor
cargado en Cadena[i] es 65, verifica el siguiente
caracter en la subrutina "verifica_2".
Si no ha sido el simbolo correcto, verifica si "i"
es mayor a la cantidad de bytes de la Cadena.
Si "i" es mayor al numero de bytes de la Cadena,
entonces reiniciamos todo el proceso desde "main".

' Si "i" no ha superado el valor de la cantidad de


' bytes de la Cadena, entonces contina verificando
' en busca del caracter "A".

' 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

' Incrementamos de una unidad la variable "i".

For X = 1 To 64

' En esta lnea definimos cuantos datos deseamos de


' obtener de la Cadena a partir de la cabecera "$GPGGA"
' Retardo de 50 milisegundos.

delay_ms(50)

Datos_RX[X] = Cadena[i] ' Carga el dato de la Cadena en "Datos_RX[X]"


i = i + 1

' Incrementamos de una unidad la variable "i".

Next X

PantallaGLCD:

'
'
'
'

Esta sub-rutina se encargara de mostrar los datos en un orden


especfico en la pantalla. Es muy importante prestar atencin
a las posiciones en las cuales se estn imprimiendo los datos
para no confundirnos.

LCD_Cmd(_LCD_CLEAR)

' Limpia la pantalla LCD

LCD_Out(1,1,"La:")
LCD_Out(2,1,"Lo:")

' Imprime una etiqueta en la linea 1 y columna 1


' Imprime una etiqueta en la linea 2 y columna 1

Caracter = Datos_RX[22]
Lcd_Chr(1, 4, Caracter)

' Letra correspondiente al Hemisferio N S.


' Escribimos el contenido de la variable "Caracter"
' en la columna 4 (Lnea 1) de la pantalla LCD.

Caracter = Datos_RX[36]
Lcd_Chr(2, 4, Caracter)

' Letra correspondiente al Hemisferio E W.


' Escribimos el contenido de la variable "Caracter"
' en la columna 4 (Lnea 2) de la pantalla LCD.

' Datos para la Latitud:


Caracter = Datos_RX[11]
Lcd_Chr(1, 5, Caracter)

' Primer Caracter del campo "Latitud" en la Cadena.


' Escribimos el contenido de la variable "Caracter"
' en la columna 5 de la pantalla LCD.

Caracter = Datos_RX[12]
Lcd_Chr(1, 6, Caracter)

' Segundo Caracter del campo "Latitud" en la Cadena.


' Escribimos el contenido de la variable "Caracter"
' en la columna 6 de la pantalla LCD.

Y = 8

' Con este valor especificaremos la posicin de la


' variable que deseamos imprimir en la pantalla.

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

'
'
'
'
'
'
'
'

Hacemos un For-Next debido a que deseamos imprimir


los siguientes 8 caracteres de la lalitud seguidos, de
esta forma ahorramos lneas de programacin.
Carga el contenido de la variable deseada en "Caracter"
Escribimos el contenido de la variable "Caracter"
en la columna "Y" (valor cargado en Y) de la pantalla LCD.
Incrementamos el valor de "Y" en una unidad para la
nueva posicin del prximo digito a imprimir.

Next X

' Datos para la Longitud:


Caracter = Datos_RX[24]
Lcd_Chr(2, 5, Caracter)

' Primer Caracter del campo "Longitud" en la Cadena.


' Escribimos el contenido de la variable "Caracter"

Caracter = Datos_RX[25]
Lcd_Chr(2, 6, Caracter)

' Segundo Caracter del campo "Longitud" en la Cadena.


' Escribimos el contenido de la

Caracter = Datos_RX[26]
Lcd_Chr(2, 7, Caracter)

' Tercer Caracter del campo "Longitud" en la Cadena.


' Escribimos el contenido de la variable "Caracter"

Y = 9

' Con este valor especificaremos la posicin de la


' variable que deseamos imprimir en la pantalla.

For X = 27 To 34

' Hacemos un For-Next debido a que deseamos imprimir


' los siguientes 8 caracteres de la lalitud seguidos.

Caracter = Datos_RX[X]
Lcd_Chr(2, Y, Caracter)

'
'
'
'
'

Y = Y + 1

Carga el contenido de la variable deseada en "Caracter"


Escribimos el contenido de la variable "Caracter"
en la columna "Y" (Lnea 2) de la pantalla LCD.
Incrementamos el valor de "Y" en una unidad para la
nueva posicin del prximo digito a imprimir.

Next X

delay_ms(5000)

' Pausa de 5 segundos para visualizar los datos en


' la pantalla LCD.

' Mostramos a continuacin la cantidad de Satlites en uso. Debido a que este


' campo en la Cadena est conformado por dos dgitos, debemos imprimir el contenido
' de las dos variables correspondientes a ste.
LCD_Cmd(_LCD_CLEAR)

' Limpia la pantalla LCD

LCD_Out(1,1,"Satelites en Uso")

' Imprime una etiqueta en la linea 1, columna 1


' de la pantalla LCD.

Caracter = Datos_RX[40]
Lcd_Chr(2, 8, Caracter)
Caracter = Datos_RX[41]
Lcd_Chr(2, 9, Caracter)

' Carga el contenido de la variable deseada en "Caracter"


' Escribimos el contenido de la variable "Caracter"
' en la columna 8, lnea 2 de la pantalla.
' Escribimos el contenido de la variable "Caracter"
' en la columna 9, lnea 2 de la pantalla.

delay_ms(5000)

' Retardo de 5 segundos para visualizar


' la informacin presentada en pantalla.

GoTo Recepcion

' Hacemos un salto a la etiqueta "Recepcin" para


' recoger nuevos datos del modulo GPS.

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

Al hacer clic en el botn Aceptar veremos que en la barra de herramientas aparece un


nuevo icono representado por un telfono.

300
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Figura 9.44

Inserte en el formulario el icono MsComm como se muestra en la figura 9.45, y configure


los siguientes parmetros en la ventana de propiedades:
CommPort: 1 (ver figura 9.46)
Settings: 9600,n,8,1 (ver figura 9.47)

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

Utilice el icono CommandButton en la barra de herramientas para agregar botones en el


formulario:

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

El siguiente paso es designar a cada botn la instruccin que se encargar de enviar un


dato especfico a travs del puerto serial RS232 del PC. Haga doble clic en el primer botn
del formulario y agregue la siguiente lnea de comando (ver figura 9.52):

Figura 9.52

303
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Se repite el paso anterior para el resto de los botones:


Botn
Botn
Botn
Botn
Botn
Botn
Botn
Botn
Botn
Botn
Botn

#2: MSComm1.Output = Chr$(50)


#3: MSComm1.Output = Chr$(51)
#4: MSComm1.Output = Chr$(52)
#5: MSComm1.Output = Chr$(53)
#6: MSComm1.Output = Chr$(54)
#7: MSComm1.Output = Chr$(55)
#8: MSComm1.Output = Chr$(56)
#9: MSComm1.Output = Chr$(57)
#10: MSComm1.Output = Chr$(42)
#11: MSComm1.Output = Chr$(48)
#12: MSComm1.Output = Chr$(35)

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

9.6.1.- Ejemplo de programacin #54:


El programa para el ejemplo planteado esta basado en el diagrama esquemtico de la figura
9.54:
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

' Fin de la configuracin de conexiones


main: '

Programa Principal

UART1_Init(9600)
Delay_ms(100)

' Inicializamos el mdulo UART a 2400 bps.


' Pausa de 100 milisegundos para estabilizacin.

LCD_Init()
LCD_Cmd(_LCD_CLEAR)
LCD_Cmd(_LCD_CURSOR_OFF)

' Inicializa la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

Recepcion:
If (UART1_Data_Ready() = 1) Then
Datos_RX = UART1_Read()
GoSub Imprime

' Si recibe datos en el puerto...


' Almacena el dato en la variable "Datos_RX"
' Salta a la subrutina de Impresin.

Else
Lcd_Out(1, 1, "Esperando Dato!") ' Mensaje de estado del Buffer.
End If
GoTo Recepcion

' Repetimos el proceso.

Imprime:
Lcd_Out(2, 1, "Tecla: ")
Lcd_Chr(2, 8, Datos_RX)

' Mensaje de estado del Buffer.


' Transmitimos de vuelta el valor cargado
' en la variable "Datos_RX"

Delay_ms(1000)
Return

' Retardo de 1.5 segundos.

End.

305
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Bsicamente el microcontrolador estar esperando un dato desde el PC el cual ser


mostrado en la segunda lnea de la pantalla LCD.
Al presionar cualquiera de las teclas del mdulo que hemos realizado en Visual Basic, el
caracter correspondiente aparecer en la pantalla para luego quedar a la espera del
siguiente dato.

9.6.2.- Ejemplo de programacin #55:


En base a los conocimientos adquiridos hasta ahora, realizaremos a continuacin un circuito
capaz de medir un voltaje variable aplicado a una de las entradas del conversor A/D de un
PIC16F877, el cual a su vez deber enviar el resultado de la conversin en decimal a una
pantalla LCD, y enviar este mismo resultado a un PC, a travs del puerto serial donde los
datos sern recibidos y convertidos, en una hoja de clculo (Excel), para posteriormente
graficar el conjunto de datos de una muestra de diez lecturas acumuladas.

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.

Analicemos el siguiente programa, leyendo cuidadosamente los comentarios realizados en


cada lnea:
program RS232_A/D
' 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

' Fin de la configuracin de conexiones

Dim texto As String[20]


Dim dato As Word
Dim DatoStr As string[4]

'
'
'
'
'

Declaramos una variable tipo String en la cual


cargaremos un mensaje de un mximo de 20 caracteres.
Variable de 16 bits para cargar el valor de la
conversin A/D.
Variable para conversin datos.

main:
UART1_Init(9600)
Delay_ms(100)

' Inicializamos el mdulo UART a 2400 bps.


' Pausa de 100 milisegundos para estabilizacin.

Lcd_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)

' Inicializamos la pantalla.


' Limpia la pantalla LCD.
' Apaga el cursor en la pantalla.

ADCON1 = 0
TRISA

= $FF

' Configura el puerto A como analgico,


' VDD es el voltaje de referencia --> Vref.
' Configura el puerto A como entrada.

While (TRUE)
dato = Adc_Read(2)

' Carga el resultado de la conversin de


' 10 bits en la variable.

LCD_Out(1,1,"Conversion A/D: ")

' Imprime un ttulo en la linea 1.

wordtostr(dato, DatoStr)
Lcd_Out(2, 5, DatoStr)

' Conversin de word a string.


' Imprime el dato cargado en "DatoStr".

307
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

UART1_Write_Text(DatoStr)

' Enviamos el dato va RS232.

delay_ms(1000)

' Retardo de 50 milisegundos.

Wend
End.

En el programa se puede observar cmo hemos definido el conexionado de la pantalla LCD,


as como tambin la configuracin bsica establecida para el conversor A/D, el cual har la
conversin a 10 bits con el fin de obtener una mayor resolucin en el proceso de medicin
del voltaje aplicado al pin RA2.
Una vez iniciada la conversin, se puede observar que el resultado de la misma es
almacenada en la variable Dato, la cual hemos declarado como una variable de 16 bits
(word), debido a que el resultado de la conversin requiere mas de ocho bits de datos.
Este resultado de la conversin es mostrado en la pantalla LCD e inmediatamente enviado a
travs del puerto serial del microcontrolador el cual ha sido inicializado a una velocidad de
transmisin de datos de 9600 bps. En la figura 9.55 podemos observar como se ver el dato
resultado de la conversin en la pantalla.

Figura 9.55

El siguiente paso en el programa consiste en enviar el dato obtenido al PC a travs del


puerto serial, para luego hacer una pequea pausa de 500 milisegundos y empezar
nuevamente el proceso para una nueva lectura.
Un paso importante en este punto, una vez obtenido el resultado de la conversin A/D en la
pantalla LCD, ser verificar la transferencia de datos hacia el PC con la ayuda de la terminal
de comunicaciones de mikroBasic.

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

Recuerde seleccionar la opcin ASCII, para visualizar los valores obtenidos de la


conversin A/D adecuadamente. En este punto ya podemos estar seguros que la conversin
en RA2 y el envo de datos hacia el PC estn correctos.
Pero la idea principal de esta prctica, ser llevar estos datos a una hoja de Excel, en la cual
podamos realizar los clculos para expresar estos valores en unidades de voltaje para
luego tomar una muestra significativa y graficarlos como se observa en la figura 9.57.

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

Haga clic en el botn Cuadro de controles y desplace la caja de herramientas


nuevamente a la parte superior de la hoja de clculo junto con el resto de herramientas
comunes de Excel (Figura 9.62).

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:

Private Sub CommandButton1_Click()


'abre el puerto de comunicacin
If Hoja1.MSComm1.PortOpen = False Then
Hoja1.MSComm1.PortOpen = True
End If
End Sub

Observe la figura 9.65, en la cual se puede ver el campo Caption, correspondiente a la


etiqueta del botn de comando que estamos configurando, la cual podemos personalizar con
un nombre adecuado como Abrir Puerto o Abrir Comm1.

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

Veremos a continuacin la ventana del editor de Visual Basic (Figura 9.68):

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

Cuando se sale del modo de diseo, el control de comunicaciones desaparece de la hoja de


clculo. Ahora, haciendo clic en el botn Abrir Comm1 y activando el circuito, podremos ver
que aparecen los datos de la conversin A/D del microcontrolador en la pantalla LCD y en la
hoja de clculo, especficamente en las celdas B40, B39, B38, B37, B36, B35, B34, B33,
B32, B31 y B30.
En la figura 9.71 se pueden ver unos datos de prueba almacenados en las celdas
anteriormente mencionadas. Estos datos pueden ser identificados poniendo un nombre o
encabezado en la celda B29, por ejemplo, podemos escribir la palabra Lecturas: .
En la columna C de la hoja de clculo, haremos la conversin de datos para expresar los
valores obtenidos en Voltios. Para esto aplicaremos la siguiente formula en las celdas C40,
C39, C38, C37, C36, C35, C34, C33, C32, C31 y C30:

=(B40*5)/1024

para la celda C40

=(B39*5)/1024

para la celda C39

=(B38*5)/1024

para la celda C38

=(B37*5)/1024

para la celda C37

=(B36*5)/1024

para la celda C36

=(B35*5)/1024

para la celda C35

=(B34*5)/1024

para la celda C34

=(B33*5)/1024

para la celda C33

=(B32*5)/1024

para la celda C32

=(B31*5)/1024

para la celda C31

=(B30*5)/1024

para la celda C30

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

Si se desea personalizar an mas el grfico, se puede hacer en la ficha Serie, en cual es


posible editar el recuadro que contiene la leyenda. En la siguiente ventana encontraremos
una serie de fichas con una gran variedad de opciones que nos permitirn aadir detalles
como el ttulo del grfico, identificar los ejes, agregar lneas de divisin, y algunos otros
detalles tiles para mejorar la apariencia del grfico. (figura 9.76).

Figura 9.76

324
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Seguidamente, podemos seleccionar si el grfico ser colocado en una hoja nueva, o en la


hoja de clculo en la cual hemos estado trabajando (figura 9.77):

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

Captulo X. Multi Media Card (MMC) y Secure Card (SD) Memory

MikroBasic tiene una completa librera para el manejo de


memorias del tipo MMC y SD, muy comunes hoy en da para
el almacenamiento de datos en equipos como telfonos
celulares, cmaras digitales, reproductores MP3 entre otros.
Lo interesante de incluir memorias de este tipo en nuestros
proyectos, resulta en el hecho de poder contar con una
capacidad muy elevada en el almacenamiento de datos
capturados de dispositivos externos al microcontrolador. Sin embargo, el aspecto
que ms ha llamado la atencin en la aplicacin de esta librera, es el hecho de
poder utilizar el sistema de archivos FAT en nuestros proyectos.
Por ejemplo, podemos crear archivos de texto, cuya extensin es bien conocida
.txt, abrirlos desde el bloc de notas de Windows y extraer los datos que han
sido descargados en l, todo procesado desde un principio por nuestros circuitos
basados en microcontroladores PIC de la familia 18.
Antes de iniciar el estudio del sistema de archivos FAT, veamos como almacenar
datos en sectores especficos de una tarjeta de memoria SD.
10.1.- Librera MMC/SD.
Las libreras necesarias para el almacenamiento de datos en la memoria SD son
las siguientes:
10.1.1.- Mmc_Init().
Inicializa la memoria por hardware utilizando SPI como
comunicaciones entre el microcontrolador y la memoria MMC\SD.

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.

10.2.1.- Ejemplo de programacin #56:


Para extraer los datos del registro CID de la memoria MMC, hemos elaborado un sencillo
programa que almacena la cadena de caracteres del mismo, y seguidamente enva el
contenido de cada variable por el puerto serial (RS232) del microcontrolador al
HyperTerminal de MikroBasic.
Tambin es importante aclarar que la comunicacin entre el microcontrolador y la tarjeta de
memoria es SPI (Comunicacin Serial Sncrona). En otras palabras, tendremos en nuestro
circuito de pruebas un bus de datos SPI a travs del cual estaremos enviando informacin
entre el microcontrolador y la memoria.
Es importante recordar que siempre debemos inicializar el mdulo SPI antes de
inicializar la tarjeta de memoria, y este paso se puede resolver bajo los
siguientes parmetros:
Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)

Lo siguiente a tomar en cuenta ser seleccionar la tarjeta de memoria a travs


del pin CS (Chip Select) en el bus de datos SPI. Esto se hace poniendo un nivel
lgico bajo, es decir, 0 en el pin CS, el cual en nuestro ejemplo est conectado
al pin RC2 del microcontrolador.
Para definir el pin CS en nuestros programas, siempre ser necesario declaras
las siguientes lneas al inicio:
Dim MMC_chip_select As sbit At RC2_bit
Dim MMC_chip_select_direction As sbit At TRISC2_bit

328
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Estas lneas de programa configuran el pin seleccionado para el CS o chip


select, que en nuestro caso ser RC2. La seleccin del dispositivo MMC se da
cuando RC2 es igual a 0.
Seguidamente procedemos a reiniciar nuevamente el mdulo SPI para una
mayor velocidad en la comunicacin entre el microcontrolador y la tarjeta de
memoria SD:
Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV16, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)

Lo siguiente ser verificar si la memoria ha sido insertada para proceder a


extraer los datos del registro o enviar un mensaje de error en caso contrario:
error_Mmc = Mmc_Init()

' Inicializamos la Memoria SD.

Si el valor cargado en la variable error_Mmc es igual a cero (0), entonces ha


habido comunicacin con la memoria, por lo cual estaremos en capacidad de leer
el registro CID de la misma y enviarlo por el puerto RS232. En caso contrario
podremos establecer un mensaje de error para informar al usuario que la tarjeta
de memoria no ha sido insertada en el circuito. Veamos el siguiente condicional:
If (error_Mmc = 0) Then

' Verificamos que la memoria est insertada.

!
!
La memoria fue encontrada, por lo cual podremos realizar el procedimiento
Correspondiente a la extraccin de datos del Registro CID en este espacio.
Else

' si no se cumple el condicional:

!
!
Entonces enviamos un mensaje de error, por ejemplo:

Memoria no Encontrada!

End If

Mientras la memoria no est insertada, la condicin establecida no se cumple


haciendo que el programa enve un mensaje de error (Memoria no Encontrada)
por el puerto serial RS232 del microcontrolador.
Si la condicin se cumple, es decir, si la variable error_Mmc = 0, entonces
procedemos a extraer la cadena de caracteres del registro CID, a almacenarlos
en las variables declaradas al inicio del programa y a enviar los datos por el
puerto serial para visualizarlo por el terminal de comunicaciones:

329
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Diagrama Esquemtico del Circuito:

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)

' Inicializacin de la USART a 9600 bps

' Inicializacin del mdulo SPI:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)

330
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

' Inicializamos la tarjeta de memoria SD:


error_Mmc = Mmc_Init()

' Inicializamos la Memoria SD.

If (error_Mmc = 0) Then

' Verificamos si la memoria ha sido insertada.

' reinicializa el mdulo SPI para mayor velocidad:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV16, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
Mmc_Read_Cid(dataBuffer)

' Carga los datos del registro CID en la variable


' "dataBuffer"

delay_ms(1000)

' Retardo de 1 segundo

For i = 0 To 15
Uart1_Write(dataBuffer[i])
Next i

' Envia el contenido cargado en la variable


' "dataBuffer" por el puerto serial (USART).

Else

' si no se cumple el condicional:

Uart1_Write_Text(" Memoria no Encontrada ") ' enva el texto "Memoria no


' encontrada" por la USART.
delay_ms(1000)

' Retardo de 1 segundo

End If
GoTo main

' Salta a la etiqueta inicio

End.

Por ltimo, compilamos y grabamos el programa en el microcontrolador.


Verifiquemos a continuacin paso a paso lo que se debe hacer a partir de este
momento para visualizar los resultados del ejercicio.
Antes que nada, es de suma importancia verificar que hemor elegido el
microcontrolador correcto en nuestro proyecto (PIC18F458), adems del valor
correcto del oscilador externo, el cual en este caso ser de 8 Mhz.

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)

' Inicializacin de la USART a 9600 bps

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

Si seleccionamos el formato ASCII, y la tarjeta de memoria SD no se encuentra


insertada en el circuito, podremos ver el mesaje de error definido por nosotros
en nuestro programa, Memoria no Encontrada. Este mensaje se repetir cada
segundo hasta que insertemos la tarjeta de memoria SD.

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

Veamos ahora el mismo mensaje en formato hexadecimal:

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

Al hacer la conversin de decimal a hexadecimal, tenemos que: 101 0x65


Si se esta preguntando que significado tiene el primer valor hexadecimal de la
cadena (0x20), ste se corresponde se corresponde en la tabla ASCII anterior
con DC4 o Device Control 4. DC1 a DC4 son los caracteres para el control de
dispositivos auxiliares o rasgos terminales especiales.
Veamos de nuevo el resultado de la transmisin de datos de nuestro programa,
pero esta vez insertaremos la memoria despues de ver el mensaje de Memoria
no Encontrada:

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

Seguidamente en el segundo recuadro, se observa la cadena de caracteres que


representan los datos extrados del registro CID, en hexadecimal. Esta cadena de
caracteres se repite cada segundo (tercer recuadro), mientras la tarjeta de
memoria est presente, tal y como lo habamos definido en nuestro programa.
Veamos entonces que significan estos datos de ejemplo:
0x03 0x53 0x44 0x53 0x44 0x30 0x32 0x47 0x80 0x50 0x19 0xA9 0x59 0x00

MID OID OID PNM PNM PNM PNM PNM PRV PSN PSN PSN PSN

0x85 0x13

MDT MDT CRC

De izquierda a derecha, tenemos que:


Manufacturer ID (MID):

0x03 SanDisk

OEM/Application ID (OID):

0x53 decimal = 83, equivalente ASCII = S


0x44 decimal = 68, equivalente ASCII = D

Product Name (PNM):

0x53 decimal = 83, equivalente ASCII = S


0x44 decimal = 68, equivalente ASCII = D
0x30 decimal = 48, equivalente ASCII = 0
0x32 decimal = 50, equivalente ASCII = 2
0x47 decimal = 71, equivalente ASCII = G

Product Revision (PRV):

0x80 equivalente BCD = 8 0


n=8
m=0
Formato n.m
Revisin Nmero: 8.0

Serial Number (PSN):

0x50 equivalente binario = 01010000


0x19 equivalente binario = 00011001
0xA9 equivalente binario = 10101001
0x59 equivalente binario = 01011001
SN: 01010000000110011010100101011001
Dec: 1343859033
Hex: 5019A959

Manufacturing Date (MDT):

0x00 equivalente BCD = 0000 0000


0
(Recuerde que los Bits 23 al 20 son reservados)
0x85 equivalente BCD = 1000 0101
8
5
Ao 2008 - Mes 5 = Mayo
338

_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Para mayor facilidad en la conversin de datos, puede utilizar la herramienta de


conversin disponible en mikroBasic:

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

10.3.- Registro CSD Versin 2.0.


Este registro nos ofrece informacin til acerca de la tarjeta de memoria que estaremos
utilizando en nuestros proyectos. Los valores cargados en la siguiente tabla corresponden al
registro CSD de la tarjeta de memoria que hemos utilizado para este estudio, y los cuales
obtendremos mas delante de una forma prctica a travs de un ejemplo explicado paso a
paso.
Veamos a continuacin la siguiente tabla de datos, he interpretemos cada uno de ellos para
saber cual es su funcin sobre la memoria SD:
Nombre
CSD structure
Reservado
Data read access-time
Data read access-time in CLK
cycles (NSAC*100)

max. data transfer rate


card command classes
max. read data block length
partial blocks for read allowed
write block misalignment
read block misalignment
DSR implemented

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

Campo del Registro


CSD_STRUCTURE
(TAAC)
(NSAC)

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

Posicin del Bit en TAAT

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

READ_BL_LEN: La longitud mxima de lectura es 2


. Este valor debe
estar siempre entre 512 y 2048 bytes. En una memoria SD, READ_BL_LEN y
WRITE_BL_LEN siempre son iguales.
Valor de READ_BL_LEN
De 0 a 8
9
10
11
De 12 a 15

Longitud del Bloque


Reservado
9
2 = 512 bytes
210 = 1024 bytes
211 = 2048 bytes
Reservado

Figura 10.15
342
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

READ_BL_PARTIAL: Este valor siempre es igual a 1 en una memoria SD.


Esto significa que los bloques mas pequeos (1 byte) tambin pueden ser
utilizados.
WRITE_BLK_MISALIGN: El tamao del bloque de memoria es definido por
WRITE_BL_LEN. Cuando WRITE_BLK_MISALIGN es igual a 0, indica que el cruce
de lmites de bloques fsicos es invlido. Cuando es igual a 1, indica que el cruce
de bloques fsicos es vlido.
READ_BLK_MISALIGN: El tamao del bloque de memoria es definido por
READ_BL_LEN. Cuando READ_BLK_MISALIGN es igual a 0, indica que el cruce de
lmites de bloques fsicos es invlido. Cuando es igual a 1, indica que el cruce de
bloques fsicos es vlido.
C_SIZE: Este parmetro es usado para calcular la capacidad del rea de datos
de usuario en una tarjeta de memoria SD, y no incluye el rea protegida. Para
calcular este valor, tenemos la siguiente frmula:
Capacidad de la memoria = (C_SIZE + 1) x 512K byte

ERASE_BLK_EN: Este valor siempre es igual a 1, lo cual significa que puede


borrar bloques mltiples de 512 bytes.
SECTOR_SIZE: Este campo es fijado en 7Fh, es decir, 64K bytes. Este valor no
esta relacionado con la operacin de borrado.
WP_GRP_SIZE: Este campo es fijado en 00h. Las memorias SD de alta
capacidad no soportan escribir grupos de bloques protegidos.
WP_GRP_ENABLE: Este campo es fijado en 00h. Las memorias SD de alta
capacidad no soportan escribir grupos de bloques protegidos.
WRITE_BL_LEN: Mxima longitud de escritura: 2

WRITE_BL_LEN

COPY: Define si el contenido en la tarjeta de memoria es original (0), o ha sido


una copia (1). El bit COPY para dispositivos OTP y MTP vendidos al consumidor
final es fijado en 1, lo cual significa que el contenido es una copia. Este Bit solo
es programado una vez.
PERM_WRITE_PROTECT: Protege el contenido de la tarjeta contra escritura o
sobre-escritura, todos los comandos para escritura y borrado de la tarjeta son
permanentemente deshabilitados. El valor por defecto es 0, es decir, No
escritura permanente = deshabilitado.

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

Disco Duro como sistema de archivos


con tabla de particin.

DOS FAT con sector de arranque, sin


tabla de particin.

Formato de archivo universal.

Otros Desconocidos.

0, 1, 2, 3

Reservado.

Figura 10.16

344
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

10.3.1.- Ejemplo de programacin #57:


Veamos a continuacin el programa que nos permitir leer el registro CSD en
una tarjeta de memoria SD:
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)

' Inicializacin de la USART a 9600 bps

' Inicializacin del mdulo SPI:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
' Inicializamos la tarjeta de memoria SD:
error_Mmc = Mmc_Init()

' Inicializamos la Memoria SD.

If (error_Mmc = 0) Then

' Verificamos si la memoria ha sido insertada.

' reinicializa el mdulo SPI para mayor velocidad:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV16, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
Mmc_Read_Csd(dataBuffer)

' Carga los datos del registro CID en la variable


' "dataBuffer"

delay_ms(1000)

' Retardo de 1 segundo

For i = 0 To 15
Uart1_Write(dataBuffer[i])
Next i

' Envia el contenido cargado en la variable


' "dataBuffer" por el puerto serial (USART).

Else

' si no se cumple el condicional:

Uart1_Write_Text(" Memoria no Encontrada ") ' enva el texto "Memoria no


' encontrada" por la USART.
delay_ms(1000)

' Retardo de 1 segundo

End If
GoTo main

' Salta a la etiqueta inicio

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:

125-120 --> 000000

TAAC:

119-112 --> 00100110

NSAC:

111-104 --> 00000000

TRAN_SPEED:

103-96 --> 00110010

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

En la descripcin anterior, la primera columna corresponde al nombre en la


tabla de la figura 10.12. La segunda columna corresponde al nmero de bit en la
cadena de datos obtenida, y la tercera columna corresponde a los datos
asociados a cada bit.
10.4.- WinHex.
Para realizar un mejor anlisis y entendimiento del manejo de la memoria,
utilizaremos un programa para el anlisis de unidades de almacenamiento de
datos en nuestro PC. El programa recomendado para realizar estas tareas se
llama WinHex, con el cual podremos ver en detalle el mapa de memoria de la
tarjeta MMC/SD.
La descarga se puede realizar desde la direccin http://www.x-ways.net. WinHex
es un producto de la empresa X-Ways Software Technology.
Una vez descargado e instalado el programa, al ejecutarlo podremos ver la
siguiente ventana:

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

Seleccionada esta opcin, veremos la siguiente ventana, la cual muestra los


volmenes disponibles en el sistema:

Figura 10.21

En esta ventana debemos identificar la unidad correspondiente a la tarjeta de


memoria insertada.

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

10.4.1.- Ejemplo de programacin #58:


Vamos a realizar un ejemplo en el cual escribiremos algunos datos en un sector
especfico de la memoria SD desde el microcontrolador, para luego ser
consultados a travs del programa WinHex. Para esto, contamos una rutina en la
librera MMC muy fcil de usar.
Mmc_Write_Sector(Sector, Datos), nos permite escribir en un sector
especfico, 512 bytes los cuales podemos cargar en la misma cantidad de
variables previamente declaradas.
A continuacin veremos un programa a travs del cual cargamos una serie de
bytes en el sector #2 de la tarjeta de memoria SD.
Los datos a cargar son los siguientes, iniciando desde la posicin 0 del sector #2:
Posicin
0
1
2
3
4
5
6
7
8
9

Dato Hexadecimal
0x6D
0x69
0x6B
0x72
0x6F
0x42
0x61
0x73
0x69
0x63

Equivalente ASCII
M
i
k
r
o
B
a
s
i
c

Las posiciones 10 a la 15 sern igualadas a 0 en el programa.


Posicin
16
17
18
19
20
21
22
23

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

Las posiciones 24 a la 31 sern igualadas a 0 en el programa.


Posicin
32
33
34
35
36
37

Dato Hexadecimal
0x4D
0x4D
0x43
0x2F
0x53
0x44

Equivalente ASCII
M
M
C
/
S
D

Las posiciones 38 a la 47 sern igualadas a 0 en el programa.


Posicin
48
49
50
51
52

Dato Hexadecimal
0x77
0x72
0x69
0x74
0x65

Equivalente ASCII
W
r
i
t
e

Las posiciones 53 a la 63 sern igualadas a 0 en el programa.


Posicin
64
65
66
67
68
69

Dato Hexadecimal
0x53
0x65
0x63
0x74
0x6F
0x72

Equivalente ASCII
S
e
c
t
o
r

Las posiciones restantes, desde la 70 a la 511 del sector #2 sern igualadas a 0


en el programa.

354
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Analicemos el siguiente programa:


program Mmc_Write_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
dato As Byte[512]
main:
UART1_init(9600)

' Inicializacin de la USART a 9600 bps

' Inicializacin del mdulo SPI:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
' Inicializamos la tarjeta de memoria SD:
error_Mmc = Mmc_Init()

' Inicializamos la Memoria SD.

If (error_Mmc = 0) Then

' Verificamos si la memoria ha sido insertada.

' re-inicializamos el mdulo SPI para mayor velocidad:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV16, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
' Cargamos las variables con los datos de las tablas:
dato[0]
dato[1]
dato[2]
dato[3]
dato[4]
dato[5]
dato[6]
dato[7]
dato[8]
dato[9]

=
=
=
=
=
=
=
=
=
=

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

' los 6 bytes siguientes = 0

'
'
'
'
'
'
'
'

L
i
b
r
e
r
i
a

' los 8 bytes siguientes = 0

'
'
'
'
'
'

M
M
C
/
S
D

' los 10 bytes siguientes = 0

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

' los 11 bytes siguientes = 0

0x53
0x65
0x63
0x74
0x6F
0x72

'
'
'
'
'
'

S
e
c
t
o
r

' igualamos el resto de las variables igual a cero (0):


For i = 70 To 511
dato[i] = 0
Next i
delay_ms(100)

' Retardo de 100 milisegundos.

mmc_write_sector(2, dato)

' Escribimos los 512 bytes del sector 2.

Uart1_Write_Text("Datos Almacenados") ' Mensaje enviado por USART.


GoTo fin
' Salto a la etiqueta "fin".
End If
UART1_Write_Text("Memoria no Encontrada") ' Envia mensaje de error por USART.
UART1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
UART1_Write(10) ' CR = Carriage Return, es decir, mueve el cursor a la
' primera posicin de la linea.
delay_ms(1000)
' Retardo de 1 segundo
GoTo main
' Salto a la etiqueta "main".
fin:
GoTo fin

' Lazo infinito.

End.

356
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Analizando el programa anterior, podemos observar que:

Declaramos la conexin del mdulo MMC/SD.

Se realizo la declaracin de las variables (error_Mmc, I, dato).

Se inicializ el puerto serial a 9600 bps.

Se inicializ el mdulo SPI.

Se verifica si la tarjeta de memoria est insertada en el circuito a travs de


la variable error_Mmc.

Si no hay error de memoria no encontrada, se re-inicializa el mdulo SPI


para mayor velocidad en la comunicacin.

Se cargan los datos de las tablas en las variables.

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.

Al compilar el programa y grabar el microcontrolador, podremos ver los


resultados siempre y cuando tengamos activo el terminal de comunicaciones de
mikroBasic, y la tarjeta de memoria insertada en el circuito. Si la tarjeta no est
presente en su base, podremos ver en el terminal el mensaje Memoria no
Encontrada.
Cuando el programa termina de grabar los datos almacenados en las variables,
veremos el mensaje Datos Almacenados. El siguiente paso ser retirar la
tarjeta de memoria SD del circuito y analizarla con WinHex.

357
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

El resultado de este anlisis, al buscar la informacin directamente en el sector


#2 en WinHex ser el siguiente:

Figura 10.25

358
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

10.4.2.- Ejemplo de programacin #59:


Mmc_Read_Sector(Sector, Datos)
Esta funcin nos permitir leer un sector especfico de la tarjeta de memoria y
almacenar los datos en variables, para luego ser procesados segn la aplicacin
que queramos dar a nuestros diseos.
Veamos a continuacin un ejemplo para la lectura de datos de un sector de la
memoria. Los datos obtenidos sern almacenados en variables y seguidamente
enviaremos el resultado a travs del puerto serial, para visualizar los datos en el
terminal de comunicaciones de mikroBasic.

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)

' Inicializacin de la USART a 9600 bps.

' inicializamos el mdulo SPI:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
' Inicializamos la tarjeta de memoria SD:
error_Mmc = Mmc_Init()
If (error_Mmc = 0) Then

' Inicializamos la Memoria SD.


' Verificamos si la memoria ha sido insertada.

' re-inicializamos el mdulo SPI para mayor velocidad:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
Uart1_Write_Text("Inicio de Lectura de Sector") ' Mensaje de Inicio de Lectura
delay_ms(1000)

' Retardo de 1 segundo.

mmc_read_sector(2, Lectura) ' Leemos el contenido del sector 2 y lo cargamos


' en diferentes variables.
For i = 0 To 511
Uart1_Write(Lectura[i])
delay_ms(100)
Next i

' Enviamos el contenido del sector 2 por la UART.


' Envia el contenido de la variable por el puerto.
' Retardo de 100 milisegundos.

UART1_Write_Text("Fin de Lectura de Datos")


GoTo fin

' Mensase de fin de lectura.

Else
UART1_Write_Text("Memoria no Encontrada")
delay_ms(1000)

' Mensaje de fin de lectura.


' Retardo de 1 segundo.

359
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

GoTo main

' Salta a la etiqueta "main".

End If
fin:
GoTo fin

' Lazo infinito.

End.

10.5.- Sistema de Archivos FAT.


Continuando con el anlisis de la librera MMC/SD, haremos una serie de
ejemplos prcticos, con el fin de cumplir con los siguientes objetivos:

Inicializar la tarjeta de memoria MMC/SD.

Dar formato FAT a la tarjeta de memoria desde el microcontrolador PIC.

Crear uno o varios archivos en la tarjeta de memoria.

Comprobar si existe un archivo en la tarjeta de memoria.

Aadir datos en un archivo existente.

Re-escribir un archivo.

Asignar fecha y hora a un archivo.

Extraer el tamao de un archivo.

Leer un archivo existente.

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

Todos los ejemplos a continuacin estarn basados en el microcontrolador


PIC18F458, conectado como se muestra en el siguiente diagrama esquemtico:

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:

0, si la tarjeta de memoria ha sido detectada e inicializada correctamente.

1, si el sector cero (0) en la tarjeta de memoria no ha sido localizado.


361

_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

255, si la tarjeta de memoria no ha sido detectada.

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:

0, si la tarjeta de memoria ha sido detectada, inicializada y formateada


correctamente.

1, si el sector cero (0) en la tarjeta de memoria no ha sido localizado.

255, si la tarjeta de memoria no ha sido detectada.

362
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

El campo Etiqueta dentro de la rutina se encarga de dar un nombre o


Etiqueta a la unidad de almacenamiento, y el mismo no debe tener ms de 11
caracteres.
En nuestro ejemplo hemos asignado el nombre MIKROBASIC a la unidad, como
se puede observar en la siguiente imagen:

Figura 10.27

363
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

10.5.3.- Ejemplo de programacin #60:


A continuacin haremos un ejercicio utilizando slo esta rutina, para demostrar
como se puede dar formato a la tarjeta de memoria, adems de un nombre, tal y
como lo demuestra la imagen anterior.
Los mensajes que determinan el progreso o actividad del programa sern
enviados por el puerto serial del microcontrolador a la terminal de
comunicaciones de mikroBasic en su configuracin estndar.
Analice el siguiente programa y lea cuidadosamente los comentarios:
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
main:
Uart1_Init(9600)

' Inicializa la USART a 9600 bps.

'--- Inicializacin del mdulo SPI:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW,
_SPI_LOW_2_HIGH)
' Inicializa la tarjeta MMC/SD y comprueba si est insertada en el circuito.
If (Mmc_Fat_QuickFormat("mikroBasic") = 0) Then

' Da formato FAT a la tarjeta MMC/SD.


' Asigna un nombre al volumen.

' re-inicializamos el mdulo SPI para mayor velocidad:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
Uart1_Write_Text("Formato FAT Listo!")

' Envia mensaje por la USART.

GoTo fin

' Salta a la etiqueta "fin".

Else

' de lo contrario...

UART1_Write_Text("Memoria no Encontrada") ' Envia mensaje de error por USART.


UART1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
UART1_Write(10) ' CR = Carriage Return, es decir, mueve el cursor a la
' primera posicin de la linea.
delay_ms(2000)

' Retardo de 2 segundos.

End If
GoTo main
fin:

' Salta a la etiqueta "main".


' Lazo infinito.

GoTo fin
End.

364
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Analizando el programa, podemos observar que:

Declaramos la conexin del mdulo MMC/SD.

Inicializamos el puerto serial a 9600 bps.

Inicializamos el mdulo SPI.

Verificamos que la tarjeta de memoria ha sido detectada, inicializada y


formateada correctamente, y le asignamos un nombre a la etiqueta. Si no
est insertada, la condicin no se cumple y hace un salto para enviar un
mensaje de error por el puerto serial.

Re-inicializamos el mdulo SPI para una mayor velocidad en la


comunicacin entre el microcontrolador y la tarjeta de memoria MMC/SD.

Enviamos un mensaje que nos indique que ya esta listo el formato FAT en
la unidad.

Por ltimo, hacemos un salto a un lazo infinito.

Al compilar y grabar el programa en el microcontrolador, podremos ver lo


siguiente en el terminal de comunicaciones:

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

10.5.4.- Cmo crear un Archivo en una tarjeta de memoria SD.


Para crear un archivo en el sistema FAT con mikroBasic, contamos con la
siguiente funcin en la librera MMC:
10.5.5.- Mmc_Fat_Assign(nombre del archivo, atributos del archivo).
El formato del nombre del archivo es 8.3 caracteres, donde el nmero 8
representa un nombre 8 caracteres (mximo), y el nmero 3 representa la
extensin del archivo. Por ejemplo: ARCHIVO1.TXT
Para lograr que el nombre del archivo obedezca a esta regla, debemos cargar el
campo nombre del archivo de la funcin, con la siguiente cadena de caracteres:

ARCHIVO1TXT

Note que en la cadena de caracteres no se toma en cuenta el punto que separa


el nombre de la extensin del archivo. La funcin para crear un archivo de
mikroBasic, siempre tomar los ltimos 3 caracteres de la cadena para la
extensin del archivo, la cual en este ejemplo ser .TXT, y el resto de los
caracteres de la cadena correspondern siempre al nombre del archivo.
Entonces, si deseamos crear un archivo con un nombre mas corto, pero con la
misma extensin .TXT, por ejemplo, DATOS.TXT, la cadena de caracteres a
cargar en el campo nombre del archivo de la funcin ser:
DATOSTXT
El resultado en este caso ser el siguiente:
DATOS.TXT

367
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

El campo Atributos del archivo de la funcin es muy importante a la hora de


crear un nuevo archivo. Este define cuales atributos debe tener nuestro archivo,
y se rige bajo la siguiente tabla de datos:
BIT
0

MASK

Descripcin

0x01

Atributo de solo Lectura

0x02

Archivo Oculto

0x04

Sistema

0x08
0x10
0x20

Etiqueta del Volumen


Subdirectorio
Archivo

0x40

Solo para uso interno

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

Bit 1: Este bit corresponde a la propiedad o atributo de archivo oculto. Al activar


este bit (1), el archivo no podr ser visualizado en el directorio.
Bit 0: Este atributo protege a un archivo contra escritura. Si el bit est activo
(1), el archivo ser de Slo lectura.
Significa entonces que si deseamos crear un archivo, con atributo de solo
lectura, los bits a activar sern los siguientes:
Bit7

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)

' Inicializa la USART a 9600 bps.

'--- Inicializacin del mdulo SPI y libreria FAT:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
' Inicializa la tarjeta MMC/SD y comprueba si est insertada en el circuito.
If (Mmc_Fat_Init() = 0) Then
' reinicializa mdulo SPI para mayor velocidad.
Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)

filename = "DATOSTXT"

' Cargamos el nombre del archivo en la variable.

' Creamos el archivo en la Raiz del Volumen o Tarjeta de Memoria SD.


' 0x81 es el valor a cargar en el campo de Atributos del Archivo:
Mmc_Fat_Assign(filename, 0x81)
Uart1_Write_Text("Archivo Creado") ' Enviamos un mensaje para confirmar que el
' archivo ha sido creado.
GoTo fin
' Saltamos a la etiqueta "fin"

369
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Else

' Si la tarjeta no esta insertada:

Uart1_Write_Text("Memoria no Encontrada") ' Mensaje de error.


UART1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
UART1_Write(10) ' CR = Carriage Return, es decir, mueve el cursor a la
' primera posicin de la linea.
delay_ms(1000)
' Retardo de 1 segundo.

fin:

GoTo main
End If

' Salta a la etiqueta "main"

GoTo fin

' Lazo Infinito

End.

Analizando el programa, podemos observar que:

Declaramos la conexin del mdulo MMC/SD.

Declaramos una variable tipo String para el nombre del archivo, la cual
hemos llamado filename.

Inicializamos el puerto serial del microcontrolador a 9600 bps.

Inicializamos el mdulo SPI.

Inicializamos la tarjeta MMC/SD y comprobamos si se encuentra insertada


en nuestro circuito. Si no est insertada, la condicin no se cumple y hace
un salto para enviar un mensaje de error por el puerto serial.

Cargamos el nombre del archivo DATOSTXT en la variable filename.

Creamos el archivo en la Raz del volumen con el atributo deseado, en este


caso de Slo lectura.

Enviamos un mensaje de confirmacin por el puerto serial, para saber que


el archivo ha sido creado.

Por ultimo, hacemos un salto a un lazo infinito.

Una vez compilado el programa y cargado en el microcontrolador, podremos ver


en el terminal de comunicaciones de mikroBasic el mensaje de error Memoria no
Encontrada, si la misma no se encuentra insertada en el circuito.
Al insertar la memoria, se crear inmediatamente el archivo DATOS.TXT en el
directorio raz, con el atributo de Slo lectura, y por ltimo veremos el mensaje
Archivo creado.

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

Se puede observar claramente un archivo de texto de tamao 0 kb, debido a que


an no hemos insertado datos en l. Para ver los atributos del archivo y verificar
que efectivamente es un archivo de Slo lectura, hacemos un clic derecho
sobre el mismo con el Mouse, y seguidamente hacemos clic en la opcin
Propiedades.

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

10.5.7.- Ejemplo de programacin #62:


Ahora cambiemos los atributos del archivo, haciendo que ste sea de Slo
lectura y Archivo Oculto.
En este caso la palabra a cargar en el campo atributo seria la siguiente:
Bit7

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)

' Inicializa la USART a 9600 bps.

'--- Inicializacin del mdulo SPI y libreria FAT:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
' Inicializa la tarjeta MMC/SD y comprueba si est insertada en el circuito.
If (Mmc_Fat_Init() = 0) Then
' reinicializa mdulo SPI para mayor velocidad.
Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)

filename = "DATOSTXT"

' Cargamos el nombre del archivo en la variable.

' Creamos el archivo en la Raiz del Volumen o Tarjeta de Memoria SD.


' 0x81 es el valor a cargar en el campo de Atributos del Archivo:
Mmc_Fat_Assign(filename, 0x83)
Uart1_Write_Text("Archivo Creado") ' Enviamos un mensaje para confirmar que el
' archivo ha sido creado.
GoTo fin
' Saltamos a la etiqueta "fin"
Else

' Si la tarjeta no esta insertada:

373
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Uart1_Write_Text("Memoria no Encontrada") ' Mensaje de error.


UART1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
UART1_Write(10) ' CR = Carriage Return, es decir, mueve el cursor a la
' primera posicin de la linea.
delay_ms(1000)
' Retardo de 1 segundo.

fin:

GoTo main
End If

' Salta a la etiqueta "main"

GoTo fin

' Lazo Infinito

End.

Se puede observar en el programa un nico cambio realizado en el campo


Atributos de la rutina Mmc_Fat_Assign():
Mmc_Fat_Assign(filename, 0x83)

Para ver el resultado de este cambio, verificamos el contenido de la tarjeta de


memoria SD con el explorador de Windows. Es posible que su explorador est
configurado para no mostrar los archivos ocultos. Si este es el caso, al explorar
la unidad o volumen correspondiente a la tarjeta de memoria SD, el resultado
sera el siguiente:

Figura 10.37

374
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

En la imagen anterior, no es posible ver el archivo, aunque sabemos que lo


hemos creado. Sin embargo, la ventana del explorador nos indica que tenemos
un archivo oculto disponible.
Para ver el archivo, podemos cambiar las propiedades del explorador de la
siguiente forma:
Hacemos clic en el men Herramientas Opciones de Carpeta, y
seguidamente seleccionamos la pestaa Ver. En esta pestaa, podremos ver
una seccin denominada Configuracin Avanzada, en la cual podremos activar
la opcin denominada Mostrar todos los archivos y carpetas ocultos.
La siguiente imagen muestra claramente cual es la opcin que debemos activar:

Figura 10.38

375
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Al aceptar este cambio y verificar nuevamente el contenido de la tarjeta de


memoria, podremos ver el archivo oculto y sus atributos, como se demuestra en
las dos siguientes imgenes:

Figura 10.39

Figura 10.40
376
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

10.5.8.- Ejemplo de programacin #63:


Hagamos a continuacin otro ejemplo activando el atributo de subdirectorio. En
este caso el resultado ser la creacin de una carpeta en el directorio raz de la
tarjeta de memoria.
Cambiando el valor del campo Atributo en el programa para crear un
subdirectorio, tenemos que:
Bit7

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)

' Inicializa la USART a 9600 bps.

'--- Inicializacin del mdulo SPI y libreria FAT:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
' Inicializa la tarjeta MMC/SD y comprueba si est insertada en el circuito.
If (Mmc_Fat_Init() = 0) Then
' reinicializa mdulo SPI para mayor velocidad.
Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)

filename = "DATOSTXT"

' Cargamos el nombre del archivo en la variable.

' Creamos el archivo en la Raiz del Volumen o Tarjeta de Memoria SD.


' 0x81 es el valor a cargar en el campo de Atributos del Archivo:
Mmc_Fat_Assign(filename, 0x90)
Uart1_Write_Text("Subdirectorio creado") ' Enviamos un mensaje para confirmar que el
' archivo ha sido creado.
GoTo fin
' Saltamos a la etiqueta "fin"
Else

' Si la tarjeta no esta insertada:

Uart1_Write_Text("Memoria no Encontrada") ' Mensaje de error.


UART1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
UART1_Write(10) ' CR = Carriage Return, es decir, mueve el cursor a la

377
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

delay_ms(1000)

fin:

' primera posicin de la linea.


' Retardo de 1 segundo.

GoTo main
End If

' Salta a la etiqueta "main"

GoTo fin

' Lazo Infinito

End.

Analizando el programa anterior, solo podemos notar dos cambios:

El valor del campo Atributo de la funcin Mmc_Fat_Assign ahora es


0x90.

El mensaje de confirmacin ha sido cambiado por Subdirectorio creado.

El siguiente paso ser verificar el proceso en el terminal de comunicaciones de


mikroBasic. Como en los ejemplos anteriores, podremos ver el mensaje de error
Memoria no encontrada si la tarjeta de memoria SD no se encuentra insertada
en nuestro circuito de pruebas. Una vez insertada, el subdirectorio ser creado,
recibiendo a continuacin el mensaje de confirmacin Subdirectorio creado.
Para verificar que efectivamente ha sido creado, retiramos la tarjeta de memoria
del circuito para ver su contenido en el explorador de Windows:

Figura 10.42

378
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

10.5.9.- Ejemplo de programacin #64:


Verifiquemos a continuacin el atributo Archivo. Para esto crearemos un
archivo en la raz de la tarjeta de memoria SD, nuevamente modificando el
campo Atributos de la funcin Mmc_Fat_Assign para poder activarlo:

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)

' Inicializa la UART a 9600 bps.

'--- Inicializacin del mdulo SPI:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
' Inicializa la tarjeta MMC/SD y comprueba si est insertada en el circuito.
If (Mmc_Fat_Init() = 0) Then
' reinicializa mdulo SPI para mayor velocidad.
Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)

filename = "DATOSTXT"

' Cargamos el nombre del archivo en la variable.

' Creamos el archivo en la Raiz del Volumen o Tarjeta de Memoria SD.


' 0x81 es el valor a cargar en el campo de Atributos del Archivo:
Mmc_Fat_Assign(filename, 0xA0)
Uart1_Write_Text("Archivo creado") ' Enviamos un mensaje para confirmar que el
' archivo ha sido creado.
GoTo fin
' Saltamos a la etiqueta "fin"
Else

' Si la tarjeta no esta insertada:

Uart1_Write_Text("Memoria no Encontrada") ' Mensaje de error.


UART1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
UART1_Write(10) ' CR = Carriage Return, es decir, mueve el cursor a la
' primera posicin de la linea.
delay_ms(1000)
' Retardo de 1 segundo.
GoTo main
End If

' Salta a la etiqueta "main"

379
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

fin:

GoTo fin

' Lazo Infinito

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

10.6.- Ingresar datos en un archivo almacenado en la memoria SD.


A continuacin vamos a crear e ingresar algunos datos en un archivo de texto,
utilizando la siguiente funcin:
Mmc_Fat_Write(datos, nmero de bytes a ser escritos)
El campo nmero de bytes a ser escritos debe contener el nmero de bytes
que va a ocupar la variable del campo datos.
Por ejemplo:
Si la informacin a cargar en el archivo de texto es la siguiente cadena de datos:
Cadena de caracteres de prueba nmero 1
Entonces el nmero de bytes a cargar es 41, puesto que cada caracter es un
byte (incluyendo las comillas), por lo tanto, sumando todos los caracteres de la
cadena obtenemos el nmero deseado.
En el siguiente ejemplo, enviaremos esta cadena de caracteres desde el terminal
de comunicaciones de mikroBasic, por el puerto serial del PC al microcontrolador,
el cual se encargar de recibir toda la cadena de caracteres, y a su vez
almacenar esta informacin en un archivo de texto creado en la raz de la tarjeta
de memoria SD.
El nombre del archivo a crear ser CADENA.TXT
Para lograr este objetivo, el primer paso ser realizar la declaracin de algunas
variables adicionales:

Dim cadena
As string[41]
acumulador As Byte

Agregamos una sub-funcin en el programa para recoger los caracteres desde el


puerto serial:
sub function LeerCaracter As Byte

' Recoje un caracter del USART

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

Luego, en la rutina principal del programa agregamos un mensaje de espera, a


ser enviado por el puerto serial del microcontrolador al terminal de
comunicaciones, para saber que el microcontrolador est listo para recibir los
datos desde el PC, y seguidamente agregamos la rutina para recolectar los
mismos en las variables previamente definidas.

Uart1_Write_Text("Esperando Datos...") ' Mensaje de espera de datos.


Uart1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
Uart1_Write(10) ' CR = Carriage Return, es decir, mueve el cursor a la
' primera posicin de la linea.
acumulador = 0

' inicializamos la variable "acumulador"

do
cadena[acumulador] = LeerCaracter

' Llama la sub-funcin "leerCaracter y


' y carga los datos en la variable.
' Incrementa la variable "acumulador".

acumulador = acumulador + 1
loop Until (acumulador = 41)

' Si la variable no es igual a 41,


' contina cargando caracteres.

Por ultimo, incluimos la funcin Mmc_Fat_Write despus de la funcin para


crear un archivo Mmc_Fat_Assign.

' Escribe la cadena de caracteres en el archivo de texto:


Mmc_Fat_Write(cadena, 41)

10.6.1.- Ejemplo de programacin #65:


Analice cuidadosamente el siguiente programa, el cual incluye las rutinas antes
mencionadas:
program Mmc_Fat_Write
'--- 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]
cadena
As string[41]
acumulador As Byte
sub function LeerCaracter As Byte

' Recoje un caracter de UART

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

' se queda en el lazo esperando.


' Lee el dato en la USART y lo carga en la
' variable "LeerCaracter".

result = UART1_Read
End sub
main:
Uart1_Init(9600)

' Inicializa la UART a 9600 bps.

delay_ms(100)

' Retardo de 100 milisegundos.

Uart1_Write_Text("Esperando Datos...") ' Mensaje de espera de datos.


UART1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
UART1_Write(10) ' CR = Carriage Return, es decir, mueve el cursor a la
' primera posicin de la linea.
acumulador = 0

' inicializamos la variable "acumulador"

do
cadena[acumulador] = LeerCaracter
acumulador = acumulador + 1
loop Until (acumulador = 41)

' Llama la sub-funcin "leerCaracter y


' y carga el dato en la variable.
' Incrementa la variable "acumulador".
' Si la variable no es igual a 41,
' contina cargando caracteres.

'--- Inicializacin del mdulo SPI y libreria FAT:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
' Inicializa la tarjeta MMC/SD y comprueba si est insertada en el circuito.
If (Mmc_Fat_Init() = 0) Then
' reinicializa mdulo SPI para mayor velocidad.
Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
filename = "CADENATXT"

' Cargamos el nombre del archivo en la variable.

' Creamos el archivo en la Raiz del Volumen o Tarjeta de Memoria SD.


' 0xA0 es el valor a cargar en el campo de Atributos del Archivo:
Mmc_Fat_Assign(filename, 0xA0)
' Escribe la cadena de caracteres en el archivo de texto:
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

' Si la tarjeta no esta insertada:

Uart1_Write_Text("Memoria no Encontrada") ' Mensaje de error.


Uart1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
Uart1_Write(10) ' CR = Carriage Return, es decir, mueve el cursor a la
' primera posicin de la linea.
End If
fin:

GoTo fin

' Lazo Infinito

End.

383
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Al compilar y grabar el programa en el microcontrolador, se podr observar en el


terminal de comunicaciones de mikroBasic, el mensaje Esperando Datos. Si el
microcontrolador inici antes de abrir el terminal, entonces no podremos ver el
mensaje. Bastar con reiniciar el microcontrolador para poder visualizar el
mensaje en la ventana de recepcin de datos del terminal. Recuerde tambin
seleccionar el modo ASCII en esta ventana.
Para generar correctamente el archivo de texto, es importante enviar la cadena
de caracteres. En este ejemplo, debemos recordar que estaremos enviando una
cadena de 41 caracteres desde el mismo terminal de comunicaciones.
Para realizar esta tarea, contamos con un campo en el terminal para escribir la
cadena que deseamos enviar al microcontrolador, tal y como se muestra es la
siguiente imagen:

Figura 10.45

384
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Reiniciando el microcontrolador, el mensaje a visualizar en el terminal es el


siguiente:
Received: Esperando Datos
Si la tarjeta de memoria no se encuentra insertada en nuestro circuito, y
enviamos la cadena de caracteres al PIC, el mensaje ser el siguiente:
Send: Cadena de caracteres de prueba nmero 1
Received: Memoria no Encontrada
y finaliza el programa.
Si la tarjeta de memoria si se encuentra insertada en el circuito y enviamos la
cadena de caracteres, el microcontrolador crear el archivo de texto con la
cadena de caracteres almacenada en el mismo, y por ltimo veremos el siguiente
mensaje en el terminal de comunicaciones:
Send: Cadena de caracteres de prueba nmero 1
Received: Archivo Creado
Al explorar el contenido de la tarjeta de memoria, podremos ver el siguiente
resultado:

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

10.7.- Asignar fecha y hora a un archivo.


Veamos ahora como asignar Fecha y Hora al archivo creado. Para esto,
mikroBasic cuenta con la siguiente funcin:
Mmc_Fat_Set_File_Date(ao, mes, da, horas, minutos, segundos)
Los parmetros vlidos a cargar en esta funcin para la fecha y hora son los
siguientes:
Ao:
Mes:
Da:

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

En el mismo programa utilizado en el ejemplo anterior, crearemos las variables


correspondientes a cada campo de la funcin, para cargar los valores de fecha y
hora en el archivo. Las variables sern declaradas de la siguiente manera:

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)

10.7.1.- Ejemplo de programacin #66:


A continuacin analice los cambios efectuados en el siguiente programa:
program Mmc_Fat_Fecha_Hora
'--- 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]
cadena
As string[41]
acumulador As Byte

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

sub function LeerCaracter As Byte

' Recoje un caracter del UART

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)

' Inicializa la UART a 9600 bps.

delay_ms(100)

' Retardo de 100 milisegundos.

Uart1_Write_Text("Esperando Datos...") ' Mensaje de espera de datos.


UART1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
UART1_Write(10) ' CR = Carriage Return, es decir, mueve el cursor a la
' primera posicin de la linea.
acumulador = 0

' inicializamos la variable "acumulador"

do
cadena[acumulador] = LeerCaracter
acumulador = acumulador + 1
loop Until (acumulador = 41)

' Llama la sub-funcin "leerCaracter y


' y carga el dato en la variable.
' Incrementa la variable "acumulador".
' Si la variable no es igual a 41,
' contina cargando caracteres.

'--- Inicializacin del mdulo SPI y libreria FAT:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
' Inicializa la tarjeta MMC/SD y comprueba si est insertada en el circuito.
If (Mmc_Fat_Init() = 0) Then
' reinicializa mdulo SPI para mayor velocidad.
Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
filename = "CADENATXT"

' Cargamos el nombre del archivo en la variable.

' Creamos el archivo en la Raiz del Volumen o Tarjeta de Memoria SD.


' 0xA0 es el valor a cargar en el campo de Atributos del Archivo:
Mmc_Fat_Assign(filename, 0xA0)
' Asignamos Fecha y Hora al Archivo CADENA.TXT:
Mmc_Fat_Set_File_Date(Anio, Mes, Dia, Horas, Minutos, Segundos)
' Escribe la cadena de caracteres en el archivo de texto:

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

' Si la tarjeta no esta insertada:

Uart1_Write_Text("Memoria no Encontrada") ' Mensaje de error.


Uart1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
Uart1_Write(10) ' CR = Carriage Return, es decir, mueve el cursor a la
' primera posicin de la linea.
End If
fin:

GoTo fin

' Lazo Infinito

End.

Antes de verificar el funcionamiento del programa, asegrese de borrar el


contenido de la tarjeta de memoria SD, ya que en el ejemplo anterior estbamos
empleando el mismo nombre para el archivo que deseamos crear. Al compilar y
grabar el programa en el microcontrolador, como en los ejemplos anteriores,
debemos asegurarnos tambin de insertar la tarjeta en el circuito, y enviar la
cadena de datos desde el terminal de comunicaciones al microcontrolador, para
que pueda crear el archivo CADENA.TXT con fecha y hora, como se muestra en
la siguiente imagen:

Figura 10.48

389
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

10.8.- Verificar si un archivo de nombre especfico existe.


El siguiente paso ser aprender a insertar datos en un archivo ya creado.
En este punto, el objetivo es el siguiente:

Verificar si el archivo de nombre CADENA.TXT existe en la tarjeta de


memoria SD.
Si el archivo existe, abrirlo para insertar ms datos.
Insertar otra cadena de caracteres al archivo y verificar que la misma se ha
grabado con xito.

Para verificar que un archivo existe en la tarjeta de memoria, utilizaremos la


funcin:
Mmc_Fat_Assign(nombre del archivo, atributo)
Aparte de usar esta funcin para crear un archivo con ciertos atributos activos,
tambin puede ser utilizada para verificar si un archivo ya existe en la memoria.
Esta rutina retorna dos posibles estados si el archivo especificado en el campo
nombre del archivo existe o no:

0, si el archivo no existe.
1, si el archivo existe.

Asumiendo que an tenemos el archivo CADENA.TXT creado en el ejemplo


anterior, en la tarjeta de memoria SD, vamos a analizar el siguiente programa, el
cual fue hecho solo para verificar si el archivo existe en el directorio raz.
10.8.1.- Ejemplo de programacin #67:
En este ejercicio, existen tres posibles respuestas de parte del microcontrolador
a travs de la USART:
1. Si la memoria no se encuentra insertada en el circuito, recibiremos un
mensaje de error en el terminal de comunicaciones.
2. Si el archivo se encuentra presente en el directorio raz, recibiremos el
mensaje de confirmacin Archivo encontrado.

390
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

3. Si el archivo no se encuentra presente en el directorio raz, recibiremos el


mensaje Archivo no encontrado.

Analice el siguiente programa, leyendo cuidadosamente sus comentarios:


program Formato_FAT_Insertar_Datos

'--- 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)

' Inicializa la UART a 9600 bps.

'--- Inicializacin del mdulo SPI:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
' Inicializa la tarjeta MMC/SD y comprueba si est insertada en el circuito.
If (Mmc_Fat_Init() = 0) Then
' reinicializa mdulo SPI para mayor velocidad.
Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)

filename = "CADENATXT"

' Cargamos el nombre del archivo en la variable.

' Creamos el archivo en la Raiz del Volumen o Tarjeta de Memoria SD.


' 0x81 es el valor a cargar en el campo de Atributos del Archivo:
If (Mmc_Fat_Assign(filename, 1)) Then
' El archivo ha sido encontrado:
Uart1_Write_Text("Archivo encontrado...")
Uart1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
Uart1_Write(10) ' CR = Carriage Return, es decir, mueve el cursos a la
' primera posicin de la linea.
Else
' El archivo no ha sido encontrado:
Uart1_Write_Text("Archivo no encontrado...!")
Uart1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
Uart1_Write(10) ' CR = Carriage Return, es decir, mueve el cursos a la
' primera posicin de la linea.
End If
Else

' Si la tarjeta no esta insertada:

Uart1_Write_Text("Memoria no Encontrada") ' Mensaje de error.


UART1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
UART1_Write(10) ' CR = Carriage Return, es decir, mueve el cursor a la
' primera posicin de la linea.
delay_ms(1000)
' Retardo de 1 segundo.
GoTo main
End If

' Salta a la etiqueta "main"

391
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

fin:

GoTo fin

' Lazo Infinito

End.

Analizando el programa, podemos observar que hemos eliminado las funciones


para crear un archivo y asignar fecha y hora, presentes en el ejemplo anterior.
Los pasos son bsicamente los mismos en la rutina principal del programa:

Inicializamos el puerto serial a 9600 bps.

Inicializamos el mdulo SPI.

Verificamos si la tarjeta de memoria SD esta presente en el circuito; en


caso de estarlo, re-inicializamos el mdulo SPI para mayor velocidad en la
comunicacin de datos. Si la memoria no se encuentra presente, enviamos
el mensaje de error Memoria no Encontrada.

Cargamos el nombre del archivo en la variable filename.

Verificamos si el archivo existe a travs de la funcin Mmc_Fat_Assign.

Si el archivo existe, enviamos el mensaje de confirmacin por el puerto


serial del microcontrolador, Archivo encontrado.

Si el archivo no existe, enviamos el mensaje Archivo no encontrado por


el puerto serial del microcontrolador.

Verifiquemos a continuacin cada paso anteriormente comentado:


1. Con el terminal de comunicaciones activo, reinicie el microcontrolador sin
la tarjeta de memoria insertada. Verifique el mensaje de error.
2. Con el archivo almacenado CADENA.TXT en la raz de la memoria, inserte
la misma en el circuito y verifique el mensaje confirmando que
efectivamente el archivo existe en la tarjeta de memoria.
3. Borre o renombre el archivo CADENA.TXT desde el explorador de
Windows, he inserte nuevamente la tarjeta de memoria en el circuito.
Verifique el mensaje enviado, el cual deber ser Archivo no encontrado.
Saber si un archivo existe en la tarjeta de memoria resulta importante cuando
necesitamos aadir ms informacin al mismo.
392
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

10.9.- Insertar datos en un archivo existente.


Para aadir informacin a un archivo que ya contiene datos grabados, mikroBasic
cuenta con la siguiente funcin:
Mmc_Fat_Append()
Los pasos para aadir ms datos a un archivo existente seran los siguientes:

Definir el nombre del archivo que deseamos modificar.

Verificar si este archivo existe en la tarjeta de memoria SD.

Preparar el archivo para aadir


Mmc_Fat_Append de mikroBasic.

Aadir los datos al archivo.

ms

datos

con

la

funcin

Recordemos que la cadena de caracteres que deseamos insertar en un archivo


que ya contiene datos, debe ser igual al nmero de caracteres especificados en
la rutina:
Mmc_Fat_Write(cadena, 41) ' Inserta la cadena en el archivo.

En este caso, la cadena a insertar en el archivo deber tener 41 caracteres, ya


que de otra forma tendremos problemas al intentar insertar una cantidad
diferente a la especificada en la rutina.
La cantidad de caracteres que deseamos insertar podra ser administrada a
travs del campo nmero de bytes a ser escritos de la rutina Mmc_Fat_Write().
10.9.1.- Ejemplo de programacin #68:
Analice a continuacin el siguiente programa y lea detenidamente los
comentarios:
program Mmc_Fat_Append
'--- 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]
cadena
As string[41]
acumulador As Byte

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]

sub function LeerCaracter As Byte


' Recoje un caracter del USART
do
loop Until Uart1_Data_Ready = 1
result = Uart1_Read
' Almacena el Caracter en la variable result
End sub
main:
espacio_en_blanco[0] = 160

' Este valor en la tabla ASCII equivale a un


' espacio en blanco.

' Valores para fijar Fecha y Hora:


Anio
Mes
Dia
Horas
Minutos
Segundos

=
=
=
=
=
=

2008
1
2
19
50
0

Uart1_Init(9600)

' Inicializa la USART a 9600 bps.

delay_ms(100)

' Retardo de 100 milisegundos.

Uart1_Write_Text("Esperando Datos...") ' Mensaje de espera de datos.


Uart1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
Uart1_Write(10) ' CR = Carriage Return, es decir, mueve el cursor a la
' primera posicin de la linea.
acumulador = 0

' inicializamos la variable "acumulador"

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)

' Si la variable no es igual a 41,


' contina cargando caracteres.

'--- Inicializacin del mdulo SPI y libreria FAT:


Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
' Inicializa la tarjeta MMC/SD y comprueba si est insertada en el circuito.
If (Mmc_Fat_Init() = 0) Then
' reinicializa mdulo SPI para mayor velocidad.
Spi1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)
filename = "CADENATXT"

' Cargamos el nombre del archivo en la variable.

' Verificamos si el archivo se encuentra en la tarjeta de memoria SD:


If (Mmc_Fat_Assign(filename, 1)) Then
' El archivo ha sido encontrado:
Uart1_Write_Text("Archivo encontrado...")
Uart1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
Uart1_Write(10) ' CR = Carriage Return, es decir, mueve el cursos a la
' primera posicin de la linea.

394
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

' Asignamos Fecha y Hora al Archivo CADENA.TXT:


Mmc_Fat_Set_File_Date(Anio, Mes, Dia, Horas, Minutos, Segundos)
' Preparamos el archivo para aadir ms datos:
Mmc_Fat_Append()
' Aadimos los datos recibidos desde el terminal de comunicaciones:
Mmc_Fat_Write(espacio_en_blanco, 1) ' Inserta un espacio en blanco antes
' de la cadena a insertar.
Mmc_Fat_Write(cadena, 41)

' Inserta la cadena en el archivo.

Uart1_Write_Text("Datos insertados en el archivo...")


Uart1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
Uart1_Write(10) ' CR = Carriage Return, es decir, mueve el cursos a la
' primera posicin de la linea.
Else
' El archivo no ha sido encontrado:
Uart1_Write_Text("Archivo no encontrado...!")
Uart1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
Uart1_Write(10) ' CR = Carriage Return, es decir, mueve el cursos a la
' primera posicin de la linea.
End If
Else

' Si la tarjeta no esta insertada:

Uart1_Write_Text("Memoria no Encontrada") ' Mensaje de error.


Uart1_Write(13) ' LF = Line Feed, es decir, Salto de Linea.
Uart1_Write(10) ' CR = Carriage Return, es decir, mueve el cursos a la
' primera posicin de la linea.
End If
delay_ms(1000)
GoTo main

fin:

GoTo fin

' Lazo Infinito

End.

Para verificar su funcionamiento debemos tomar en cuenta que en la tarjeta de


memoria debe haber un archivo ya creado de nombre CADENA.TXT.
Los pasos a seguir seran los siguientes:

Iniciamos la terminal de comunicaciones de mikroBasic y nos aseguramos


que hemos seleccionado el modo de recepcin en formato ASCII.

Reiniciamos el microcontrolador para ver el primer mensaje, Esperando


Datos.

Si la tarjeta de memoria no se encuentra insertada y enviamos la cadena


de caracteres (Cadena de caracteres de prueba nmero 1), podremos ver
el mensaje de error Memoria no Encontrada. Un segundo despus
tendremos nuevamente el mensaje Esperando Datos.
395

_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Si la memoria se encuentra insertada y enviamos la cadena de caracteres


(Cadena de caracteres de prueba nmero 1), el mensaje ser Archivo
encontrado y seguidamente Datos insertados en el archivo. Un segundo
despus tendremos nuevamente el mensaje Esperando Datos.

Las cadenas insertadas en el archivo estarn separadas por un espacio en


blanco. Este espacio puede ser reemplazado por una coma (,) o por
cualquier otro carcter de ser necesario.
Un archivo con datos separados por comas podra ser muy til para nuestros
proyectos, ya que este formato puede ser asociado a una hoja de clculo de
Microsoft Excel. En este caso, la extensin del archivo a definir tendra que ser
.CSV para que esta aplicacin de Microsoft lo reconozca como tal.

396
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Captulo XI. Servomotores

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

Entonces, si deseamos llevar el eje a 0, se deben introducir al servomotor pulsos de 0.6


milisegundos (T1) aproximadamente, cada 20 milisegundos, como se muestra en la figura
11.3. T2 corresponde por consiguiente al tiempo que debemos esperar para enviar un nuevo
pulso, el cual mantiene actualizada la posicin de eje. El tiempo T2 puede estar dentro del
rango 10 ms T2 40 ms.

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:

' Alias del Pin RB0

' Programa Principal

TRISB = %11111110

' Configuracin del Puerto "B"

Centro:
Servo = 1
Delay_Us(1500)
Servo = 0
Delay_ms(20)

'
'
'
'

Activamos el pulso en la salida RB0.


Hacemos una pausa de 1500 microsegundos.
Desactivamos el pulso en la salida RO0.
Hacemos una pausa de 20 milisegundos.

GoTo Centro

' Repetimos el proceso indefinidamente.

End.

Al compilar, grabar y ejecutar el programa anterior en el microcontrolador, podremos ver en


un osciloscopio el tren de pulsos presente en el pin RB0 como se muestra en la figura 11.7.

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

Si analizamos el programa, podremos observar que la instruccin Delay_Us realiza una


parada durante un tiempo definido, cuyo valor es de 1500, es decir, se est generando una
pausa de 1500 microsegundos, o 1,5 milisegundos.
Seguidamente hacemos una pausa de 20 milisegundos antes de enviar nuevamente el pulso
al Pin RB0.
Entonces, si deseramos modificar el ngulo de giro, podemos cambiar el valor del tiempo
en T1, siempre y cuando el valor est dentro del rango de tiempo permitido (0,65 ms T1
2.6 ms), es decir, 650 Delay_Us 2600.
En muchos modelos de servomotores, este rango puede de valores puede ser demasiado
grande. Si este es el caso, suceder que cuando nos salimos de los lmites soportados por
el servomotor, ste no adquiere ninguna posicin definida y posiblemente el eje principal del
mismo quede libre.
Por esto es importante que siempre verifiquemos las especificaciones del fabricante.
Tambin podemos hacer un programa en el cual podamos mover el motor en al menos tres
posiciones que consideramos principales:

Figura 11.8

402
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

11.1.2.- Ejemplo de programacin #70:


Veamos el siguiente programa, en el cual el servomotor mueve su eje a cada posicin de la
figura 11.8. Cada posicin se mantiene durante dos segundos.
program Servo2
' Area de declaracin.
Symbol Servo = PORTB.0

' Alias del Pin RB0

Dim X As Byte

' Variable para For-Next.

main:

' Programa Principal

TRISB = %11111110

' Configuracin del Puerto "B"

Centro:
For X = 1 To 100
Servo = 1
Delay_Us(1500)
Servo = 0
Delay_ms(20)

'
'
'
'
'
'

For-Next para mantener la posicin durante


un tiempo determinado antes de mover el Servo.
Activamos el pulso en la salida RB0.
Hacemos una pausa de 1500 microsegundos.
Desactivamos el pulso en la salida RO0.
Hacemos una pausa de 20 milisegundos.

'
'
'
'
'
'

For-Next para mantener la posicin durante


un tiempo determinado antes de mover el Servo.
Activamos el pulso en la salida RB0.
Hacemos una pausa de 1000 microsegundos.
Desactivamos el pulso en la salida RO0.
Hacemos una pausa de 20 milisegundos.

'
'
'
'
'
'

For-Next para mantener la posicin durante


un tiempo determinado antes de mover el Servo.
Activamos el pulso en la salida RB0.
Hacemos una pausa de 2000 microsegundos.
Desactivamos el pulso en la salida RO0.
Hacemos una pausa de 20 milisegundos.

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

' Repetimos el proceso indefinidamente.

End.

403
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

Captulo XII. PWM

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%

Entonces, si deseamos por ejemplo saber cual es el valor a cargar la rutina


PWM1_Set_Duty(ciclo de trabajo) para un 5% de ciclo de trabajo, realizamos el siguiente
clculo:
Valor =

255 5%
= 12.75 13
100%

En este caso, la seal PWM de salida se ver de la siguiente forma:

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 =

Vout 255 3.5V 255


=
= 178,5 179
5V
Vfuente

El valor a ser cargado en el campo ciclo de trabajo de la rutina PWM1_Set_Duty(ciclo de


trabajo) es 179. Al medir el voltaje en la salida PWM, podremos comprobar que ste se
aproxima al valor deseado de 3.5 voltios.

407
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC www.conexionelectronica.com Christian Bodington Esteva

12.2.6.- Ejemplo de programacin #71:

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:

' Programa Principal

PWM1_Init(5000)

' Inicializamos el mdulo PWM1 a 5KHz

Duty = 127

' Este valor define el ciclo de trabajo del pulso.

PWM1_Start()
PWM1_Set_Duty(Duty)

' Inicia PWM1


' Selecciona el ciclo de trabajo para PWM1

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:

' Programa Principal

PWM1_Init(5000)
PWM2_Init(2000)

' Inicializamos el mdulo PWM1 a 5KHz


' Inicializamos el mdulo PWM1 a 2KHz

Duty1 = 100
Duty2 = 200

' Este valor define el ciclo de trabajo en PWM1.


' Este valor define el ciclo de trabajo en PWM2.

PWM1_Start()
PWM2_Start()

' Inicia PWM1


' Inicia PWM2

PWM1_Set_Duty(Duty1)
PWM2_Set_Duty(Duty2)

' Selecciona el ciclo de trabajo para PWM1


' Selecciona el ciclo de trabajo para PWM1

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

12.2.7.- Ejemplo de programacin #72:


Vamos a realizar a continuacin un ejercicio para el control de un motor DC a travs de una
seal PWM. Para esto hemos incluido en el diagrama esquemtico cuatro pulsadores y una
pantalla LCD. La funcin de los pulsadores deber ser la siguiente:

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.

P3: Activa la seal PWM en la salida correspondiente al mdulo PWM1.

P4: Detiene la seal PWM en la salida correspondiente al mdulo PWM1.

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

Verifiquemos el siguiente programa, leyendo detenidamente los comentarios en cada lnea:


program PWM3
' Area de declaracin.
Dim Duty1 As Byte
Estado As Byte
txt
As String[6]

' Variable de contenido temporal tipo String

' 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

' Fin de la configuracin de conexiones


main:

' Programa Principal

LCD_Init()
LCD_Cmd(_LCD_Clear)
LCD_Cmd(_LCD_Cursor_Off)

' Inicializamos la pantalla LCD


' Limpia la pantalla LCD
' Apaga el cursor en la pantalla

LCD_Out(1, 1,"Valor en Duty1: ")


Duty1 = 127
PWM1_Init(5000)
PWM1_Set_Duty(Duty1)

' Imprime en la fila 1, columna 1

' Este valor define el ciclo de trabajo en PWM1.


' Inicializamos el mdulo PWM1 a 5KHz
' Selecciona el ciclo de trabajo para PWM1

Pulsadores:
ByteToStr(Duty1, txt)
Lcd_Out(2, 8, txt)

' Convierte el valor numrico en String.


' Imprime el contenido cargado en "txt" en la fila 2,
' columna 8.

Estado = Button(PortD, 0, 50, 1) ' Verificamos si P1 fue presionado, estado activo = 1.


If Estado = 255 Then

' Preguntamos si el Estado del pulsador es "activo"

Duty1 = Duty1 + 1

' Incrementamos el cliclo de trabajo en una unidad.

If Duty1 > 254 Then


Duty1 = 254
End If

' Fijamos un lmite para que la variable no se desborde,


' es decir, si Duty1 es mayor que el valor lmite superior,
' entonces Duty1 deber permanecer en este valor.

PWM1_Set_Duty(Duty1) ' Actualizamos el ciclo de trabajo para PWM1


End If
Estado = Button(PortD, 1, 50, 1) ' Verificamos si P2 fue presionado, estado activo = 1.
If Estado = 255 Then

' Preguntamos si el Estado del pulsador es "activo"

Duty1 = Duty1 - 1

' Decrementamos el cliclo de trabajo en una unidad.

If Duty1 < 1 Then


Duty1 = 1
End If

' Fijamos un lmite inferior, es decir, si Duty1 es menor


' que 1, entonces debe permanecer en este valor.

PWM1_Set_Duty(Duty1) ' Actualizamos el ciclo de trabajo para PWM1

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

' Preguntamos si el Estado del pulsador es "activo"


' Si esta activo, salta a la subrutina "IniciaPWM"

Estado = Button(PortD, 3, 50, 1) ' Verificamos si P4 fue presionado, estado activo = 1.


If Estado = 255 Then
GoSub DetienePWM
End If

' Preguntamos si el Estado del pulsador es "activo"


' Si esta activo, salta a la subrutina "DetienePWM"

GoTo Pulsadores
IniciaPWM:
PWM1_Start()
Delay_ms(100)
Return

' Inicia PWM1.


' Pausa de 100 milisegundos.
' Retorno del llamado Gosub.

DetienePWM:
PWM1_Stop()
Delay_ms(100)
Return

' Detiene PWM1.


' Pausa de 100 milisegundos.
' Retorno del llamado Gosub.

End.

Al iniciar el programa en el microcontrolador, el motor deber estar detenido. Si pulsamos


P3 el motor deber arrancar con un 50% de ciclo de trabajo en la seal PWM, debido a
que hemos inicializado la variable correspondiente a este parmetro en 127.
Los pulsadores P1 y P2 aumentan y disminuyen respectivamente el ciclo de trabajo de la
seal PWM. Esta variacin podr ser visible a travs de la pantalla LCD.
Por ltimo, si pulsamos P4 el motor deber parar completamente, debido a que la seal
PWM ser interrumpida por el programa.

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

Software y prcticas en formato digital.

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

Microchip Technology Inc., http://www.microchip.com

SD-3C LLC., http://www.sd-3c.com

Dimension Engineering., http://www.dimensionengineering.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

You might also like