04.06.2013 Views

MPLAB X y Tecnicas de Programacion con librerias ... - mcelectronics

MPLAB X y Tecnicas de Programacion con librerias ... - mcelectronics

MPLAB X y Tecnicas de Programacion con librerias ... - mcelectronics

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>MPLAB</strong>® X Y TÉCNICAS DE<br />

PROGRAMACIÓN CON LIBRERÍAS<br />

DE MICROCHIP<br />

1<br />

Andrés Raúl Bruno Saravia<br />

Ariel Jacinto Coria<br />

Sebastián Gregori Fiadino<br />

Alejandro Anibal Airoldi


Airoldi, Alejandro Anibal<br />

<strong>MPLAB</strong> X y Técnicas <strong>de</strong> Programación <strong>con</strong> Librerías <strong>de</strong> Microchip. - 1a ed. - Buenos Aires.<br />

<strong>mcelectronics</strong>, 2011.<br />

300 p.: il.; 22x16 cm.<br />

ISBN: 978-987-26021-1-6<br />

1. Informática. 2. Programación. I. Título<br />

CDD 519.7<br />

Fecha <strong>de</strong> catalogación: Abril 2011<br />

© <strong>mcelectronics</strong><br />

Hecho el <strong>de</strong>pósito que marca la ley 11.723<br />

Todos los <strong>de</strong>rechos reservados.<br />

Ninguna parte <strong>de</strong> este libro, incluido el diseño <strong>de</strong> la portada, pue<strong>de</strong> reproducirse, almacenarse o transmitirse <strong>de</strong><br />

ninguna forma ni por ningún medio, sea este eléctrico, químico, mecánico, óptico, <strong>de</strong> grabación o <strong>de</strong> fotocopia,<br />

sin la previa autorización escrita por parte <strong>de</strong> <strong>mcelectronics</strong>. La infracción <strong>de</strong> los <strong>de</strong>rechos mencionados pue<strong>de</strong><br />

ser <strong>con</strong>stitutiva <strong>de</strong> <strong>de</strong>lito <strong>con</strong>tra la propiedad intelectual.<br />

La editorial no se pronuncia ni expresa implícitamente respecto a la exactitud <strong>de</strong> la información <strong>con</strong>tenida en<br />

este libro, razón por la cual no pue<strong>de</strong> asumir ningún tipo <strong>de</strong> responsabilidad en caso <strong>de</strong> error u omisión.<br />

Las marcas mencionadas son propiedad exclusiva <strong>de</strong> sus registradores legales.<br />

2


A todos los que han colaborado en la redacción y edición <strong>de</strong> este libro.<br />

A los alumnos que a lo largo <strong>de</strong> estos años <strong>con</strong>tribuyeron <strong>con</strong> sus invaluables aportes.<br />

A nuestras familias y amigos por el apoyo in<strong>con</strong>dicional.<br />

3


SERVICIO DE AYUDA AL LECTOR<br />

Por <strong>con</strong>sultas, sugerencias o para solicitar información adicional, favor no du<strong>de</strong> en escribirnos a:<br />

soporte@<strong>mcelectronics</strong>.com.ar<br />

PROGRAMAS Y RECURSOS ADICIONALES DE MICROCHIP<br />

Para po<strong>de</strong>r compilar los programas propuestos necesita el entorno <strong>de</strong> <strong>de</strong>sarrollo <strong>MPLAB</strong> X, el<br />

compilador C18 para PIC18 y el compilador C30 para los dsPIC. Todas las herramientas se pue<strong>de</strong>n<br />

obtener en forma gratuita <strong>de</strong>s<strong>de</strong> la <strong>de</strong> Microchip:<br />

www.microchip.com/mplabx<br />

www.microchip.com/c18<br />

www.microchip.com/c30<br />

PROGRAMAS Y RECURSOS ADICIONALES DE MCELECTRONICS<br />

Pue<strong>de</strong> acce<strong>de</strong>r al código fuente <strong>de</strong> los programas, ejercicios adicionales y clases en MP3 a través<br />

<strong>de</strong> la web <strong>de</strong>l libro:<br />

www.<strong>mcelectronics</strong>.com.ar/techtrain<br />

COMPLEMENTOS<br />

Microchip Application Libraries<br />

www.microchip.com/mal<br />

MCP2200 Configuration Utility<br />

www.microchip.com/mcp2200<br />

LABVIEW<br />

www.ni.com/labview<br />

MATLAB<br />

www.mathworks.com/products/matlab<br />

5


SUMARIO<br />

CREANDO UN PROYECTO CON <strong>MPLAB</strong> X 9<br />

GUIA VISUAL 11<br />

PROGRAMANDO EN LENGUAJE C 21<br />

CARACTERISTICAS DEL LENGUAJE 23<br />

SET DE INSTRUCCIONES 26<br />

DECLARACION DE VARIABLES 30<br />

FUNCION PRINTF() 31<br />

MANEJO DE LA MEMORIA 41<br />

FUNCIONES 44<br />

INTERRUPCIONES 50<br />

ESCRIBIENDO APLICACIONES EN C18 53<br />

CONTROL I/O ELEMENTAL 55<br />

CONTADOR 56<br />

LCD 57<br />

CONVERSOR A/D 63<br />

USART 65<br />

INTERRUPCIONES 68<br />

ETHERNET Y WI-FI CON PIC 71<br />

MICROCHIP TCP/IP CONFIGURATION WIZARD 74<br />

LOS ARCHIVOS DEL STACK 85<br />

MPFS 88<br />

MICROCHIP WEB PREVIEW 93<br />

