RobotyPic son proyectos básicos de electrónica con microcontroladores PIC, de aplicación en el mundo de la robótica didáctica, con archivos fuente creados mediante el compilador CCS PIC C COMPILER en lenguajeC.

Servidor Web con PIC18F4620 y ENC28J60 con wizard de CCS

 
En este proyecto se va a mostrar la creación de un Servidor Web, similar al del artículo "Servidor Web con PIC18F4550 Y ENC28j60", aunque en este caso mediante el uso del wizard del ccs PIC c compiler de la versión v5.15. El control del PIC se realiza igualmente por medio de una página web, alojada en la propia memoria del PIC, y accesible desde cualquier dispositivo, conectado a la red.

La página que se va a crear para permitir el acceso al control del PIC consistirá en 2 botones que nos permitirán activar dos salidas en el PIC, conmutando entre el encendido y apagado de unos leds. Por otro lado monitorizará la lectura del canal analógico AN0.

El wizard nos va a crear el código del PIC y la propia página web. Lo único que deberemos programar es lo que queramos que ocurra cuando pulsemos los botones en la web (conmutar las salidas en el PIC) o lo que queramos que aparezca en la misma proporcionado por los eventos ocurridos en el PIC (mostrar el valor de la lectura de una entrada analógica). En los comentarios del código del PIC generado por el wizard, identificaremos rápidamente dónde debemos colocar nuestro propio código. 

En este ejemplo emplearemos la versión v5.015 del ccs pic c compiler. La opción del servidor web en el wizard no está disponible en las primeras versiones del ccs v5, y por tanto tampoco en ninguna de las del ccs v4. 

Se va a mostrar el ejemplo simulado bajo proteus, para ello habrá que instalar WinPcap. Software que se puede descargar gratuitamente. 


En la siguiente animación se muestra todo el proceso de configuración con el wizard para la creación del código del PIC y la página web asociada.


No obstante, se expone a continuación paso a paso todo el proceso:
  1. Ejecutar CCS PIC C compiler.

  2. En el menú seleccionar <File> <new> <Project Wizard>

  3. Indicar el nombre y ruta donde guardar el proyecto con los archivos que se van a generar.

  4. Se abre la pantalla del Wizard. En la opción “Device” elegiremos el PIC deseado. En este caso hemos optado por el PIC18F4620. Este es uno de los permitidos por el Wizard. No todos son admitidos a la hora de compilar.

  5. En la opción “Analog” elegimos la entrada analógica que vamos a emplear (AN0) y el número de bits (8bits => 0-255)

  6. En la opción “TCP/IP” marcamos “use TCP/IP”. Al hacerlo nos permitirá elegir el uso del ENC28J60, elegir la dirección MAC y seleccionar los pines del PIC para el bus SPI. EN concreto para el reset (B3 en este ejemplo) y para el Chip select (B2). El resto de los pines del bus SPI no se pueden cambiar puesto que al usar el módulo hardware se emplearán los pines físicos propios del bus.

  7. Continuando dentro de “TCP/IP”, en la pestaña “IP” desmarcamos “use DHCP” que nos permitirá elegir las direcciones IP (192.168.1.15), puerta de enlace (192.168.1.1) y máscara de subred (255.255.255.0)

  8. Sin salir de “TCP/IP”, en la pestaña “Webserver”, seleccionando “use http Server”, podremos indicar cuantos campos de lectura del PIC  y los botones a mostrar en la web.

  9. Elegidas todas estas opciones podemos pulsar ya el botón <Create Project>. Aparecerá el código del archivo fuente principal creado. Sobre este código deberemos programar los efectos que queramos que ocurran al pulsar los botones en la web por ejemplo.

  10. La información procedente del PIC que queramos que aparezca en la web la programaremos dentro de la función http_format_char(). A continuación muestro el código resultante de dicha función. En rojo, el código que hemos creado para leer el canal analógico y enviarlo a la web. El resto de código es el propio creado por el wizard. 
unsigned int8 http_format_char(char* file, char id, char *str, unsigned int8 max_ret)
{
   char new_str[20];
   int8 len=0;
   int8 AD0;
   
   /* TODO: This is a callback function to the HTTP stack.
   'id' is the char for the dynamic element to be updated.
   For each dynamic element you create, you need to parse
   and save a result to 'str'. *str is where the callback
   function must save the formatting result, and it should
   not store more than max_ret characters to this pointer
   (buffer-overrun protection).
   Example:
   switch(id) {
      case 0x00:
         set_adc_channel(0);
         delay_us(100);
         i=read_adc();
         sprintf(new_str,"0x%X", i);
   .....
   strncpy(str, new_str, max_ret);
   */
   if (id == 0)
   {
         //TODO: Handle dyn0 field and save result to str
         set_adc_channel(0);
         delay_us(100);
         AD0=read_adc();
         sprintf(new_str,"0x%X",AD0);
         len=strlen(new_str);
         strncpy(str, new_str, max_ret);
   }
}
  1. Dentro de la función http_exec_cgi() escribiremos el código de lo que queramos que ocurra cuando se pulsan los botones en la web. Cambiaremos el estado de dos de los pines del PIC para encender y apagar unos leds. Como en el caso anterior, en rojo se ha representado el código introducido manualmente. Una vez más, los comentarios generados por el wizard nos ayudan a saber dónde se debe colocar.
