Subido por Jorge Botero

Mikro Basic

Anuncio
Copyright 2010 Christian Bodington
Todos los derechos reservados. Esta publicación no puede ser reproducida,
ni en todo ni en partes, ni registrada en o transmitida por un sistema de
recuperación de información, en ninguna forma ni por ningún medio, sea
mecánico, fotoquímico, electrónico, magnético, electroóptico, por fotocopia
o cualquier otro, sin permiso previo por escrito del autor.
Ilustrado y Editado por: Christian Bodington Esteva
Diseño 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 diseño.
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 Aritméticos.
Operadores Bit a Bit.
Operadores de Comparación.
Capitulo II.
2.1.2.2.2.3.2.4.-
Arquitectura Básica del microcontrolador PIC16F877.
El oscilador externo.
Circuito de Reset.
Consideraciones técnicas de diseño.
2.4.1.2.4.2.2.4.3.2.4.4.-
Estado lógico de un pin I/O.
Lectura de un estado lógico en un pin I/O.
El opto-acoplador como dispositivo de enlace.
Fuente de poder 5Vdc – 3.3Vdc.
2.5.- Configuración de puertos de entrada y salida en un microcontrolador PIC.
2.6.- Primeros ejemplos de programación 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. Librería Button.
i
Capitulo III. Pantallas LCD y GLCD.
3.1.- Pantallas LCD, estudio de la librería LCD de mikroBasic.
3.1.1.3.1.2.3.1.3.3.1.4.3.1.5.-
Identificación de los pines de una pantalla LCD.
Conexión y configuración 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.- Parámetros de rutinas cargados en variables.
3.2.1.- Ejemplo #8. Uso de variables como parámetros.
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 operación,
suma y resta de un número cargado en una variable
a través de pulsadores.
3.3.3.- Ejemplo #12. Crear un menú de opciones en la pantalla.
3.4.- Pantalla Gráfica o GLCD (Graphic Liquid Crystal Display).
3.4.1.- Conexión y configuración de una pantalla GLCD.
3.5.- Librería GLCD.
3.5.1.- Rutina Glcd_Init().
3.5.2.- Ejemplo #13. Uso de la rutina Glcd_Init().
3.5.3.- Módulo de Fuentes en mikroBasic.
ii
3.5.3.1.- Ejemplo #14. Cómo incluir un módulo 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 específico.
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 línea entre coordenadas específicas.
3.5.8.2.- Ejemplo #20. Dibuja línea entre coordenadas, color inverso.
3.5.9.- Rutina Glcd_V_Line(y1, y2, x, color).
3.5.9.1.- Ejemplo #21. Dibuja línea vertical entre
coordenadas específicas.
3.5.10.- Rutina Glcd_H_Line(x1, x2, y, color).
3.5.10.1.- Ejemplo #22. Dibuja línea horizontal entre coordenadas.
3.5.11.- Rutina Glcd_Rectangle(x1, y1, x2, y2, color).
3.5.11.1.- Ejemplo #23. Dibuja un cuadrado o rectángulo.
3.5.11.2.- Ejemplo #24. Dibuja una serie de rectángulos consecutivos.
3.5.12.- Rutina Glcd_Box(x1, y1, x2, y2, color).
3.5.12.1.- Ejemplo #25. Dibuja un cuadrado o rectángulo sólido.
3.5.12.2.- Ejemplo #26. Dibuja un cuadrado o rectángulo sólido,
color inverso.
3.5.13.- Glcd_Circle(x, y, radio, color).
3.5.13.1.- Ejemplo #27. Dibuja un círculo en la pantalla.
3.5.13.2.- Ejemplo #28. Dibuja un círculo, color inverso.
3.5.13.3.- Ejemplo #29. Dibuja círculos consecutivos.
iii
Capítulo IV. Librería Trigon – Funciones Trigonométricas.
4.1.- Funciones Trigonométricas. 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. Cálculo del seno de un valor x.
4.1.2.- Ejemplo #31. Cálculo del coseno de un valor x.
4.1.3.- Ejemplo #32. Cálculo de la tangente de un valor x.
4.1.4.- Ejemplo #33. Calculadora.
Capítulo V. Librería Sound.
5.1.- Rutinas de la librería de sonido de mikroBasic. Cálculos 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 través de la pantalla LCD.
5.1.2.- Ejemplo #35. Elaboración de un piano de una octava musical.
Capítulo VI. Teclado Matricial y Teclado PS/2.
6.1.- Teclado Matricial.
6.2.- Librería 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.- Librería 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 símbolo ASCII y valor correspondiente
a una tecla presionada.
iv
Capítulo VII. Memoria de Datos EEPROM.
7.1.- Memoria de datos EEPROM.
7.2.- Librería 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
dígitos 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.
Capítulo 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. Conversión A/D de una señal analógica.
Ejemplo #44. Conversión A/D con voltaje de referencia.
Ejemplo #45. Conversión A/D, datos adicionales en la pantalla.
8.2.- El Acelerómetro.
8.2.1.- Ejemplo #46. Acelerómetro 3D, conversión A/D de datos en los
ejes X, Y, Z.
8.2.2.- Cálculo del voltaje de entrada del conversor A/D.
8.2.3.- Cálculo de la aceleración en base al voltaje calculado en cada eje.
8.2.4.- Ejemplo #47. Visualizar voltaje y aceleración calculada en la GLCD.
8.3.- Termocupla.
8.3.1.- AD594/AD595, cálculo de la linealidad.
8.3.2.- Ejemplo #48. Termómetro digital con termocupla tipo J.
Capítulo IX. Comunicación Serial Asíncrona RS232.
9.1.- Comunicación Serial Asíncrona RS232.
9.2.- Librería 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. Recepción de datos vía RS232.
Ejemplo #50. Almacenar y visualizar una cadena de caracteres.
Rutina UART1_Write().
Ejemplo #51. Transmisión y recepción de datos vía RS232.
9.3.- ¿Cómo extraer información específica de una cadena de datos?.
9.3.1.- Ejemplo #52. Extraer información de una cadena de datos.
9.4.- Módulo de comunicaciones BlueTooth.
9.4.1.- Widcomm BlueTooth Software 5.0.1.3900.
9.4.2.- Comunicación Serial inalámbrica BlueTooth.
9.5.- Módulo GPS (OEM), comunicación serial RS232.
9.5.1.- Protocolo NMEA.
9.5.2.- Ejemplo #53. Extrae coordenadas geográficas y número de
satélites utilizador por el módulo GPS.
9.6.- Programación en Visual Basic 6.0 para ejemplos de comunicación serial
RS232.
9.6.1.- Ejemplo #54. Captura de datos enviados desde un módulo VB.
9.6.2.- Ejemplo #55. Captura de datos enviados desde un microcontrolador
a una hoja de cálculo de Microsoft Excel.
Capítulo X. Multi Media Card (MMC) y Secure Card (SD) Memory.
10.1.- Librería 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 Versión 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 específicos
de la memoria SD.
10.4.2.- Ejemplo #59. Lectura de datos de un sector específico.
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. Cómo dar formato a una tarjeta de memoria SD
desde el microcontrolador PIC.
10.5.4.- ¿Cómo 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 sólo lectura.
10.5.7.- Ejemplo #62. Crear un archivo .txt con atributo de sólo 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 vía 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 específico 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
Capítulo 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.
Capítulo XII. PWM.
12.1.- PWM.
12.2.- Librería 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 señal PWM controlada.
Ejemplo #72. Control de un Motor DC.
Apéndice A. Tabla ASCII.
Apéndice B. Prácticas en formato digital.
Bibliografía.
viii
Prólogo
La segunda edición 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 rápido en la programación de microcontroladores PIC gracias a
una completa librería diseñada para el control de una gran variedad de periféricos,
facilitando el desarrollo de proyectos electrónicos a través de 72 ejemplos prácticos,
analizados y comentados detalladamente en base a los microcontroladores PIC16F877,
PIC18F442, PIC18F452 y PIC18F458.
La mayoría de los proyectos han sido desarrollados con la ayuda del entrenador de
microcontroladores “EasyPic5” de mikroElektronika, además de una serie de componentes
adicionales de fácil adquisición y bajo costo.
Al igual que en la primera edición, la metodología empleada ha sido orientada para que el
lector pueda expandir sus conocimientos para generar nuevas ideas en la implimentación de
este compilador sobre esta tecnología 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 básicos en la programación de estos componentes.
Los puntos de estudios más importantes han sido el control de puertos, pantallas LCD y
GLCD, sonido, funciones trigonométricas, teclado matricial y PS/2, memoria de datos
EEPROM, conversor A/D, control de dispositivos como potenciómetros, acelerómetro 3D,
termocupla, comunicación serial RS-232, BlueTooth, módulos GPS, programación en Visual
Basic para control de puertos, multimedia card (MMC y SD), almacenamiento masivo de
datos, creación 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 Diseño
En la elaboración de proyectos electrónicos con microcontroladores PIC, resulta muy
importante considerar una serie de herramientas que vamos a describir a continuación y las
cuales pueden ser proporcionadas en su gran mayoría por la empresa Mikroelektronika
(www.mikroe.com). Esta empresa se ha dado a la tarea de diseñar tanto el software de
programación para microcontroladores PIC, como el hardware necesario para poder
aprender todo lo relacionado al tema que a continuación estaremos abordando a través de
muchos ejemplos prácticos los cuales tienen una gran variedad de periféricos disponibles,
tales como pantallas LCD, GLCD, teclados matriciales, teclados PS/2, dispositivos de
comunicación serial, entre otros.
Software: para la programación en Lenguaje Basic, contamos con el Ambiente Integrado de
Desarrollo MikroBasic de MikroElektronika. Con esta herramienta estaremos realizando la
programación en cada uno de los proyectos propuestos a partir del capítulo 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 conexión 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. También es posible hacer arreglos en nuestros
circuitos para dejar un puerto de conexión para el programador, y así poder realizar
cambios en nuestros programas sin retirar el microcontrolador de nuestros diseños.
Esta opción, denominada ICSP (In-Circuit Serial Programming), simplifica el trabajo a
la hora de reprogramar nuestros diseños.
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 diseñada para trabajar en
conjunto con los compiladores de mikroElektronika, proporcionan diferentes módulos
interconectados entre ellos, facilitando la elaboración de prácticas con
microcontroladores. Estos entrenadores de microcontroladores además incorporan su
propio programador de microcontroladores PIC de conexión USB 2.0. El entrenador
recomendado en esta edición es el EasyPIC5.
Figura 1.3 (Fuente: http://www.mikroe.com/en/tools/easypic5)
•
Herramientas de corte, extractor de circuitos integrados, cable rígido 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 prácticas en
las cuales se hace necesario medir las señales generadas desde el microcontrolador.
Figura 1.5
•
Componentes electrónicos: microcontroladores PIC en los modelos definidos en cada
ejemplo práctico, resistencias, diodos, servomotores, condensadores, cristales y otros
componentes de fácil adquisición. Cada proyecto cuenta con una tabla en la cual se
describen los componentes electrónicos que deberán 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 programación la cual podemos descargar de la
pagina oficial http://www.mikroe.com en su versión de demostración y con sus respectivas
limitaciones. Para obtener una versión 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 físico.
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
continuación:
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 instalación 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 instalación, seleccionamos la opción de aceptación de los
términos explicados en el acuerdo de licencia, y seguidamente hacemos clic en “Next”.
A continuación veremos los componentes del programa disponibles para la instalación:
•
El compilador.
•
Los archivos de ayuda del compilador.
•
Ejemplos de programas desarrollados para los módulos 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 botón “Next”, veremos la ruta de instalación 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 según convenga. Al haber
seleccionado anteriormente todos los componentes en la instalación, podemos observar que
el espacio requerido se acerca a los 75 MB.
Ahora para iniciar la instalación, hacemos clic en el botón “Install”, acción con la cual
veremos el progreso de la instalación en nuestro disco, como lo demuestran las siguientes
imágenes:
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 botón “Finish”, el programa de instalación nos preguntará si deseamos
instalar el soporte ICD (In-Circuit Debugger) de mikroBasic:
Figura 1.18
Figura 1.19
Al hacer clic en el botón “Si” veremos la ventana de bienvenida a la guía de instalación, 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 opción para la aceptación de la licencia y hacemos clic en el botón “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 instalación del software “PicFlash”.
Este programador viene integrado en las tarjetas entrenadoras, e incluso se vende por
separado en su versión USB.
13
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Figura 1.21
Haciendo clic en el botón “Next”, estaremos viendo la ruta de instalación por defecto o ruta
sugerida por el programa de instalación. Esta ruta se puede mantener igual o ser cambiada
según convenga al usuario.
Una vez seleccionada la ruta, hacemos clic en el botón “Install” y esperamos a que termine
el proceso de instalación como se muestra en las siguientes imágenes:
Figura 1.22
14
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Figura 1.23
El siguiente paso será la instalación 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
También será necesaria la instalación 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 instalación de drivers, la instalación de mikroBasic nos pregunta si deseamos
ejecutar el software inmediatamente. Al hacer clic en el botón “Si” podremos ver que la
interfaz de programación se abre y queda lista para iniciar a programar nuestros proyectos.
Inicialmente se podrá observar que la misma abre automáticamente un ejemplo de
programación 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 comprensión del mismo ante otros programadores que deseen
realizar mejoras a éste, es necesario establecer una estructura que nos permita identificar
fácilmente cada una de las partes que lo componen.
A
B
C
D
Figura 1.35
En la figura 1.35 se puede observar la estructura básica de un programa hecho en
mikroBasic, y en la cual hemos identificado las cuatro secciones que consideramos más
importantes para lograr un programa bien estructurado.
Sección A: Corresponde al encabezado del programa, en el cual siempre es conveniente
incorporar información básica del mismo, como el nombre, la identificación de autor,
Copyright, fecha de elaboración o fecha de los últimos cambios realizados, versión del
programa que se está realizando, e incluso una breve descripción acerca del objetivo del
programa y su aplicación en un determinado circuito electrónico.
Sección B: Esta sección empieza en la columna cero del editor de texto de mikroBasic, y en
ella se pueden declarar variables, sub-funciones, configuraciones de dispositivos periféricos
y etiquetas de cada una de las subrutinas que serán programadas.
Las etiquetas identifican puntos específicos o subrutinas dentro de un programa. Son
definidas por el programador y deben tener al final de cada una de ellas el símbolo de “dos
puntos”, que definen el final de la misma.
21
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Sección C: Estará destinada para las instrucciones de programa y la misma está separada
de la columna cero del editor de texto por una tabulación, es decir, cuando el cursor se
encuentra en la columna cero, presionamos una vez la tecla “TAB”, y de esta manera
establecemos un espacio mínimo, siempre igual o superior entre la sección B y C.
Sección D: Esta destinada para realizar comentarios acerca de la función que estará
cumpliendo una instrucción específica en nuestro programa. Cada comentario debe
empezar siempre con una comilla simple como se muestra a continuación:
' Define el Oscilador para un Cristal
' de 4 Mhz.
Cuando un comentario es demasiado extenso, podemos continuar el mismo en la siguiente
línea, siempre que la frase comience con su respectiva comilla.
Los comentarios ayudan al diseñador a identificar cada línea de programa o cada una de las
funciones de cada subrutina, garantizando así una buena documentación 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 continuación los pasos a seguir:
•
Desplegamos el menú “Project” y seguidamente seleccionamos la opción “New
Project”. Enseguida veremos la ventana de bienvenida.
Figura 1.36
•
En el paso 1, seleccionamos la opción “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
señalada en la figura 1.39, a través 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 código
creado con anterioridad, los cuales pudieran contener subrutinas generalizadas para
el control de periféricos comunes como pantallas LCD o teclados. En caso de no
disponer de ningún archivo adicional para el proyecto, simplemente continuamos
seleccionando la opción “Next”.
Figura 1.42
26
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
•
En el paso 5 tenemos la opción de incluir todas las librerías disponibles para el
microcontrolador anteriormente seleccionado en nuestro proyecto. También tenemos
la opción de no incluir ninguna de ellas. Esto se debe a que mikroBasic cuenta con
una amplia selección de librerías para el control de dispositivos periféricos o procesos
de cálculo o conversión de datos que nos permitirán hacer de la programación algo
fácil y rápida a la hora de diseñar un programa, pero no necesariamente
necesitaremos de todas las librerías en un solo proyecto. Si elegimos la opción
“Include All” podremos estar seguros de que cada librería empleada en nuestro
programa funcionará correctamente. Si elegimos la opción “Include None (Advance)”
tendremos que realizar la selección de las librerías que deseamos utilizar desde el
administrador de librerías de mikroBasic, el cual veremos mas adelante.
Figura 1.43
•
El paso 6 en la creación de un nuevo proyecto nos dice que hemos finalizado la
configuración 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 más importantes a la hora de elaborar un programa.
A
B
D
C
E
Figura 1.46
En la sección A, podemos encontrar las opciones del menú principal, además de todos los
accesos directos a cada funcion del software a través de pequeños botones ordenados y de
fácil acceso.
La sección B es el editor en el cual se escribirán los programas de cada proyecto bajo las
recomendaciones realizadas en punto 1.3 de este capítulo.
29
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
En la sección C se puede observar el administrador de librerías, el cual deberá ser tomado
en cuenta siempre que nuestros proyectos incluyan el uso de cualquiera de las librerías
disponibles en mikroBasic.
En la sección D se encuentra en explorador de código 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 sección E muestra dos pestañas importantes. La primera pestaña se llama “Messages” o
“Mensajes”, contiene un área en la cual se mostrarán los resultados del procedimiento de
compilación de un programa. Si se genera un error de compilación, éste será mostrado en
esta ventana mostrando el tipo de error y su ubicación en la ventana de edición. La segunda
pestaña se llama “Quick Converter” y contiene una herramienta de conversión de unidades
en diferentes formatos.
Veamos a continuación la descripción de cada menú en la sección A de la imagen 1.46.
Menú “File”:
Figura 1.47
•
New Unit: Abre una nueva ventana de edición de programas para mikroBasic. En
esta ventana escribiremos el código de programa de nuestros proyectos.
•
Open: A través de esta opción podremos abrir cualquier archivo asociado a
nuestros proyectos de programación.
•
Recent Files: Al seleccionar esta opción, 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 programación.
•
Save As: Salva o guarda los cambios realizados en la ventana de programación
con un nombre o ruta diferente.
•
•
Close: Cierra la ventana de código activa.
Print Preview: Una vista previa de la ventana de código activa antes de la
impresión.
•
Print: Imprime la ventana de código Activa.
•
Exit: Cierra el entorno de programación 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 búsqueda 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 línea 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 líneas de código de programa previamente seleccionadas en
comentarios. Si no hemos seleccionado ninguna línea de código, simplemente
aparece una comilla simple, asignando el resto de la línea como un espacio
disponible para realizar comentarios.
•
Uncomment: Remueve la propiedad de comentario de una o varias líneas
seleccionadas.
•
Indent: Aplica una tabulación o sangría al texto seleccionado.
•
Outdent: Elimina una tabulación o sangría al texto seleccionado.
•
Lowercase: Cambia todo el texto seleccionado a minúsculas.
•
Uppercase: Cambia todo el texto seleccionado a mayúsculas.
•
Titlecase: Cambia a mayúscula la primera letra del texto seleccionado.
Menú “View”:
Figura 1.50
Sub-Menú “Toolbars”: A través de este sub-menú podemos seleccionar cuales
herramientas estarán visibles o disponibles en la sección “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 través 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 configuración 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 compilación y ventana de depuración de mikroBasic.
Figura 1.54
35
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
•
Code Explorer o Explorador de Código: Despliega la ventana del explorador de
código de mikroBasic.
Figura 1.55
•
Project Manager o Administrador de Proyectos: A través de esta ventana es
posible acceder a todo el contenido del proyecto.
Figura 1.56
Esta ventana posee además botones de acceso rápido a algunas funciones importantes:
o
Salvar un grupo de proyectos: En mikroBasic es posible tener más de
un proyecto abierto en entorno de desarrollo integrado. Este botón 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 administración de proyectos.
Figura 1.57
•
Abrir un grupo de proyectos: A través de esta opción 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 programación de microcontroladores PIC de
mikroElektronika.
37
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
•
Library Manager o Administrador de Librerías: El administrador de librerías de
mikroBasic contiene todas las librerías disponibles para un microcontrolador
previamente seleccionado.
Figura 1.58
•
Actualiza el administrador de librerías.
•
Compila todas las librerías disponibles.
•
Incluye todas las librerías en un proyecto.
•
No incluye ninguna de las librerías en el proyecto.
•
•
Restaura el estado de las librerías justo antes de la última grabación del
proyecto.
Bookmarks o Marcadores: Esta opción despliega una ventana en la cual podremos
agregar accesos directos a puntos específicos en un programa. Al hacer doble clic en
alguno de estos accesos directos, el cursor se ubicará automáticamente en la línea o
dirección especificada.
38
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Figura 1.59
•
Quick Converter o Conversor rápido de datos: Despliega la ventana de conversión
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,
podríamos grabar una secuencia de ordenes que nos permita por ejemplo abrir el
terminal de comunicaciones de mikroBasic y hacer que se conecte bajo ciertos
parámetros específicos con tan solo activar su Macro correspondiente.
Figura 1.60
•
Inicia el proceso de grabación en la secuencia de pulsaciones de teclas
sobre el entorno de desarrollo integrado de mikroBasic.
•
Detiene el proceso de grabación 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 través de esta opción 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 código generado en lenguaje ensamblador.
•
View Statistics: Muestra las estadísticas del proyecto activo.
•
View Listing: Muestra el listado de asignación de memoria del PIC: direcciones
de instrucciones, registros, las rutinas y las etiquetas.
•
Edit Search Paths: Edita rutas de búsqueda.
•
Clean Project Folder: Esta opción limpia o borra de la carpeta de proyecto los
archivos generados cuando se realiza la compilación 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 específico de un proyecto.
Import Project: Permite importar proyectos de versiones anteriores de
mikroBasic.
•
New Project: Abre el asistente para la creación 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 través de la cual podemos configurar los
fusibles de programación 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 través de esta opción
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 través de este menú podremos acceder a toda la ayuda disponible acerca
del compilador, accesos directos al foro de discusión, página Web oficial de
mikroElektronika, formulario de registro del compilador e información de registro actual.
Figura 1.65
43
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Nota Importante: En la versión 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 versión completa del
compilador, para poder llevar a cabo todos los ejemplos propuestos en esta edición.
La licencia es suministrada en línea por la empresa “MikroElektronika” y el proceso de
registro es sumamente sencillo. Tener la licencia del compilador nos garantiza además el
acceso al soporte técnico 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 específica. 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 programación entre las cuales
podemos mencionar las etiquetas, variables, identificadores, constantes, comentarios y
símbolos 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 facilitarán el trabajo considerablemente.
1.6.2.- Variables: En las variables podemos almacenar datos temporalmente, los cuales
podrán ser consultados o modificados cada vez que sea necesario. Normalmente la
definición 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
Tamaño
bit
1–bit
0 or 1
Rango
sbit
1–bit
0 or 1
byte, char
8–bit
0 .. 255
short
8–bit
-127 .. 128
word
16–bit
0 .. 65535
integer
16–bit
-32768 .. 32767
longword
32–bit
0 .. 4294967295
longint
32–bit
-2147483648 .. 2147483647
float
32–bit
±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 según
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 número de “elementos”, definido
según el tamaño 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 través de un índice. Este índice se específica 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
según el modelo del mismo.
1.6.4.- Constantes: Ayudan a identificar un valor constante en nuestro programa, facilitando
aún más la comprensión 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
declaración).
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 específico a elementos o variables dentro de
nuestro programa. Para definir un símbolo, utilizamos la palabra “Symbol”, seguida del alias
del elemento, el símbolo de igualdad “=”, y por último el elemento en cuestión:
Symbol
{alias}
=
{elemento}
Por ejemplo, si deseamos controlar un motor DC a través de uno de los pines del puerto A
de un microcontrolador, resultaría 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 Aritméticos: Entre los operadores aritméticos más utilizados tenemos
los que se muestran en la siguiente tabla:
Operadores
Operación
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
*
multiplicación
byte, short, word, integer,
longint, longword, float
word, integer, longint,
longword, float
/
División, en punto flotante.
byte, short, word, integer,
longint, longword, float
float
div
División, redondea hacia el
entero mas cercano.
byte, short, word, integer,
longint, longword
byte, short, word, integer,
longint, longword
módulo, devuelve el resto de
byte, short, word, integer,
la división entera (no se
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
Operación
AND Lógico
OR Lógico
OR Exclusiva (XOR)
NOT Lógico
Figura 1.69
Con estos operadores resulta muy sencillo realizar operaciones binarias, como lo demuestra
el siguiente ejemplo:
Si aplicamos una AND lógica, donde deseamos filtrar los siete bits más significativos del
valor almacenado en la siguiente variable:
Var1 = %00101001
Entonces,
Var1 = Var1 and %00000001
El resultado de esta operación es Var1 = %00000001
1.6.8.- Operadores de Comparación: Los operadores de comparación normalmente son
utilizados con la instrucción If…Them… para realizar comparaciones entre variables o datos
extraídos de alguna operación aritmética.
Operador
=
<>
>
<
>=
<=
Operación
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 básica del microcontrolador PIC16F877.
Para iniciar con el estudio de la programación en mikroBasic, nos plantearemos tres
objetivos que consideramos importantes para entrar en materia:
•
Familiarizarse con la arquitectura básica de los microcontroladores que estaremos
empleando a lo largo de esta edición.
•
Familiarizarse con la estructura de programa de mikroBasic, muy importante a la hora
de realizar un programa ordenado y libre de errores, por muy pequeño que este sea.
•
El estudio de las primeras prácticas, cortas y de fácil comprensión con el fin de
adquirir confianza en el uso de instrucciones y librerías de mikroBasic.
Arquitectura Básica del microcontrolador PIC16F877:
Uno de los microcontroladores seleccionados para el estudio de la programación de
microcontroladores en lenguaje Basic ha sido el PIC16F877. Veamos a continuación
algunas de sus características técnicas más importantes:
•
CPU: Risc (Reduced Instruction Set Computer).
•
Frecuencia Máxima: 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.
•
Protección de código programable.
•
Voltaje de Operación: 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 Síncrono (SSP) con SPI e I2C.
49
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
•
Puerto Serial Universal (USART/SCI).
•
2 Módulos 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
Descripción 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
Identificación
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
Descripción del Pin
Reset y entrada de voltaje de programación.
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 Alimentación de 5Vdc
Pin de Alimentación 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 Alimentación a Tierra (GND)
Pin de Alimentación 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 además,
define la velocidad a la cual va a trabajar. Para hacer funcionar nuestro diseño 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 cerámicos vienen dados según la tabla que se muestra a
continuación:
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 alimentación de 5 Vdc y medir la señal de
salida del oscilador XT con un osciloscopio, en el pin 14 (Osc2/CLKout) del
microcontrolador, podremos ver la onda generada bajo los siguientes parámetros de
medición 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 período en este caso sería la siguiente:
•
•
Frecuencia: 3,972 Mhz
Período: 251,71 ns
Cristal de cuarzo TTL: Este tipo de cristal consta de cuatro pines, de los cuales solo tres
están 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 parámetros de medición 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 período en este caso sería la siguiente:
•
Frecuencia: 3,999 Mhz
•
Período: 250,013 ns
El oscilador externo en modo RC resulta ser el más sencillo de todos y por ende el más
económico. Su configuración lo hace menos preciso debido a que existe una tolerancia de
error en sus componentes, sin olvidar también que la temperatura puede afectar la
operación 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 diseña un circuito con microcontroladores PIC. A través de este Pin se
podrá reiniciar el dispositivo, si a éste se le aplica un nivel lógico bajo (0V), por lo tanto
resulta importante destacar que para que un programa cargado en un microcontrolador se
mantenga en ejecución, el Pin MCLR debe estar siempre en un nivel lógico 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 técnicas de diseño.
A continuación veremos algunos circuitos básicos que deben ser tomados en cuenta para el
desarrollo de prácticas con microcontroladores PIC. Estos circuitos son muy útiles cuando
deseamos visualizar el resultado de una acción programada en el microcontrolador.
2.4.1.- Estado Lógico de un pin I/O.
Una manera muy sencilla de ver el estado lógico de un pin configurado como salida en
cualquiera de los puertos de microcontrolador es a través 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 lógico del pin de salida del
puerto (RB1) sea igual a “1”, es decir, 5 voltios.
El Led “D2” se iluminará solo cuando el estado lógico 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 lógico de un pin específico, en cualquiera de los puertos de un microcontrolador, una
forma “básica” de visualizar este cambio es a través del uso de Leds.
57
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
2.4.2.- Lectura de un estado lógico en un pin I/O:
El microcontrolador también nos permite capturar datos o señales externas para luego ser
procesadas y convertidas en respuestas que pueden definir una acción específica en
nuestros circuitos de prueba. Un ejemplo común podría ser el uso de un pulsador para hacer
destellar un led cada vez que éste sea presionado.
Si deseamos introducir un nivel lógico bajo (0V), o alto (5V), a una de las entradas de un
microcontrolador a través de un pulsador, podríamos 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 lógico alto (5V) mientras el pulsador
permanece abierto. Al presionar el pulsador, el nivel lógico en el pin I/O del puerto pasa a
ser bajo (0V).
El segundo circuito de la figura 2.12 mantiene un nivel lógico bajo (0V) mientras el pulsador
permanece abierto. Al presionar el pulsador, el nivel lógico 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
electrónicos digitales con etapas de manejo de potencia o con otros circuitos.
Este componente en una de sus versiones, se compone básicamente de un diodo LED el
cual se encarga de iluminar un fototransistor, para que éste conduzca corriente a través del
colector.
Figura 2.13
En la configuración de la figura 2.13, cuando en el pin I/O aplicamos un 1 lógico (5V), el LED
del opto-acoplador enciende y el fototransistor conduce la corriente a tierra; por lo tanto, en
la salida tendremos un 0 lógico (0V).
Si apagamos el LED, el transistor no conduce, de tal manera que en la salida tendremos un
1 lógico (5V).
En la configuración de la figura 2.14, cuando en el pin I/O aplicamos un 1 lógico (5V), el LED
del opto-acoplador enciende y el fototransistor conduce para poner en la salida un 1 lógico
(5V). Mientras haya un 0 lógico en la entrada, el fototransistor permanecerá abierto entre el
emisor y colector, dando como resultado un 0 lógico (0V) en la salida.
59
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Figura 2.14
Una configuración muy común para el control de dispositivos de potencia como motores
eléctricos, 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 través 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 construcción de un
diseño sencillo que podemos implementar en todos los proyectos propuestos. En la figura
2.16 se puede observar el diseño 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.- Configuración 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 configuración de puertos, los cuales para el
caso específico del PIC16F877 son cinco:
TrisA (registro de configuración 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 más
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 deseáramos 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 configuración de los pines I/O del puerto A es el siguiente:
Registro TrisA
1
1
1
1
0
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 código es muy sencillo:
TrisA = %11110
(“%” para expresar la configuración en Binario), ó:
TrisA = $1E (”$” para expresar la configuración 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:
1
1
Registro TrisB
1
1
1
1
1
0
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 estarán en uso como entrada, ya que
de esta forma podemos evitar daños en el hardware interno del microcontrolador en caso de
una conexión errónea al experimentar con éste en un tablero de pruebas.”
La configuración en mikroBasic en forma de código de programa en este caso sería:
TrisB = %11111110 (si se desea hacer la notación en binario), ó:
TrisB = $FE (si se desea hacer la notación 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 configuración de los puertos C, D y E. Sus
registros de configuración TRISC, TRISD y TRISE deberán ser siempre configurados para
determinar su función dentro de un proyecto electrónico.
63
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
2.6.- Primeros ejemplos de programación en mikroBasic:
2.6.1.- Ejemplo de programación #1: Un ejemplo sencillo para determinar que hemos
iniciado de forma correcta todo lo referente a la configuración de un nuevo proyecto en
mikroBasic, es intentar realizar el encendido de uno o dos Leds a través de uno de los
puertos disponibles en el microcontrolador. Normalmente los pasos que vamos a realizar
para lograr este objetivo son los pasos básicos para realizar el resto de nuestros proyectos.
Estos pasos serán descritos a continuación y el programa para el encendido de dos Leds
estará basado en el diagrama esquemático de la figura 2.19.
Figura 2.19
Dos puntos importantes a considerar sobre este diagrama esquemático son:
•
El Led “D1” tiene su “ánodo” conectado al pin RB1 del puerto “B”, por lo tanto el Led
sólo encenderá cuando RB1 = 1.
•
El Led “D2” tiene su “cátodo” conectado al pin RB0 del puerto “B”, por lo tanto el Led
sólo encenderá cuando RB0 = 0
64
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Empecemos con la creación de un nuevo proyecto, siguiendo los pasos comentados en la
sección “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 programación:
Figura 2.20
Nótese que en la ventana de programación mikroBasic ha generado automáticamente una
pequeña estructura de programa que nos servirá de guía para comenzar a programar. En
este caso, lo primero que vamos a agregar será la línea de configuración del puerto “B”, ya
que en él hemos conectado los Leds que deseamos encender. Para determinar la palabra
de configuración del registro TRISB, veamos la siguiente figura:
1
1
Registro TrisB
1
1
1
1
0
0
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 línea en la estructura del programa:
program Ejemplo1
' Area de declaración.
main:
' Programa Principal
TRISB = %11111100
' Configuración 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 declaración.
main:
' Programa Principal
TRISB = %11111100
' Configuración 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 según lo esperado, compilamos el programa a
través 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 además el archivo de extensión .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 programación #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 través de los pines
RD0 y RD1 del puerto “D”.
Esto significa que debemos configurar los pines RD0 y RD1 como entradas a través de
registro TRISD, para poder tomar lectura del estado en el cual se encuentran, de tal forma
que podamos tomar una decisión 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 continuación 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 línea de código y sus
respectivos comentarios:
program Ejemplo2
' Area de declaración.
main:
'
Programa Principal.
TRISB = %11111100 ' Configuración del Puerto "B"
TRISD = %11111111 ' Configuración 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 verificación 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 información 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 través 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 código de programa:
program Ejemplo2
' Area de declaración.
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 ' Configuración del Puerto "B"
TRISD = %11111111 ' Configuración 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 verificación 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 programación #3: En este ejemplo haremos uso de la librería “Button”
de mikroBasic.
“Button” permite eliminar rebotes en pulsadores o interruptores, evitando así errores de
lectura que pueden generar mal funcionamiento de nuestros diseños.
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 específico del puerto que estaremos utilizando
para tomar lectura de un pulsador o interruptor.
•
Tiempo: Este campo es un período 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 máximo para el período de anti-rebote,
es decir “255”, el tiempo de anti-rebote será de 250 milisegundos.
•
Estado Activo: Este parámetro puede ser cero (0) ó uno (1). A través de este campo
podemos definir si el pulsador o interruptor estará activo con un 0 lógico o con un 1
lógico.
Esta rutina también 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 práctico, basado en el ejemplo de programación #2.
program Ejemplo3
' Area de declaración.
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 ' Configuración del Puerto "B"
TRISD = %11111111 ' Configuración 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 verificación 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
decisión con respecto al puerto de salida.
Para comprender mejor el funcionamiento de esta rutina, analizaremos la señal 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 momentáneamente el pulsador P1, pero no lo mantenemos activo el
tiempo suficiente para cumplir con el período 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 duración, 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.
También es posible utilizar la rutina Button de la siguiente manera:
program Ejemplo_3_1
' Area de declaración.
Symbol D1 = PORTB.0
Symbol D2 = PORTB.1
main:
'
' Alias del Pin RB0
' Alias del Pin RB1
Programa Principal.
TRISB = %11111100 ' Configuración del Puerto "B"
TRISD = %11111111 ' Configuración 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 verificación 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 continuación estudiaremos las librerías encargadas del control de pantallas LCD y GLCD
de mikroBasic PRO a través de ejemplos claros y de fácil entendimiento.
Pantalla LCD Alfanumérica
Pantalla Gráfica GLCD
3.1.- Pantallas LCD, estudio de la librería 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 programación. Al hacer esto, entonces tendremos una base sobre la cual trabajar
el programa, en el cual debemos definir los pines de conexión de la misma, de manera que
el microcontrolador sepa donde dirigir la información y las instrucciones que controlarán
estos módulos.
3.1.1.- Identificación de los pines de una pantalla LCD: Veamos a continuación la
descripción de cada uno de los pines de una pantalla LCD:
Figura 3.1. Pinout de un módulo LCD con
conexión a Vcc, Gnd y Control de contraste.
Pin 1, 2 y 3: como se puede observar en la figura 6.4, en la mayoría de las pantallas LCD, el
Pin No. 1 y 2 corresponden a la alimentación de la pantalla, GND y Vcc, donde el voltaje
77
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
máximo comúnmente 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
instrucción, pero cuando RS es uno, el dato presente en el bus corresponde a un registro de
datos o caracter alfanumérico.
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 condición indica que podemos
escribir un dato en la pantalla. Si R/W = 1, esta condición nos permite leer un dato desde la
pantalla LCD.
Pin 6: "E" (Enable), este es el pin de habilitación, es decir, si E = 0 el módulo LCD se
encuentra inhabilitado para recibir datos, pero si E = 1, el módulo 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 líneas que se utilizan para
colocar el dato que representa una instrucción para el modulo LCD o un carácter
alfanumérico.
Pin 15-16: "BackLight", en muchos modelos de LCD, los pines 15 y 16 son respectivamente
el “Ánodo” y el “Cátodo”, aunque se pueden encontrar en el mercado modelos de pantallas
LCD donde esta condición es configurable desde la parte posterior del circuito impreso a
través de “Jumpers”, o conexiones donde podemos invertir los Pines, de manera tal que el
Pin 15 sea el “Cátodo” y el Pin 16 el “Ánodo”, como se muestra en la figura 3.2.
Figura 3.2
3.1.2.- Conexión y configuración 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 deberán estar conectados en un solo puerto y nunca en puertos diferentes. Si
deseamos trabajar solo con los cuatro bits más significativos del bus, estos deberán ser
conectados en los cuatro bits menos significativos de un puerto o en los cuatro bits más
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 configuración 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 librería para el control de pantallas LCD a 4 bits, denominada “LCD Library”.
•
La segunda configuración 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 configuración será descartada en esta
ocasión, 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 prácticas basadas en la configuración de 4 bits, como se
sugiere en el siguiente diagrama esquemático. Diagrama de conexión entre un módulo LCD
y un PIC16F877 en configuración 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 esquemático de la figura 3.3, la configuración de pines se realiza de
la siguiente manera:
' Configuración 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 configuración de conexiones
La configuración 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 módulo LCD. Normalmente se ubica al inicio del
programa, después de la etiqueta de inicio y no en la zona de declaración de variables o
configuración 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
programación 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
Propósito
_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 posición 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 fácilmente acciones
como mover el cursor o limpiar la pantalla entre otras como se demuestra en el próximo
ejercicio, pero antes veamos otras rutinas importantes.
3.1.5.- Lcd_Out(Fila, Columna, Texto)
La rutina Lcd_Out() nos permite escribir en una posición específica de la pantalla LCD, su
estructura es muy sencilla y se ve como sigue a continuación:
Ejemplo:
Lcd_Out(1, 4, “mikroBasic”)
Este ejemplo se interpreta de la siguiente forma: Escribir la palabra “mikroBasic” (sin incluir
las comillas) en la línea 1 de la pantalla, empezando en la columna 4.
Si deseamos escribir en la segunda línea de la pantalla, pero a partir de la primera columna,
entonces el cambio en la rutina sería 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 programación #4: Veamos a continuación un ejemplo de
programación, basados en el diagrama esquemático 3.3, y utilizando las rutinas hasta ahora
comentadas:
program Proyecto_LCD_1
' Sección de Declaración
' Configuración 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 configuración 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 librería LCD ha sido
incluida al crear el proyecto. Esto lo sabremos fácilmente desplegando la pestaña del
administrador de librerías, en la cual deberán estar seleccionadas las librerías
correspondientes a este ejercicio:
82
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Figura 3.6
Observe que cuando la librería correspondiente no ha sido incluida, las rutinas de nuestros
programas son subrayadas por una línea 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 línea de programación, 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 través de la rutina LCD_Init().
•
Limpiamos la pantalla LCD con el comando correspondiente, según 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 línea 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 programación #5:
Veamos otro ejemplo utilizando otros comandos de la tabla:
program Proyecto_LCD_2
' Sección de Declaración
Dim I As Byte
' Configuración 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 configuración 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 pequeña pausa de 300 milisegundos. Por último
85
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
apagamos la pantalla LCD a través del comando _Lcd_Turn_Off, esperamos 2 segundos y
comenzamos el proceso haciendo un salto a la etiqueta “main”.
También 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 programación #5.1: Verifique el siguiente programa y lea
detenidamente sus comentarios. Rápidamente podrá notar los cambios con respecto al
ejemplo anterior:
program Proyecto_LCD_3
' Sección de Declaración
Dim I As Byte
' Configuración 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 configuración 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 función de esta rutina es escribir
en la pantalla LCD los caracteres especificados en la posición en la cual ha quedado el
cursor.
3.1.6.1.- Ejemplo de programación #6:
program Proyecto_LCD_4
' Sección de Declaración
' Configuración 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 configuración 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 posición
' 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
continuación:
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 posición en la cual ha
quedado el cursor.
3.1.8.1.- Ejemplo de programación #7: El siguiente ejercicio, imprime en la fila 1, columna
8 de la pantalla LCD el caracter “@”.
program Proyecto_LCD_5
' Sección de Declaración
' Configuración 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 configuración 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 posición 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.- Parámetros de rutinas cargados en variables:
Los parámetros de las rutinas son los campos que debemos completar dentro de ellas, para
obtener un resultado específico según la función para la cual ha sido creada. Por ejemplo,
los parámetros 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 específicas dentro de la misma. Para visualizar este
concepto de forma clara, supongamos que deseamos imprimir en la primera línea de la
pantalla e iniciando en la primera columna la palabra “mikro”. La forma más directa y sencilla
de hacer esto sería:
LCD_Out(1,1,"mikro")
' Imprime en la linea 1 y columna 3
Pero en algunos casos, será necesario controlar estos parámetros a través de variables las
cuales pueden cambiar su valor o contenido según sea necesario para la aplicación que
estemos desarrollando.
Dim fila As Byte
' declaración de la variable "fila" tipo byte
' declaración de la variable "columna" tipo byte
columna As Byte
texto As String[10] ' declaración 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 programación #8:
program Proyecto_LCD_6
' Sección de Declaración
Dim fila As Byte
columna As Byte
' declaración de la variable "fila" tipo byte
' declaración de la variable "columna" tipo byte
' Configuración 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 configuración 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 posición
' 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 programación 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 programación #9:
program Proyecto_LCD_7
' Sección de Declaración
Dim fila
columna
texto1
texto2
As
As
As
As
Byte
Byte
string[8]
string[8]
'
'
'
'
declaración de la variable "fila" tipo byte
declaración de la variable "columna" tipo byte
Variable tipo String "texto1"
Variable tipo String "texto2"
' Configuración 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 configuración 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 posición
' 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 numérica en una pantalla LCD:
Es muy importante tomar en cuenta que para visualizar el contenido de una variable
numérica a través de la pantalla LCD, debemos seguir un procedimiento sencillo el cual
involucra una de las librerías de mikroBasic denominada “Conversions”.
Esta librería contiene varias rutinas a través de las cuales podremos convertir el contenido
de una variable en un string de datos, los cuales podrán ser presentados en la pantalla con
la ayuda de la rutina Lcd_Out(), tal y como lo estudiamos en el ejemplo de programación #9.
Para comprender de forma clara este punto, supongamos que se desea visualizar el
contenido numérico de las siguientes variables en la pantalla LCD:
' Area de declaración.
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 través 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() sólo es capáz de imprimir variables tipo “cadena” o
“string”. En este caso, la solución se extrae de la librería “Conversions” de mikroBasic, la
cual posee una rutina específica para cada caso de conversión de variables según su tipo de
declaración:
•
ByteToStr(“variable tipo Byte a convertir”, “variable tipo string”): convierte una
variable tipo “Byte” en una cadena de caracteres los cuales serán 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 serán 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 serán 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 serán almacenados en
una variable tipo “string” previamente declarada.
Veamos a continuación un ejemplo de conversión de datos almacenados en tres diferentes
tipos de variables, Byte, Word y Float.
3.3.1.- Ejemplo de programación #10:
program Proyecto_LCD_8
' Sección de Declaración
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.
' Configuración 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 configuración 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 programación #11:
Para hacer un poco más 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.
Específicamente en los puertos RD0 y RD1, los cuales debemos de configurar como
entrada, y los cuales cuentan además con una resistencia Pull Down de 10 kohm, como se
demuestra en el siguiente diagrama esquemático:
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 también 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 estarán
conectados los pulsadores P1 y P2.
94
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
•
Puerto B: se inicializa según la configuración de la pantalla LCD, la cual en este caso
se mantiene con respecto al diagrama esquemático 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
lógico. Debemos considerar que el estado lógico 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 lógico 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 límites en los
extremos, es decir, un límite inferior igual a uno (1), y un límite superior igual a cincuenta
(50):
•
La primera condición 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 máximo a ser
mostrado en la pantalla sea igual a cincuenta, el cual es el límite superior fijado
propuesto en el planteamiento anterior.
•
La segunda condición 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 mínimo a ser mostrado en la pantalla siempre sea igual a uno
(1), el cual es el límite inferior propuesto.
program Proyecto_LCD_8
' Sección de Declaración
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
' Configuración 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 configuración de conexiones
TRISD = $FF
' Configuración 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 numérico en String.
Imprime el contenido cargado en "txt" en la fila 2,
columna 8.
'
'
'
'
'
Verifica si la condición 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 numérico 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 límite 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 condición 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 numérico 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 límite 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 ningún 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 líneas de código 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 numérico en String.
' Imprime el contenido cargado en "txt" en la fila 2,
' columna 8.
While PortD.0 = 1
.
.
.
Se observa además en el programa que estamos realizando una conversión 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 librería “Conversions” la cual deberá estar seleccionada en
la pestaña de librerías, 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 condición 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 numérico 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 límite 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 sólo si
PortD.0 = 1. Entonces, al presionar P1, la condición en la instrucción “while” se cumple y el
microcontrolador pasa a ejecutar la siguiente línea en la cual incrementamos el valor de la
variable “dato” en una unidad.
Después 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 análisis del pulsador P2, el cual decrementa el
valor de la variable “dato”
3.3.3.- Ejemplo de programación #12:
En el siguiente proyecto nos hemos basado en el diagrama de la figura 3.11 para efectuar la
programación del microcontrolador.
La idea principal en este ejemplo, será mostrar un menú inicial en la pantalla LCD, tal y
como se observa a continuación:
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 también deberá permanecer visible durante 5 segundos para luego retornar al
menú inicial:
Figura 3.16
Lea detenidamente los comentarios de cada línea 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
' Sección de Declaración
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]
' Configuración 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 configuración de conexiones
TRISD = $FF
' Configuración 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 través de un alias.
•
Declaración de las variables en las cuales deseamos almacenar el texto a ser
mostrado en la pantalla LCD.
•
Configuración 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 línea
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 Gráfica o GLCD (Graphic Liquid Crystal Display).
MikroBasic cuenta con librerías para el control de pantallas GLCD, facilitando la tarea y
haciendo que nuestros proyectos se vean mejor, ofreciendo además funciones que no
podríamos tener con una pantalla alfanumérica convencional.
Por su puesto, el uso de una pantalla gráfica se justifica cuando es necesario incluir en
nuestros proyectos mas espacio para la visualización de datos, sin dejar atrás el hecho de
que podremos realizar gráficos o dibujos que complementen dicha información, y los cuales
nunca podremos realizar en una pantalla alfanumérica convencional.
Para realizar el estudio de estas librerías, hemos realizado el siguiente diagrama de
conexión entre un módulo 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.- Configuración de pines de control y datos en mikroBasic.
Al igual que para una pantalla LCD, el primer paso siempre será establecer la configuración
de pines entre el módulo GLCD y el microcontrolador. Sin este paso el módulo nunca
arrancará, evitando que podamos avanzar en la programación de nuestros proyectos.
Para inicializar la pantalla GLCD según la configuración de pines del diagrama de la figura
3.17, usaremos el siguiente arreglo:
' Configuración de conección del módulo 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 configuración del módulo 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 páginas en blanco en las cuales podremos
escribir. Llamemos a estas dos páginas CS1 (primera página) y CS2 (segunda página).
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 línea 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 continuación, con respecto
al diagrama esquemático 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 página de la izquierda, es decir, en la
página 1.
Figura 3.19
Pero si llegáramos a invertir esta configuración, 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
También por hardware, invirtiendo el conexionado de pines entre el microcontrolador y la
pantalla, y manteniendo la ubicación de la palabra “mikroBasic” en la pantalla, es decir, línea
4 y columna 0, el resultado sería que la palabra “mikroBasic” sigue estando en la primera
página, solo que esta vez se encontrará a la derecha de la pantalla, tal y como se muestra a
continuación:
Figura 3.20
3.5.- Librería GLCD.
La librería GLCD nos ofrece un repertorio de rutinas muy útiles que nos permiten hacer de la
programación para el control de estos dispositivos una tarea sencilla y de fácil comprensión.
Realizaremos un estudio detenido de cada rutina aplicando su función específica en
ejemplos cortos y sencillos para tener una base clara y práctica sobre el tema y la cual será
empleada en varios nuevos proyectos en los capítulos 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 librería Glcd de
mikroBasic.
El tamaño 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 ubicación
específica, sin necesidad de llamar a un archivo de fuentes en el programa.
Un ejemplo de esto se puede ver a continuación 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 programación #13:
program pantalla_glcd_01
' Configuración de conección del módulo 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 configuración del módulo 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 también pueden
estar asociados a un módulo de fuentes adicional, el cual define la forma o estilo de cada
carácter de una manera personalizada.
3.5.3.- Módulo de Fuentes en mikroBasic.
Este módulo de fuentes es un archivo de extensión .mbas el cual podemos crear para definir
el estilo de caracteres que deseamos mostrar en la pantalla LCD.
Por ejemplo, podríamos 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 edición del libro “Basic para microcontroladores PIC”, vamos a
apoyarnos en una pequeña tabla cuadriculada para generar un caracter de estilo
personalizado. Los caracteres que a continuación vamos a definir serán 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 píxel 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 píxeles que deseamos activar para formar una
figura. Entonces, basados en la columna 1 de la figura 3.22, podríamos decir que solo
activaremos los píxeles 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 píxel activo y recordando del sistema
numérico 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 píxeles 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 conversión, 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
x
x
F1
F5
x
F2
x
F3
x
F4
x
F6
E
F7
F8
7
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 continuación un módulo de “fonts” ya creado, y ubiquemos el caracter “A” en el
código:
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 código para crear 98 caracteres personalizados, donde cada caracter
tiene asignado 5 bytes, dando como resultado la declaración 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 cálculos que hemos efectuado anteriormente. De igual forma
deberán existir los bytes calculados para cada uno de los caracteres que deseamos mostrar
en la pantalla Glcd.
Una vez que hemos realizado todos los cálculos 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 también
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 creación 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 opción “New Unit”, o simplemente
accedemos a esta opción a través del atajo “Ctrl+N”.
Figura 3.29
113
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
2.- Copiamos el código 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 continuación:
Figura 3.30
114
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Este archivo es importante porque contiene el código responsable de dar forma a cada
número, letra, o caracter especial que deseamos mostrar en la pantalla Glcd. Además, este
archivo deberá estar en la misma ruta o carpeta en la cual está el proyecto en el cual
realizaremos el código correspondiente para escribir en la pantalla.
3.- Creamos un nuevo proyecto en mikroBasic, el cual estará basado en el diagrama
esquemático 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 través 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 módulo de fuentes descrito anteriormente.
3.5.3.1.- Ejemplo de programación #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 máximo de 20 caracteres.
' Configuración de conección del módulo 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 configuración del módulo Glcd
main:
Glcd_Init()
Glcd_Fill(0x00)
' Limpiamos la pantalla
Glcd_Set_Font(@fuentes5x8, 5, 8, 32) ' Elegimos el módulo 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 módulo de fuentes “mis_fuentes.mbas” en el programa a través de la
instrucción “include”. No es necesario escribir la extensión 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 conexión
de la figura 3.17.
•
Limpiamos la pantalla Glcd, llenando cada píxel con un cero lógico a través de la
rutina Glcd_Fill(), la cual detallaremos a continuación.
•
Cargamos el módulo de fuentes de 5x8 a través de la rutina Glcd_Set_Font(), la cual
detallaremos a continuación.
•
Cargamos el mensaje en la variable “texto”.
•
Enviamos el mensaje cargado en la variable “texto” a la pantalla Glcd a través de la
rutina Glcd_Write_Text() la cual detallaremos a continuación.
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 lógico (0) en cada píxel, o para verificar la pantalla observando cada
píxel encendido al aplicar un uno lógico (1) en cada uno de ellos. Entonces, si escribimos
Glcd_Fill(0), tendremos todos los píxeles apagados, y si escribimos Glcd_Fill($FF)
tendremos todos los píxeles encendidos.
En nuestro programa, hemos escrito Glcd_Fill(0x00), la cual es una forma de un número 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 módulo “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(dirección
de la fuente, ancho, alto, posición 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 través 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 carácter 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 continuación:
Glcd_Write_Text(texto, posición en x, línea, 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 “Posición en x”, indica a partir de que píxel 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 píxel número 35.
El campo “línea”, indica el número de línea en la cual vamos a escribir, a partir de la línea 0
hasta la línea 7. La cantidad de líneas en este tipo de pantallas al escribir texto, depende
sólo del tamaño de la fuente que hemos creado. En nuestro caso, tendremos un total de 8
líneas 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 librería “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 prácticos de conversión.
Para una variable tipo byte:
Dim
dato
As Byte
datoStr As String[3]
dato = 20  Conversión: byteToStr(dato, datoStr)
Para una variable tipo word:
Dim
dato
As Word
datoStr As String[5]
dato = 1023  Conversión: 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  Conversión: floatToStr(dato, datoStr)
Veamos a continuación un ejemplo en el cual se imprime el valor de una variable tipo Word
en una posición predeterminada de la pantalla Glcd.
3.5.6.1.- Ejemplo de programación #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 máximo de 20 caracteres.
Dim dato As Word
' Declaramos una variable tipo Word.
datoStr As String[5] ' Declaramos una variable tipo String.
' Configuración de conección del módulo 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 configuración del módulo 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 módulo 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 continuación cuales son las rutinas para crear gráficos de una forma simple y
rápida.
3.5.7.- Glcd_Dot(x, y, color).
Esta rutina nos permite encender o apagar un píxel específico en la pantalla, a través de sus
coordenadas (x, y).
El campo color tiene tres posibles estados:
•
•
•
0, apaga el píxel especificado.
1, enciende el píxel especificado.
2, invierte el estado del píxel especificado.
Veamos el siguiente ejemplo, basado en el diagrama esquemático de la figura 3.17.
3.5.7.1.- Ejemplo de programación #16:
program Proyecto_Glcd_04
' Configuración de conección del módulo 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 configuración del módulo Glcd
main:
Glcd_Init()
Glcd_Fill(0)
Glcd_Dot(64, 32, 1)
' Inicializamos la pantalla
' Limpiamos la pantalla
' activamos el píxel en X = 0 , Y = 0
End.
El resultado es el siguiente:
Figura 3.36
El programa enciende el píxel 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 través de la rutina
Glcd_Fill(0), llenaremos con un 1 lógico en cada píxel, utilizando la rutina Glcd_Fill($FF), y
seguidamente apagaremos un píxel específico de coordenada (64, 32).
3.5.7.2.- Ejemplo de programación #17:
program Proyecto_Glcd_05
' Configuración de conección del módulo 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 configuración del módulo Glcd
main:
Glcd_Init()
Glcd_Fill($FF)
' Inicializamos la pantalla
' Llenamos la pantalla
Glcd_Dot(64, 32, 0)
' activamos el píxel en X = 0 , Y = 0
End.
Para ver el efecto de cambio de estado de un Píxel cuando el campo “color” es igual a 2,
hacemos una pequeña modificación al programa anterior, de tal manera que el píxel
especificado cambie de estado cada 1 segundo.
3.5.7.3.- Ejemplo de programación #18:
program Proyecto_Glcd_06
' Configuración de conección del módulo 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 configuración del módulo Glcd
main:
Glcd_Init()
Glcd_Fill($FF)
' Inicializamos la pantalla
' Llenamos la pantalla con un 1 lógico en cada pixel
intermitencia:
Glcd_Dot(64, 32, 2)
Delay_ms(1000)
GoTo intermitencia
' cambiamos el estado del píxel 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 línea entre dos coordenadas específicas, (x1, y1) y (x2, y2). El estado
de los píxeles de la línea, 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 píxeles de la línea.
1, enciende los píxeles de la línea.
2, invierte el estado de los píxeles en la línea.
Veamos un ejemplo práctico.
3.5.8.1.- Ejemplo de programación #19:
program Proyecto_Glcd_07
' Configuración de conección del módulo 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 configuración del módulo 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 sería el efecto inverso.
3.5.8.2.- Ejemplo de programación #20:
program Proyecto_Glcd_08
' Configuración de conección del módulo 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 configuración del módulo 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 línea vertical en la pantalla Glcd. Para esto, solo será
necesario indicar los dos valores entre los cuales se dibujará la línea, y el valor
correspondiente al eje x, en el cual estará ubicada dicha línea.
Al igual que en la rutina anterior, cuando el campo “color” es igual a:
•
•
•
0, apaga los píxeles de la línea.
1, enciende los píxeles de la línea.
2, invierte el estado de los píxeles en la línea.
Veamos un ejemplo práctico.
3.5.9.1.- Ejemplo de programación #21:
program Proyecto_Glcd_09
' Configuración de conección del módulo 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 configuración del módulo 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 línea horizontal en la pantalla Glcd. Para esto, solo será
necesario indicar los dos valores entre los cuales se dibujará la línea, y el valor
correspondiente al eje y, en el cual estará ubicada dicha línea.
Al igual que en la rutina anterior, cuando el campo “color” es igual a:
•
•
•
0, apaga los píxeles de la línea.
1, enciende los píxeles de la línea.
2, invierte el estado de los píxeles en la línea.
Veamos un ejemplo práctico.
3.5.10.1.- Ejemplo de programación #22:
program Proyecto_Glcd_10
' Configuración de conección del módulo 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 configuración del módulo 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 rectángulo especificando tan solo dos
esquinas opuestas diagonales, Las coordenadas de estas dos esquinas determinarán el
tamaño en píxeles, y el campo “color” aplica las mismas reglas de las rutinas anteriores:
•
•
•
0, apaga los píxeles de la línea.
1, enciende los píxeles de la línea.
2, invierte el estado de los píxeles en la línea.
Veamos a continuación dos ejemplos prácticos.
3.5.11.1.- Ejemplo de programación #23:
program Proyecto_Glcd_11
' Configuración de conección del módulo 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 configuración del módulo Glcd
main:
Glcd_Init()
Glcd_Fill(0)
' Inicializamos la pantalla
' Limpiamos la pantalla
Glcd_Rectangle(26, 26, 102, 38, 1)
' Rectángulo:
' (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 programación #24:
program pantalla_glcd_12
Dim x1
x2
y1
y2
As
As
As
As
Byte
Byte
Byte
Byte
' Declaración de variables para coordenadas de puntos.
'
'
'
' Configuración de conección del módulo 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 configuración del módulo Glcd
main:
x1
y1
x2
y2
=
=
=
=
0
0
127
63
' Inicializamos las variables con los datos necesarios
' para generar un rectangulo de coordenadas máximas en una
' pantalla de 128 x 64 píxeles.
Glcd_Init()
Glcd_Fill(0)
' Inicializamos la pantalla
' Limpiamos la pantalla
rectangulo:
Glcd_Rectangle(x1, y1, x2, y2, 1)
delay_ms(500)
' Rectángulo:
' (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 límite en el tamaño del cuadro.
Si el límite 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 rectángulo de menor tamaño que el anterior hasta
llegar al límite 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 rectángulo.
La diferencia radica en que esta vez se activaran todos los píxeles internos.
Veamos un ejemplo.
3.5.12.1.- Ejemplo de programación #25:
program pantalla_glcd_13
' Configuración de conección del módulo 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 configuración del módulo 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)
' Rectángulo:
' (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 programación #26:
program pantalla_glcd_14
' Configuración de conección del módulo 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 configuración del módulo Glcd
main:
Glcd_Init()
Glcd_Fill($FF)
' Inicializamos la pantalla
' Limpiamos la pantalla
Glcd_Box(26, 26, 102, 38, 0)
' Rectángulo:
' (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 píxeles en el campo del mismo nombre, y al igual que en las
rutinas anteriores, de color activo específico.
Veamos un ejemplo.
3.5.13.1.- Ejemplo de programación #27:
program pantalla_glcd_15
' Configuración de conección del módulo 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 configuración del módulo Glcd
main:
Glcd_Init()
Glcd_Fill(0)
Glcd_Circle(63, 31, 25, 1)
' Inicializamos la pantalla
' Limpiamos la pantalla
' Círculo.
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 podría aumentar el tamaño del radio, sobrepasando el límite
permitido por el número de píxeles de la pantalla. El resultado es muy interesante).
La solución respectiva para su forma inversa sería la siguiente:
3.5.13.2.- Ejemplo de programación #28:
program pantalla_glcd_16
' Configuración de conección del módulo 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 configuración del módulo Glcd
main:
Glcd_Init()
Glcd_Fill($FF)
' Inicializamos la pantalla
' Limpiamos la pantalla
Glcd_Circle(63, 31, 25, 0)
' Círculo.
End.
135
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
El resultado será el siguiente:
Figura 3.46
Otro ejemplo interesante podría ser dibujar una secuencia de círculos utilizando la
instrucción For – Next:
3.5.13.3.- Ejemplo de programación #29:
program pantalla_glcd_17
Dim Radio As Byte
I
As Byte
'
'
'
'
Declaramos la variable "Radio" para poder modificar
el tamaño de los circulos consecutivos.
Variable para generar repeticiones a través de la
instrucción For-Next.
' Configuración de conección del módulo 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 configuración del módulo 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
' Díez repeticiones de la siguiente rutina:
Glcd_Circle(63, 31, Radio, 1)
' Círculo
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
Capítulo IV. Librería Trigon – Funciones Trigonométricas
4.1.- Funciones Trigonométricas.
Veamos a continuación algunas funciones trigonométricas disponibles en mikroBasic que
nos permitirán realizar algunos cálculos complejos de una forma sencilla y práctica:
•
sin(x): calcula el seno del valor de “x”. Retorna un valor en radianes entre -1 y 1.
•
sinh(x): calcula el seno hiperbólico de “x”, definido matemáticamente como
•
cos(x): calcula el coseno del valor de “x”. Retorna un valor en radianes entre -1 y 1.
•
cosh(x): calcula el coseno hiperbólico de “x”, definido matemáticamente 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 raíz cuadrada de “x”.
•
exp(x): La función devuelve el valor de e, la base de los logaritmos naturales, elevado
a la potencia “x”, es decir, e x .
tangente
hiperbólica
de
“x”,
definida
e x − e−x
.
2
e x + e−x
.
2
matemáticamente
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 programación #30:
Veamos un ejemplo de programación para el uso de funciones trigonométricas, basados en
el diagrama esquemático de la figura 4.1:
Figura 4.1
Ejemplo para el calculo del sin(x), donde x = -0.5
program Trigon
' Sección de Declaración
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.
' Configuración 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 configuración 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 continuación 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 programación #31: Ejemplo para el calculo del cos(x), donde x = 1.
program Trigon
' Sección de Declaración
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.
' Configuración 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 configuración 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 continuación 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 programación #32: Ejemplo para el calculo de la tan(x), donde x = 0.6.
program Trigon
' Sección de Declaración
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.
' Configuración 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 configuración 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 continuación 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 programación #33: En el siguiente ejemplo de programación
realizaremos un programa para el control de una calculadora sencilla, cuya función principal
será realizar las siguientes operaciones en base a dos valores introducidos desde un
teclado:
•
•
•
•
•
Suma.
Resta.
Multiplicación.
División.
Raíz Cuadrada de un valor.
El procedimiento para realizar una operación en la calculadora es el siguiente:
1.
2.
3.
4.
Ingresamos el primer valor de la operación.
Pulsamos el botón correspondiente al tipo de operación: + - * /
Ingresamos el segundo valor de la operación.
Pulsamos el botón de "Igualdad" para obtener el resultado.
En el caso del cálculo de la raíz cuadrada de un número:
1. Ingresamos el valor de la operación.
2. Pulsamos el botón correspondiente al cálculo de la raíz cuadrada “Sqrt”.
Si deseamos realizar una nueva operación, se deberá pulsar el botón de “Reset” del circuito
para inicializar todo el programa.
Analice y lea detenidamente los comentarios realizados en cada línea del programa, ya que
la explicación del procedimiento de cálculo se encuentra a lo largo de todo el cuerpo del
programa.
El ejemplo está basado en el diagrama esquemático de la figura 4.5. El microcontrolador
elegido para este ejemplo ha sido el PIC18F442. Se debe tomar en cuenta que cada botón
en el teclado deberá tener la configuración 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
' Sección de Declaración
Dim pulsador
As Byte
' Variable para almacenar el resultado de
' la rutina "keypad".
txt As String[25]
' Variable para la conversión 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 operación, ejemplo, si la operación 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 operación vamos a hacer
con los valores, es decir, si Operación = 1 será una
suma; si Operación = 2 será una resta; si Operación = 3
será una multiplicación; si Operación = 4 será una
división.
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 operación matemática. 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]"
' Configuración 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 configuración 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 dígito que introducimos desde el Teclado para un Valor de la operación
matemática 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 dígitos del primer valor (1500) se almacenarán 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 operación en
una calculadora común, es el siguiente:
1ro.2do.3ro.4to.-
Ingresamos el primer valor de la operación.
Pulsamos el botón correspondiente al tipo de operación: + - * /
Ingresamos el segundo valor de la operación.
Pulsamos el botón de "Igualdad" para obtener el resultado.
Cada vez que introducimos un nuevo dígito, incrementamos el indice de referencia
del arreglo Digito[I], es decir, I = I + 1. De esta forma nos aseguramos que
cada dígito de un valor de la operación 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 operación:
'
'
'
'
La siguiente subrutina, realiza este cálculo hasta el dígito numero nueve de un
valor, y los cálculos de la explicación que acabamos de ver se realizan diferente
pero generan el mismo resultado. Analice cómo se realiza el cálculo del valor[1] a
continuación:
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 sería:
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 sería:
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 dígito 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 dígito.
Digito[1] = Digito[1] * 10
Valor[X] = Digito[1] + Digito[2]
End If
If I = 3 Then
' Significa que hemos introducido un tercer dígito.
Valor[X] = Valor[X] * 10
Valor[X] = Valor[X] + Digito[3]
End If
If I = 4 Then
' Significa que hemos introducido un cuarto dígito.
Valor[X] = Valor[X] * 10
Valor[X] = Valor[X] + Digito[4]
End If
If I = 5 Then
' Significa que hemos introducido un quinto dígito.
Valor[X] = Valor[X] * 10
Valor[X] = Valor[X] + Digito[5]
End If
If I = 6 Then
' Significa que hemos introducido un sexto dígito.
Valor[X] = Valor[X] * 10
Valor[X] = Valor[X] + Digito[6]
End If
If I = 7 Then
' Significa que hemos introducido un septimo dígito.
Valor[X] = Valor[X] * 10
Valor[X] = Valor[X] + Digito[7]
End If
If I = 8 Then
' Significa que hemos introducido un octavo dígito.
Valor[X] = Valor[X] * 10
Valor[X] = Valor[X] + Digito[8]
End If
If I = 9 Then
' Significa que hemos introducido un noveno dígito.
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 dígito.
' A medida que vamos introduciendo dígitos al valor deseado para la operación
146
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
' matemática, 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 dígito.
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 dígitos
de la variable "Valor[1]", por lo tanto, lo que hacemos en adelante es
mantener en memoria qué tipo de operación deseamos realizar a través
de la asignación de un valor cargado en la variable "Operación" el cual
se corresponderá al tipo de operación 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 serán utilizadas para almacenar los dígitos del
' segundo valor de la operación matemática.
X = 2
' X = 2 debido a que el resultado de introducir los dígitos del
' segundo valor de la operación será almacenado en "Valor[2]".
Lcd_Out(1, 1, "Calculadora: +
Lcd_Out(2, 1, "
GoTo inicio
Resta:
")
")
' Anunciamos el tipo de operación en la LCD,
' en este caso se observa que hemos agregado
' el símbolo "+".
' Salta a la etiqueta "inicio" para recibir los digitos del
' segundo valor de la operación matemática.
' 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 operación.
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 operación (+ - * /) 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 operación.
' Mostramos el resultado en la pantalla LCD.
Fin: GoTo Fin ' Lazo Infinito. Si deseamos realizar una nueva operación matemática
' entoces debemos reiniciar el microcontrolador a través 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 están asignados para realizar un salto a las
' subrutinas correspondientes a la operación matemática deseada:
' Si pulsamos el botón "Suma", entonces el programa salta a la subrutina "Suma":
If Button(PortD, 2, 150, 1) Then
GoTo Suma
End If
' Si pulsamos el botón "Resta", entonces el programa salta a la subrutina "Resta":
If Button(PortD, 3, 150, 1) Then
GoTo Resta
End If
' Si pulsamos el botón "Mult.", entonces el programa salta a la subrutina "Multiplicacion":
If Button(PortD, 4, 150, 1) Then
GoTo Multiplica
End If
' Si pulsamos el botón de "Div.", entonces el programa salta a la subrutina "Divide":
If Button(PortD, 5, 150, 1) Then
GoTo Divide
End If
' Si pulsamos el botón "Sqrt", entonces el programa salta a la subrutina "RaizCuadrada":
If Button(PortD, 6, 150, 1) Then
GoTo RaizCuadrada
End If
' Si pulsamos el botón "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 dígitos del primer valor. Veamos un
ejemplo de una operación matemática:
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 operación:
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
Capítulo V. Librería Sound
5.1.- Rutinas de la librería de sonido de mikroBasic.
A través de esta librería, mikroBasic nos facilita la generación de sonidos de frecuencias
predefinidas y con una duración que podemos especificar fácilmente. Esta librería cuenta
con dos únicas rutinas:
•
Sound_Init(Puerto, Pin).
•
Sound_Play(Frecuencia, Duración).
Estas dos rutinas son muy intuitivas por lo cual será muy sencillo visualizar un diseño que
genere tonos audibles para el oído humano.
Un ejemplo práctico y útil para demostrar el uso de esta librería, 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 específicas
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 símbolo # 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 continuación y las cuales utilizaremos como punto de partida para la
generación de tonos de una escala musical.
Una formula matemática 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 raíz duodécima
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 matemática correspondiente para calcular este valor seria
la siguiente:
La # = 440 Hz × 12 2 = 440 × 1.059454545 = 466.15 Hz
Si deseáramos hallar la nota inmediatamente inferior a la nota de referencia “L”, entonces la
formula matemática para calcular este valor sería la siguiente:
La # =
440 Hz
12
2
=
440 Hz
= 415.30 Hz
1.059454545
Entonces, realizando los cálculos 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 través de un programa
en mikroBasic, el cual esta diseñado en base al diagrama esquemático de la figura 5.3:
Figura 5.3
5.1.1.- Ejemplo de programación #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
reproducirán los semitonos en este ejemplo, por lo tanto no se declaran). Estos valores
serán visualizados en la pantalla LCD mientras cada una de las notas es reproducida a
través del parlante o “Speaker” conectado al pin RD0 del puerto “D”. Recuerde verificar que
la librería “Sound” ha sido seleccionada para su proyecto para no tener errores al momento
de compilar este ejemplo.
program Sound1
' Configuración 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 configuración 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 oír los tonos correspondientes a una sexta
octava, entonces podríamos 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 programación #35:
El siguiente ejercicio es la representación de un pequeño piano con una “octava” A4
completa. En este caso hemos eliminado la pantalla LCD y hemos agregado 12 pulsadores
los cuales estarán 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 línea.
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
' Configuración de pines del puerto C.
' Configuración 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
Capítulo 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 más 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. Básicamente cuando
pulsamos un botón 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 esquemático, 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
lógico (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 edición del libro “Basic para microcontroladores PIC”, analizar un teclado
matricial para saber cual de las teclas había sido presionada, requería de una serie de pasos
en los cuales debíamos enviar un pulso a través 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 lógico presente había cambiado, de tal manera que pudiésemos
reconocer cual de las teclas en ese instante había sido presionada.
Con mikroBasic, la tarea del análisis de un teclado matricial ha sido simplificada de tal
manera a través de su librería “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 esquemático de la
figura 6.4, por lo tanto el puerto de conexión del teclado será el puerto D del
microcontrolador PIC16F877.
Antes de empezar, debemos recordar verificar que hemos seleccionado las librerías
correspondientes a los periféricos que tenemos conectados al microcontrolador. En este
caso, la pestaña de librerías del proyecto se debería ver de la siguiente forma:
Figura 6.5
163
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
6.2.- Librería KeyPad.
La configuración del puerto correspondiente al teclado matricial se debe hacer de la
siguiente manera:
dim keypadPort as byte at PORTC
Como en otros capítulos, esta línea de programación se hace al inicio del programa, en la
sección de declaración de variables. Esta línea 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 inicialización 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 línea (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 continuación 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 programación #36:
program Proyecto_KeyPad_01
' Sección de Declaración
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 conversión de Byte a String.
' Configuración 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 configuración 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 línea 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 deseáramos 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 línea despues del llamado a la
' rutina "teclado".
Analizando el programa, podemos observar que primero hemos hecho lo necesario para
configurar los puertos de conexión entre el microcontrolador y los periféricos, además de la
declaración de dos variables, una para almacenar el dato obtenido desde el teclado matricial
y la otra para realizar la conversión 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 conversión 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 cómo está identificada
cada tecla:
167
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Figura 6.9
La asociación de valores versus teclas de la tabla de la figura 6.7 pudiera ser confusa a la
hora de realizar un programa, ya que sólo la identificación 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” sería la tecla identificada con el
número “4” sobre ella, pero el valor correspondiente a ella cargado en la variable es el
número “5”, y esto continúa 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 identificación 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 programación #37:
program Proyecto_KeyPad_02
' Sección de Declaración
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".
' Configuración 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 configuración 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 línea 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 símbolo en la pantalla:
Figura 6.11
Si presionamos la tecla “#”, veremos este mismo símbolo 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 librería para el control de un teclado QWERTY - PS/2, a través del
cual podremos introducir datos a nuestros proyectos. Al igual que muchas de las librerías
anteriormente estudiadas, posee una rutina de inicialización y una rutina de captura de datos
para el teclado.
Figura 6.13
Básicamente la librería “PS/2” resuelve la comunicación entre el microcontrolador y un
teclado Qwerty en una sola vía, ya que sólo se utilizan dos líneas denominadas “Data” t Clk”.
Esto significa que cuando presionamos una tecla, la información de ésta es enviada hacia el
microcontrolador para ser procesada por el mismo (no hay comunicación desde el
microcontrolador hacia el teclado). Para que esta librería 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 comunicación del teclado, “data” y “Clk”.
Un teclado qwerty consta por lo regular de 101 teclas entre letras, números, símbolos o
teclas de funciones especiales. Cuando hacemos uso de esta librería, la rutina encargada de
realizar la comunicación y extracción de datos del teclado nos devuelve un valor numérico
que corresponderá a la tecla presionada, o dicho de otra manera, nos devolverá el valor
ASCII del símbolo correspondiente en la tecla; incluso es capaz de detectar mas de un
símbolo 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 configuración común de un teclado Qwerty la podemos observar en la siguiente figura:
Figura 6.14
Los valores correspondientes a cada uno de los símbolos en un teclado estándar han sido
escritos en color rojo en la siguiente figura al lado derecho de cada símbolo, 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
1
F2
2
F3
3
F4
4
F5
5
F6
6
F7
7
F8
8
F9
9
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 programación estarán basados en el siguiente diagrama esquemático:
Figura 6.17
La identificación de los pines en un conector PS/2 con respecto al símbolo del mismo en el
diagrama esquemático 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.- Librería PS/2.
Siempre será imprescindible realizar la declaración al inicio de un programa de los pines de
comunicación del teclado PS/2, como se muestra a continuación:
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 líneas han sido definidos los pines del puerto en el cual han sido
conectados los pines de comunicación del teclado, “Data” y Clk”. Esta definición se realizó
en base al diagrama esquemático propuesto anteriormente.
Adicionalmente a esto, la librería PS/2 cuenta con dos rutinas a través 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, función, estado)
Esta rutina tiene tres campos que hemos denominado “valor”, “especial” y “estado”.
•
Valor: almacena el valor correspondiente al símbolo en la tecla presionada.
•
Función: Es una bandera cuyo estado cambia entre 1 y 0, y nos indica si una tecla de
función especial ha sido presionada o no. Si una tecla de función 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 símbolo 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 librerías
correspondientes a los periféricos que estaremos utilizando en la práctica. En este caso, las
librerías a seleccionar deberán ser las siguientes:
Figura 6.19
Veamos el siguiente ejercicio:
6.4.2.1.- Ejemplo de programación #38:
program PS2_01
' Declaración de variables y puertos para Librería 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
' Configuración 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 configuración 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 comunicación con PS/2.
' Retardo de 100 milisegundos.
Lcd_Out(1, 1, "Caracter: ")
Lcd_Out(2, 1, "ASCII: ")
' Escribimos la palabra "Caracter:" en la primera línea.
' Escribimos la palabra "ASCII:" en la segunda línea
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 sólo si se cumple la condición 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 función 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
' posición especificada, línea 1, columna 11.
LCD_Chr(2, 12, Valor)
' Mostramos el equivalente ASCII en la posición
' especificada, línea 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 configuración de los dispositivos periféricos conectados al microcontrolador.
•
En primer lugar, se realizó la definición 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 inicialización de los periféricos.
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
líneas de la pantalla LCD. En este ejemplo escribimos la palabra “Caracter:” en la
línea 1, columna 1; y la palabra “ASCII:” en la línea 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 señalada por un círculo 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 “Mayúscula” y luego la misma tecla señalada,
entonces el resultado cambia:
Figura 6.22
Lo mismo ocurrirá si presionamos cualquier otra tecla, siempre y cuando no sea una tecla de
función 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 “función” 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
“función” deberá ser igual a 1 para determinar que una tecla de “función 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
símbolo (ASCII), eliminaremos del ejemplo anterior las líneas correspondientes a la
información presentada en la segunda línea de la pantalla LCD.
180
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
6.4.2.2.- Ejemplo de programación #39:
program PS2_02
' Declaración de variables y puertos para Librería 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
' Configuración 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 configuración 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 comunicación con PS/2.
Lcd_Out(1, 1, "Tecla Func.: ") ' Escribimos la palabra "Caracter:" en la primera línea.
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 sólo si se cumple la condición 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 función 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
' posición especificada, línea 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”, deberíamos poder ver su valor
correspondiente “34” en la pantalla LCD como se muestra a continuación:
Figura 6.23
Si presionamos la tecla “Print Screen”, el valor correspondiente según la tabla de la figura
6.16 cargado en la variable “valor” sería:
Figura 6.24
Veamos el siguiente ejemplo en el cual mostraremos el símbolo ASCII correspondiente a
una tecla en la primera línea de la pantalla LCD, y el valor correspondiente a las teclas de
funciones especiales en la segunda línea de la pantalla.
182
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
6.4.2.3.- Ejemplo de programación #40:
program PS2_03
' Declaración de variables y puertos para Librería 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
' Configuración 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 configuración 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 comunicación con PS/2.
' Retardo de 100 milisegundos.
Lcd_Out(1, 1, "ASCII: ")
' Escribimos la palabra "Caracter:" en la primera línea.
Lcd_Out(2, 1, "Tecla Func.: ") ' Escribimos la palabra "ASCII:" en la segunda línea
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 sólo si se cumple la condición 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 función 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 posición
' especificada, línea 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
' posición especificada, línea 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
Capítulo VII. Memoria de Datos EEPROM
7.1.- La Memoria de Datos EEPROM.
La memoria EEPROM de datos resulta muy importante cuando necesitamos almacenar
información que no queremos que se pierda al desconectar la energía de nuestros
proyectos. La capacidad de esta memoria varía según el modelo de microcontrolador que
escojamos, y no todos cuentan con esta característica. Sin embargo los microcontroladores
que hemos estado utilizando en esta edición 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 información
puede ser verificada directamente en la hoja de características técnicas de cada
microcontrolador. Sin embargo, haremos un mapa de memoria de datos para el
microcontrolador PIC16F877, a través del cual explicaremos la forma de almacenar
información en posiciones predeterminadas en la programación 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.- Librería EEPROM.
Guardar y leer datos resulta muy sencillo al trabajar en mikroBasic. Este compilador cuenta
con una librería 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 específicas dentro del mapa
de memoria.
Veamos a continuación la sintaxis de estas dos rutinas.
Lectura de la memoria EEPROM de datos:
7.2.1.- EEPROM_Read(Dirección).
El campo “Dirección” se refiere a la posición dentro del mapa de memoria que deseamos
leer.
Ejemplo:
Dato = EEPROM_Read(0x01)
' Lectura de la memoria EEPROM de datos en la
' dirección 0x01 del mapa de memoria.
Escritura de la memoria EEPROM de datos:
7.2.2.- EEPROM_Write(Dirección, Dato).
El campo “Dirección” se refiere a la posición dentro del mapa de memoria que deseamos
escribir o re-escribir.
El campo “Dato” se refiere a la información 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
' dirección 0x01.
La idea principal en cada proyecto será familiarizarse con el uso de la memoria de datos,
almacenando en ella información 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
información 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 continuación un sistema de control de acceso, en el cual el usuario
deberá introducir una contraseña previamente almacenada en la memoria de datos. Si la
contraseña es correcta, se genera un mensaje de confirmación en la pantalla. Si la
contraseña es incorrecta, se genera un mensaje de error.
Basados en el diagrama esquemático de la figura 7.2, empezamos el programa realizando la
configuración de los pines de control de los dispositivos periféricos conectados al
microcontrolador.
Antes de empezar a programar, es importante tomar en cuenta cuales serán las posiciones
en la memoria de datos para guardar la contraseña.
Para un sistema de control de acceso donde la contraseña será de seis dígitos, y donde
cada dígito deberá ser almacenado en una posición específica, convenientemente podemos
tomar las posiciones en el mapa de la memoria de datos a partir de la dirección “$10” por
ejemplo, hasta la dirección “$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 programación #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 dígitos
consecutivos “123456””.
program EEPROM_1
' Sección de Declaración
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".
' Configuración 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 configuración 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 confirmación
' cuando se introduce un dígito en el teclado.
inicio:
pulsador = 0
' Inicializamos la variable "Pulsador"
' Almacenamos los digitos de la contraseña en la memoria EEPROM, en las
' posiciones asignadas por el diseñador del programa.
' La contraseña 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
contraseña
contraseña
contraseña
contraseña
contraseña
contraseña
en
en
en
en
en
en
la
la
la
la
la
la
dirección
dirección
dirección
dirección
dirección
dirección
10
11
12
13
14
15
del
del
del
del
del
del
mapa.
mapa.
mapa.
mapa.
mapa.
mapa.
' Escribimos un mensaje en la línea 1.
' Escribimos un mensaje en la línea 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 línea 1.
' Escribimos un mensaje en la línea 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 dígitos
' 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 dígitos 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 línea 1.
' Escribimos un mensaje en la línea 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 línea 1.
' Escribimos un mensaje en la línea 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 línea 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
serán: 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 deberán ser: 1, 2, 3, 5, 6 y 7. Esta es
una forma de relacionar los dígitos impresos en las teclas y los dígitos reales de la clave
elegida.
7.2.2.2.- Ejemplo de programación #42.
Veamos ahora algunas modificaciones importantes en el ejemplo anterior, en el cual se ha
creado la posibilidad de cambiar la “clave de fábrica” del sistema por una clave
personalizada de seis dígitos, 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 fábrica es almacenada en sus respectivas
posiciones cada vez que el microcontrolador es reiniciado. En este nuevo ejemplo,
esta situación deberá ser controlada, debido a que si realizamos un cambio de clave
en el sistema, y éste es reiniciado, lo correcto sería mantener la nueva clave y no la
de fábrica. Para evitar que la nueva clave sea re-escrita por la clave de fábrica,
tomaremos la posición 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 posición cero
de la memoria EEPROM será siempre igual a $FF. Una vez que decidamos cambiar
la clave en el sistema a través de un nuevo menú de opciones que vamos a crear,
entonces tendremos que modificar esta bandera asignando un valor (por ejemplo “1”)
en la posición cero de la memoria EEPROM de datos.
•
Una vez introducida la nueva clave, a través 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 fábrica”.
•
Cada vez que introducimos un digito para almacenar la nueva clave, se deberá
generar un sonido de confirmación de cada tecla pulsada. El sonido es sumamente
importante en este proyecto, ya que permite al usuario saber que un dígito 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. También es posible verificar estos cambios en la memoria
EEPROM de datos a través 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 fábrica (123456, 123567 en
relación a los valores entregados por la rutina del teclado) se encuentran en las posiciones
10, 11, 12, 13, 14 y 15. Observe además que el valor en la posición 0 de la memoria es $FF.
Cuando hacemos el primer cambio de clave, por ejemplo, 456789, cuyos valores
relacionados a la rutina del teclado serán 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 además que la bandera en la posición 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
línea para una mejor comprensión:
program Control_Acceso
' Sección de Declaración
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".
' Configuración 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 configuración 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 fábrica" ha sido cambiada, ya que sino
realizamos esta comprobación, la clave de fábrica será re-escrita cada vez que
reiniciemos el sistema. Para esto, crearemos una bandera en la posición 0 de
la memoria de datos. Entonces, si el sistema es iniciado por primera vez, esta
posición 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 posición “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 fábrica 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 posición
' “0” de la EEPROM de datos.
ClavedeFabrica = EEPROM_Read(0)
If ClavedeFabrica = 1 Then
GoTo Bienvenido
End If
' Carga el valor almacenado en la posición 0
' de la EEPROM en la variable.
' Si el valor es igual a 1, la Clave fue cambiada,
' y se salta la grabación de la clave de fábrica.
194
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
' Si la bandera o valor de la posición 0 de la EEPROM no ha sido modificada,
' almacenamos los digitos de la contraseña en la memoria EEPROM, en las
' posiciones asignadas por el diseñador del programa.
' La contraseña o clave de fábrica 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
contraseña
contraseña
contraseña
contraseña
contraseña
contraseña
en
en
en
en
en
en
la
la
la
la
la
la
dirección
dirección
dirección
dirección
dirección
dirección
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 línea 1.
' Escribimos un mensaje en la línea 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 línea 1.
' Escribimos un mensaje en la línea 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 dígitos
' 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 dígitos 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 línea 1.
' Escribimos un mensaje en la línea 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 línea 1.
' Escribimos un mensaje en la línea 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 línea 1.
' Escribimos un mensaje en la línea 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 línea 1.
' Escribimos un mensaje en la línea 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 línea 1.
' Escribimos un mensaje en la línea 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 dígitos
' 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 línea 1.
' Escribimos un mensaje en la línea 2.
digito
digito
digito
digito
digito
digito
de
de
de
de
de
de
la
la
la
la
la
la
contraseña
contraseña
contraseña
contraseña
contraseña
contraseña
en
en
en
en
en
en
la
la
la
la
la
la
dirección
dirección
dirección
dirección
dirección
dirección
10
11
12
13
14
15
del
del
del
del
del
del
mapa.
mapa.
mapa.
mapa.
mapa.
mapa.
' Ponemos un 1 en la posición elegida para la bandera que
' determina si hemos cambiado la clave de fábrica.
' Generamos un sonido de confirmación de 2 segundos.
")
")
' Escribimos un mensaje en la línea 1.
' Escribimos un mensaje en la línea 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 línea 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 después del mensaje de confirmación 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 dígitos de la clave, recordando que cada
vez que presionamos una tecla debemos esperar el tono de confirmación 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. También
escucharemos un sonido de dos segundos de duración. Recuerde que el propósito 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
Capítulo VIII. Conversor A/D.
8.1.- El conversor A/D.
Los microcontroladores de las familias PIC16F87x y PIC18Fxxx de los cuales estaremos
hablando a continuación, poseen un convertidor Analógico-Digital que convierte una señal
analógica en un número de 8 o 10 bits, según sea la configuración elegida por el diseñador.
En los microcontroladores PIC de 28 pines como el PIC16F870, encontraremos que solo
poseen 5 entradas para la conversión 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 conversión 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 conversión 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 están 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 conversión, como se puede observar en la tabla de la figura 8.2.
REGISTRO BAJO (ADRESL)
REGISTRO ALTO (ADRESH)
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
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 aún mejor este punto, veamos el siguiente ejemplo:
Si se configura el conversor A/D a 8 bits e introducimos una señal cuya amplitud varía entre
0 y 5 voltios, y donde el voltaje de referencia del conversor es 5 voltios, entonces la
resolución que obtendremos en la conversión sería la siguiente:
Resolución =
Vimax
2n
Resolución =
5V
28
Resolución =
5V
256
Resolución = 0.0196 ≈ 0.02 V
Esto significa que la resolución 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 resolución mayor, lo cual podemos demostrar realizando los cálculos
correspondientes:
Resolución =
Vimax
2n
Resolución =
5V
210
Resolución =
5V
1024
Resolución = 0.00488 ≈ 0.0049 V
Entonces la resolución 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 más resolución en términos de voltios por
paso, si utilizamos un voltaje de referencia menor al de la alimentación del microcontrolador
a través de los pines “Ref+” o “Ref-“ según 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:
Resolución =
Vimax
2n
Resolución =
2.5V
210
Resolución =
2.5V
1024
Resolución = 0.00244 ≈ 0.0025 V
La resolución del conversor A/D sería 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 conversión 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 señal
analógica al conversor A/D y los canales para voltajes de referencia, en el caso de ser
necesario. Esto se hace seleccionando la combinación 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 serán entradas al conversor A/D, según la combinación
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 señal analógica
para que pase a la etapa de muestreo. La selección de las entradas analógicas 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 conversión de datos A/D es posible gracias a su librería “ADC”, la cual
podemos ubicar fácilmente en la pestaña de librerías, y la cual cuenta con tan solo una
rutina, capaz de hacer todo el trabajo fácilmente 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 librería, Adc_Read(canal), en la cual sólo se especifica cual será el
canal de entrada de la señal 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 conversión de una señal 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 líneas de programa, consideramos conveniente hacer una revisión 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: Selección del reloj del conversor A/D.
ADCS1 ADCS0
Conversión 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: Selección 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 conversión.
GO/DONE: Solo funciona si ADON = 1
1 = Conversión A/D en progreso.
0 = Conversión 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: Justificación del resultado de la conversión a 10 bits a la derecha o izquierda.
1 = Justifica a la derecha.
0 = Justifica a la Izquierda.
Bit 6 al Bit 4: No están implementados.
Bit3, Bit 2, Bit 1 y Bit 0: Configuración
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 Analógica
D = I/O Digital
Cuando realizamos la conversión A/D a 10 bits, el resultado de la conversión 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 máximo 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
0
0
0
0
0
0
Figura 8.13
En la conversión a 10 bits también es muy importante considerar el bit 7 (ADFM) del registro
de control ADCON1, ya que este bit mantiene el resultado de la conversión 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
0
0
0
0
0
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
0
0
0
0
0
0
Figura 8.15
Cuando justificamos el resultado de la conversión A/D a la izquierda, el bit menos
significativo de éste es el bit 6 del registro ADRESL, y el bit más significativo es el bit 7 del
registro ADRESH.
Para realizar los siguientes ejemplos de programación, hemos propuesto un circuito inicial
en el cual tendremos conectado al microcontrolador una pantalla Glcd para visualizar los
resultados de la conversión, y un potenciómetro con el cual estaremos variando el nivel de
voltaje entre 0 voltios y 5 voltios en una de las entradas del conversor, específicamente en
RA2.
A medida que vayamos avanzando, iremos incorporando nuevas características a cada
ejercicio, de tal manera que podamos generar algunas nuevas ideas que sirvan en el
desarrollo de proyectos que requieran de una conversión A/D.
209
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
8.1.3.- Ejemplo de programación #43:
El diagrama esquemático de la figura 8.16 muestra el conexionado entre en
microcontrolador y sus periféricos:
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 capítulo de Pantallas LCD y GLCD.
2. Realizamos la configuración de pines de control y datos de la pantalla Glcd.
3. Declaramos algunas variables, en las cuales estaremos almacenando los datos
producto de la conversión 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 módulo de fuentes deseado, pues
recordemos que en un archivo de fuentes, podemos tener más de un módulo.
6. En un lazo infinito, realizamos la conversión A/D y la cargamos en una variable tipo
Word. El valor convertido desde la entrada analógica 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 posición
predeterminada de la pantalla Glcd.
Veamos a continuación la solución al planteamiento.
program ADC_01
Include mis_fuentes ' Incluimos el archivo de fuentes
' Configuración de conección del módulo 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 configuración del módulo 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 máximo de 20 caracteres.
Variable de 16 bits para cargar el valor de la
conversión A/D.
Variable para conversión datos.
main:
ADCON1 = 0
TRISA
= $FF
' Configura el puerto A como analógico,
' 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 módulo de fuentes
While (TRUE)
dato = Adc_Read(2)
' Carga el resultado de la conversión de
' 10 bits en la variable.
wordtostr(dato, DatoStr)
' Conversión 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
dígitos, la cual puede variar su valor entre 0 y 1023 al modificar la posición del
potenciómetro 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 programación #44:
Veamos ahora como podríamos configurar este ejemplo, para hacer uso de un voltaje de
referencia en el conversor A/D, de tal manera que podamos variar la resolución de la
conversión de datos.
Para esto, será necesario tomar en cuenta nuevamente el registro ADCON1 y la tabla de
configuración 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
configuración de pines del mismo.
En este ejemplo, elegiremos como pin de voltaje de referencia positivo a RA3 y
mantendremos RA2 como pin de entrada analógica. Esto significa que una de las
configuraciones posibles representadas en la tabla, puede ser la que encontramos en la
línea 2 de la misma, como se muestra a continuación:
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 configuración 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 debería quedar el circuito propuesto:
Figura 8.20
Observe que hemos puesto un potenciómetro 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, podríamos deducir que para este nuevo circuito, si
giramos el potenciómetro REF hasta obtener un voltaje de referencia de 5 Voltios, al variar la
entrada en RA2 el resultado en la pantalla debería ser el mismo en comparación con el
ejemplo anterior, es decir, al variar el recorrido del potenciómetro 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 cálculo de la resolución se vería así:
Resolución =
Vimax
2n
Resolución =
5V
210
Resolución =
5V
1024
Resolución = 0.00488 ≈ 0.0049 V
Resolución = 4.9 mV
¿Pero que sucede si ponemos un voltaje de referencia igual a 2.5 voltios? Fácilmente
podremos ver el resultado variando el potenciómetro REF hasta obtener el voltaje de
referencia deseado.
Con un voltaje de referencia igual a la mitad del voltaje que aplicamos en RA2, la resolución
en la conversión sería:
Resolución =
Vimax
2n
Resolución =
2.5V
210
Resolución =
2.5V
1024
Resolución = 0.00244 ≈ 0.0025 V
Resolución = 2.5 mV
En este caso se podrá observar que la conversión entre 0 y 5 voltios en el pin RA2 se hará
en la mitad del recorrido del potenciómetro 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 configuración
del registro ADCON1:
program ADC_02
Include mis_fuentes ' Incluimos el archivo de fuentes
' Configuración de conección del módulo 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 configuración del módulo 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 máximo de 20 caracteres.
Variable de 16 bits para cargar el valor de la
conversión A/D.
Variable para conversión datos.
main:
ADCON1 = 1
TRISA
= $FF
' Configura el puerto A como analógico,
' 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 módulo de fuentes
While (TRUE)
dato = Adc_Read(2)
' Carga el resultado de la conversión de
' 10 bits en la variable.
wordtostr(dato, DatoStr)
' Conversión 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 varía entre 0 y 5 voltios
en datos de de 10 bits a través del conversor A/D, sería interesante agregar mas información
en la pantalla Glcd en base a éstos, como por ejemplo, el valor del voltaje en la entrada
analógica.
Esto también significa que basados en los datos obtenidos en la conversión A/D los cuales
varían entre 0 y 1023, el voltaje de referencia seleccionado a través del potenciómetro POT
216
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
en RA3 y el valor de la resolución 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 cálculo, como lo demostraremos a continuación:
1. Sabemos que la conversión genera datos entre 0 y 1023 los cuales son almacenados
temporalmente en una variable que hemos llamado “dato”.
2. sabemos además el valor calculado de la resolución para un voltaje de referencia
igual al voltaje aplicado en RA3.
Por ejemplo, si tenemos un valor de conversión igual a 512, y el voltaje de referencia del
conversor es de 5 voltios, entonces:
Voltaje = (Resolución x Valor de la conversión 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 conversión nos ha entregado un
valor igual a 512, debería ser igual o aproximadamente el voltaje calculado.
Convirtamos esta formula en código y observemos el resultado:
8.1.5.- Ejemplo de programación #45:
program ADC_03
Include mis_fuentes ' Incluimos el archivo de fuentes
' Configuración de conección del módulo 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 configuración del módulo 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 información en la Glcd
' Esta variable se ha decladaro para cargar el valor
' de la conversión en formato de punto flotante,
217
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
' debido a que haremos cálculos de punto flotante a
' través de la formula planteada en la explicación.
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 máximo de 20 caracteres.
Variable de 16 bits para cargar el valor de la
conversión A/D.
' Variable para conversión datos.
main:
ADCON1 = 1
TRISA
= $FF
' Configura el puerto A como analógico,
' 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 módulo de fuentes
While (TRUE)
dato = Adc_Read(2)
' Carga el resultado de la conversión de
' 10 bits en la variable.
datoflt = dato
wordtostr(dato, DatoStr)
' Conversión 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 resolución 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 línea 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 cálculos 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 cálculo 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
conversión proveniente de la variable “dato” la cual ha sido ya declarada anteriormente
como “word”.
En la tercera nueva variable, almacenaremos la conversión de la variable “Voltaje” de “float”
a “string”, para poder visualizar el dato en la pantalla Glcd.
Por último, se han agregado las líneas de programa correspondientes al cálculo de la
formula, conversión de datos e impresión de datos en la pantalla.
218
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Veamos a continuación algunos de los resultados de la conversión 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 Acelerómetro.
En el siguiente ejemplo realizaremos un programa para el control de un acelerómetro triaxial,
el cual posee tres salidas analógicas las cuales deseamos representar en un formato digital
en la pantalla Glcd, y en la cual incluiremos además de los datos de la conversión A/D de
cada salida, los valores de los voltajes calculados en cada una de ellas, en base a algunas
características del dispositivo, las cuales estudiaremos a continuación.
El acelerómetro 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, Código: DE-ACCM3D2
Figura 8.23 (Fuente: http://www.dimensionengineering.com/DE-ACCM3D2.htm)
Antes de empezar, veamos resumidamente que es un acelerómetro y que utilidad tendría en
nuestros proyectos electrónicos.
Básicamente, un acelerómetro es un instrumento capaz de medir aceleraciones y fuerzas
inducidas por la gravedad. Es un dispositivo muy utilizado hoy en día en equipos como
cámaras fotográficas, juegos de video, reproductores portátiles 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, podríamos medir la dirección hacia la cual se encuentra un objeto con
respecto al espacio tridimensional X, Y, Z.
Veamos a continuación algunas características importantes de este modelo:
•
El voltaje de operación está entre 3.5V y 15V, debido a que incorpora un regulador de
voltaje de 3.3V.
•
El circuito cuenta con un punto de conexión (regulator bypass) a través del cual
podemos alimentar el acelerómetro entre 2.4V y 3.6V, y prescindir del regulador de
voltaje.
•
Si decidimos utilizar el regulador de voltaje, podremos utilizar el punto de conexión
(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 protección en su entrada, en caso de una conexión 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.
Según los datos proporcionados por su fabricante, los datos de rangos de sensibilidad para
los siguientes voltajes de operación son los siguientes:
•
Para un voltaje de operación = 3.6V, la sensibilidad = 760 mV/g.
•
Para un voltaje de operación = 3.33V, la sensibilidad = 666 mV/g.
•
Para un voltaje de operación = 3.0V, la sensibilidad = 600 mV/g.
•
Para un voltaje de operación = 2.4V, la sensibilidad = 480 mV/g.
En nuestro caso, haremos uso del regulador de voltaje de 3.3V, por lo cual los cálculos se
realizarán en base a la sensibilidad correspondiente, S = 666 mV/g. Los voltajes máximos en
cada salida observando la placa del acelerómetro en sus posiciones extremas, considerando
que la alimentación del acelerómetro 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 aceleración en base a un voltaje medido en la salida X del acelerómetro.
Datos conocidos:
•
•
•
Voltaje de alimentación = 3.3V
Voltaje en la salida X = 1.95V
A 3.3V, el punto de 0g en el acelerómetro es equivalente a 1.66V en su salida.
Entonces,
1.95V – 1.66V = +0.29V con respecto al punto de 0g del acelerómetro.
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 aceleración en el eje X es +0.435 g
223
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Calculemos ahora la inclinación del circuito en el eje Y, con respecto al voltaje en la salida
correspondiente. Para este cálculo utilizaremos un voltaje de ejemplo, igual a 1.85 V.
Datos conocidos:
•
Voltaje de alimentación = 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 inclinación 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
programación, partiendo del diagrama esquemático propuesto en la figura 8.27.
Figura 8.27
Lo primero que debemos observar en el diagrama esquemático, es que la configuración
entre la pantalla Glcd y el microcontrolador no ha cambiado, por lo cual continuamos con la
misma configuración de pines de control y datos en nuestros programas.
En este caso, podemos ver que las salidas del acelerómetro han sido conectadas en el
puerto A, incluyendo el pin denominado “bypass” o “BP” en el acelerómetro, 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 programación #46:
program ADC_04
Include mis_fuentes ' Incluimos el archivo de fuentes
' Configuración de conección del módulo 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 configuración del módulo Glcd
Dim texto As String[20]
' Declaramos una variable tipo String en la cual
' cargaremos un mensaje de un máximo de 20 caracteres.
Eje_X As Word
' Variable de 16 bits para cargar el valor de la
' conversión A/D de la salida X del Acelerómetro.
Eje_Y As Word
' Variable de 16 bits para cargar el valor de la
' conversión A/D de la salida Y del Acelerómetro.
Eje_Z As Word
' Variable de 16 bits para cargar el valor de la
' conversión A/D de la salida Z del Acelerómetro.
Dim DatoStr As string[8]
' Variable para conversión datos.
main:
ADCON1 = 1
' Configura el puerto A como analógico,
' 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 módulo de fuentes
While (TRUE)
texto = "Acelerometro"
Glcd_Write_Text(texto, 25, 0, 1)
' Cargamos la variable con un titulo.
' Escribimos el contenido en la línea 0
texto = "Eje Dato"
Glcd_Write_Text(texto, 2, 2, 1)
' Cargamos la variable con un Sub-titulo.
' Escribimos el contenido en la línea 2
Eje_X = Adc_Read(0)
' Carga el resultado de la conversión de
' de 10 bits en la variable.
wordtostr(Eje_X, DatoStr)
' Conversión de word a string
texto = "X:"
' Cargamos la variable con un mensaje.
Glcd_Write_Text(texto, 5, 4, 1)
' Escribimos el contenido en la línea 4
Glcd_Write_Text(DatoStr, 16, 4, 1) ' Escribimos el contenido de la conversión
Eje_Y = Adc_Read(1)
' Carga el resultado de la conversión de
' 10 bits en la variable.
226
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
wordtostr(Eje_Y, DatoStr)
' Conversión de word a string
texto = "Y:"
' Cargamos la variable con un mensaje.
Glcd_Write_Text(texto, 5, 5, 1)
' Escribimos el contenido en la línea 5
Glcd_Write_Text(DatoStr, 16, 5, 1) ' Escribimos el contenido de la variable
Eje_Z = Adc_Read(2)
' Carga el resultado de la conversión de
' 10 bits en la variable.
wordtostr(Eje_Z, DatoStr)
' Conversión de word a string
texto = "Z:"
' Cargamos la variable con un mensaje.
Glcd_Write_Text(texto, 5, 6, 1)
' Escribimos el contenido en la línea 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 conversión A/D de cada una de las salidas del
acelerómetro.
Estas tres variables llamadas “Eje_X”, “Eje_Y” y “Eje_Z” han sido declaradas tipo “word”, ya
que la conversión A/D está configurada por defecto a 10 bits, por lo cual una variable de 8
bits (byte), no funcionaría en este caso.
Eje_X As Word
' Variable de 16 bits para cargar el valor de la
' conversión A/D de la salida X del Acelerómetro.
Eje_Y As Word
' Variable de 16 bits para cargar el valor de la
' conversión A/D de la salida Y del Acelerómetro.
Eje_Z As Word
' Variable de 16 bits para cargar el valor de la
' conversión A/D de la salida Z del Acelerómetro.
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 conversión, RA0, RA1 y RA2 sean
entradas análogas, y para que el pin RA3 sirva de voltaje de referencia positivo.
ADCON1 = 1
' Configura el puerto A como analógico,
' RA3 es el voltaje de referencia --> Vref.
También contamos con un título para nuestro proyecto, el cual ha sido ubicado en la primera
línea de la pantalla Glcd, al igual que el título de las dos columnas de datos ubicado en la
segunda línea de la pantalla.
texto = "Acelerometro"
Glcd_Write_Text(texto, 25, 0, 1)
' Cargamos la variable con un titulo.
' Escribimos el contenido en la línea 0
texto = "Eje Dato"
Glcd_Write_Text(texto, 2, 2, 1)
' Cargamos la variable con un Sub-titulo.
' Escribimos el contenido en la línea 2
Por último, tenemos las rutinas correspondientes a la captura y conversión de datos del
acelerómetro:
227
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Eje_X = Adc_Read(0)
' Carga el resultado de la conversión de
' de 10 bits en la variable.
wordtostr(Eje_X, DatoStr)
' Conversión de word a string
texto = "X:"
' Cargamos la variable con un mensaje.
Glcd_Write_Text(texto, 5, 4, 1)
' Escribimos el contenido en la línea 4
Glcd_Write_Text(DatoStr, 16, 4, 1) ' Escribimos el contenido de la conversión
Eje_Y = Adc_Read(1)
' Carga el resultado de la conversión de
' 10 bits en la variable.
wordtostr(Eje_Y, DatoStr)
' Conversión de word a string
texto = "Y:"
' Cargamos la variable con un mensaje.
Glcd_Write_Text(texto, 5, 5, 1)
' Escribimos el contenido en la línea 5
Glcd_Write_Text(DatoStr, 16, 5, 1) ' Escribimos el contenido de la variable
Eje_Z = Adc_Read(2)
' Carga el resultado de la conversión de
' 10 bits en la variable.
wordtostr(Eje_Z, DatoStr)
' Conversión de word a string
texto = "Z:"
' Cargamos la variable con un mensaje.
Glcd_Write_Text(texto, 5, 6, 1)
' Escribimos el contenido en la línea 6
Glcd_Write_Text(DatoStr, 16, 6, 1) ' Escribimos el contenido de la variable
Las rutinas para la captura y conversión A/D, son básicamente las mismas. Solo hemos
cambiado las variables en las cuales estamos almacenando el dato correspondiente a cada
salida del acelerómetro, la conversión 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 conversión A/D para cada una de las salidas del acelerómetro. Pero éste sería mas útil
aún si pudiésemos contar con estos valores expresados en términos de voltaje y
aceleración, tal y como lo estudiamos antes de empezar a hacer este ejercicio.
8.2.2.- Cálculo 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 cálculo serían los siguientes:
Para calcular el voltaje necesitamos saber el valor de la resolución en la conversión A/D:
Resolución =
Vimax
2n
Resolución =
3.3V
210
Resolución =
3.3V
1024
Resolución = 0,003222 V
Las formulas para el cálculo de voltaje en cada entrada serían las siguientes:
Voltaje en RA0 = Valor de la conversión cargado en la variable “Eje_X” x 0.003222 V
Voltaje en RA1 = Valor de la conversión cargado en la variable “Eje_Y” x 0.003222 V
Voltaje en RA2 = Valor de la conversión 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 aceleración en base al voltaje calculado en cada eje.
Datos conocidos:
•
•
•
Voltaje de alimentación = 3.3V
Voltajes calculados en cada entrada analógica.
A 3.3V, el punto de 0g en el acelerómetro es equivalente a 1.66V en su salida.
Entonces,
La aceleración para el Eje X:
Voltaje en RA0 – 1.66V = Voltaje con respecto al punto de 0g del acelerómetro.
Si sabemos que la sensibilidad a 3.3V es 666 mV/g:
Voltaje con respecto al punto de 0g del acelerómetro ÷ 0.666 V/g = Aceleración en X.
La aceleración para el Eje Y:
Voltaje en RA1 – 1.66V = Voltaje con respecto al punto de 0g del acelerómetro.
Si sabemos que la sensibilidad a 3.3V es 666 mV/g:
Voltaje con respecto al punto de 0g del acelerómetro ÷ 0.666 V/g = Aceleración en Y.
La aceleración para el Eje Z:
Voltaje en RA2 – 1.66V = Voltaje con respecto al punto de 0g del acelerómetro.
Si sabemos que la sensibilidad a 3.3V es 666 mV/g:
Voltaje con respecto al punto de 0g del acelerómetro ÷ 0.666 V/g = Aceleración en X.
230
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
8.2.4.- Ejemplo de programación #47:
program ADC_05
Include mis_fuentes ' Incluimos el archivo de fuentes
' Configuración de conección del módulo 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 configuración del módulo Glcd
Dim texto As String[20]
' Declaramos una variable tipo String en la cual
' cargaremos un mensaje de un máximo de 20 caracteres.
Eje_X As Word
' Variable de 16 bits para cargar el valor de la
' conversión A/D de la salida X del Acelerómetro.
Eje_Y As Word
' Variable de 16 bits para cargar el valor de la
' conversión A/D de la salida Y del Acelerómetro.
Eje_Z As Word
' Variable de 16 bits para cargar el valor de la
' conversión A/D de la salida Z del Acelerómetro.
' Variables para calculos de voltaje y aceleración en cada Eje del
' acelerómetro. Todas las variables son declaradas tipo "Float" ya que
' los cálculos 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 conversión de datos.
main:
ADCON1 = 1
' Configura el puerto A como analógico,
' 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 módulo 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 línea 0
texto = "
Volt.
Acell."
Glcd_Write_Text(texto, 2, 2, 1)
' Cargamos la variable con un Sub-titulo.
' Escribimos el contenido en la línea 2.
'*************************************************************************
' Rutina correspondiente al Eje X del Acelerómetro ***********************
Eje_X = Adc_Read(0)
' Carga el resultado de la conversión 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 línea 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)
' Conversión de float a string
Glcd_Write_Text(DatoStr, 15, 4, 1) ' Escribimos el contenido de la conversión.
' Calculamos la Aceleración:
Volt_Acell_X =
Volt_Eje_X - 1.66
Acell_X = Volt_Acell_X / 0.666
' Voltaje con respecto al punto de 0g
' del acelerómetro.
' Se calcula la aceleración.
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 Acelerómetro ***********************
Eje_Y = Adc_Read(1)
' Carga el resultado de la conversión 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 línea 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)
' Conversión de float a string
Glcd_Write_Text(DatoStr, 14, 5, 1) ' Escribimos el contenido de la variable.
' Calculamos la Aceleración:
Volt_Acell_Y =
Volt_Eje_Y - 1.66
Acell_Y = Volt_Acell_Y / 0.666
' Voltaje con respecto al punto de 0g
' del acelerómetro.
' Se calcula la aceleración.
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 Acelerómetro ***********************
Eje_Z = Adc_Read(2)
' Carga el resultado de la conversión 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 línea 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)
' Conversión de word a string
Glcd_Write_Text(DatoStr, 14, 6, 1) ' Escribimos el contenido de la variable.
' Calculamos la Aceleración:
Volt_Acell_Z = Volt_Eje_Z - 1.66
' Voltaje con respecto al punto de 0g
' del acelerómetro.
Acell_Z = Volt_Acell_Z / 0.666
' Se calcula la aceleración.
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 estarán variando constantemente mientras estemos moviendo el
acelerómetro en diferentes direcciones sobre cada eje.
233
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
8.3.- Termocupla.
A continuación haremos una breve introducción 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 -200ºC y 1700ºC.
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 termoeléctrico descubierto a inicios de la segunda década del siglo
dieciocho por Thomas Johann Seebeck.
Hoy en día se fabrican diferentes tipos de termocuplas, las cuales han sido clasificadas
según ciertas características 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 más comunes
debido a que poseen características como una alta sensibilidad, en el rango de 40 uV/ºC a
52 uV/ºC aproximadamente, además de un alto rango de temperaturas que pueden ser
medidas.
Los metales correspondientes a la termocupla tipo J son el hierro y el constantán. Su rango
de temperatura es de -200ºC hasta 750ºC.
Los metales correspondientes a la termocupla tipo K son el cromo y el aluminio. Su rango de
temperatura es de -200ºC hasta 1250ºC.
Resulta muy importante mencionar que el voltaje generado por la unión 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, cálculo 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 fácilmente:
Para una termocupla tipo J, el voltaje generado por la unión 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 unión 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 acción 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 están calibrados de fábrica para generar un voltaje igual a 250mV en
su salida cuando aplicamos una temperatura de 25ºC en la unión de las termocuplas.
Para compensar este desplazamiento, el AD594 realiza el cálculo del voltaje en su salida en
base a la siguiente formula:
Salida en AD594 = (Voltaje de Termocupla tipo J + 16uV) * Ganancia
Veamos un ejemplo numérico suponiendo que aplicamos una temperatura ideal de 30ºC en
una termocupla tipo J. El valor correspondiente al voltaje generado por la unión de los
metales en la termocupla tipo J se especifica en una tabla de valores publicada por la norma
IEC 584 (IEC es el acrónimo de International Electrotechnical Commission), Figura 8.31.
1. Según la tabla de la figura 8.31, sabemos que una termocupla tipo J genera 1536 uV
a una temperatura de 30ºC.
2. Además 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
0
1
2
3
4
5
6
7
8
9
-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
0
0
0
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 cálculo 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 numérico suponiendo que aplicamos una temperatura ideal de 160ºC en
una termocupla tipo K. El valor correspondiente al voltaje generado por la unión de los
metales en la termocupla tipo K se especifica en una tabla de valores publicada por la norma
IEC 584 (IEC es el acrónimo de International Electrotechnical Commission), Figura 8.32.
3. Según la tabla de la figura 8.32, sabemos que una termocupla tipo K genera 6539 uV
a una temperatura de 160ºC.
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
0
1
2
3
4
5
6
7
8
9
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
0
0
0
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 continuación 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 conversión de la salida analógica de los dispositivos AD594 o
AD595 según sea el caso, a través del conversor A/D del microcontrolador.
245
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
8.3.2.- Ejemplo de programación #48:
Utilizaremos para el ejemplo de programación una termocupla tipo J con su respectivo
amplificador-compensador AD594, cuya configuración básica veremos a continuación,
además de una característica adicional que nos ayudará a determinar si la termocupla
conectada al circuito se ha fallado ya sea por corrosión 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 lógico alto gracias a la
resistencia “Pull Up” de 1K, lo cual significa que se mantiene un estado lógico alto en RC0
mientras la termocupla se encuentra conectada y funcionando. Cuando se produce una falla,
el AD594 activa el transistor y el estado lógico 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
' Configuración 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 configuración de conexiones
Dim texto As String[20]
' Declaramos una variable tipo String en la cual
' cargaremos un mensaje de un máximo de 20 caracteres.
Dim dato As Word
' Variable de 16 bits para cargar el valor de la
' conversión A/D.
Dim DatoStr As string[16] ' Variable para conversión datos.
Dim Temp As Float
main:
ADCON1 = 0
' Configura el puerto A como puerto analógico,
' 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 conversión de
' 10 bits en la variable.
Temp = (dato * 4.9) / 10
' Calculamos la Temperatura de TC-J.
FloatToStr(Temp, DatoStr)
' Conversión 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 conversión.
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 dañada, 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 alimentación
del circuito, es decir, +5 Vdc, la medida de la temperatura en este ejemplo se limita a un
rango aproximado de 0ºC a 460ºC.
En cuando al cálculo de la temperatura, primero es necesario saber el valor de la resolución
del conversor A/D en términos de voltaje. Como el voltaje de referencia es igual al de la
fuente de poder, entonces tenemos que:
Resolución =
Vimax
2n
Resolución =
5V
210
Resolución =
5V
1024
Resolución = 0.00488 ≈ 0.0049 V
Resolución = 4.9 mV
Entonces, si por ejemplo tenemos una temperatura en la unión de la termocupla de 30ºC,
tendremos en la salida del AD594 un voltaje igual a 300 mV. Al convertir este voltaje a través
de conversor A/D de microcontrolador, el valor cargado en la variable “Dato” será
aproximadamente igual a 62, en el rango de conversión de 0 a 1023.
Ahora bien, si tenemos el valor de la conversión y el valor de la resolución en la conversión,
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 conversión A/D x Resolución
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 conversión 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
Capítulo IX. Comunicación Serial Asíncrona RS232.
9.1.- Comunicación Serial Asíncrona RS232.
La librería que a continuación 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
comúnmente en microcontroladores de gama alta como por ejemplo, en el PIC16F877,
PIC18F442, PIC18F458 entre otra buena cantidad de microcontroladores disponibles en el
mercado.
La comunicación serial asíncrona resulta muy útil cuando necesitamos transmitir o recibir
datos entre circuitos gobernados por microcontroladores PIC, o inclusive cuando deseamos
establecer una comunicación entre nuestros circuitos y un PC.
Este protocolo define estándares como la velocidad de transmisión 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 comunicación 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 están comprendidos entre +12V y 12V, y en un microcontrolador los niveles de voltaje están comprendidos entre 0V y 5V.
Las señales en el puerto del PC son digitales y la tensión con la cual trabaja, +12V y -12V,
poseen una lógica invertida, la cual es de suma importancia tomar en cuenta a la hora de
realizar el diseño de un circuito.
+12 V  Lógica = “0”
-12 V  Lógica = “1”
Acoplar el puerto serial de nuestro PC con estos niveles de voltaje y lógica invertida a
nuestros circuitos digitales de 5 voltios, resulta sencillo cuando utilizamos un circuito
integrado diseñado para solucionar este inconveniente y el cual es posible encontrar en casi
todos los diseños electrónicos actuales.
El circuito integrado MAX232 de MAXIM, es una interfaz que traduce estos niveles de voltaje
y la lógica 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 configuración para la
conexión 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 través del uso de librerías de mikroBasic, podemos concentrarnos básicamente 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 específicos
de la UART en un microcontrolador, ha sido simplificado a través de rutinas de inicialización,
captura y envío de datos, entre otras, y las cuales estaremos estudiando a continuación.
251
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
El microcontrolador elegido para las siguientes prácticas ha sido el PIC16F877, sin embargo
los programas que a continuación vamos a realizar funcionan con cualquier otro modelo de
gama alta de Microchip, siempre y cuando hagamos los ajustes pertinentes en la ficha de
configuración del proyecto que realicemos en mikroBasic.
Como periféricos emplearemos una pantalla LCD, un MAX232 para acoplar nuestro circuito
al puerto serial de PC, un modulo BlueTooth para comunicación serial inalámbrica y un
módulo GPS (OEM) cuyos modelos especificaremos mas adelante.
Veamos a continuación el diagrama esquemático sobre el cual estaremos desarrollando los
siguientes ejemplos prácticos:
Figura 9.2
252
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
9.2.- Librería UART.
El primer paso en el estudio de la librería UART se refiere a la rutina de inicialización del
módulo:
9.2.1.- UART1_Init(“Velocidad de transmisión de datos”)
Esta rutina inicializa automáticamente algunos parámetros en los registros internos de la
UART. Esta inicialización comprende la habilitación de la transmisión y recepción de datos,
el tamaño de la cadena de bits a ser transmitidos (8 bits), configura 1 bit de parada, la
paridad y selecciona el modo de transmisión asíncrono.
La velocidad de transmisión de datos puede ser configurada entre 2400 bps y 115000 bps a
través del campo denominado “Velocidad de transmisión de datos” en la rutina de
inicialización.
Entonces, si deseáramos realizar una comunicación serial entre un microcontrolador y un
PC a una velocidad de 2400 bps, la rutina de inicialización 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 transmisión deberá ser
siempre una constante y nunca un valor cargado en una variable.
Otro punto importante a considerar sobre la rutina de inicialización, será que ésta deberá
estar siempre antes del uso de cualquier otra rutina correspondiente a la librería 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 leídos y cargados en una variable
previamente definida:
9.2.2.- UART1_Data_Ready()
Esta función nos devuelve dos posibles estados:
•
•
1, si el Buffer de la UART contiene datos listos para ser leídos.
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 código a través de
esta rutina sería 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
También podríamos 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 símbolos “<>” 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 declaración 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 vía RS232 hacia el microcontrolador PIC16F877, son cargados Byte a Byte a
través de un registro denominado RSR (Receive Shift Register), quien espera a que el Bit de
Stop de la transmisión llegue para pasar el Byte al Buffer o registro RCSTA, el cual tiene una
capacidad máxima de dos Bytes, por lo tanto podríamos decir que podemos contar con tres
Bytes de información disponible en la UART antes de que el Buffer se desborde y perdamos
información en la transmisión.
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 sólo hace falta un cuarto Byte en la transmisión 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 información en el proceso de transmisión
de datos.
9.2.4.- Ejemplo de programación #49:
Veamos a continuación un ejemplo de transmisión y recepción de datos, basado en el
diagrama esquemático de la figura 9.2. Este ejemplo muestra a través de la pantalla LCD los
datos enviados desde la terminal de comunicaciones de mikroBasic, a una velocidad de
transmisión de 2400 bps.
program RS232
'--- Area de declaración:
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 configuración de conexiones
main: '
Programa Principal
UART1_Init(2400)
Delay_ms(100)
' Inicializamos el módulo UART a 2400 bps.
' Pausa de 100 milisegundos para estabilización.
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 línea 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 Impresión.
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 línea.
Analicemos ahora el contenido de la subrutina “Recepción”:
•
A través de la rutina UART1_Data_Ready(), preguntamos si tenemos datos
disponibles en el Buffer. Si se cumple la condición, cargamos el primer dato
almacenado en el Buffer en la variable “Dato_RX”. Si no se cumple la condición, se
imprime en la segunda línea de la pantalla un mensaje de estado del Buffer.
•
Al cumplirse la condición 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 línea de la pantalla y muestra el dato almacenado en la variable
“Dato_RX” en la posición especificada en la rutina Lcd_Chr(), luego hace una pausa
de 1 segundo para poder ver la información 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
“Recepción” y se produce un salto incondicional a la etiqueta “Recepción”.
•
Si existe más de un Byte almacenado en el Buffer, se repite el proceso anterior hasta
que el Buffer se encuentre vacío.
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 “Comunicación” o envío de datos. Seguidamente hacemos clic en “Send” para enviar la
cadena al microcontrolador vía RS232.
El Buffer en el microcontrolador se carga hasta su capacidad máxima de tres Bytes y se
desborda deteniendo la recepción de datos. Al evaluar el Buffer a través de la condición “If
(UART1_Data_Ready() = 1) Then”, sabremos que éste ha sido cargado con nuevos datos, los
cuales podremos extraer uno a uno a través 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 después, ocurre el retorno
a la rutina “Recepción” y se evalúa nuevamente el Buffer para ver si aún quedan datos en él.
El proceso se repite hasta que el Buffer queda vacío:
“1 2 3”
257
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Cuando enviamos una cadena de caracteres vía RS232 al microcontrolador con mas de tres
Bytes, el Buffer se llena y se desborda deteniendo la recepción, 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 programación #50:
El primer cambio importante que hemos hecho, ha sido la creación de una sub-función, 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 pequeña rutina de recolección de datos la cual se ejecutará hasta que se
cumpla una condición conocida. Las instrucciones dentro de un lazo “do-loop
Until(condición)” se repetirán hasta que dicha condición sea verdadera.
Por último, creamos una rutina de visualización de datos a través 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 declaración:
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.
' Configuración 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 configuración 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 módulo UART a 2400 bps.
' Pausa de 100 milisegundos para estabilización.
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 línea
' 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-función "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,
' continúa 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 finalización del proceso.
End.
Analizando el programa a partir de la etiqueta “Recepción” tenemos que:
•
Escribimos un mensaje de estado del Buffer; en este caso el mensaje será “Buffer
Vacío” ya que aún no hemos recolectado información 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(condición)”, podemos observar que el primer paso será
almacenar el primer dato en la variable que corresponda según el valor que trae
cargado el “acumulador”, es decir, si “acumulador” es igual a 1, entonces el valor
extraído desde la sub-función “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
condición “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 condición no se cumple aún, por lo tanto el programa
vuelve a hacer un llamado a la sub-función “LeerCaracter”, cargando el siguiente Byte
capturado del Buffer en la variable que corresponda en este momento según el valor
del “acumulador”. Esto significa que este segundo Byte será cargado en
“Dato_RX[2]”.
•
El proceso se repite hasta que la condición “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 línea de la pantalla LCD (“Mostrando
Datos”), y a través 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 través de la UART es:
9.2.6.- UART1_Write(“Variable tipo Byte”)
A través de esta rutina podemos enviar datos almacenados en una variable tipo “Byte” a
través del puerto serial hacia el PC o cualquier otro dispositivo o circuito que soporte
comunicación 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 través 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 código de programa, ya que de otra forma tendríamos que escribir una rutina
de envío de datos para cada una de las variables.
El código a añadir en nuestro programa sería 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 líneas pueden ser agregadas después de la recolección de datos, o incluso después
de presentar los mismos en la pantalla LCD:
9.2.7.- Ejemplo de programación #51:
program RS232
'--- Area de declaración:
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.
' Configuración 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 configuración 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 módulo UART a 2400 bps.
' Pausa de 100 milisegundos para estabilización.
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 línea
' 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-función "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,
continúa 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 finalización 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 transmisión y recepción ha sido exitosa.
Figura 9.4
262
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
9.3.- Cómo extraer información específica de una cadena de datos.
En muchos diseños electrónicos en los cuales requeriremos de comunicación serial,
seguramente vamos a necesitar extraer de una cadena larga de caracteres cierta
información específica atrapada en ella. En otras palabras, se pudiera dar el caso en el cual
tenemos un dispositivo periférico entregando constantemente información 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 información que deseamos extraer. Sin importar su ubicación dentro de la cadena,
como podríamos lograr extraer estos 20 caracteres y desechar el resto?
En muchos casos podremos también observar que estos dispositivos envían algunos
caracteres dentro de la cadena que identifican cada bloque de información, por ejemplo, en
nuestra cadena de 48 caracteres podremos ver que hemos asignado como caracteres de
cabecera del bloque de información los siguientes:
“1234567890/XYZmikroBasic para PIC!12345678901234”
“XYZ” serán la cabecera y nos ayudarán a identificar la posición del bloque de datos que nos
interesa extraer, entonces, si el la cabecera y el bloque de datos estuviesen en esta posición
u otra diferente de la cadena, seguramente podremos hacer un código de programa para
identificar la cabecera “XYZ” y seguidamente almacenar los siguientes 20 caracteres en un
arreglo de variables:
“1234567890/123456789XYZmikroBasic para PIC!01234”
Básicamente el procedimiento a seguir sería el siguiente:
•
Almacenamos toda la cadena en un arreglo de variables a las cuales llamaremos
“Cadena[n]”, donde “n” representa el número de caracteres conocido de la cadena.
•
Seguidamente, analizamos la cadena desde el primer Byte, buscando los caracteres
de cabecera de nuestro bloque de información deseado. Esto significa que debemos
hacer una rutina de descarte de información, 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, deberíamos 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 búsqueda del mismo, o si finalmente algún 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 búsqueda debido a que los Bytes
de cabecera del bloque de información deseado deberán estar siempre juntos, de otra
forma, estaríamos capturando información errada dentro de la cadena.
•
Sólo cuando encontremos los tres Bytes consecutivos de cabecera de la cadena será
cuando procederemos a almacenar los 20 bytes del bloque de información 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 información
dentro del bloque deseado.
En este ejemplo, nuestro dispositivo periférico 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 esquemático de la figura 9.2. Sin
embargo, no haremos uso de la pantalla LCD debido a que estaremos enviando los datos
extraídos de la cadena de caracteres vía RS232 hacia la terminal de comunicaciones de
mikroBasic.
La velocidad de transmisión será de 2400 bps.
Adicionalmente a esto, haremos uso de una nueva rutina de la librería UART para transmitir
texto directamente a la terminal y de esta forma poder saber en que estado se encuentra el
proceso de transmisión y recepción de datos:
UART1_Write_Text(“Texto a enviar vía RS232”)
Esta rutina envía el texto cargado dentro de las comillas, o caracteres almacenados en
variables tipo “string”, vía RS232.
9.3.1.- Ejemplo de programación #52:
Analice detenidamente el siguiente programa, leyendo los comentarios en cada línea:
program RS232
'--- Area de declaración:
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 módulo UART a 2400 bps.
' Pausa de 100 milisegundos para estabilización.
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-función "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,
continúa 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 continúa 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 continúa 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 continúa 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 vía 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 transmisión.
' Hace un salto a “Rcepción” 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 través 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
También 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, aparecerán uno a uno en la pantalla hasta
recibir finalmente el mensaje de estado final de la transmisión.
Figura 9.6
En este momento, resulta importante mencionar que el ejemplo anterior será la base para
establecer las comunicaciones entre el microcontrolador a través de su UART y un módulo
GPS (Global Positioning System), propuesto en uno de los próximos ejemplos de este
capítulo y a través del cual podremos obtener las coordenadas geográficas 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.- Módulo de comunicaciones BlueTooth.
Haciendo uso de un módulo para comunicaciones inalámbricas Bluetooth, de tal manera que
podamos eliminar la conexión física entre nuestro circuito y nuestro PC la cual por cierto
también deberá contar con un módulo de comunicaciones Bluetooth que por lo regular viene
integrado de fábrica.
Figura 9.7
En caso de con contar con un módulo Bluetooth integrado en nuestro PC, también es
posible utilizar un adaptador Bluetooth USB como el que mostramos a continuación:
Figura 9.8
El módulo 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
Código: WRL-00582
Figura 9.10
Este módulo de fácil conexionado maneja niveles de voltaje en sus pines de comunicaciones
RS232 de 5 voltios, por lo cual también podremos eliminar de nuestro circuito el MAX232
que veníamos utilizando para acoplar el puerto serial del PC. El diagrama esquemático
modificado según los cambios planteados se vería de la siguiente forma:
Figura 9.11
269
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Enlazar el módulo Bluetooth que proporciona Sparkfun con el módulo Bluetooth de nuestro
PC es muy simple, siempre y cuando contemos con el software para la administración de
dispositivos Bluetooth en nuestra PC. A continuación veremos una breve explicación acerca
de la instalación 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 módulo recomendado
para este ejemplo práctico. A través de él podremos administrar algunos servicios
disponibles como transferencia de archivos, servicios de impresión, acceso a Red, pasarela
de audio, auriculares, puerto serial Bluetooth entre otros. Veamos a continuación la
secuencia de instalación 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 sesión de Windows, continúa el proceso de configuración 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 opción “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 búsqueda de dispositivos Bluetooth, es probable que aparezcan otros
como nuestros teléfonos móviles, 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 configuración por defecto de este software se solicita que los dispositivos Bluetooth
encontrados sean “emparejados” a través de un código que por lo regular es suministrado
por el fabricante del equipo. En nuestro caso, el código por defecto del módulo 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 código de seguridad para emparejar el dispositivo, entrar en la
configuración del puerto serial Bluetooth y deseleccionar la opción “Conexión segura”.
Figura 9.28
279
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
También 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 configuración, estamos listos para ver nuestro módulo Bluetooth
conectado a nuestro PC, tal y como se observa en la siguiente figura:
Figura 9.31
También es posible ver el estado de la conexión Bluetooth a través de dos Leds en la base
del módulo Bluetooth de nuestro circuito:
•
Un LED de color verde estará en un estado de intermitencia mientras el módulo se
encuentra a la espera de una conexión.
•
Un LED de color Rojo nos indicará que la conexión ha sido exitosa y que el módulo se
encuentra preparado para transmitir y recibir datos.
281
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
9.4.2.- Comunicación Serial inalámbrica BlueTooth.
Sin realizar ninguna modificación sobre el último programa que hemos cargado en el
microcontrolador, podremos ver en funcionamiento las comunicaciones a través de esta
pasarela inalámbrica, 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
configuración para la conexión del puerto, donde COM6 representa la conexión a través del
módulo 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.- Módulo GPS (OEM), comunicación serial RS232.
Hoy en día es posible adquirir a través de Internet módulos
GPS (OEM, abreviatura del inglés “Original Equipment
Manufacturer”) de muy bajo costo y con una eficiencia que
puede sorprender a cualquiera que desee incluirlos en sus
proyectos electrónicos, debido a que son sumamente precisos y
muy fáciles de acoplar.
Básicamente, estos módulos son capaces de capturar la
información necesaria de una red de satélites, a través de los
cuales determinan su posición geográfica en el planeta. Esta
información es entregada por el dispositivo a través de un protocolo estándar denominado
NMEA 0183. Esta información 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
ubicación geográfica actualizada de nuestro dispositivo cada 1 segundo. También existen
módulos GPS que entregan dicha información a frecuencias mayores, por ejemplo a 5Hz, 10
Hz e incluso a 20 Hz.
Los módulos GPS que utilizaremos a continuación tienen una salida de datos Serial
Asíncrona con niveles de voltaje en su salida entre 0 y 5 voltios. Requieren además de una
antena “activa” la cual podremos encontrar en dos modalidades; montada directamente
sobre el módulo 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 próximos ejemplos será la obtención de los siguientes datos
extraídos 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 través del cual se calcula el tiempo en diferentes partes
del mundo.
•
Ubicación geográfica (Latitud y Longitud). Es la ubicación del dispositivo sobre el
planeta, medida en ángulos; grados, minutos y segundos de arco.
•
Satélites detectados. Es la cantidad de satélites 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, sería recomendable leer al respecto en algún
libro especializado o a través de Internet, donde podrá encontrar suficiente información útil y
detallada.
Sin embargo estudiemos un poco acerca del protocolo NMEA, coordenadas geográficas y su
representación numérica.
284
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
9.5.1.- Protocolo NMEA.
Como dijimos anteriormente, podemos obtener la ubicación geográfica del dispositivo en
términos 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 geográfica determina la distancia angular entre un punto del planeta y el
meridiano de Greenwish. En este caso y según su ubicación en el planeta, podremos extraer
del dispositivo una longitud Este o una longitud Oeste según sea el caso.
Esta información la podemos extraer a través una cadena de caracteres ASCII en formato
de comunicación NMEA.
NMEA cuenta con varias sentencias las cuales empiezan con los caracteres “$GP” seguidas
del nombre de la misma, además de los datos capturados por el dispositivo desde la red de
satélites, cada uno de ellos presentados en campos separados por comas. También
podremos encontrar al final de la sentencia el resultado de una operación de dos dígitos
denominada “Checksum” justo después del símbolo “*”.
El “Checksum” se calcula a través de una operación lógica (XOR) realizada tantas veces
como sea necesario según la cantidad de dígitos en la cadena, a través de la cual podemos
determinar si la transmisión de datos desde el modulo GPS hacia el microcontrolador PIC ha
sido correcta. El resultado de esta operación queda expresado a través de dos caracteres
ASCII, los cuales representan un valor Hexadecimal.
Cada vez que el modulo GPS envía una de estas sentencias a través de su salida,
automáticamente termina la misma con <CR> y <LF> (Carrie Return y Line Feed), lo cual
resulta ser muy útil cuando deseamos ver esta información en un terminal de
comunicaciones, ya que cada sentencia será visualizada en una nueva línea en el área de
recepción de datos, y no de forma continua y desordenada.
Uno de los módulos o dispositivos GPS que hemos utilizado como ejemplo ha sido el
Garmin 18-5Hz, de Garmin International Inc., en su versión 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 números, contienen información en un formato conocido el
cual podremos encontrar detallado en la hoja de especificaciones técnicas 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 sincronización con el sistema de
posicionamiento global. 0 = no hay posición, 1 = posición disponible para GPS nodiferencial, 2 = posición disponible para DGPS o GPS diferencial.
•
El campo <7> almacena el número de satélites en uso, entre 00 y 12. Los ceros
siempre serán representados en la cadena de datos, es decir, si la cantidad de
satélites es igual a “cero”, entonces podremos ver los caracteres “00” en este campo.
(Esta característica aplica para todos los campos de la cadena).
•
El campo <8> almacena la Imprecisión 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 sincronización: 2, posición disponible para DGPS.
•
Satélites en uso: 9 satélites.
•
Imprecisión 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
través 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 parámetros de comunicación, 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 están 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 información geográfica (GIS), como Google Earth (http://earth.google.com).
Descargue este programa gratuitamente de la dirección señalada.
Con este programa podremos tomar información relativa a coordenadas geográficas e
introducirlas en Google Earth para obtener la ubicación geográfica 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 Geográfica: N50 42.52892 W112 38.40770
Al introducir estos datos bajo este formato en la casilla de búsqueda de Google Earth, el
programa nos llevará a la posición 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
módulo GPS a una frecuencia conocida, a través de un microcontrolador PIC, debemos
analizar la cadena completa y observar cada cuantos caracteres se da una repetición de la
misma.
En la siguiente imagen podemos ver la salida del módulo 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 señalada será la que estaremos analizando en busca de la sentencia
NMEA que mas nos interesa, y a través de la cual obtendremos los datos anteriormente
comentados, como coordenadas geográficas, número de satélites en uso, altitud entre otros.
Los módulos GPS vienen configurados de fábrica para enviar una cierta cantidad de
sentencias NMEA a través de su salida. Esta configuración podría ser cambiada a través de
un software proporcionado por el fabricante, en caso de que estemos interesados en obtener
una sentencia NMEA específica de todo el repertorio que encontraremos en el manual del
módulo 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 sólo deseamos extraer los datos de la sentencia GGA para la próxima
práctica de programación.
290
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
9.5.2.- Ejemplo de programación #53:
En este ejemplo se requiere extraer de la cadena de caracteres proporcionada por el módulo
GPS las coordenadas geográficas (latitud y longitud) y el número de satélites 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 tamaño conocido, según 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-función "leerCaracter y
y carga el dato en la variable.
Incrementa la variable "acumulador".
Si la variable no es igual a 184,
continúa 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-función, la cual habíamos
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 condición del lazo. Si la condición no
se cumple, se procede a cargar el siguiente byte extraído del Buffer de la UART en la
variable cadena[acumulador], o cadena[2] y así sucesivamente hasta que la condición
“acumulador = 184” se cumpla.
Si se ha preguntado porqué la condición es “acumulador = 184”, sabiendo de ante mano que
la cadena cuenta con tan solo 183 caracteres, la respuesta sería la siguiente:
Si la condición fuese “loop Until(acumulador = 183)”, el último caracter de la cadena (es
decir, el carácter # 183), nunca se cargaría en la variable “cadena[183]”, debido a que la
carga de datos extraídos del Buffer se realiza antes del incremento de la variable
“acumulador”.
Una vez almacenada la cadena, procedemos a realizar la búsqueda 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 búsqueda se reinicia desde el primer caracter “$”
a partir del la posición 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 través de algún periférico
conectado al microcontrolador y el cual en nuestro caso será una pantalla LCD.
' La variable “i” representa el valor de una pocisión 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 línea 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 análisis de la cadena tal y como lo hicimos en el ejemplo de programación
anterior, estaremos desechando las sentencias VTG, RMC y GSA junto con sus datos.
Si por ejemplo quisiéramos extraer tan solo los campos de coordenadas geográficas y
cantidad de satélites en uso de la sentencia GGA para mostrados por la pantalla LCD, lo
apropiado sería mostrar tan sólo el contenido de las variables correspondientes a cada
carácter.
$GPGGA,212529.4,5042.52892,N,12238.40770,W,2,09,1.1,9.7,M,-11.4,M,,*61
Esto significa que según la subrutina de almacenamiento de datos que vimos anteriormente
y según los caracteres correspondientes marcados en “negrilla” en la cadena, la variables
que debemos tomar para extraer estos campos serían las señaladas a continuación dentro
del arreglo “Datos_RX[X]:
292
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Datos_RX[1]
,
Datos_RX[33]
7
Datos_RX[2]
2
Datos_RX[34]
0
Datos_RX[3]
1
Datos_RX[35]
,
Datos_RX[4]
2
Datos_RX[36]
W
Datos_RX[5]
5
Datos_RX[37]
,
Datos_RX[6]
2
Datos_RX[38]
2
Datos_RX[7]
9
Datos_RX[39]
,
Datos_RX[8]
.
Datos_RX[40]
0
Datos_RX[9]
4
Datos_RX[41]
9
Datos_RX[10]
,
Datos_RX[42]
,
Datos_RX[11]
5
Datos_RX[43]
1
Datos_RX[12]
0
Datos_RX[44]
.
Datos_RX[13]
4
Datos_RX[45]
1
Datos_RX[14]
2
Datos_RX[46]
,
Datos_RX[15]
,
Datos_RX[47]
9
Datos_RX[16]
5
Datos_RX[48]
.
Datos_RX[17]
2
Datos_RX[49]
7
Datos_RX[18]
8
Datos_RX[50]
,
Datos_RX[19]
9
Datos_RX[51]
M
Datos_RX[20]
2
Datos_RX[52]
,
Datos_RX[21]
,
Datos_RX[53]
-
Datos_RX[22]
N
Datos_RX[54]
1
Datos_RX[23]
,
Datos_RX[55]
1
Datos_RX[24]
1
Datos_RX[56]
.
Datos_RX[25]
2
Datos_RX[57]
4
Datos_RX[26]
2
Datos_RX[58]
,
Datos_RX[27]
3
Datos_RX[59]
M
Datos_RX[28]
8
Datos_RX[60]
,
Datos_RX[29]
.
Datos_RX[61]
,
Datos_RX[30]
4
Datos_RX[62]
*
Datos_RX[31]
0
Datos_RX[63]
6
Datos_RX[32]
7
Datos_RX[64]
1
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 ocasión utilizaremos un microcontrolador PIC18F452, debido a que requerimos de
una mayor capacidad en memoria RAM, además 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 programación se hará en base al siguiente diagrama esquemático:
Figura 9.39
Dependiendo de las características técnicas del módulo GPS, es posible que éste pueda ser
alimentado directamente de la fuente de 5 voltios que alimenta nuestro circuito, así como
también es posible que debamos incluir en el diseño de nuestro circuito un MAX232 para
acoplar el módulo al microcontrolador. Algunos otros modelos requerirán de un regulador de
voltaje de 3.3 voltios, he incluso podremos prescindir del MAX232, ya que la salida de datos
puede venir diseñada de diferentes maneras en diferentes modelos o marcas.
Con esto queremos dar a entender que siempre será importante estar seguros de cuales
son los parámetros suministrados por el fabricante para su conexionado, puesto que estos
módulos 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 continuación presentamos y lea detenidamente los
comentarios en cada línea:
program GPS_RS232
'--- Area de declaración:
' Configuración 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 configuración de conexiones.
Caracter As Byte
Y As Byte
' Variable para almacenar datos temporalmente.
' Variable para ubicar datos en una posición 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 módulo UART a 2400 bps.
' Pausa de 100 milisegundos para estabilización.
Recepcion:
acumulador = 1
' inicializamos la variable "acumulador"
do
Cadena[acumulador] = LeerCaracter
acumulador = acumulador + 1
loop Until (acumulador = 184)
i = 0
'
'
'
'
'
Llama la sub-función "leerCaracter y
y carga el dato en la variable.
Incrementa la variable "acumulador".
Si la variable no es igual a 185,
continúa 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 continúa 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 continúa 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 continúa 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 continúa 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 continúa 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 continúa verificando
' en busca del caracter "A".
' Una vez identificada la cabecera completa de la sentencia NMEA, procedemos a cargar
' el resto de la información 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 línea 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
específico en la pantalla. Es muy importante prestar atención
a las posiciones en las cuales se están 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 (Línea 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 (Línea 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 posición 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 líneas de programación.
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 posición del próximo 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 posición 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" (Línea 2) de la pantalla LCD.
Incrementamos el valor de "Y" en una unidad para la
nueva posición del próximo digito a imprimir.
Next X
delay_ms(5000)
' Pausa de 5 segundos para visualizar los datos en
' la pantalla LCD.
' Mostramos a continuación la cantidad de Satélites en uso. Debido a que este
' campo en la Cadena está conformado por dos dígitos, 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, línea 2 de la pantalla.
' Escribimos el contenido de la variable "Caracter"
' en la columna 9, línea 2 de la pantalla.
delay_ms(5000)
' Retardo de 5 segundos para visualizar
' la información presentada en pantalla.
GoTo Recepcion
' Hacemos un salto a la etiqueta "Recepción" para
' recoger nuevos datos del modulo GPS.
End.
298
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
9.6.- Programación en Visual Basic 6.0 para ejemplos de comunicación serial RS232.
Cuando se trata de proyectos de comunicación serial RS232, es muy probable que
necesitemos de una interfase personalizada para el control de nuestros dispositivos
electrónicos. Una forma sencilla y efectiva de realizar esto es a través de la programación de
módulos de control en Visual Basic.
A continuación explicamos paso a paso como llegar a programar un sencillo módulo de
comunicaciones encargado de enviar datos al microcontrolador PIC a través del puerto serial
RS232 del PC.
Para esto emplearemos el diagrama esquemático de la figura 9.54, a través 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 opción “EXE estándar” (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
comunicación 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 botón “Aceptar” veremos que en la barra de herramientas aparece un
nuevo icono representado por un teléfono.
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 parámetros 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 código en la
cual introduciremos las siguientes líneas de programa, las cuales se encargarán 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 botón, 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 botón la instrucción que se encargará de enviar un
dato específico a través del puerto serial RS232 del PC. Haga doble clic en el primer botón
del formulario y agregue la siguiente línea 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:
Botón
Botón
Botón
Botón
Botón
Botón
Botón
Botón
Botón
Botón
Botón
#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 botón “Iniciar” (ver figura 9.53), para hacer funcionar el teclado
3x4 desde el cual se enviarán 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 programación #54:
El programa para el ejemplo planteado esta basado en el diagrama esquemático de la figura
9.54:
program RS232
'--- Area de declaración:
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 configuración de conexiones
main: '
Programa Principal
UART1_Init(9600)
Delay_ms(100)
' Inicializamos el módulo UART a 2400 bps.
' Pausa de 100 milisegundos para estabilización.
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 Impresión.
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
Básicamente el microcontrolador estará esperando un dato desde el PC el cual será
mostrado en la segunda línea de la pantalla LCD.
Al presionar cualquiera de las teclas del módulo 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 programación #55:
En base a los conocimientos adquiridos hasta ahora, realizaremos a continuación 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 conversión en decimal a una
pantalla LCD, y enviar este mismo resultado a un PC, a través del puerto serial donde los
datos serán recibidos y “convertidos”, en una hoja de cálculo (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 capítulo de conversión 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 vía
RS232 el resultado de la conversión A/D hacia el PC.
Antes de realizar la programación en Excel, vamos a realizar las pruebas de conversión 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 línea:
program RS232_A/D
' Sección de Declaración
' Configuración 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 configuración 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 máximo de 20 caracteres.
Variable de 16 bits para cargar el valor de la
conversión A/D.
Variable para conversión datos.
main:
UART1_Init(9600)
Delay_ms(100)
' Inicializamos el módulo UART a 2400 bps.
' Pausa de 100 milisegundos para estabilización.
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 analógico,
' VDD es el voltaje de referencia --> Vref.
' Configura el puerto A como entrada.
While (TRUE)
dato = Adc_Read(2)
' Carga el resultado de la conversión de
' 10 bits en la variable.
LCD_Out(1,1,"Conversion A/D: ")
' Imprime un título en la linea 1.
wordtostr(dato, DatoStr)
Lcd_Out(2, 5, DatoStr)
' Conversión 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 vía RS232.
delay_ms(1000)
' Retardo de 50 milisegundos.
Wend
End.
En el programa se puede observar cómo hemos definido el conexionado de la pantalla LCD,
así como también la configuración básica establecida para el conversor A/D, el cual hará la
conversión a 10 bits con el fin de obtener una mayor resolución en el proceso de medición
del voltaje aplicado al pin RA2.
Una vez iniciada la conversión, 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 conversión requiere mas de ocho bits de datos.
Este resultado de la conversión es mostrado en la pantalla LCD e inmediatamente enviado a
través del puerto serial del microcontrolador el cual ha sido inicializado a una velocidad de
transmisión de datos de 9600 bps. En la figura 9.55 podemos observar como se verá el dato
resultado de la conversión en la pantalla.
Figura 9.55
El siguiente paso en el programa consiste en enviar el dato obtenido al PC a través del
puerto serial, para luego hacer una pequeña 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 conversión 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
recepción en la terminal:
Figura 9.56
Recuerde seleccionar la opción “ASCII”, para visualizar los valores obtenidos de la
conversión A/D adecuadamente. En este punto ya podemos estar seguros que la conversión
en RA2 y el envío de datos hacia el PC están correctos.
Pero la idea principal de esta práctica, será llevar estos datos a una hoja de Excel, en la cual
podamos realizar los cálculos 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 cálculo el control “Microsoft communications control, Version 6.0”.
Para esto debemos seguir los siguientes pasos:
1.- Al abrir la hoja de cálculo, podemos ver un menú de opciones en la parte superior de la
ventana denominado “Herramientas”. Haga clic en el menú “Herramientas” y seleccione la
opción “Personalizar”.
310
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Figura 9.58
Al seleccionar esta opción podrá observar que en la ventana “Personalizar” hay tres fichas
de configuración. 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 botón “Cerrar” y verá que aparece en la hoja de
cálculo una caja de herramientas nueva llamada “Visual Basic” (Figura 9.60), la cual
podemos trasladar a la parte superior de la hoja de cálculo, la cual contiene el resto de las
herramientas típicas 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 botón “Cuadro de controles” y desplace la caja de herramientas
nuevamente a la parte superior de la hoja de cálculo 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 cálculo. Para esto, debe mantener el
botón izquierdo del mouse activado y arrastrar el puntero hasta que aparezca un pequeño
recuadro. Al soltar el botón izquierdo el control aparece sobre la hoja. La figura de un
Teléfono 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 botón en el cual se configura el código 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 botón, estamos entrando al editor de Visual Basic, en el
cual podemos agregar las siguientes líneas de programa, las cuales permitirán abrir el
puerto al hacer clic sobre el botón que hemos agregado para tal fin:
Private Sub CommandButton1_Click()
'abre el puerto de comunicación
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 botón 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 también podemos apreciar las líneas de programación agregadas al botón de
comando, y el icono que nos permitirá regresar a la hoja de cálculo para continuar con la
programación.
Al regresar a la hoja de cálculo podremos notar el cambio en la etiqueta del botón de
comando, como se muestra en la figura 9.66:
Figura 9.66
Ahora solo nos queda configurar el evento OnComm, relativo a la recepción 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 continuación 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
declaración de la misma antes de ejecutar cualquier otra línea de programa que así la
requiera. Es por esto que para este ejemplo, el primer paso en la configuración del control
de comunicaciones ha sido la declaración 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 código del evento OnComm, el cual
detallamos unas líneas más adelante. Esta variable se usa básicamente como acumulador y
determina la posición en un rango predeterminado de las filas en la hoja de cálculo. 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 gráfica de líneas 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 cálculo,
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
próximo 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 cálculo.
Veamos a continuación el código 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 código en el evento OnComm. Verifique la rutina
encargada de apilar los datos entre las celdas (40,1) y (30, 1). Por último, analice la
extracción de datos de la cadena de caracteres almacenada en la variable “datainput”.
Completados todos estos pasos, lo siguiente será volver a la hoja de cálculo y salir del modo
de diseño, haciendo clic en el icono señalado 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 diseño, el control de comunicaciones desaparece de la hoja de
cálculo. Ahora, haciendo clic en el botón “Abrir Comm1” y activando el circuito, podremos ver
que aparecen los datos de la conversión A/D del microcontrolador en la pantalla LCD y en la
hoja de cálculo, específicamente 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 cálculo, haremos la conversión 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 también que hemos
ocultado una serie de filas de la hoja de cálculo, las cuales hemos reservado para agregar
un gráfico de líneas 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 Gráficos” (Figura 9.73), donde
aparecerá una ventana en la cual podremos elegir el tipo de gráfico que deseamos utilizar.
Seleccione la ficha “Tipos personalizados” y haga clic en la opción “Líneas 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 aún mas el gráfico, 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 permitirán añadir detalles
como el título del gráfico, identificar los ejes, agregar líneas de división, y algunos otros
detalles útiles para mejorar la apariencia del gráfico. (figura 9.76).
Figura 9.76
324
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Seguidamente, podemos seleccionar si el gráfico será colocado en una hoja nueva, o en la
hoja de cálculo 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 serán 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
Capítulo X. Multi Media Card (MMC) y Secure Card (SD) Memory
MikroBasic tiene una completa librería para el manejo de
memorias del tipo MMC y SD, muy comunes hoy en día para
el almacenamiento de datos en equipos como teléfonos
celulares, cámaras 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 más ha llamado la atención en la aplicación de esta librería, es el hecho de
poder utilizar el sistema de archivos FAT en nuestros proyectos.
Por ejemplo, podemos crear archivos de texto, cuya extensión 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 específicos de una tarjeta de memoria SD.
10.1.- Librería MMC/SD.
Las librerías 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
acrónimo CID: Card IDentification.
10.1.3.- Mmc_Read_Csd().
Lee los 16 bytes del registro CSD de la tarjeta de memoria. Significado del
acrónimo 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 información que podría ser útil, dependiendo de la aplicación que
vamos a querer dar a nuestros circuitos. Veamos a continuación como sustraer el contenido
del registro CID, con un ejemplo sencillo y muy fácil de entender.
El análisis a continuación 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 según 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
Acrónimo
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 número identifica el fabricante de la tarjeta de memoria. En
nuestro análisis utilizaremos una memoria del fabricante SanDisk, por lo cual al leer el
registro CID, debemos obtener el numero de identificación correspondiente a este fabricante,
el cual en binario sería 00000011, en decimal el número 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 número de revisión del producto. Está codificado en
BCD y su formato “n.m” seria el siguiente: Revisión 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 año y mes de fabricación
del producto. Los bits 19 al 12 representan el año. Los bits 11 al 8 representan el mes,
donde 1 es Enero.
CRC7 Checksum: Es una suma de verificación para proteger la integridad de los datos.
10.2.1.- Ejemplo de programación #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 envía el
contenido de cada variable por el puerto serial (RS232) del microcontrolador al
HyperTerminal de MikroBasic.
También es importante aclarar que la comunicación entre el microcontrolador y la tarjeta de
memoria es SPI (Comunicación Serial Síncrona). En otras palabras, tendremos en nuestro
circuito de pruebas un bus de datos SPI a través del cual estaremos enviando información
entre el microcontrolador y la memoria.
Es importante recordar que siempre debemos inicializar el módulo SPI antes de
inicializar la tarjeta de memoria, y este paso se puede resolver bajo los
siguientes parámetros:
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 través
del pin CS (Chip Select) en el bus de datos SPI. Esto se hace poniendo un nivel
lógico 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 líneas 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 líneas de programa configuran el pin seleccionado para el “CS” o chip
select, que en nuestro caso será RC2. La selección del dispositivo MMC se da
cuando RC2 es igual a “0”.
Seguidamente procedemos a reiniciar nuevamente el módulo SPI para una
mayor velocidad en la comunicación 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 comunicación 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 extracción 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 condición establecida no se cumple
haciendo que el programa envíe un mensaje de error (“Memoria no Encontrada”)
por el puerto serial RS232 del microcontrolador.
Si la condición 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 Esquemático del Circuito:
Figura 10.2
El microcontrolador elegido para realizar todos los ejemplos a continuación ha
sido el PIC18F458.
Veamos a continuación el programa completo:
program RegistroCid
' Area de declaración:
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)
' Inicialización de la USART a 9600 bps
' Inicialización del módulo 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 módulo 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 ") ' envía 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 continuación 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), además 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 también establecer los parámetros o ajustes del proyecto haciendo clic
en el botón “Default”, como lo muestra la siguiente imagen:
Figura 10.4
La ventana anterior la puede ubicar fácilmente presionando simultáneamente 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 rápido “Ctrl-T”, o a través 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 parámetros de comunicación del puerto serial que tenga
disponible en su PC, asi como la velocidad de transmisión, la cual deberá ser de
9600 bps, ya que en el ejemplo propuesto la hemos declarado así:
Uart1_Init(9600)
' Inicialización de la USART a 9600 bps
Figura 10.6
El formato en la ventana de recepción 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 fácilmente si observamos la tabla ASCII, y
convertimos sus valores decimales en hexadeimales. Podemos encontrar esta tabla en el
menú “Tools”, haciendo clic en la opción “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 conversión 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 conversión 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 transmisión 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 carácter 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 extraídos 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 habíamos 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”
Revisión Número: 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
Año 2008 - Mes 5 = Mayo
338
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Para mayor facilidad en la conversión de datos, puede utilizar la herramienta de
conversión disponible en mikroBasic:
Figura 10.11
En este punto, ya hemos visto como inicializar la tarjeta de memoria SD, y cómo
extraer la cadena de caracteres del registro CID.
339
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
10.3.- Registro CSD Versión 2.0.
Este registro nos ofrece información ú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 práctica a través de un ejemplo explicado paso a
paso.
Veamos a continuación la siguiente tabla de datos, he interpretemos cada uno de ellos para
saber cual es su función 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 asíncrona 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.
Posición del Bit en TAAT
Valor y Unidad
Bit 2 al 0
Unidades:
0=1ns, 1=10ns, 2=100ns, 3=1μs, 4=10μs,
5=100μs, 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 número equivale a 6, que se corresponde al
valor expresado en la tabla de 1 ms.
Bit 6 al 3: 0100b  en decimal este número 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 debería ser usado para calcular
valores de intervalo de espera.
TRAN_SPEED: Este campo define la máxima velocidad de transferencia en una
línea de datos. Sólo hay dos valores posibles en este caso, 32h equivalente a
25Mhz, que es la frecuencia máxima 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
Posición 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
. Este valor debe
READ_BL_LEN: La longitud máxima de lectura es 2
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 pequeños (1 byte) también pueden ser
utilizados.
WRITE_BLK_MISALIGN: El tamaño del bloque de memoria es definido por
WRITE_BL_LEN. Cuando WRITE_BLK_MISALIGN es igual a 0, indica que el cruce
de límites de bloques físicos es inválido. Cuando es igual a 1, indica que el cruce
de bloques físicos es válido.
READ_BLK_MISALIGN: El tamaño del bloque de memoria es definido por
READ_BL_LEN. Cuando READ_BLK_MISALIGN es igual a 0, indica que el cruce de
límites de bloques físicos es inválido. Cuando es igual a 1, indica que el cruce de
bloques físicos es válido.
C_SIZE: Este parámetro 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 fórmula:
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 múltiples de 512 bytes.
SECTOR_SIZE: Este campo es fijado en 7Fh, es decir, 64K bytes. Este valor no
esta relacionado con la operación 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: Máxima 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
0
0
Disco Duro como sistema de archivos
con tabla de partición.
0
1
DOS FAT con sector de arranque, sin
tabla de partición.
0
2
Formato de archivo universal.
0
3
Otros – Desconocidos.
1
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 programación #57:
Veamos a continuación el programa que nos permitirá leer el registro CSD en
una tarjeta de memoria SD:
program RegistroCid
' Area de declaración:
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)
' Inicialización de la USART a 9600 bps
' Inicialización del módulo 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 módulo 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 ") ' envía 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 repetición 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 descripción anterior, la primera columna corresponde al “nombre” en la
tabla de la figura 10.12. La segunda columna corresponde al número 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 análisis y entendimiento del manejo de la memoria,
utilizaremos un programa para el análisis 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 dirección 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 continuación insertamos la tarjeta de memoria SD en la ranura “ExpressCard”
de la computadora, y seguidamente abrimos el menú “Herramientas” en el cual
encontraremos la opción “Abrir Disco”.
También podemos acceder a esta opción presionando la tecla de acceso rápido
F9 en el teclado.
Figura 10.20
349
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Seleccionada esta opción, veremos la siguiente ventana, la cual muestra los
volúmenes 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.
También contamos con información ú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 clúster, bytes por
sector, bytes por página, entre otros.
En este punto será bueno recordar que el tamaño de un sector puede variar
entre 0,5K bytes y 64K bytes. Comúnmente podremos encontrar que el tamaño
estándar de un sector es de 512 bytes, y este es el caso en este ejemplo.
Para ubicar un sector específico en WinHex, tenemos una herramienta de
búsqueda rápida en el menú “Posición”, llamada “Ir a Sector”. También podemos
acceder a ella con las teclas de acceso rápido “Ctrl+G”.
351
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Figura 10.23
Además tenemos disponible un botón de acceso rápido a esta función,
identificado claramente en la imagen anterior. Al seleccionar esta opción
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
periféricos que suministrarán datos importantes para algún propósito específico.
Al escribir el número del sector y hacer clic en el botón “Aceptar”, podremos
llegar directamente a la posición solicitada, haciendo mucho mas fácil el trabajo
de búsqueda 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 programación #58:
Vamos a realizar un ejemplo en el cual escribiremos algunos datos en un sector
específico de la memoria SD desde el microcontrolador, para luego ser
consultados a través del programa WinHex. Para esto, contamos una rutina en la
librería “MMC” muy fácil de usar.
Mmc_Write_Sector(Sector, Datos), nos permite escribir en un sector
específico, 512 bytes los cuales podemos cargar en la misma cantidad de
variables previamente declaradas.
A continuación veremos un programa a través 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 posición 0 del sector #2:
Posición
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 serán igualadas a 0 en el programa.
Posición
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 serán igualadas a 0 en el programa.
Posición
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 serán igualadas a 0 en el programa.
Posición
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 serán igualadas a 0 en el programa.
Posición
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 serán 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 declaración:
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)
' Inicialización de la USART a 9600 bps
' Inicialización del módulo 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 módulo 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 posición 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 conexión del módulo MMC/SD.
•
Se realizo la declaración de las variables (error_Mmc, I, dato).
•
Se inicializó el puerto serial a 9600 bps.
•
Se inicializó el módulo SPI.
•
Se verifica si la tarjeta de memoria está insertada en el circuito a través de
la variable “error_Mmc”.
•
Si no hay error de memoria no encontrada, se re-inicializa el módulo SPI
para mayor velocidad en la comunicación.
•
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 grabación 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 análisis, al buscar la información 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 programación #59:
Mmc_Read_Sector(Sector, Datos)
Esta función nos permitirá leer un sector específico de la tarjeta de memoria y
almacenar los datos en variables, para luego ser procesados según la aplicación
que queramos dar a nuestros diseños.
Veamos a continuación un ejemplo para la lectura de datos de un sector de la
memoria. Los datos obtenidos serán almacenados en variables y seguidamente
enviaremos el resultado a través del puerto serial, para visualizar los datos en el
terminal de comunicaciones de mikroBasic.
program Mmc_Read_Sector
' Area de declaración:
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)
' Inicialización de la USART a 9600 bps.
' inicializamos el módulo 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 módulo 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 análisis de la librería MMC/SD, haremos una serie de
ejemplos prácticos, 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.
•
Añadir datos en un archivo existente.
•
Re-escribir un archivo.
•
Asignar fecha y hora a un archivo.
•
Extraer el tamaño 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 inicialización del módulo SPI y de la
tarjeta de memoria.
360
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Todos los ejemplos a continuación estarán basados en el microcontrolador
PIC18F458, conectado como se muestra en el siguiente diagrama esquemático:
Figura 10.26
En este punto, sabemos como inicializar y re-inicializar el módulo SPI para una
comunicación 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 inicialización de la tarjeta se
debe hacer con la siguiente rutina de programación:
10.5.1.- Mmc_Fat_Init()
Esta rutina nos devolverá tres posibles estados los cuales describiremos a
continuación:
•
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 diseños incluir un condicional que nos
permita tomar una decisión en caso de presentarse uno de estos tres estados.
Un ejemplo de ello sería determinar a través 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 librería 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 más 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 programación #60:
A continuación haremos un ejercicio utilizando sólo esta rutina, para demostrar
como se puede dar formato a la tarjeta de memoria, además de un nombre, tal y
como lo demuestra la imagen anterior.
Los mensajes que determinan el progreso o actividad del programa serán
enviados por el puerto serial del microcontrolador a la terminal de
comunicaciones de mikroBasic en su configuración estándar.
Analice el siguiente programa y lea cuidadosamente los comentarios:
program Formato_FAT
'--- Area de declaración:
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.
'--- Inicialización del módulo 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 módulo 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 posición 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 conexión del módulo MMC/SD.
•
Inicializamos el puerto serial a 9600 bps.
•
Inicializamos el módulo 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 condición no se cumple y hace un salto para enviar un
mensaje de error por el puerto serial.
•
Re-inicializamos el módulo SPI para una mayor velocidad en la
comunicación 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 envíe 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.- Cómo crear un Archivo en una tarjeta de memoria SD.
Para crear un archivo en el sistema FAT con mikroBasic, contamos con la
siguiente función en la librería 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 número 8
representa un nombre 8 caracteres (máximo), y el número 3 representa la
extensión 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 función, 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 extensión del archivo. La función para crear un archivo de
mikroBasic, siempre tomará los últimos 3 caracteres de la cadena para la
extensión del archivo, la cual en este ejemplo será “.TXT”, y el resto de los
caracteres de la cadena corresponderán siempre al nombre del archivo.
Entonces, si deseamos crear un archivo con un nombre mas corto, pero con la
misma extensión “.TXT”, por ejemplo, “DATOS.TXT”, la cadena de caracteres a
cargar en el campo “nombre del archivo” de la función 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 función 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
Descripción
0x01
Atributo de solo Lectura
1
0x02
Archivo Oculto
2
0x04
Sistema
3
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 creación de un archivo. Si el archivo no existe, y la
bandera es activada (“1”), entonces será creado un nuevo archivo bajo un
nombre específico.
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
creación. Una vez modificado el archivo, veremos automáticamente 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 “Sólo lectura”.
Significa entonces que si deseamos crear un archivo, con atributo de “solo
lectura”, los bits a activar serán los siguientes:
Bit7
1
Bit6
0
Bit5
0
Bit4
0
Bit3
0
Bit2
0
Bit1
0
Bit0
1
Figura 10.33
10.5.6.- Ejemplo de programación #61:
Veamos a continuación algunos ejemplos prácticos en los cuales haremos uso de
algunos de estos atributos. El siguiente programa es capaz de crear un archivo
en el directorio raíz de la tarjeta de memoria SD, con el atributo de “solo lectura”
activo:
program Formato_FAT
'--- Area de declaración:
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.
'--- Inicialización del módulo 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 módulo 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 posición 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 conexión del módulo 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 módulo SPI.
•
Inicializamos la tarjeta MMC/SD y comprobamos si se encuentra insertada
en nuestro circuito. Si no está insertada, la condición 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 Raíz del volumen con el atributo deseado, en este
caso de “Sólo lectura”.
•
Enviamos un mensaje de confirmación 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 raíz, con el atributo de “Sólo 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 tamaño 0 kb, debido a que
aún no hemos insertado datos en él. Para ver los atributos del archivo y verificar
que efectivamente es un archivo de “Sólo lectura”, hacemos un clic derecho
sobre el mismo con el Mouse, y seguidamente hacemos clic en la opción
“Propiedades”.
371
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Figura 10.35
Observe que el atributo de “Sólo lectura” se encuentra activo.
372
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
10.5.7.- Ejemplo de programación #62:
Ahora cambiemos los atributos del archivo, haciendo que éste sea de “Sólo
lectura” y “Archivo Oculto”.
En este caso la palabra a cargar en el campo atributo seria la siguiente:
Bit7
1
Bit6
0
Bit5
0
Bit4
0
Bit3
0
Bit2
0
Bit1
1
Bit0
1
Figura 10.36
Este byte expresado en forma hexadecimal equivale al valor 0x83. Sustituimos
este valor en el campo de atributos de la función “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 quedaría de la siguiente forma:
program Formato_FAT
'--- Area de declaración:
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.
'--- Inicialización del módulo 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 módulo 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 posición 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
sería 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 pestaña “Ver”. En esta pestaña, podremos ver
una sección denominada “Configuración Avanzada”, en la cual podremos activar
la opción denominada “Mostrar todos los archivos y carpetas ocultos”.
La siguiente imagen muestra claramente cual es la opción 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 imágenes:
Figura 10.39
Figura 10.40
376
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
10.5.8.- Ejemplo de programación #63:
Hagamos a continuación otro ejemplo activando el atributo de subdirectorio. En
este caso el resultado será la creación de una carpeta en el directorio raíz de la
tarjeta de memoria.
Cambiando el valor del campo “Atributo” en el programa para crear un
subdirectorio, tenemos que:
Bit7
1
Bit6
0
Bit5
0
Bit4
1
Bit3
0
Bit2
0
Bit1
0
Bit0
0
Figura 10.41
El valor a cargar en el campo “Atributo” de la función “Mmc_Fat_Assign” es 0x90.
Verifique los cambios en siguiente programa:
program Formato_FAT
'--- Area de declaración:
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.
'--- Inicialización del módulo 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 módulo 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 posición 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 función “Mmc_Fat_Assign” ahora es
0x90.
•
El mensaje de confirmación 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 continuación el mensaje de confirmación “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 programación #64:
Verifiquemos a continuación el atributo “Archivo”. Para esto crearemos un
archivo en la raíz de la tarjeta de memoria SD, nuevamente modificando el
campo “Atributos” de la función “Mmc_Fat_Assign” para poder activarlo:
Bit7
1
Bit6
0
Bit5
1
Bit4
0
Bit3
0
Bit2
0
Bit1
0
Bit0
0
Figura 10.43
El valor equivalente en hexadecimal es 0xA0.
program Formato_FAT
'--- Area de declaración:
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.
'--- Inicialización del módulo 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 módulo 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 posición 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 confirmación.
Al compilar y grabar el programa en el microcontrolador, y finalmente explorar el
contenido de la tarjeta de memoria SD en Windows después 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 continuación vamos a crear e ingresar algunos datos en un archivo de texto,
utilizando la siguiente función:
Mmc_Fat_Write(datos, número de bytes a ser escritos)
El campo “número de bytes a ser escritos” debe contener el número de bytes
que va a ocupar la variable del campo “datos”.
Por ejemplo:
Si la información a cargar en el archivo de texto es la siguiente cadena de datos:
“Cadena de caracteres de prueba número 1”
Entonces el número 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 número 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 información en un archivo de texto creado en la raíz 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 declaración de algunas
variables adicionales:
Dim cadena
As string[41]
acumulador As Byte
Agregamos una sub-función 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 posición de la linea.
acumulador = 0
' inicializamos la variable "acumulador"
do
cadena[acumulador] = LeerCaracter
' Llama la sub-función "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,
' continúa cargando caracteres.
Por ultimo, incluimos la función “Mmc_Fat_Write” después de la función 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 programación #65:
Analice cuidadosamente el siguiente programa, el cual incluye las rutinas antes
mencionadas:
program Mmc_Fat_Write
'--- Area de declaración:
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 posición de la linea.
acumulador = 0
' inicializamos la variable "acumulador"
do
cadena[acumulador] = LeerCaracter
acumulador = acumulador + 1
loop Until (acumulador = 41)
' Llama la sub-función "leerCaracter y
' y carga el dato en la variable.
' Incrementa la variable "acumulador".
' Si la variable no es igual a 41,
' continúa cargando caracteres.
'--- Inicialización del módulo 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 módulo 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 posición 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 recepción de datos del terminal. Recuerde también
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 número 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 número 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 función:
Mmc_Fat_Set_File_Date(año, mes, día, horas, minutos, segundos)
Los parámetros válidos a cargar en esta función para la fecha y hora son los
siguientes:
Año:
Mes:
Día:
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 función, para cargar los valores de fecha y
hora en el archivo. Las variables serán 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 función para asignar la fecha y la hora al archivo, justo
después de la función “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 programación #66:
A continuación analice los cambios efectuados en el siguiente programa:
program Mmc_Fat_Fecha_Hora
'--- Area de declaración:
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 posición de la linea.
acumulador = 0
' inicializamos la variable "acumulador"
do
cadena[acumulador] = LeerCaracter
acumulador = acumulador + 1
loop Until (acumulador = 41)
' Llama la sub-función "leerCaracter y
' y carga el dato en la variable.
' Incrementa la variable "acumulador".
' Si la variable no es igual a 41,
' continúa cargando caracteres.
'--- Inicialización del módulo 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 módulo 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 posición de la linea.
End If
fin:
GoTo fin
' Lazo Infinito
End.
Antes de verificar el funcionamiento del programa, asegúrese de borrar el
contenido de la tarjeta de memoria SD, ya que en el ejemplo anterior estábamos
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 también 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 específico 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 más 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
función:
Mmc_Fat_Assign(nombre del archivo, atributo)
Aparte de usar esta función para crear un archivo con ciertos atributos activos,
también 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 aún 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 raíz.
10.8.1.- Ejemplo de programación #67:
En este ejercicio, existen tres posibles respuestas de parte del microcontrolador
a través 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 raíz, recibiremos el
mensaje de confirmación “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 raíz, recibiremos el
mensaje “Archivo no encontrado…”.
Analice el siguiente programa, leyendo cuidadosamente sus comentarios:
program Formato_FAT_Insertar_Datos
'--- Area de declaración:
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.
'--- Inicialización del módulo 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 módulo 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 posición 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 posición 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 posición 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 básicamente los mismos en la rutina principal del programa:
•
Inicializamos el puerto serial a 9600 bps.
•
Inicializamos el módulo SPI.
•
Verificamos si la tarjeta de memoria SD esta presente en el circuito; en
caso de estarlo, re-inicializamos el módulo SPI para mayor velocidad en la
comunicación 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 través de la función “Mmc_Fat_Assign”.
•
Si el archivo existe, enviamos el mensaje de confirmación 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 continuación 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 raíz 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 añadir más información al mismo.
392
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
10.9.- Insertar datos en un archivo existente.
Para añadir información a un archivo que ya contiene datos grabados, mikroBasic
cuenta con la siguiente función:
Mmc_Fat_Append()
Los pasos para añadir más datos a un archivo existente serían 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 añadir
“Mmc_Fat_Append” de mikroBasic.
•
Añadir los datos al archivo.
más
datos
con
la
función
Recordemos que la cadena de caracteres que deseamos insertar en un archivo
que ya contiene datos, debe ser igual al número 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 podría ser administrada a
través del campo “número de bytes a ser escritos” de la rutina Mmc_Fat_Write().
10.9.1.- Ejemplo de programación #68:
Analice a continuación el siguiente programa y lea detenidamente los
comentarios:
program Mmc_Fat_Append
'--- Area de declaración:
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 posición de la linea.
acumulador = 0
' inicializamos la variable "acumulador"
do
cadena[acumulador] = LeerCaracter ' Llama la sub-función "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,
' continúa cargando caracteres.
'--- Inicialización del módulo 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 módulo 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 posición 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 añadir más datos:
Mmc_Fat_Append()
' Añadimos 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 posición 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 posición 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 posición 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 serían los siguientes:
•
Iniciamos la terminal de comunicaciones de mikroBasic y nos aseguramos
que hemos seleccionado el modo de recepción 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 número 1”), podremos ver
el mensaje de error “Memoria no Encontrada”. Un segundo después
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 número 1”), el mensaje será “Archivo
encontrado” y seguidamente “Datos insertados en el archivo”. Un segundo
después tendremos nuevamente el mensaje “Esperando Datos…”.
Las cadenas insertadas en el archivo estarán separadas por un espacio en
blanco. Este espacio puede ser reemplazado por una coma (“,”) o por
cualquier otro carácter de ser necesario.
Un archivo con datos separados por comas podría ser muy útil para nuestros
proyectos, ya que este formato puede ser asociado a una hoja de cálculo de
Microsoft Excel. En este caso, la extensión del archivo a definir tendría que ser
“.CSV” para que esta aplicación de Microsoft lo reconozca como tal.
396
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Capítulo XI. Servomotores
11.1.- ¿Qué es un Servomotor?
Un servomotor es un dispositivo electromecánico capaz de rotar su eje a una posición
específica 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 señal se introduce a través de un
cable de control que se distingue entre los tres cables que posee y que según la marca del
servomotor puede ser de color blanco, amarillo o anaranjado. Los cables de alimentación se
distinguen por sus colores rojo (Positivo), y negro o marrón (Negativo).
Un servomotor estándar tiene dimensiones muy apropiadas para realizar proyectos de
robótica, y aunque se pueden encontrar en diferentes tamaños, es importante resaltar que la
fuerza de un servo en su eje no es directamente proporcional al tamaño del mismo. Esto
significa que su fuerza depende en gran sentido de su diseño interior, es decir, de la
mecánica y material que componen sus engranajes.
Veamos a continuación algunas características técnicas importantes en un servomotor
estándar:
Control: Control por ancho de pulso.
Pulso: 3-5 Voltios Pico a Pico.
Voltaje de operación: 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 posición 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 posición,
siempre y cuando el tren de pulsos esté presente. El recorrido será en la mayoría de los
modelos de 180º y los tiempos correspondientes al pulso en la señal 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 posición 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 señal
correspondiente a esta posición (90º), donde T2 se mantiene en 20 milisegundos.
Figura 11.4
La señal correspondiente a la posición máxima (180º) en un servomotor estándar, tendría
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 características,
cambiando el valor correspondiente a T1 a través de una variable declarada, podemos
modificar el ángulo de giro de un servomotor.
11.1.1.- Ejemplo de programación #69:
Veamos el siguiente ejemplo:
Figura 11.6
400
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
program Servo1
' Area de declaración.
Symbol Servo = PORTB.0
main:
' Alias del Pin RB0
' Programa Principal
TRISB = %11111110
' Configuración 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
Período: 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 posición 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 instrucción “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 deseáramos 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 límites soportados por
el servomotor, éste no adquiere ninguna posición definida y posiblemente el eje principal del
mismo quede libre.
Por esto es importante que siempre verifiquemos las especificaciones del fabricante.
También 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 programación #70:
Veamos el siguiente programa, en el cual el servomotor mueve su eje a cada posición de la
figura 11.8. Cada posición se mantiene durante dos segundos.
program Servo2
' Area de declaración.
Symbol Servo = PORTB.0
' Alias del Pin RB0
Dim X As Byte
' Variable para For-Next.
main:
' Programa Principal
TRISB = %11111110
' Configuración del Puerto "B"
Centro:
For X = 1 To 100
Servo = 1
Delay_Us(1500)
Servo = 0
Delay_ms(20)
'
'
'
'
'
'
For-Next para mantener la posición 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 posición 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 posición 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
Capítulo XII. PWM
12.1.- PWM.
PWM es una abreviación de Pulse Width Modulation, o modulación por ancho de pulso, y es
un método utilizado normalmente para el control de velocidad de motores eléctricos, 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 señal generada.
Algunos microcontroladores como los que estamos utilizando en esta edición (PIC16F877,
PIC18F452, entre otros) tienen en su hardware dos módulos CCP (Capture-Compare-PWM).
A través de estos módulos y con la ayuda de la librería PWM de mikroBasic, el trabajo de
generar una señal de modulación por ancho de pulso resulta muy sencillo y rápido.
Una señal PWM se ve de siguiente forma:
Figura 12.1
El ciclo de trabajo representa el tiempo que la señal permanece activa. En otras palabras, si
quisiéramos controlar la velocidad en un motor DC, y aplicamos una señal PWM a éste, un
momento o tiempo en alto de la señal significaría que estamos aplicando energía al motor
durante este tiempo, y un momento en bajo significaría que no hay energía aplicada a éste.
Si hacemos el momento, tiempo o ciclo de trabajo mayor, entonces estaríamos aplicando
energía durante un tiempo mayor, lo cual significa que el motor tomaría mayor velocidad.
Esto sugiere que si tenemos control sobre el ciclo de trabajo de la señal 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 señal PWM y el ciclo de trabajo son dos parámetros que pueden ser
controlados a través de las rutinas proporcionadas por la librería PWM de mikroBasic.
También es posible especificar cual de los dos módulos PWM en el hardware del
microcontrolador deseamos utilizar. Cada módulo es independiente, lo cual nos da la libertad
de configurar la frecuencia y ciclo de trabajo de cada uno por separado.
12.2.- Librería PWM.
Veamos a continuación las rutinas de la librería PWM para cada módulo.
Módulo PWM 1:
12.2.1.- PWM1_Init(“freq”).
Inicializa el módulo PWM1 con un ciclo de trabajo igual a 0. El parámetro “freq” representa la
frecuencia en Hz deseada para la señal de salida PWM. El valor mínimo de la frecuencia
cuando usamos un oscilador externo de 4 Mhz es de 245 Hz. El valor mínimo de la
frecuencia cuando usamos un oscilador externo de 20 Mhz es 1221 Hz. Estos valores se
calculan según las especificaciones de cada microcontrolador en su hoja de datos. En este
caso, hemos tomado la resolución máxima de 10 bits, Timer Prescaler = 16, y el valor del
registro PR2 = 0xFFh.
12.2.2.- PWM1_Set_Duty(“ciclo de trabajo”).
El parámetro “ciclo de trabajo” lo podemos medir en términos de porcentaje sobre una
escala que varía entre 0 y 255, donde 255 equivale al 100% del ciclo de trabajo.
12.2.3.- PWM1_Start().
Inicia la señal PWM en el módulo PWM1, según su ciclo de trabajo y frecuencia definida.
12.2.4.- PWM1_Stop().
Detiene la señal PWM en el módulo PWM1.
12.2.5.- Módulo PWM2:
Sólo se debe cambier el indice “n” en las rutinas de la librería “PWMn_” para el control del
módulo 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 parámetro “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
cálculo:
Valor =
255 ∗ 5%
= 12.75 ≈ 13
100%
En este caso, la señal PWM de salida se verá de la siguiente forma:
Figura 12.2
Si calculamos el valor del ciclo de trabajo para un 50%, la señal 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 señal 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 multímetro digital. Para
generar un voltaje específico en una de las salidas de un microcontrolador a través de la
instrucción PWM, podemos aplicar la siguiente fórmula:
Vout =
Vfuente ∗ nivel
255
Donde,
Vout: voltaje de salida.
Vfuente: voltaje de la fuente de alimentación 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 programación #71:
Figura 12.5
Verifique el voltaje de salida en el pin RC2 para cada valor calculado del ciclo de trabajo de
la señal PWM.
El siguiente programa genera una señal PWM con un ciclo de trabajo del 50% a través del
pin RC2:
program PWM1
' Area de declaración.
Dim Duty As Byte
main:
' Programa Principal
PWM1_Init(5000)
' Inicializamos el módulo 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 señales PWM simultáneas, pero con diferentes frecuencias y
ciclos de trabajo, entonces debemos agregar las líneas correspondientes al segundo módulo
PWM:
program PWM2
' Area de declaración.
Dim Duty1 As Byte
Dim Duty2 As Byte
main:
' Programa Principal
PWM1_Init(5000)
PWM2_Init(2000)
' Inicializamos el módulo PWM1 a 5KHz
' Inicializamos el módulo 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 (Señal Verde), y RC1 para PWM2 (Señal Roja) se verían 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 programación #72:
Vamos a realizar a continuación un ejercicio para el control de un motor DC a través de una
señal PWM. Para esto hemos incluido en el diagrama esquemático cuatro pulsadores y una
pantalla LCD. La función 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 señal 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 señal PWM.
•
P3: Activa la señal PWM en la salida correspondiente al módulo PWM1.
•
P4: Detiene la señal PWM en la salida correspondiente al módulo PWM1.
Se deberá inicializar el valor del ciclo de trabajo para que la señal 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 línea:
program PWM3
' Area de declaración.
Dim Duty1 As Byte
Estado As Byte
txt
As String[6]
' Variable de contenido temporal tipo String
' Configuración 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 configuración 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 módulo PWM1 a 5KHz
' Selecciona el ciclo de trabajo para PWM1
Pulsadores:
ByteToStr(Duty1, txt)
Lcd_Out(2, 8, txt)
' Convierte el valor numérico 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 límite para que la variable no se desborde,
' es decir, si Duty1 es mayor que el valor límite 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 límite 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 señal PWM, debido a
que hemos inicializado la variable correspondiente a este parámetro en 127.
Los pulsadores “P1” y “P2” aumentan y disminuyen respectivamente el ciclo de trabajo de la
señal PWM. Esta variación podrá ser visible a través de la pantalla LCD.
Por último, si pulsamos “P4” el motor deberá parar completamente, debido a que la señal
PWM será interrumpida por el programa.
412
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Apéndice A.
Tabla ASCII
413
_______________________________________________________________________________________
Contenido - Basic para Microcontroladores PIC – www.conexionelectronica.com – Christian Bodington Esteva
Apéndice B
Software y prácticas en formato digital.
http://www.conexionelectronica.com/download/Ejemplos.rar
Bibliografía
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
Višegradska 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
Descargar