ENVIO DE EMAILS 95<br />

ACCESO DESDE INTERNET 97<br />

ARQUITECTURA DEL PIC18F97J60 102<br />

VARIABLES DINÁMICAS 106<br />

MODULO WI-FI 124<br />

7


ALICACIONES USB CON PIC 149<br />

CAPAS DEL MODELO USB 157<br />

USB + VISUAL BASIC.NET 177<br />

LABORATORIOS PRACTICOS 179<br />

MCP2200 197<br />

APLICACIONES GSM CON PIC 201<br />

COMANDOS AT 203<br />

ESQUEMATICO COMPLETO 206<br />

DESCRIPCION DEL PROGRAMA 211<br />

CONTROL DISCRETO CON dsPIC 227<br />

INTRODUCCION A CONTROL AUTOMATICO 229<br />

SISTEMAS DE CONTROL DIGITALES 230<br />

SELF BALANCING ROBOT 235<br />

CONSTRUCCION DEL ROBOT 242<br />

COMPENSADOR EN MATLAB 251<br />

ADQUISICION Y ANALISIS DE DATOS 258<br />

INTRODUCCION A LABVIEW 259<br />

COMPARACION SOFT/DSP 280<br />

NOMENCLATURA 282<br />

8


ETHERNET Y WI-FI CON<br />

9<br />

PIC®


TELEMETRÍA Y CONTROL REMOTO CON PIC<br />

En este capítulo apren<strong>de</strong>remos a realizar algunas aplicaciones muy útiles para los sistemas <strong>de</strong><br />

monitoreo y <strong>con</strong>trol a distancia utilizados en electrónica industrial mediante re<strong>de</strong>s Ethernet.<br />

Las aplicaciones <strong>de</strong> monitoreo y <strong>con</strong>trol son muy utilizadas en la industria, don<strong>de</strong> se necesita<br />

tener suficiente información para realizar una <strong>de</strong>terminada acción <strong>de</strong> <strong>con</strong>trol. Es por este motivo<br />

que en este capítulo veremos algunas aplicaciones simples don<strong>de</strong> se agrega comunicación a<br />

través <strong>de</strong> la red Ethernet. Esto permite que el <strong>con</strong>trol sea a distancia, permitiendo a<strong>de</strong>más la<br />

comunicación entre distintos dispositivos que actúan como sensores o actuadores, esto es un<br />

ejemplo <strong>de</strong> los beneficios que trae una red Ethernet.<br />

Los ejemplos serán explicados <strong>de</strong> manera <strong>de</strong>tallada y <strong>con</strong> la profundidad a<strong>de</strong>cuada. Veremos<br />

a<strong>de</strong>más, los módulos <strong>de</strong> entrenamiento comerciales que nos ayudarán a afianzar los<br />

<strong>con</strong>ocimientos teóricos sobre este tema. Todo esto nos permitirá <strong>de</strong>sarrollar aplicaciones <strong>de</strong><br />

manera rápida y efectiva.<br />

NETWORKING CON PIC<br />

Apren<strong>de</strong>remos a utilizar las herramientas <strong>de</strong> Microchip, como el TCP/IP Configuration Wizard y el<br />

Microchip WebPreview para crear un WebServer <strong>con</strong> PIC.<br />

Para comenzar a trabajar necesitamos tener instalado el <strong>MPLAB</strong>, el compilador C18 y el<br />

Microchip TCP/IP Stack. Vamos a estudiar el Microchip TCP/IP Stack. Siempre es recomendable<br />

<strong>con</strong>sultar la web <strong>de</strong>l fabricante para <strong>de</strong>scargar la última versión: www.microchip.com/mal<br />

Para instalarlo basta <strong>con</strong> ejecutar las Microchip Libraries que se <strong>de</strong>scargan <strong>de</strong> la web mencionada<br />

anteriormente. En verdad estamos instalando una serie <strong>de</strong> librerías que Microchip provee para<br />

manejo <strong>de</strong> USB, mTouch (sensor capacitivo), TFT y Ethernet.<br />

El Microchip TCP/IP Stack está formado por un <strong>con</strong>junto <strong>de</strong> capas que dan acceso a distintos<br />

protocolos: ARP, IP, ICMP, UDP, TCP, DHCP, SNMP, HTTP, FTP y TFTP. El Stack está totalmente<br />

programado en C, requiere aproximadamente 32K en memoria <strong>de</strong> programa y es portable a<br />

través <strong>de</strong> las distintas familias <strong>de</strong> Microchip. Es <strong>de</strong>cir, funciona en micros <strong>de</strong> 8, 16 y 32 bits.<br />

11


Figura 1: El stack está formado por varia capas, don<strong>de</strong> cada una brinda servicios a la capa<br />

superior.<br />

Junto <strong>con</strong> el TCP/IP Stack se instalan 2 aplicaciones sumamente útiles al momento <strong>de</strong> <strong>de</strong>sarrollar<br />

una interface Ethernet <strong>con</strong> PIC: el Microchip TCP/IP Configuration Wizard y el Microchip Web<br />

Preview. La primera nos permite modificar los parámetros <strong>de</strong>l Stack en forma gráfica (sin tener<br />

que programar en C) y <strong>con</strong> la segunda po<strong>de</strong>mos visualizar la página web antes <strong>de</strong> cargarla en la<br />

memoria <strong>de</strong>l PIC.<br />

MICROCHIP TCP/IP CONFIGURATION WIZARD<br />