void http_exec_cgi(char* file, char *key, char *val)
{
   /* TODO: This is a callback function to the HTTP stack.
   This function is called with each key/value pair read in
   the GET/POST request before any web data is sent to the
   web browser. 'key' matches the name of the field and
   'val' is the value it was changed to.
   Example:
   int8 v = atoi(val);
   if (stricmp(key,led1_key)==0)
      LedSet(0, v);
   */
   if (strcmp(key, "button00") == 0)
   {
         //TODO: Handle button00
          output_toggle(PIN_C0);
   }
   if (strcmp(key, "button01") == 0)
   {
         //TODO: Handle button01
         output_toggle(PIN_C1);
   }
}


Con esto ya funcionaría nuestro ejemplo. No hemos intervenido para nada en la programación de la página web. Todo el código html lo ha creado el wizard. Ahora bien, quizá deseemos modificar el código creado para personalizar el diseño a nuestro gusto o adaptarlo a nuestra necesidad. Detallo a continuación el procedimiento para hacerlo. No se trata de mostrar como programar una aplicación web, sino del proceso a seguir para compilar de nuevo el ejemplo una vez modificada la página web creada.
  1. Deberemos localizar el archivo “index.html” que se ha creado dentro de la carpeta “pages” en el directorio donde se nos ha compilado el proyecto. Este archivo es la página web que el wizard ha creado.

  2. Para modificarlo, debemos abrirlo con cualquier editor HTML como PageBreeze, Microsoft Office FrontPage, etc. Una vez modificado guardar los cambios.

  3. Ahora se debe cargar el nuevo diseño web en el código del PIC. Para ello ejecutamos el archivo “make mpfsimg” también creado en el mismo directorio del proyecto.

  4. Compilamos una vez más el archivo fuente con el ccs pic c compiler.

  5. Al ejecutar de nuevo el proyecto deberemos ver los cambios producidos en la web.
Para hacerlo funcionar, ya sea con la web personalizada o la creada originalmente, en la barra de direcciones del explorador web de cualquier dispositivo conectado a la misma red ethernet, tecleamos la dirección IP que hemos asignado a nuestro servidor (162.168.1.15). Aparecerá la página que hemos cargado en el PIC.





Cuando queramos acceder desde el exterior por internet, en la barra de direcciones del explorador deberemos escribir la dirección IP con la que se identifica nuestro router en internet y el número de puerto (puerto 80). Por ejemplo 87.64.15.102:80 

Es necesario haber configurado el router de forma que redirija el trafico que le llega desde el exterior hasta el servidor web. Deberemos abrir el puerto 80 TCP para la dirección IP del servidor web (192.168.1.15).

La dirección IP de nuestro router en internet, la podremos obtener por mediación de alguna de las muchas páginas que nos la pueden proporcionar. Una de ellas es http://www.cualesmiip.com/

El esquema completo para un montaje real:
Descarga de los archivos del proyecto:

Servidor Web PIC18f4620+ENC28j60




El proyecto contenido en el artículo ha sido diseñado y probado utilizando las siguientes versiones de software:
- Windows xp, windows 7 (32 bits) y windows 8 (64 bits)
- Proteus V7.7 SP2
- CCS PIC C COMPILER v5.015

Artículo relacionado>> Servidor Web PIC18F4550+enc28j60


18 comentarios:

rodrigon dijo...

ESPECTACULAR el tutorial....hace muuucho que ando buscando pero,estoy probandolo, con la version 7.7 sp2 de proteus y no me da ping ni nada, tengo que desconectarme del router y colocarle al pic como puerta de enlace mi ip? o funciona conectado desde el proteus si le coloco de puerta de enlace mi router?.

Robotypic dijo...

