Probando el stack TCP/IP de Microchip con MPLABX

Ejemplo de comunicación Ethernet utilizando el stack TCP/IP de Microchip

MICROCONTROLADORES

Biblioman

5/4/201210 min read

Ejemplo de comunicación Ethernet utilizando el stack TCP/IP de Microchip, esta demo se ha compilado y depurado utilizando el nuevo IDE de desarrollo Multiplataforma de Microchip (MPLABX). La placa utilizada para la prueba es la PIC32 Ethernet Starter Kit montada sobre la placa de expansión DM320002 de Microchip. La idea era complementar el artículo que en su día se publicó sobre Comandar un PIC a través de Internet con un Microcontrolador con uno que llevará el controlador Ethernet integrado como es el caso del PIC32MX795F512L y ya de paso probar el stack con el MPLABX en diferentes sistemas operativos en este caso Windows 7 y Linux (Ubuntu 11.04).

Comencemos


Lo primero que tenemos que tener son las herramientas de trabajo, nos bajaremos el MPLABX junto con el compilador C32 lite desde la página oficial de Microchip seleccionando la plataforma que proceda:

https://www.microchip.com/en-us/tools-resources/develop/mplab-x-ide

La
página incluye un tutorial y un vídeo de instalación del entorno que está bastante bien. MPLABX es una aplicación desarrollada en Java con el IDE NetBeans, por tanto como nos dice el vídeo de instalación debemos de instalar si es que no lo tenemos instalado ya el Runtime Environment o JRE de Java previamente en nuestro ordenador.

Después nos descargaremos la última versión del stack:

https://www.microchip.com/en-us/development-tool/TCPIPSTACK

En
realidad nos descargamos e instalamos el conjunto de librerías completo de Microchip.


Una vez instaladas las librerías se nos crea una carpeta en el directorio raíz (por defecto) llamada Microchip Solutions, desde la cual iremos a la carpeta TCPIP donde se encuentran los diferentes ejemplos para este stack, el ejemplo empleado para las pruebas está basado en la Demo App que consiste en la creación de un servidor web, que nos permite alojar una página web en él y acceder a ella desde un navegador web.

Junto a las librerías se instalan una serie de utilidades y asistentes que nos facilitan el trabajo con el stack.

Utilidades del stack TCP/IP


Podemos acceder a las utilidades desde inicio-> todos los programas -> Microchip-> TCPIPStack, entre ellas tenemos:

  • Microchip TCP/IP Configuration Wizard: es un asistente que nos permite configurar de manera gráfica el archivo TCPIPConfig.h con los parámetros y servicios de red que elijamos.

Los parámetros que nos permite modificar de manera gráfica este asistente son:

  • Los componentes o servicios que queremos compilar del stack para nuestra aplicación: por ejemplo, en nuestro caso el servidor web. Los componentes que no se seleccionen aparezcan comentados en el archivo TCPIPConfig.h y no se compilaran. Es una forma sencilla de personalizar el stack y no gastar recursos en servicios que no se van a utilizar.

  • Host name y dirección MAC.

  • Configuración del Web server: nombre de la página web principal, número máximo de conexiones simultáneas permitidas, etc.

  • Configuración del servicio de telnet: Máximo número de conexiones telnet permitidas, número del puerto usado tanto normal como SSL, usuario y contraseña para la conexión telnet.

  • Configuración de archivos: donde podemos seleccionar donde se va alojar físicamente nuestra página web, permitiéndonos elegir entre: una EEPROM externa, una memoria Flash externa conectada al micro por SPI, la memoria de programa interna del microcontrolador o en un sistema de archivos FAT.

El asistente Configuration Wizard es útil para empezar a ver las diferentes opciones de configuración que nos permite la librería, una vez vistos bajo mi punto de vista es más rápido modificarlo directamente en el archivo TCPIPConfig.h. Para este ejemplo el archivo (simplificado) quedaría de la siguiente forma:

// =======================================================================
// Application Options
// =======================================================================