Po<strong>de</strong>mos tener una buena i<strong>de</strong>a <strong>de</strong> las posibilida<strong>de</strong>s <strong>de</strong>l Stack estudiando en <strong>de</strong>talle el Microchip<br />

TCP/IP Configuration Wizard. Si bien esta aplicación nos permite modificar parámetros <strong>de</strong> la red<br />

como la dirección IP y MAC; seleccionar entre protocolos como HTTP y FTP, no permite que el<br />

usuario agregue su propio código. Al momento <strong>de</strong> implementar un sistema necesariamente<br />

<strong>de</strong>bemos programar las funciones en C <strong>con</strong> el <strong>MPLAB</strong>.<br />

Lo primero que <strong>de</strong>bemos hacer es seleccionar la carpeta <strong>de</strong>s<strong>de</strong> la cual vamos a trabajar, es <strong>de</strong>cir,<br />

don<strong>de</strong> está instalado el Stack. El proyecto básico se encuentra en: C:\Microchip Solutions<br />

library\TCPIP Demo App. Si bien hay varios ejemplos realizados <strong>con</strong> el stack, es <strong>con</strong>veniente<br />

empezar <strong>con</strong> este. Hay otros <strong>con</strong> soporte para WI-FI y librerías <strong>de</strong> encriptación SSL.<br />

Lo que estamos haciendo es <strong>de</strong>cirle al asistente que archivos vamos a <strong>con</strong>figurar. Hay que tener<br />

presente que el TCP/IP Configuration Wizard agrega o quita funciones <strong>de</strong>l stack comentando<br />

código. Sabemos que el C18 no compila el código comentado ni las funciones asociadas,<br />

ahorrando así memoria <strong>de</strong> programa en el PIC.<br />

12


Figura 2: Pantalla inicial <strong>de</strong>l TCP/IP Configuration Wizard.<br />

El TCP/IP Configuration Wizard es una aplicación gráfica que permite modificar los parámetros<br />

<strong>de</strong>l stack. Sin embargo, para realizar telemetría y <strong>con</strong>trol a través <strong>de</strong> Ethernet <strong>de</strong>bemos<br />

interactuar <strong>con</strong> el stack mediante funciones callback programadas en C.<br />

AGREGANDO SERVICIOS AL STACK<br />

Po<strong>de</strong>mos agregar soporte para distintos servicios: Servidor Web, Cliente <strong>de</strong> email, Telnet, FTP y<br />

SSL. A<strong>de</strong>más soporte para el módulo WI-FI <strong>de</strong> Wi-Fi que veremos en el fascículo 22.<br />

En esta instancia vamos a agregar Servidor Web, que permite acce<strong>de</strong>r a un página por medio <strong>de</strong><br />

una dirección IP y Cliente <strong>de</strong> email mediante el cual podremos enviar un email automáticamente<br />

ante un <strong>de</strong>terminado evento, por ejemplo, si sube la temperatura por encima <strong>de</strong> un umbral.<br />

13


Figura 3: Opciones <strong>de</strong> Servidor Web y Cliente <strong>de</strong> email seleccionadas en el TCPIP Configuration<br />

Wizard.<br />

Como mencionamos anteriormente, cada servicio que <strong>de</strong>shabilitamos por medio <strong>de</strong>l asistente es<br />

comentado en el Stack para que el C18 no lo compile.<br />

En la Figura 3, vemos que po<strong>de</strong>mos comentar manualmente cada servicio. En esta instancia cabe<br />

mencionar que el Stack <strong>de</strong> Microchip está organizado en varios archivos, los encabezados que<br />

habilitan los servicios se encuentran en el archivo: TCPIPConfig.h<br />

Vemos que no todas las funciones <strong>de</strong>l Stack están disponibles a través <strong>de</strong>l TCP/IP Configuration<br />

Wizard, por eso es importante acce<strong>de</strong>r al archivo TCPIPConfig.h y comentar los servicios que no<br />

necesitamos, <strong>de</strong> esta forma estamos optimizando el uso <strong>de</strong> la memoria <strong>de</strong> programa. Por<br />

ejemplo, para <strong>de</strong>shabilitar el DNS, la instrucción <strong>de</strong>be quedar comentada por medio <strong>de</strong>l operador<br />

//<br />

//#<strong>de</strong>fine STACK_USE_DNS<br />

14


FUNCIONES ESPECIALES DEL STACK<br />

Por medio <strong>de</strong>l TCP/IP Configuration Wizard po<strong>de</strong>mos agregar funciones especiales. Por ejemplo,<br />

una aplicación sumamente útil es hacer un <strong>con</strong>versor RS232 – Ethernet: así todos los paquetes<br />

que ingresen por el <strong>con</strong>ector <strong>de</strong> red serán retransmitidos por la UART <strong>de</strong>l PIC y viceversa. De esta<br />

forma po<strong>de</strong>mos darle <strong>con</strong>ectividad Ethernet a sistemas que originalmente solo tenían<br />

comunicación RS232.<br />

Otra función interesante es medir el tiempo <strong>de</strong> viaje <strong>de</strong> un paquete entre el cliente y el host, lo<br />

que comúnmente <strong>de</strong>nominamos PING. El stack nos <strong>de</strong>vuelve el tiempo <strong>de</strong> viaje en milisegundos.<br />

Figura 4: Habilitando las funciones especiales Serial to Ethernet Bridge y TCP Performance Test<br />

(PING).<br />

Vamos ahora a <strong>de</strong>finir el nombre <strong>de</strong> Host, es <strong>de</strong>cir un nombre <strong>con</strong> el cual i<strong>de</strong>ntificar a nuestra<br />

placa en la red. Si tenemos habilitado el servicio <strong>de</strong> DNS po<strong>de</strong>mos asociar un nombre a la placa<br />

que será más fácil <strong>de</strong> recordar que la dirección IP. Por otra parte, como la IP pue<strong>de</strong> ser asignada<br />

por el servidor en forma dinámica, resulta <strong>con</strong>veniente <strong>de</strong>finir un nombre <strong>de</strong> Host.<br />

15


Figura 5: Dirección MAC por <strong>de</strong>fecto <strong>de</strong>l PIC y nombre <strong>de</strong> Host .<br />

Vinculado estrechamente al nombre <strong>de</strong> Host se encuentra la dirección MAC. Recor<strong>de</strong>mos que por<br />

norma la MAC <strong>de</strong>be ser unívoca, por lo tanto, al momento <strong>de</strong> comercializar nuestro <strong>de</strong>sarrollo es<br />

necesario adquirir un bloque <strong>de</strong> direcciones MAC a la IEEE. Existen memorias <strong>de</strong> Microchip que<br />

tienen pregrabada una MAC y que po<strong>de</strong>mos vincular el micro<strong>con</strong>trolador a través <strong>de</strong> la interface<br />

SPI o I2C. Claro que para hacer pruebas po<strong>de</strong>mos utilizar la MAC por <strong>de</strong>fecto que trae el Stack.<br />

CONFIGURACIÓN DEL WEBSERVER<br />

Vamos a <strong>de</strong>finir el nombre <strong>de</strong> la página principal, es <strong>de</strong>cir aquella que se va a mostrar por<br />

<strong>de</strong>fecto, en este caso: in<strong>de</strong>x.htm<br />

16


Figura 6: Configuración <strong>de</strong> la página por <strong>de</strong>fecto, la cantidad <strong>de</strong> <strong>con</strong>exiones simultáneas y<br />

funciones adicionales.<br />

Un parámetro importante es la cantidad <strong>de</strong> <strong>con</strong>exiones que vamos a permitir. Esto hace<br />

referencia a la cantidad <strong>de</strong> usuarios que pue<strong>de</strong>n monitorear el sistema simultáneamente. Cómo<br />

máximo pue<strong>de</strong>n ser 32, pero <strong>de</strong>bemos <strong>con</strong>si<strong>de</strong>rar parámetros como ancho <strong>de</strong> banda y<br />

estabilidad <strong>de</strong> la red antes <strong>de</strong> establecerlo, ya que una excesiva <strong>de</strong>manda pue<strong>de</strong> <strong>de</strong>teriorar el<br />

rendimiento <strong>de</strong>l sistema.<br />

UBICACIÓN DE LA PÁGINA WEB<br />

Po<strong>de</strong>mos establecer diferentes ubicaciones para almacenar la página web que verá el usuario<br />

final <strong>de</strong> nuestro webserver. La misma pue<strong>de</strong> estar en la memoria <strong>de</strong> programa <strong>de</strong>l<br />

micro<strong>con</strong>trolador o en una memoria externa <strong>de</strong>l tipo EEPROM.<br />

Si bien vemos en la Figura 7 otras opciones como memoria Flash y sistema FAT, las mencionadas<br />

anteriormente son las más representativas ya que <strong>de</strong>terminan si la página está alojada en la<br />

memoria <strong>de</strong>l micro o en una memoria externa.<br />

17


Figura 7: Opciones <strong>de</strong> almacenamiento para la página web.<br />

En los ejemplos <strong>de</strong> este capitulo vamos a utilizar la memoria externa <strong>de</strong> Microchip: 25LC1024.<br />

Esta memoria es <strong>de</strong>l tipo EEPROM , tiene una capacidad <strong>de</strong> 1Mbit y se <strong>con</strong>ecta al PIC por SPI.<br />

Eligiendo una memoria externa disponemos <strong>de</strong> toda la memoria <strong>de</strong> programa para escribir<br />

nuestro código y alojar el Stack TCP/IP.<br />

Básicamente tenemos dos opciones para almacenar la página web: memoria externa o interna.<br />

Debemos <strong>de</strong>cidir por una u otra <strong>con</strong>si<strong>de</strong>rando el costo adicional que significa una memoria<br />

EEPROM y por otro lado la <strong>con</strong>secuente reducción <strong>de</strong> espacio en memoria <strong>de</strong> programa.<br />

18


COMPILANDO EL STACK<br />

Una vez <strong>con</strong>figurados los parámetros básicos <strong>de</strong> nuestra aplicación a través <strong>de</strong>l Microchip TCP/IP<br />

Configuraton Wizard, estamos en <strong>con</strong>diciones <strong>de</strong> compilar el Stack y cargarlo en el PIC.<br />

Figura 8: La última pantalla <strong>de</strong>l asistente: simplemente cliquear en finalizar para aceptar los<br />

cambios realizados.<br />

Necesitamos, entonces, compilar el Stack, para lo cual abrimos el proyecto TCPIP Demo App-<br />

C18.mcp <strong>de</strong>s<strong>de</strong> el <strong>MPLAB</strong> y ejecutamos la compilación haciendo click en Build all.<br />

Dentro <strong>de</strong> la carpeta TCPIP Demo App en<strong>con</strong>tramos varios proyectos preparados para utilizar <strong>con</strong><br />

micros <strong>de</strong> 8 a 32 bits. Es interesante <strong>de</strong>stacar que los parámetros <strong>con</strong>figurados <strong>con</strong> el asistente<br />

sirven para cualquier proyecto, esto se <strong>de</strong>be a que sólo se está modificando el archivo <strong>de</strong><br />