Rodrigon.
Puedes ejecutarlo directamente desde proteus con winpcap instalado. Ese PC, donde ejecutas proteus, conectado al router por cable ethernet.
Desde otro PC conectado al router, tambien por cable ethernet, haces el ping o metes la ip asignada a tu servidor web (el que has creado en el PIC) en la barra de direcciones del explorador de internet para acceder a la página.
La puerta de enlace la de tu router. No siempre funciona si lo haces todo desde un mismo PC.
Cuando esto te funcione pruebas el acceso desde internet como está explicado en la entrada. Igualmente en este caso, puede ser necesario que la linea de internet desde la que te conectes sea diferente a la propia del servidor web creado.

rodrigon dijo...
Este comentario ha sido eliminado por el autor.
rodrigon dijo...

Ya funciona,coloqué cruzado los pines Si y SO, fué una estupidez, ahora lo que veo es que cuando inicio el server nada mas se cuelga y ya no puedo hacer ping ni me actualiza la página...muchas gracias por el tutorial de nuevo...por fin algo está funcionando aunque no del todo ya estoy mas animado!.

Miguel Angel dijo...

hola;
Ya realice los pasos del video y des post, que son los mismos, pero al compilar me marca un error, el cual es, "out of rom , a segment or the program is too large strpbrk" la version de CCS es la 5.025.

Robotypic dijo...

Miguel Angel. El ejemplo mostrado está realizado con la versión 5.015.

Jaime dijo...

Buenos días, e implementado todo el proyecto y compila y funciona en el proteus, pero cuando lo implemento físicamente no funciona, con los pines wol, int, clck, a donde se conectan. Lo ha probado físicamente el funcionamiento?
Gracias por su respuesta.

Robotypic dijo...

Jaime.
Está probado con un montaje real. Revisa tu circuito. Los pines int y wol no es necesario conectarlos. El clk está identificado como sck.

Unknown dijo...

Hola

Tu tutorial es bueno y funciona ben según la simulación; sin embargo con la gran cantidad de librerias en el codigo, es complejo seguirlo. Apenas estoy aprendiendo el lenguaje C y e intentado ampliarle mas entradas para leer por ejemplo mas pulsadores como lo hace en la entrada RE0. Si quisiera leer mas pulsadores y visualizarlos en la web, por ejemplo leer un pulsador en RE1, RE2, RC4, RC5, RC6, etc ¿Como podría hacer la modificación del código? ya que cuando intente hacer el seguimiento en la FUNCIÓN FORMAT CHAR, aparentemente el valor temrina en %d como se muestra:

break;
case '1':
RE0=bit_test(porte,0);
sprintf(new_str,"%d",RE0);
len=strlen(new_str);
break;
default:
len=0;

Luego lo seguí hasta http_format_char, pero ahí se complica mas ya que todo son símbolos y condiciones que se escapan a mi conocimiento. Me gustaría poder agregarle mas entradas.

podrías compartir eso?

gracias

Unknown dijo...

muito bom,parabéns!

Unknown dijo...

Hello, pls help me.
When i test in proteus, its work very well.
But in actual assembly its not work, i try buy crossed cable, i connect direct Pin pic18f4620 to enc28j60 and i cant ping my IP of CCS.
Pls help me why!!

lerolero dijo...

Lo probé en proteus con windows 10 y funciono a la perfección. Me anime a montarlo en un protoboard y también funciono. Muchas gracias por el aporte, saludos.

Unknown dijo...

HI,we have created the proteus file as shown in this page and programmed in ccs as your video shows.we are not familiar with networking.our proteus is running on a pc which in connected to wifi. when we open browser we didn't get the webpage for the ip address 192.162.1.15. please explain the procedure
for running this project and and about the ip address

Robotypic dijo...

Hi Rahul.

The PC must be connected to an ethernet network. No wifi.

Unknown dijo...

Hola que tal.

Te agradezco tu aporte con este dispositivo, veo que no hay mucha información acerca del mismo.

Quisiera preguntarte, ¿si el módulo ethernet puede funcionar como Servidor TCP?. Tengo una aplicación tipo Hyperterminal, la computadora sería el cliente y el módulo sería servidor tcp, le enviaría datos a través de esa aplicación tipo Hyperterminal.

De antemano te agradezco tu respuesta.

Saludos

Unknown dijo...

y con pic 18f2550 es igual, solo le cambio los puertos?

xfd dijo...

Hello , thank you for this project.

i want to start on pc but there is no connection with proteus
do you have any idea
here is the error code:
https://prnt.sc/seii0n

Unknown dijo...

Como puedo ver 2 variables dinámicas?, entiendo se debe modificar el archivo index.xml pero no logro ver las 2 variables solo veo que se me repite 2 veces la misma, agradecería me explicaras como hacerlo.

Related Posts Plugin for WordPress, Blogger...

CONTACTA - (Haz referencia del artículo sobre el que trata la consulta o comentario)