/* Application Level Module Selection
Uncomment or comment the following lines to enable or
disabled the following high-level application modules.
/
//#define STACK_USE_UART // Application demo using UART for IP address display and stack configuration
//#define STACK_USE_UART2TCP_BRIDGE // UART to TCP Bridge application example
//#define STACK_USE_IP_GLEANING
#define STACK_USE_ICMP_SERVER // Ping query and response capability
#define STACK_USE_ICMP_CLIENT // Ping transmission capability
#define STACK_USE_HTTP2_SERVER // New HTTP server with POST, Cookies, Authentication, etc.
//#define STACK_USE_SSL_SERVER // SSL server socket support (Requires SW300052)
//#define STACK_USE_SSL_CLIENT // SSL client socket support (Requires SW300052)
//#define STACK_USE_AUTO_IP // Dynamic link-layer IP address automatic configuration protocol
//#define STACK_USE_DHCP_CLIENT // Dynamic Host Configuration Protocol client for obtaining IP address and other parameters
//#define STACK_USE_DHCP_SERVER // Single host DHCP server
//#define STACK_USE_FTP_SERVER // File Transfer Protocol (old)
#define STACK_USE_SMTP_CLIENT // Simple Mail Transfer Protocol for sending email
//#define STACK_USE_SNMP_SERVER // Simple Network Management Protocol v2C Community Agent
//#define STACK_USE_SNMPV3_SERVER // Simple Network Management Protocol v3 Agent
//#define STACK_USE_TFTP_CLIENT // Trivial File Transfer Protocol client
#define STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE // HTTP Client example in GenericTCPClient.c
#define STACK_USE_GENERIC_TCP_SERVER_EXAMPLE // ToUpper server example in GenericTCPServer.c
//#define STACK_USE_TELNET_SERVER // Telnet server
#define STACK_USE_ANNOUNCE // Microchip Embedded Ethernet Device Discoverer server/client
//#define STACK_USE_DNS // Domain Name Service Client for resolving hostname strings to IP addresses
//#define STACK_USE_DNS_SERVER // Domain Name Service Server for redirection to the local device
#define STACK_USE_NBNS // NetBIOS Name Service Server for repsonding to NBNS hostname broadcast queries
#define STACK_USE_REBOOT_SERVER // Module for resetting this PIC remotely. Primarily useful for a Bootloader.
#define STACK_USE_SNTP_CLIENT // Simple Network Time Protocol for obtaining current date/time from Internet
//#define STACK_USE_UDP_PERFORMANCE_TEST // Module for testing UDP TX performance characteristics. NOTE: Enabling this will cause a huge amount of UDP broadcast packets to flood your network on the discard port. Use care when enabling this on production networks, especially with VPNs (could tunnel broadcast traffic across a limited bandwidth connection).
#define STACK_USE_TCP_PERFORMANCE_TEST // Module for testing TCP TX performance characteristics
#define STACK_USE_DYNAMICDNS_CLIENT // Dynamic DNS client updater module
//#define STACK_USE_BERKELEY_API // Berekely Sockets APIs are available
//#define STACK_USE_ZEROCONF_LINK_LOCAL // Zeroconf IPv4 Link-Local Addressing
//#define STACK_USE_ZEROCONF_MDNS_SD // Zeroconf mDNS and mDNS service discovery

// =======================================================================
// Network Addressing Options
// =======================================================================

/ Default Network Configuration
These settings are only used if data is not found in EEPROM.
To clear EEPROM, hold BUTTON0, reset the board, and continue
holding until the LEDs flash. Release, and reset again.
/
#define MY_DEFAULT_HOST_NAME "BOARDEMO"

#define MY_DEFAULT_MAC_BYTE1 (0x00) // Use the default of 00-04-A3-00-00-00
#define MY_DEFAULT_MAC_BYTE2 (0x04) // if using an ENCX24J600, MRF24WB0M, or
#define MY_DEFAULT_MAC_BYTE3 (0xA3) // PIC32MX6XX/7XX internal Ethernet
#define MY_DEFAULT_MAC_BYTE4 (0x02) // controller and wish to use the
#define MY_DEFAULT_MAC_BYTE5 (0x04) // internal factory programmed MAC
#define MY_DEFAULT_MAC_BYTE6 (0x01) // address instead.

#define MY_DEFAULT_IP_ADDR_BYTE1 (192ul)
#define MY_DEFAULT_IP_ADDR_BYTE2 (168ul)
#define MY_DEFAULT_IP_ADDR_BYTE3 (1ul)
#define MY_DEFAULT_IP_ADDR_BYTE4 (110ul)

#define MY_DEFAULT_MASK_BYTE1 (255ul)
#define MY_DEFAULT_MASK_BYTE2 (255ul)
#define MY_DEFAULT_MASK_BYTE3 (255ul)
#define MY_DEFAULT_MASK_BYTE4 (0ul)

#define MY_DEFAULT_GATE_BYTE1 (192ul)
#define MY_DEFAULT_GATE_BYTE2 (168ul)
#define MY_DEFAULT_GATE_BYTE3 (1ul)
#define MY_DEFAULT_GATE_BYTE4 (1ul)

#define MY_DEFAULT_PRIMARY_DNS_BYTE1 (169ul)
#define MY_DEFAULT_PRIMARY_DNS_BYTE2 (254ul)
#define MY_DEFAULT_PRIMARY_DNS_BYTE3 (1ul)
#define MY_DEFAULT_PRIMARY_DNS_BYTE4 (1ul)

#define MY_DEFAULT_SECONDARY_DNS_BYTE1 (0ul)
#define MY_DEFAULT_SECONDARY_DNS_BYTE2 (0ul)
#define MY_DEFAULT_SECONDARY_DNS_BYTE3 (0ul)
#define MY_DEFAULT_SECONDARY_DNS_BYTE4 (0ul)

  • MPFS Generator: es una utilidad muy fácil de usar e imprescindible, lo que hace es convertirnos la página ó páginas web escritas en .html (también se admiten otros lenguajes como PHP, ASP, etc.) en un único archivo de salida de extensión diferente que depende de donde vayamos a alojar la página. En nuestro ejemplo la vamos a alojar en la memoria de programa del Microcontrolador, por tanto en el punto 2 (Processing Optión) deberemos marcar la opción C18/C32 Image, en el punto 3 seleccionaremos el directorio y el nombre de la imagen con extensión .c que contendrá nuestra página web. Por defecto se guarda en el archivo MPFSimg2.c que podemos encontrar en la carpeta TCPIP stack de nuestro proyecto.

Cada vez que generemos una nueva imagen debemos de volver a compilar el programa y programar de nuevo el PIC.

Por defecto la página web se guarda en el directorio WebPages2 de nuestro proyecto.

La página se puede crear con cualquier editor de html o incluso con el bloc de notas.

El ejemplo modificado utiliza formularios para el envío de datos al Microcontrolador, se utiliza el método GET para el encendido y apagado de los diodos leds y el método POST para el envío de cadenas de texto al LCD.

El método GET utiliza la dirección URL para enviar las variables así como su estado, es el método más fácil pero es poco seguro y tiene la limitación de que no se pueden enviar más 1024 bytes en la URL el método POST no tiene esta limitación.

Archivos que componen el Proyecto

  • TCPIP ETH795.h (Configuración TCP/IP): Visto anteriormente y donde están las opciones de configuración del stack TCP/IP.

  • HWP PIC32_ETH_SK_ETH795.h (Opciones de configuración del hardware de la demo): donde se definen los pines que se van a utilizar para conectar los leds y LCD:

// Hardware I/O pin mappings

// LEDs
#define LED0_TRIS (TRISCbits.TRISC1) // Ref LED0
#define LED0_IO (LATCbits.LATC1)
#define LED1_TRIS (TRISCbits.TRISC2)
#define LED1_IO (LATCbits.LATC2)
#define LED2_TRIS (TRISCbits.TRISC3)
#define LED2_IO (LATCbits.LATC3)
#define LED3_TRIS (TRISCbits.TRISC4)
#define LED3_IO (LATCbits.LATC4)
#define LED4_TRIS (TRISGbits.TRISG0)
#define LED4_IO (LATGbits.LATG0)
#define LED5_TRIS (TRISGbits.TRISG1)
#define LED5_IO (LATGbits.LATG1)
#define LED6_TRIS (TRISGbits.TRISG12)
#define LED6_IO (LATGbits.LATG12)
#define LED7_TRIS (TRISGbits.TRISG14)
#define LED7_IO (LATGbits.LATG14)

// Momentary push buttons
#define BUTTON0_TRIS (TRISDbits.TRISD6) // Ref SW1
#define BUTTON0_IO (PORTDbits.RD6)
#define BUTTON1_TRIS (TRISDbits.TRISD7) // Ref SW2
#define BUTTON1_IO (PORTDbits.RD7)
#define BUTTON2_TRIS (TRISDbits.TRISD13) // Ref SW3
#define BUTTON2_IO (PORTDbits.RD13)

//DEFINICIÓN DE REGISTROS LCD
#define LCD_DATA_TRIS (*((volatile unsigned char*)&TRISE))
#define LCD_DATA_IO (*((volatile unsigned char*)&LATE))
#define LCD_RD_WR_TRIS (TRISDbits.TRISD5)
#define LCD_RD_WR_IO (LATDbits.LATD5)
#define LCD_RS_TRIS (TRISBbits.TRISB15)
#define LCD_RS_IO (LATBbits.LATB15)
#define LCD_E_TRIS (TRISDbits.TRISD4)
#define LCD_E_IO (LATDbits.LATD4)

  • CustomHTTPApp.c (Donde están definidas las funciones callback): a través de ellas se actualizan las variables dinámicas que se muestran en la página web.

  • MainDemo.c (archivo principal de la aplicación): en el inicializamos variables, registros y llamamos a las funciones que componen nuestra aplicación.

Configuración del proyecto

Al utilizar la Ethernet Starter Kit deberemos configurar las opciones de nuestro proyecto en el MPLABX según la foto de abajo:

Circuito de la Demo

Las conexiones del LCD:

E ->RD4
R/W-> RD5
RS-> RB15
VC-> VEE
VCC-> 3,3V
GND->Masa
DB0-> RE0
DB1-> RE1
DB2-> RE2
DB3-> RE3
DB4-> RE4
DB5-> RE5
DB6-> RE6
DB7-> RE7

Página web modificada

Código html:

<style type="text/css">
<!--
body {
background-color: #00CCFF;
}
.Estilo1 {
color: #0000FF;
font-weight: bold;
font-style: italic;
font-size: 24px;
}
.Estilo2 {
font-size: 24px
}
-->
</style><div id="content">
<table width="1303" border="1">
<tr>
<th width="298" scope="col"><img src="/logo.gif" alt="logo" width="298" height="68" /></th>
<th width="989" bgcolor="#19799E" scope="col">&nbsp; </th>
</tr>
</table>
<p align="center">Control E/S Digitales:</p>
<form method="get" action="index.htm">
<div>

<p align="center"><b>0:</b>
<select name="led0">
<option value="1" ~ledSelected(0,TRUE)~>On</option>
<option value="0" ~ledSelected(0,FALSE)~>Off</option>
</select>
&nbsp;
<b>1:</b>
<select name="led1">
<option value="1" ~ledselected(1,true)~>On</option>
<option value="0" ~ledselected(1,false)~>Off</option>
</select>
&nbsp;
<b>2:</b>
<select name="led2">
<option value="1" ~ledSelected(2,TRUE)~>On</option>
<option value="0" ~ledSelected(2,FALSE)~>Off</option>
</select>
&nbsp;
<b>3:</b>
<select name="led3">
<option value="1" ~ledSelected(3,TRUE)~>On</option>
<option value="0" ~ledSelected(3,FALSE)~>Off</option>
</select>
&nbsp;
<b>4:</b>
<select name="led4">
<option value="1" ~ledSelected(4,TRUE)~>On</option>
<option value="0" ~ledSelected(4,FALSE)~>Off</option>
</select>
&nbsp;
<b>5:</b>
<select name="led5">
<option value="1" ~ledSelected(5,TRUE)~>On</option>
<option value="0" ~ledSelected(5,FALSE)~>Off</option>
</select>
&nbsp;
<b>6:</b>
<select name="led6">
<option value="1" ~ledSelected(6,TRUE)~>On</option>
<option value="0" ~ledSelected(6,FALSE)~>Off</option>
</select>
&nbsp;
<b>7:</b>
<select name="led7">
<option value="1" ~ledSelected(7,TRUE)~>On</option>
<option value="0" ~ledSelected(7,FALSE)~>Off</option>
</select>
&nbsp;

<br />
</p>
<p align="center">

<input type="submit" value="Enviar" style="margin-top:5px;" />
</p>
</div>
</form>

<h6><hr /></h6>


<p align="center"><span>Envio de datos al LCD:</span></p>

<form method="post" action="index.htm">
<div>
<div align="center"><b>LCD:</b>
<input type="text" name="lcd" maxlength="32">
&nbsp;
<input type="submit" value="Enviar">
</div>
</div>
</form>

</div>

<h6><hr /></h6>

<div align="center">&copy; aquihayapuntes.com&nbsp;&nbsp;&nbsp;&nbsp; <img src="/avatar.jpg" alt="Biblioman" width="85" height="84" /></div>

Un par de vídeos de la demo funcionando en Windows y en Linux…

  • En Windows 7

  • En Ubuntu 11.04

Documentación Microchip

https://www.microchip.com/en-us/development-tool/DM320004-2

Para comentarios sobre el tema los podéis hacer en los propios videos

Saludos