cabecera TCPIPConfig.h. Nótese que seleccionamos el proyecto TCPIP Demo App-C18.mcp ya que<br />

vamos a trabajar <strong>con</strong> un micro <strong>de</strong> la familia PIC18 (8bits).<br />

19


Figura 9: Proyecto en el <strong>MPLAB</strong> listo para compilar.<br />

Una vez compilado el proyecto, necesitamos un micro<strong>con</strong>trolador don<strong>de</strong> cargarlo. Vamos a<br />

utilizar una placa comercial <strong>de</strong>nominada MCE WebServer DEV <strong>de</strong>sarrollada por la empresa<br />

<strong>mcelectronics</strong> (www.<strong>mcelectronics</strong>.com.ar).<br />

20


ACCEDIENDO A LA PÁGINA WEB<br />

El Stack, por <strong>de</strong>fecto, habilita el cliente DHCP, por tal motivo po<strong>de</strong>mos <strong>con</strong>ectar la placa a un<br />

router <strong>con</strong> DHCP habilitado (capacidad <strong>de</strong> asignar direcciones IP) y así obtener <strong>con</strong>ectividad<br />

<strong>de</strong>s<strong>de</strong> una computadora en la misma red.<br />

Figura 10: Página inicial in<strong>de</strong>x.htm que se acce<strong>de</strong> colocando la dirección IP asignada por el<br />

router.<br />

En este caso la IP asignada es 192.168.0.101, vemos sobre la izquierda <strong>de</strong> la página inicial un<br />

menú <strong>con</strong> las distintas opciones <strong>de</strong> la placa. Estas opciones son las que habilitamos a través <strong>de</strong>l<br />

TCP/IP Configuration Wizard. Por ejemplo: envío <strong>de</strong> emails, servidor HTTP y servidor seguro, el<br />

cual nos permite acce<strong>de</strong>r a una página protegida.<br />

21


Lo que nos interesa en este momento es el recuadro <strong>de</strong> arriba a la <strong>de</strong>recha que nos muestra en<br />

tiempo real el estado <strong>de</strong> 8 LEDs y la temperatura enviada <strong>de</strong>s<strong>de</strong> un sensor que tiene la placa.<br />

Podríamos, por ejemplo, monitorear otro led o <strong>con</strong>trolar un relay <strong>de</strong>s<strong>de</strong> la interface web. Este<br />

tipo <strong>de</strong> interacción, don<strong>de</strong> una variable reporta o modifica el estado <strong>de</strong> un puerto, se realiza<br />

mediante funciones callback que veremos más a<strong>de</strong>lante. Es interesante <strong>de</strong>stacar que la<br />

actualización <strong>de</strong> los datos es automática y no requiere refrescar la pantalla <strong>de</strong>l navegador.<br />

En la sección Configuración, en<strong>con</strong>tramos parámetros como la dirección IP, el <strong>de</strong>fault Gateway, la<br />

máscara <strong>de</strong> red, la MAC y el servidor DHCP. Todo esto po<strong>de</strong>mos cambiarlo en tiempo <strong>de</strong><br />

ejecución, por eso es importante protegerlo <strong>con</strong> <strong>con</strong>traseña, ya que una <strong>con</strong>figuración incorrecta<br />

dará como resultado la pérdida <strong>de</strong> <strong>con</strong>exión.<br />

También tenemos la posibilidad <strong>de</strong> enviar emails <strong>de</strong>s<strong>de</strong> un formulario web. Para esto se utiliza el<br />

protocolo SMTP. Simplemente hay que completar el formulario <strong>con</strong> el nombre <strong>de</strong>l servidor SMTP,<br />

el nombre <strong>de</strong> usuario y la clave. Por último colocamos la dirección <strong>de</strong>l <strong>de</strong>stinatario y el cuerpo <strong>de</strong>l<br />

mensaje. Por <strong>de</strong>fecto se adjunta un archivo csv (se pue<strong>de</strong> abrir <strong>con</strong> Excel) don<strong>de</strong> se muestra el<br />

estado <strong>de</strong> los LEDs, los pulsadores y el valor <strong>de</strong> temperatura. Más a<strong>de</strong>lante vamos a ver el código<br />

<strong>de</strong> este ejemplo.<br />

Antes <strong>de</strong> pasar a la programación <strong>de</strong>l stack, vamos a ver una última pantalla <strong>de</strong> la interface web.<br />

Se trata <strong>de</strong>l envío <strong>de</strong> variables a través <strong>de</strong> los métodos GET y POST. Quién esté acostumbrado a<br />

programar en PHP sabrá la ventaja que <strong>con</strong>lleva utilizar este recurso. Por ejemplo, <strong>con</strong> el método<br />

GET po<strong>de</strong>mos enviar una serie <strong>de</strong> variables junto <strong>con</strong> la URL. Es lo que habitualmente vemos<br />

como:<br />

http://192.168.1.101/forms.htm?relay2=on&relay1=off<br />

Luego <strong>de</strong> la dirección IP <strong>de</strong> nuestra placa está el nombre <strong>de</strong>l formulario que vamos a actualizar, y<br />

a <strong>con</strong>tinuación <strong>de</strong>l signo <strong>de</strong> interrogación está el nombre <strong>de</strong> cada variable y su valor separadas<br />

por &.<br />

Nótese que estamos actualizando el estado <strong>de</strong> dos variables (relay1 y relay2) <strong>de</strong> una sola vez. GET<br />

tiene una limitación y es el hecho <strong>de</strong> que la URL no pue<strong>de</strong> <strong>con</strong>tener más <strong>de</strong> 1024 bytes.<br />

Si necesitamos enviar una mayor cantidad <strong>de</strong> variables, <strong>de</strong>bemos utilizar el método POST que no<br />

tiene restricciones <strong>de</strong> longitud. Generalmente se suele utilizar POST para actualizar el texto <strong>de</strong> un<br />

LCD.<br />

22


LOS ARCHIVOS PRINCIPALES DEL STACK<br />

Como mencionamos anteriormente, es necesario <strong>con</strong>ocer el stack para po<strong>de</strong>r agregar nuestras<br />

propias funciones y así lograr un sistema <strong>de</strong> telemetría y <strong>con</strong>trol remoto acor<strong>de</strong> a nuestras<br />

necesida<strong>de</strong>s. Para esto vamos a <strong>de</strong>sarrollar los archivos principales <strong>de</strong>l stack. En la Figura 9<br />

vemos la estructura general en el <strong>MPLAB</strong>.<br />

Figura 11: Estructura <strong>de</strong> archivos <strong>de</strong>l Stack.<br />

Se distingue la estructura dividida en archivos <strong>de</strong> cabecera (.h) y el código en los archivos (.c). Los<br />

archivos principales son los siguientes:<br />

HardwareProfile.h<br />

En este archivo simplemente asociamos un puerto <strong>con</strong> un nombre fácil <strong>de</strong> recordar, por ejemplo<br />

si colocamos un LED en el puerto RF3 <strong>de</strong>l PIC:<br />

#<strong>de</strong>fine LED_TRIS (TRISFbits.TRISF3)<br />

#<strong>de</strong>fine LED_IO (PORTFbits.RF3)<br />

23


TCPIPConfig.h<br />

Como vimos, se utiliza para habilitar o <strong>de</strong>shabilitar funciones <strong>de</strong>l stack como DNS, FTP, SNTP, SSL<br />

y UART <strong>de</strong>pendiendo <strong>de</strong> las características <strong>de</strong> nuestra aplicación y la memoria disponible en el<br />

micro.<br />

MainDemo.c<br />

Es el programa principal, en el archivo MainDemo.c en<strong>con</strong>tramos el mapeo <strong>de</strong> puertos, la<br />

<strong>con</strong>figuración <strong>de</strong> los registros <strong>de</strong> la USART, los ADC y la inicialización <strong>de</strong> la placa. Por ejemplo<br />

ADCON0=0x0D; Para seleccionar AN3 como entrada analógica.<br />

CustomHTTPApp.c<br />

Por último, el cuarto archivo que necesitamos para una aplicación básica es CustomHTTPApp.c,<br />

en el cual se encuentran las funciones callback, es <strong>de</strong>cir aquellas que interactúan <strong>con</strong> la pagina<br />

web.<br />

FUNCIONES CALLBACK<br />

Echemos un vistazo al archivo CustomHTTPApp.c don<strong>de</strong> se encuentran las funciones Callback. En<br />

este ejemplo vamos a mostrar el estado <strong>de</strong> un LED en la página web por medio <strong>de</strong> ON y OFF.<br />

La función Callback <strong>con</strong>tiene el nombre y el valor <strong>de</strong> la variable dinámica ( led ) que va a ser<br />

mostrada en la web. Un error común es enviar directamente al buffer Ethernet el estado <strong>de</strong>l led<br />

mediante la variable int LED_IO.<br />

Hay que tener en cuenta que SOLO SE PUEDEN ENVIAR STRINGS POR ETHERNET, por lo que, en<br />

numerosas ocasiones usamos itoa o ftoa para <strong>con</strong>vertir los tipos <strong>de</strong> dato. Analicemos el código:<br />

ROM BYTE ESTADO_LED_UP[] = “ON";<br />

ROM BYTE ESTADO_LED_DOWN[] = “OFF";<br />

void HTTPPrint_led(void)<br />

{<br />

TCPPutROMString(sktHTTP, (LED_IO?ESTADO_LED_UP:ESTADO_LED_DOWN));<br />

}<br />

En este caso, en lugar <strong>de</strong> usar los <strong>con</strong>versores <strong>de</strong> tipo, creamos dos variables auxiliares<br />

ESTADO_LED_UP y ESTADO_LED_DOWN para mostrar el estado <strong>de</strong>l led mediante ON y OFF.<br />

La función void HTTPPrint_led(void) envía a la página web el valor <strong>de</strong> la variable dinámica led.<br />

Para chequear el estado <strong>de</strong>l puerto RF3 (don<strong>de</strong> esta mapeado el led) utilizamos la sentencia<br />

<strong>con</strong>dicional IF, aquí representada en una línea:<br />

LED_IO?ESTADO_LED_UP:ESTADO_LED_DOWN<br />

24


Recordar que anteriormente <strong>de</strong>finimos LED_IO como el estado <strong>de</strong>l puerto RF3.<br />

El IF chequea el estado <strong>de</strong> LED_IO, si el puerto está en 1, entonces la sentencia es verda<strong>de</strong>ra y<br />

envía por HTTP, ESTADO_LED_UP, si en cambio está en cero, la sentencia es falsa y envía<br />

ESTADO_LED_DOWN.<br />

De esta forma tenemos un sistema básico que monitorea una variable y la envía por Ethernet.<br />

Ahora <strong>de</strong>bemos diseñar una página web que reciba esta variable y la muestre en el explorador.<br />

Programación <strong>de</strong> la página web<br />

Microchip organiza los archivos <strong>de</strong>l sitio web <strong>de</strong> tal forma <strong>de</strong> ahorrar espacio. Se trata <strong>de</strong> no<br />

repetir la información, por ejemplo, al pie <strong>de</strong> todas las páginas aparece la misma leyenda,<br />

entonces, utilizamos el archivo footer.inc que será llamado <strong>de</strong>s<strong>de</strong> cada página, en lugar <strong>de</strong><br />

escribir el texto nuevamente. Esto permite reducir sensiblemente el tamaño total <strong>de</strong>l sitio.<br />

Hay que incluir en el sitio web la variable dinámica led, para esto vamos a modificar status.xml e<br />

in<strong>de</strong>x.htm.<br />

status.xml <strong>con</strong>tiene todas las variables dinámicas que se actualizan (leds, temperatura y<br />

pulsadores). Agregamos la línea correspondiente a la nueva variable dinámica:<br />

~led~<br />

Entre se indica el nombre <strong>de</strong>l divisor que se va a utilizar en el in<strong>de</strong>x para <strong>de</strong>finir la posición <strong>de</strong><br />

la variable.<br />

In<strong>de</strong>x.html finalmente es el archivo que ve el usuario final. Don<strong>de</strong> aparezca el webserver<br />

lo va a reemplazar <strong>con</strong> ON, OFF según el valor <strong>de</strong> LED_IO.<br />


SISTEMA DE ARCHIVOS MPFS<br />

Ahora necesitamos cargar la web en la memoria externa 25LC1024. Antes <strong>de</strong> hacerlo <strong>de</strong>bemos<br />

compactar los archivos que componen el sitio mediante la aplicación MPFS (Microchip PIC File<br />

System). Esta aplicación se instala <strong>con</strong> el Stack y se encuentra en la ruta que venimos trabajando.<br />

MPFS es el sistema <strong>de</strong> archivos que utiliza el micro para leer la página web. Una vez que tenemos<br />

nuestro sitio terminado <strong>con</strong> los archivos html, jpg o gif <strong>de</strong>bemos <strong>con</strong>vertirlos al sistema MPFS,<br />

para luego, po<strong>de</strong>r cargarlos en el micro o en la memoria externa. Lo que hace internamente este<br />

<strong>con</strong>versor es juntar todos los archivos en uno solo, <strong>de</strong> hecho, po<strong>de</strong>mos abrir el archivo resultante<br />

<strong>con</strong> el bloc <strong>de</strong> notas y veremos, or<strong>de</strong>nado secuencialmente, el <strong>con</strong>tenido <strong>de</strong> cada archivo que<br />

compone el website.<br />

La aplicación MPFS.exe <strong>con</strong>vierte el <strong>con</strong>junto <strong>de</strong> archivos que componen la página web a dos<br />

formatos posibles:<br />

.bin (para cargar el website en la memoria EEPROM externa)<br />

.c (para cargar el website en la memoria <strong>de</strong> programa <strong>de</strong>l PIC)<br />

Como mencionamos anteriormente, al cargar la web en la memoria externa, tenemos disponible<br />

toda la memoria <strong>de</strong> programa <strong>de</strong>l PIC para nuestra aplicación.<br />

26


Figura 13: Pantalla principal <strong>de</strong>l MPFS.exe <strong>con</strong> las opciones necesarias para compactar la web<br />

y cargarla en la memoria.<br />

El MPFS nos da la opción <strong>de</strong> transferir la web automáticamente a la memoria externa luego <strong>de</strong><br />

compactarla. Para esto la placa <strong>de</strong>be estar <strong>con</strong>ectada a la red y tener cargada la última versión<br />

<strong>de</strong>l Stack.<br />

Debemos tener en cuenta que cada variable que agreguemos en la web requiere su<br />

correspondiente variable en el Stack, por lo tanto es necesario recompilar el stack y cargarlo en el<br />

PIC antes <strong>de</strong> compactar la web y transferirla a la memoria. La secuencia correcta es la siguiente:<br />

1-Modificar el Stack según las necesida<strong>de</strong>s <strong>de</strong> telemetría requeridas.<br />

2-Agregar las variables dinámicas correspondientes en status.xml e in<strong>de</strong>x.htm.<br />

3-Compactar la web <strong>con</strong> MPFS.<br />

4-Compilar el Stack <strong>con</strong> el <strong>MPLAB</strong>.<br />

5-Cargar el stack en el PIC.<br />

6-Transferir la página web a la memoria externa.<br />

27


Tenemos dos alternativas para cargar la web en la memoria externa, una ya la vimos y es a través<br />

<strong>de</strong>l MPFS. La segunda opción nos permite cargar la web remotamente a través <strong>de</strong>l explorador<br />

web. Es un sistema <strong>de</strong> transferencia <strong>de</strong> archivos por medio <strong>de</strong> HTTP. Debemos ingresar a:<br />

http://192.168.1.101/mpfsupload<br />

Figura 14: Servicio para cargar el website remotamente, <strong>de</strong>bemos incluir el archivo .bin<br />

resultante <strong>de</strong> la compactación.<br />

Las aplicaciones más seguras no permiten cargar la web <strong>de</strong> esta forma ya que cualquiera podría<br />

ingresar a la dirección mencionada, <strong>con</strong>ociendo solo la IP y modificar nuestra web. En este caso<br />

po<strong>de</strong>mos proteger el sistema <strong>de</strong> carga <strong>con</strong> <strong>con</strong>traseña o bien cargar la web en la memoria <strong>de</strong><br />

programa <strong>de</strong>l PIC.<br />

Debemos colocar la menor cantidad <strong>de</strong> imágenes posibles en la aplicación final, ya que la<br />

memoria 25LC1024 posee 1Mbit, es <strong>de</strong>cir 128 Kbytes <strong>de</strong> espacio. Si nuestra web ocupa más, no<br />

se cargará correctamente.<br />

Es importante tener en cuenta que al agregar o quitar variables <strong>de</strong> nuestra web, se modifica el<br />

archivo HTTPPrint.h por lo que hay que volver a compilar el Stack antes <strong>de</strong> cargar la aplicación<br />

en el micro.<br />

28


CARGAR LA WEB EN LA MEMORIA INTERNA DEL PIC<br />

En aplicaciones que <strong>de</strong>ben ser extremadamente e<strong>con</strong>ómicas o bien don<strong>de</strong> la seguridad es una<br />

prioridad, po<strong>de</strong>mos optar por almacenar la web en la memoria <strong>de</strong> programa <strong>de</strong>l<br />

micro<strong>con</strong>trolador.<br />

Para esto ejecutamos el MPFS y seleccionamos la opción: C18/C32 Image <strong>de</strong>s<strong>de</strong> el menú<br />

principal.<br />

Figura 15: MPFS <strong>con</strong>figurado para generar un archivo .c<br />

Esto generará un archivo .c que <strong>de</strong>bemos agregar al stack para que sea compilado <strong>con</strong> el resto<br />

<strong>de</strong>l código. Por <strong>de</strong>fecto el nombre <strong>de</strong>l archivo es MPFSImg2.c<br />

Para agregar la web, es <strong>de</strong>cir el archivo MPFSImg2.c, <strong>de</strong>bemos hacer 2 cosas:<br />

Primero comentamos la sentencia #<strong>de</strong>fine MPFS_USE_EEPROM <strong>de</strong>ntro <strong>de</strong>l archivo<br />

TCPIPConfig.h. De este modo estamos indicando que la web no estará en la memoria EEPROM<br />

externa.<br />

29


En segundo lugar, incluimos el archivo MPFSImg2.c en el proyecto. Para lo cual hacemos click <strong>con</strong><br />

el botón <strong>de</strong>recho sobre Source Files y seleccionamos Add Files, como se ve en la Figura 16.<br />

Figura 16: Cómo agregar al proyecto el archivo MPFSImg2.c<br />

De esta forma estaríamos prescindiendo <strong>de</strong> la memoria EEPROM externa <strong>con</strong> el <strong>con</strong>secuente<br />

ahorro <strong>de</strong> dinero y espacio físico en la placa.<br />

30


Ya tenemos la web incluida en el Stack, ahora <strong>de</strong>bemos compilar el proyecto completo y cargarlo<br />

en el PIC.<br />

Una vez que compilamos, po<strong>de</strong>mos notar que queda mucho menos espacio disponible en la<br />

memoria <strong>de</strong> programa. Una página promedio ocupa cerca <strong>de</strong>l 25% <strong>de</strong> la memoria <strong>de</strong> un<br />

PIC18F97J60. Este es el PIC que está en la placa MCE WebServer DEV y que vamos a estudiar en<br />

<strong>de</strong>talle en el próximo fascículo. Por lo tanto, en caso <strong>de</strong> necesitar almacenar la web <strong>de</strong> esta<br />

forma, es crítico reducir la cantidad <strong>de</strong> imágenes y minimizar su resolución lo más posible.<br />

MICROCHIP WEBPREVIEW<br />

Esta aplicación permite visualizar el aspecto que tendrá la página web antes <strong>de</strong> cargarla en<br />

nuestro sistema. Esto resulta útil, ya que <strong>de</strong> otra forma <strong>de</strong>beríamos compactar la web y<br />

transferirla a la memoria cada vez que modifiquemos algún parámetro estético.<br />

El Microchip WebPreview se encuentra <strong>de</strong>ntro <strong>de</strong> la carpeta <strong>de</strong>l Stack en el menú Inicio.<br />

Figura 17: Pantalla principal <strong>de</strong> Microchip WebPreview<br />

En primer lugar <strong>de</strong>bemos ingresar la ruta <strong>de</strong>l archivo in<strong>de</strong>x.htm y la ubicación <strong>de</strong> la carpeta<br />

don<strong>de</strong> se encuentran las imágenes y <strong>de</strong>más archivos que componen el sitio:<br />

Respectivamente son:<br />

C:\Microchip Solutions library\TCPIP Demo App\WebPages2\in<strong>de</strong>x.htm<br />

C:\Microchip Solutions library\TCPIP Demo App\WebPages2<br />

31


Luego hacemos clic en Preview Page y veremos la página generada por la aplicación en una<br />

ventana <strong>de</strong> Windows.<br />

Figura 18: Página generada <strong>con</strong> el WebPreview<br />

Nótese que las variables, como las que indican el estado <strong>de</strong> los pulsadores, aparecen <strong>con</strong> (?), esto<br />

es lógico, pues no está la aplicación cargada en el micro y por lo tanto no hay un función callback<br />

que <strong>de</strong>vuelva esos valores. Tampoco tenemos posibilidad <strong>de</strong> interacción <strong>con</strong> los botones.<br />

Si bien el Microchip WebPreview es sumamente útil para visualizar el aspecto <strong>de</strong> nuestra web,<br />

necesariamente <strong>de</strong>bemos compilar el proyecto y grabarlo en el PIC para luego transferir la web a<br />

la memoria y po<strong>de</strong>r verificar que todas las funciones callback estén funcionando como<br />

esperamos.<br />

32

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!