Mikro Basic

July 23, 2019 | Author: qazpo | Category: Microcontrolador PIC, Microcontrolador, Puerta lógica, Compilador, Basic
Share Embed Donate


Short Description

Microcontroladores PIC...

Description

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 la división entera (no se byte, short, word, integer, longint, longword puede utilizar con punto flotante)

byte, short, word, integer, longint, longword

mod

Figura 1.68

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

1.6.7.- Operadores Bit a Bit: En la siguiente tabla veremos los operadores binarios proporcionados para el lenguaje Basic: Operador and or xor not

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 = > < >= 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 columna As Byte ' declaración de la variable "columna" tipo 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 */ '* { */ '* | */ '* } */ '* 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

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF