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