# Monitoreo TCP/IP con ENC28j60 y PIC18F2620



## Shakkangelcliff (Mar 25, 2008)

Primero que todo quisiera darle gracias a toda la comunidad, ya que por medio de todos los post que he leido en este medio he aclarado varios puntos que me tenian preocupado.

  Como ven este es mi primer post, me presento mi nombre es Miguel, soy ingeniero en telecomunicaciones y estoy en medio de un proyecto personal  que luego de varios prototipos, a la final he tomado la decisión de utilizar el ENC28j60 y el PIC18F2620.

  El proyecto consiste en detectar por medio del 18F2620 cuando el trafico de la red ISP que viene del ENC28j60 esta muy lento, o simplemente detectar cuando esta caida la red, para luego dar una orden a unos reles y realizar un suicheo para otro ISP. 

  Ustedes me diran que ya existen equipos que realizan esta operacion, pero haciendolo yo mismo me saldria mas economico y aprenderia muchisimo mas.

  Me gustaria que me ayudaran en lo siguiente, el montaje como tal lo tengo bien claro, aun no he decidido si el 18F2620 es el PiC indicado para este trabajo, me gustaria que me recomendaran otro o si el que estoy usando esta bien.

  Tambien me gustaria que me recomendaran algun tutorial de programacion para el PIC en lenguaje C, que me muestra como trabajar las SPI y distintas interfaces de captura de datos ya que estamos tratando con trafico de red. 

  Anteriormente he trabajado con algunos compiladores como el IC-PROG, este tambien creo que funciona para este tipo de PIC, si ustedes conocen uno mas poderoso tambien me gustaria saberlo.

  Una ves mas gracias por todo y bueno espero sus respuestas.


----------



## Meta (Mar 25, 2008)

Hola:

Parece interesante el proyecto. 

En IC-PROG hay otro que está muy bien que es el www.winpic800.com

Sobre el 18F2620, la verdad pregúntate que cantidad de pines vas a utilizar, ¿oscilador interno es suficiente? ¿Memoria RAM, Flash EEPROM? cosas así.

Hojas de datos o Datasheet:
http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1004&mid=10&lang=en&pageId=74

Los PIC de alta gama suelen usar mucho los 18F2550 de 28 pins o los 18F4550 de 40 Pines, para lo que vas hacer, te vale el que nombraste, aún así que vengan más expertos de pic de gama alta y te aconsejarán mejor.


----------



## Shakkangelcliff (Mar 25, 2008)

Hola Meta gracias por tu pronta respuesta, el funcionamiento del PIC es el siguiente,

 Como sabemos el trafico red es almacenado por el ENC28j60 en sus registros y cuando recibe una orden especifica, este envia los paquetes Ip almacenados en los registros por sus puertos.

 El funcionamiento del PIC sera enviar esas ordenes y ademas tomar los datos o trafico en binario que arroja el ENC28j60 por SO y Si (puertos Tx y Rx), luego por medio de una programacion previa el PIC debe analizar cuando la red esta lenta o caida, cuando el detecte esta situacion tendra que darle una orden a unos reles para que hagan el suicheo de un rj45 a otro (ISP 1 al ISP 2) .

 Claro en la programacion se tiene que crear un modelo de Paquete IP para que el PIC este familiarizado con los paquetes que esta recibiendo. La parte del paquete que el PIC analizaria en todo el trafico seria direcciones IP y MAC y el numero de saltos de los paquetes, jugando un poco con todos estos datos se puede lograr detectar cuando la red esta caida o lenta.

 Por supuesto al ocurrir una caida fisica de la red la cosa es mas facil, por que solo se detectaria una caida de tension.


----------



## macraig (Mar 25, 2008)

Aunq lo q dices se puede implementar directamente en el router conectado a la red del ISP, no veo razon para q no construyas el tuyo propio, asi q te mando un par de enlaces interesantes:

http://www.tuxgraphics.org/electronics/200611/article06111.shtml
http://www.tuxgraphics.org/electronics/200606/article06061.shtml

Con los pic no me llevo muy bien, no se prestan para programar en C. Sin embargo creo q lo q esta implementado en los links con un AVR, puede servirte de algo.

Salu2


----------



## Meta (Mar 25, 2008)

Muy buena esos LInks, la verdad se oye mucho utilizar estas cosas en AVR de atmel o los Motorola.


----------



## eidtech (Mar 25, 2008)

si vas a utilizar un PIC, mejor utiliza los que ya traen un transceiver Ethernet integrado, como el  PIC18F86J60 entre otros.. 

(http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=121&mid=10&lang=en&pageId=74)

Microchip tiene el stack tcp/ip, por lo tanto la labor seria mas sencilla.


----------



## Shakkangelcliff (Mar 25, 2008)

Estan muy bueno esos link, y me ayudo a concretar la parte de la circuiteria gracias Macraiq.

 Lo has dicho muy bien un router twin ISP me hace el trabajo muy facil, me da Load Balance y Auomatic Failover Capacibility, estos router son algo costosos y este suicheo es una de las multiples funciones que realiza.

 Yo solo quiero la funcion de suicheo cuando la red esta lenta o caida y pues me puse a investigar sobre el asunto y me di de cuenta que no es muy complicado si tienes conocimiento de como se comporta el trafico en la red.

 Al principio queria realizar el desacople de la señal del RJ45 y luego descifrar el codigo manchester que posee el trafico para asi tener el trafico IP virgen y  manejarme solo con 1 PIC de la familia 16F.

 Pero las tarjetas que ya vienen armadas con el dessacople y el  ENC28j60 me facilitan las cosas y son muy economicas, primero por que me sincronizan el trafico (que es algo bastante dificil) y segundo poseen MAC propias ademas me dan el paquete IP virgen.

 Una de las cosas que me falto agregar es que por medio del PIC y el ENC28j60 puedo enviar un paquete Ip haciendo PING por el isp a una web site como por ejemplo google y asi comprobar si la red esta activa o no, cosa que los AVR creo que no me permiten.

 La idea de la programacion la tengo pero practicamente no he trabajado nunca con la serie 18F me gustaria que me facilitaran algun tutorial o guia para la programacion de estos señores en lenguaje C o algunas lineas de comandos en C que tengan algo de relacion con la comunicacion entre el ENC28j60 y el PIC que es en lo que tengo algo de problema.

 Nuevamente muchas gracias por prestar de su ayuda, si logro terminar el proyecto con gusto dejare mi proyecto plasmado aca.


----------



## eidtech (Mar 25, 2008)

Shakkangelcliff dijo:
			
		

> Una de las cosas que me falto agregar es que por medio del PIC y el ENC28j60 puedo enviar un paquete Ip haciendo PING por el isp a una web site como por ejemplo google y asi comprobar si la red esta activa o no, cosa que los AVR creo que no me permiten.



WTF? 

claro que puedes hacer lo mismo con un AVR, un MSP430, un 8051, el que sea...

Aun asi si quieres PIC, deberias considerar mi recomendacion anterior.


----------



## Meta (Mar 25, 2008)

Si al final haces el proyecto. Nos avisa.


----------



## eidtech (Mar 25, 2008)

otra recomendacion son los Wiznet...(mucho mejor que el ENC28J60)


----------



## Shakkangelcliff (Mar 25, 2008)

eidtech dijo:
			
		

> si vas a utilizar un PIC, mejor utiliza los que ya traen un transceiver Ethernet integrado, como el  PIC18F86J60 entre otros..
> 
> Microchip tiene el stack tcp/ip, por lo tanto la labor seria mas sencilla.



 Sep esos PIC tambien los he visto, pero el ENC28j60 me hace la funcion de transceiver Ethernet tambien, preferi usar el ENC28j60 aparte junto con otro PIC para no sobrecarga a un solo PIC con tantas funciones.

 Igual el diseño como tal esta sujeto a cambios si veo que un solo PIC con transceiver integrado es mas sencillo y eficaz pues bienvenido sea.

 gracias por tu aporte


----------



## Shakkangelcliff (Mar 25, 2008)

eidtech dijo:
			
		

> otra recomendacion son los Wiznet...(mucho mejor que el ENC28J60)



  Mmmm esos si no me los sabia, por que dices que son mejores?


----------



## eidtech (Mar 25, 2008)

ENC28J60 = MAC + PHY

WIZNET = TCP + MAC + PHY ---> el Stack TCP/IP viene por hardware...


----------



## eidtech (Mar 25, 2008)

me puse a analizar un poco mas tu proyecto, y si pretendes analizar todos los paquetes provenientes de la red, no creo que el ENC28J60 de el ancho, debido a su interfaz SPI... donde no puedes obtener datos a tanta velocidad (y estarias perdiendo paquetes).

ahi quedaria como recomendacion el Wiznet, algun Realtek o Cirrus Logic dado a sus modos de acceso mas veloces.


----------



## Shakkangelcliff (Mar 25, 2008)

Wow mira que bien, lo otro bueno que vi es que la misma marca te proporsiona la tarjeta ya armada, muchas gracias por la información Eidtech me ayudo de mucho.

 En estos momentos tengo que retirarme me gustaria seguir posteando por que me han ayudado en mucho, el dia de mañana investigare un poco mas sobre los AVR para ver si me facilitan el trabajo ya que de ellos no tengo ningun conocimiento.

 Igual los link que me pasaste estan muy bueno pero me gustaria saber un poco mas sobre el funcionamiento de los AVR, como se programan, como trabajaria con WIZNET entre otras cosas si posees algo mas me seria de mucha ayuda.


----------



## eidtech (Mar 25, 2008)

en realidad PIC o AVR te sirven igual.. ahi depende tus preferencias.
Yo en lo personal me quedo con AVR, pero esa es otra historia.

Hace tiempo estuve trabajando en un analizador de protocolos con Wiznet y AVR, analizaba paquetes, tiempos de vida, fragmentacion, llevaba estadisticas de protocolos, filtrado, rendimiento, etc. 

Nunca fue un proyecto formal, solo era para conocer la plataforma Wiznet.

el Wiznet basico es el 5100, pero mejor aun esta el 5300.


----------



## Shakkangelcliff (Mar 25, 2008)

eidtech dijo:
			
		

> me puse a analizar un poco mas tu proyecto, y si pretendes analizar todos los paquetes provenientes de la red, no creo que el ENC28J60 de el ancho, debido a su interfaz SPI... donde no puedes obtener datos a tanta velocidad (y estarias perdiendo paquetes).
> 
> ahi quedaria como recomendacion el Wiznet, algun Realtek o Cirrus Logic dado a sus modos de acceso mas veloces.



 Lo que dices es cierto, estoy condenando la conexión a 10 Mbps, igual con Wiznet tendria que ver cuanto es la velocidad de la interfaz SPI que sea compatible con algun PIC o el AVR que tanto me has mencionado


----------



## eidtech (Mar 25, 2008)

con Wiznet tienes el modo de acceso directo (bus de datos + bus de direcciones + senales de control), donde puedes alcanzar varios Megabits por segundo.


----------



## Meta (Mar 25, 2008)

No encuentro ejemplos sobre lo que dice en post principal. Si alguien encuentra ejemplo o aparatos sobre TCP nos avisan.


----------



## eidtech (Mar 25, 2008)

http://www.google.com.mx/search?hl=es&q=ENC28J60&btnG=Buscar+con+Google&meta=


----------



## macraig (Mar 25, 2008)

Shakkangelcliff dijo:
			
		

> Estan muy bueno esos link, y me ayudo a concretar la parte de la circuiteria gracias Macraiq.
> 
> Lo has dicho muy bien un router twin ISP me hace el trabajo muy facil, me da Load Balance y Auomatic Failover Capacibility, estos router son algo costosos y este suicheo es una de las multiples funciones que realiza.
> 
> ...



No hombre, q van a ser costosos... Una pc vieja tres interfaces de red y un buen linux te sirven... ah y cafe.... Te dejo otro enlace

http://lartc.org/howto/lartc.rpdb.multiple-links.html

Salu2..


----------



## Shakkangelcliff (Mar 26, 2008)

Jeje claro con una Pc con 2 tarjetas de red se puede lograr facilmente, incluso en mi casa tengo esa configuracion, pero este proyecto va dirigido a cualquier dispositivo o maquinas conectadas online por banda ancha, que solo posean una sola tarjeta de red y que su software como tal no puede ser tocado, de igual forma gracias por la Info.

  Como mencione es un proyecto personal que lo quiero desarrollar primero por que lo necesito y segundo por que mas adelante desarrollare mas proyecto parecidos a este, pero con un grado mayor de complejidad.

  Me empape un poco sobre el tema de los AVR y se ve bastante interesante, pero en estos momentos para mi es un poco mas comodo utilizar el PIC, primero por que ya lo tengo a mano y segundo por que el programador que poseo no aguanta el atmega88, igual utilizare la tarjeta Wiznet que me recomendaron.

  De todas formas si tienen algun programita en C que utilize SPI me seria de gran ayuda.


----------



## macraig (Mar 26, 2008)

Codigo, pero para avr!
http://www.avrfreaks.net/modules/FreaksFiles/files/430/DN_035.pdf

Sabes q te puedes construir un programador para avr con menos de 1 dolar?
http://tldp.org/linuxfocus/Castellano/November2004/article352.shtml

Conexion a la red con un AVR y una vieja targeta ISA
http://www.dclausen.net/projects/avr_ethernet/dclausen_ee281_writeup.pdf

TCP/IP stack para AVR y otros micros
http://www.sics.se/~adam/uip/index.php/Main_Page

Salu2


----------



## Meta (Mar 26, 2008)

Muy curioso para los AVR. Entrar a los AVR casi sin información comparado con PIC, como que es arriesgado, en cosas de TCP será mejor los AVR. Para PIC es más fácil, ya que con el tiempo aparecerán más PIC con muchos ejemplos sobre Server Web de PIC.


----------



## eidtech (Mar 26, 2008)

Meta, tambien para AVRs hay mucha información, que no sepas encontrarla es cosa muy diferente.

Existe una comunidad no oficial - avrfreaks.net - donde se puede discutir muy a fondo cualquier teman de AVR donde incluso postea gente que trabaja en Atmel, esta misma comunidad es reconocida y recomendada por Atmel.

Eso si, no te atrevas a postear como aqui, por que ahi si te comen vivo...


----------



## Meta (Mar 26, 2008)

eidtech dijo:
			
		

> Meta, tambien para AVRs hay mucha información, que no sepas encontrarla es cosa muy diferente.
> 
> Existe una comunidad no oficial - avrfreaks.net - donde se puede discutir muy a fondo cualquier teman de AVR donde incluso postea gente que trabaja en Atmel, esta misma comunidad es reconocida y recomendada por Atmel.
> 
> Eso si, no te atrevas a postear como aqui, por que ahi si te comen vivo...



Ok.

¿Cómo que postear como aquí? Lo que dije arriba es una opinión y me equivoqué. No creo que sean tan sensibles para comerme vivo. ¿Qué has visto ahí para que coman vivos? Es por curiosidad.

PD:
avrfreaks.net que mala suerte, está en Inglés. AL menos es muy buena, con Wallpaper inlcuidos.


----------



## eidtech (Mar 26, 2008)

He notado que aplicas la ley del minimo esfuerzo, cosa que en esta comunidad no esta permitido.

Mucho menos con los "freaks"..

Y por cierto... la mayor parte de la información valiosa esta en Ingles...


----------



## Andres Cuenca (Mar 27, 2008)

eidtech dijo:
			
		

> He notado que aplicas la ley del minimo esfuerzo, cosa que en esta comunidad no esta permitido.



Tal cual. Meta, tomate el tiempo para digerir toda la experiencia que nos aportan los compañeros de la comunidad, y evita hacer pregunta tras pregunta. Esfuérzate, aprenderás mas.

Saludos.


----------



## Meta (Mar 27, 2008)

Ok.


----------



## Shakkangelcliff (Mar 27, 2008)

que me perdi...   

   Orita que ya estaba decidido a comprar el Wiznet, vi que nada mas el envio me sale en 57 Dolares.... asi no me es factible el proyecto, estaba pensando en ver que beneficios me dan los PIC de la familia 18F que ya vienen con ethernet integrado, que me dicen ustedes que beneficios y desventajas tendria?


----------



## Meta (Mar 27, 2008)

Si trabajas con ASM te viene con 77 instrucciones o 83 si se amplía. (Si no me equivoco). está orientado a lenguajes de alto nivel como el C. Tiene más prestaciones que los 16F, etc...


----------



## Doniga (Ene 27, 2009)

Hey señores, qué pasó con este tema, me parece super interesante.

Estoy haciendo un proyecto en el cuál quiero enviar una serie de datos via internet.

En mi ciudad, el ENC28j60 no está disponible, sin embargo quizás me lo pueden traer, por otra parte hay una empresa que tiene el módulo WIZ830MJ a la venta, la cuál integra el MagJack y el proce W5300 que integra ethernet. Eso sí, está un poco caro, jeje. Voy a ver si aperro a comprarlo.

Quería preguntarles si alguien sabe si el WIZ se configura a través del mismo ethernet con un software de wiznet y también si alguien sabe cuál es la forma más fácil y rápida de obtener los datos en el PC de destino para procesarlos. (Lo equivalente a un Hyperterminal, que recibe los datos en ASCII por ejemplo).

Espero que este comentario ayude a reabrir este tema.

Saludos.


----------



## Moyano Jonathan (Ene 27, 2009)

Bueno , como les va

Este es un pequeño aporte a la causa. Se trata de 2 ejemplos completos de control del ENC28j60 con PIC. La programación para la PC se realiza en visual basic 2006 y para el PIC se realiza en mikrobasic.

espero que les sirva  .


PD: El  autor de este PDF es navaismo, un participante de todopic.


----------



## piotxa (Ene 30, 2009)

Hola a todos, soy nuevo en el foro y la verdad es que este hilo me ha servido de mucho, sobre todo los aportes de macraig.

Estoy en un proyecto similar, quiero mandar datos de los estados de sensores por internet a un servidor asi como hacerlos accesibles y operables desde web.

En mi busqueda, lo mas interesante que he visto en cuanto a relacion calidad/precio son los modulos de Wiznet y el tema del uIP.

Ire posteando resultados de mi proyecto.

Por cierto, en el wiki de wiznet hay unos prototipos muy interesantes:

http://www.wizwiki.net/tc/

Saludos a todos.


----------



## johnnytolengo (May 8, 2010)

Hola a todos, estuve mirando este hilo y la verdad estoy muy interesado en armar un web server para prender leds y enviar info via serial al pc   

Por cuestion de precio decidi comprar un WIZ812MJ
el unico problema es que no hay mucha informacion al respecto en la web se que trabaja como un conversor de SPI a ethernet por hardware.

Quisiera utilizar un PIC  como Master y alguna memoria para guardar las paginas http.

La verdad es que nose como empezar y es por eso que les pido ayuda nunca he programado SPI tampoco se muy bien como es el funcionamiento de este chip 
WIZ812MJ


Gracias por su ayuda.

JT.


----------



## cristiancrm (Jun 8, 2010)

Hola a todos. 
Hace unos días terminé de armar mi modulito ethernet con el ENC28J60 y un PIC18F452. Conecté todo y funciona de maravilla! Inicialmente hice la programación bajo MikroC, pero vi que para crear el Stack es muy complicado, así que decidí migrar la C18 e incluso fui a la conferencia que se dictó en Argentina. En dicha conferencia, se habló sobre el Stack que Microchip posee, pero no se dieron ejemplos de cómo programarlo, por lo tanto no entendí mucho que digamos. De todos modos nos regalaron unos libros que están muy buenos y una placa MCP2200 la cual les recomiendo a quienes quieren migrar RS232 A USB.
Mi idea es compilar el Stack de Microchip para poder cargarlo en la memoria interna del 18F452, alguien tuvo la oportunidad de configurarlo?
Si necesitan el esquemático o alguna info, avisenme que se las paso.

Gracias de antemano.
Saludos,
Cristian.


----------



## cosmefulanito04 (Jun 8, 2010)

cristiancrm dijo:


> Hola a todos.
> Hace unos días terminé de armar mi modulito ethernet con el ENC28J60 y un PIC18F452. Conecté todo y funciona de maravilla! Inicialmente hice la programación bajo MikroC, pero vi que para crear el Stack es muy complicado, así que decidí migrar la C18 e incluso fui a la conferencia que se dictó en Argentina. En dicha conferencia, se habló sobre el Stack que Microchip posee, pero no se dieron ejemplos de cómo programarlo, por lo tanto no entendí mucho que digamos. De todos modos nos regalaron unos libros que están muy buenos y una placa MCP2200 la cual les recomiendo a quienes quieren migrar RS232 A USB.
> Mi idea es compilar el Stack de Microchip para poder cargarlo en la memoria interna del 18F452, alguien tuvo la oportunidad de configurarlo?
> Si necesitan el esquemático o alguna info, avisenme que se las paso.
> ...



¿Podrias subir el codigo del manejo del enc28j60? asi tengo algo en que basarme.

Gracias.


----------



## cristiancrm (Jun 9, 2010)

Hola.
El código que usé es el que viene en la librería de MikroC:


```
// duplex config flags
#define Spi_Ethernet_HALFDUPLEX     0x00  // half duplex
#define Spi_Ethernet_FULLDUPLEX     0x01  // full duplex

// mE ehternet NIC pinout
sfr sbit SPI_Ethernet_Rst at RC0_bit;
sfr sbit SPI_Ethernet_CS  at RC1_bit;
sfr sbit SPI_Ethernet_Rst_Direction at TRISC0_bit;
sfr sbit SPI_Ethernet_CS_Direction  at TRISC1_bit;
// end ethernet NIC definitions

/************************************************************
 * ROM constant strings
 */
const unsigned char httpHeader[] = "HTTP/1.1 200 OKnContent-type: " ;  // HTTP header
const unsigned char httpMimeTypeHTML[] = "text/htmlnn" ;              // HTML MIME type
const unsigned char httpMimeTypeScript[] = "text/plainnn" ;           // TEXT MIME type
unsigned char httpMethod[] = "GET /";
/*
 * web page, splited into 2 parts :
 * when coming short of ROM, fragmented data is handled more efficiently by linker
 *
 * this HTML page calls the boards to get its status, and builds itself with javascript
 */
const char    *indexPage =                   // Change the IP address of the page to be refreshed
"<meta http-equiv="refresh" content="3;url=http://192.168.20.60">
<HTML><HEAD></HEAD><BODY>
<h1>PIC + ENC28J60 Mini Web Server</h1>
<a href=/>Reload</a>
<script src=/s></script>
<table><tr><td valign=top><table border=1 style="font-size:20px ;font-family: terminal ;">
<tr><th colspan=2>ADC</th></tr>
<tr><td>AN2</td><td><script>document.write(AN2)</script></td></tr>
<tr><td>AN3</td><td><script>document.write(AN3)</script></td></tr>
</table></td><td><table border=1 style="font-size:20px ;font-family: terminal ;">
<tr><th colspan=2>PORTB</th></tr>
<script>
var str,i;
str="";
for(i=0;i<8;i++)
{str+="<tr><td bgcolor=pink>BUTTON #"+i+"</td>";
if(PORTB&(1<<i)){str+="<td bgcolor=red>ON";}
else {str+="<td bgcolor=#cccccc>OFF";}
str+="</td></tr>";}
document.write(str) ;
</script>
" ;

const char    *indexPage2 =  "</table></td><td>
<table border=1 style="font-size:20px ;font-family: terminal ;">
<tr><th colspan=3>PORTD</th></tr>
<script>
var str,i;
str="";
for(i=0;i<8;i++)
{str+="<tr><td bgcolor=yellow>LED #"+i+"</td>";
if(PORTD&(1<<i)){str+="<td bgcolor=red>ON";}
else {str+="<td bgcolor=#cccccc>OFF";}
str+="</td><td><a href=/t"+i+">Toggle</a></td></tr>";}
document.write(str) ;
</script>
</table></td></tr></table>
This is HTTP request #<script>document.write(REQ)</script></BODY></HTML>
" ;

/***********************************
 * RAM variables
 */
unsigned char   myMacAddr[6] = {0x00, 0x14, 0xA5, 0x76, 0x19, 0x3f};   // my MAC address
unsigned char   myIpAddr[4]  = {192, 168, 20, 60};                     // my IP address
unsigned char   getRequest[15];                                        // HTTP request buffer
unsigned char   dyna[30];                                              // buffer for dynamic response
unsigned long   httpCounter = 0;                                       // counter of HTTP requests

/*******************************************
 * functions
 */
 
/*
 * put the constant string pointed to by s to the ENC transmit buffer.
 */
/*unsigned int    putConstString(const char *s)
        {
        unsigned int ctr = 0 ;

        while(*s)
                {
                Spi_Ethernet_putByte(*s++) ;
                ctr++ ;
                }
        return(ctr) ;
        }*/
/*
 * it will be much faster to use library Spi_Ethernet_putConstString routine
 * instead of putConstString routine above. However, the code will be a little
 * bit bigger. User should choose between size and speed and pick the implementation that
 * suites him best. If you choose to go with the putConstString definition above
 * the #define line below should be commented out.
 *
 */
#define putConstString  SPI_Ethernet_putConstString

/*
 * put the string pointed to by s to the ENC transmit buffer
 */
/*unsigned int    putString(char *s)
        {
        unsigned int ctr = 0 ;

        while(*s)
                {
                Spi_Ethernet_putByte(*s++);

                ctr++;
                }
        return(ctr);
        }*/
/*
 * it will be much faster to use library Spi_Ethernet_putString routine
 * instead of putString routine above. However, the code will be a little
 * bit bigger. User should choose between size and speed and pick the implementation that
 * suites him best. If you choose to go with the putString definition above
 * the #define line below should be commented out.
 *
 */
#define putString  SPI_Ethernet_putString

/*
 * this function is called by the library
 * the user accesses to the HTTP request by successive calls to Spi_Ethernet_getByte()
 * the user puts data in the transmit buffer by successive calls to Spi_Ethernet_putByte()
 * the function must return the length in bytes of the HTTP reply, or 0 if nothing to transmit
 *
 * if you don't need to reply to HTTP requests,
 * just define this function with a return(0) as single statement
 *
 */
unsigned int    SPI_Ethernet_UserTCP(unsigned char *remoteHost, unsigned int remotePort, unsigned int localPort, unsigned int reqLength)
        {
        unsigned int    len = 0;                   // my reply length
        unsigned int    i;                         // general purpose integer

        if(localPort != 80)                         // I listen only to web request on port 80
                {
                return(0);
                }

        // get 10 first bytes only of the request, the rest does not matter here
        for(i = 0; i < 10; i++)
                {
                getRequest[i] = SPI_Ethernet_getByte();
                }
        getRequest[i] = 0;

        if(memcmp(getRequest, httpMethod, 5))       // only GET method is supported here
                {
                return(0);
                }

        httpCounter++;                             // one more request done

        if(getRequest[5] == 's')                    // if request path name starts with s, store dynamic data in transmit buffer
                {
                // the text string replied by this request can be interpreted as javascript statements
                // by browsers

                len = putConstString(httpHeader);              // HTTP header
                len += putConstString(httpMimeTypeScript);     // with text MIME type

                // add AN2 value to reply
                IntToStr(ADC_Read(2), dyna);
                len += putConstString("var AN2=");
                len += putString(dyna);
                len += putConstString(";");

                // add AN3 value to reply
                IntToStr(ADC_Read(3), dyna);
                len += putConstString("var AN3=");
                len += putString(dyna);
                len += putConstString(";");

                // add PORTB value (buttons) to reply
                len += putConstString("var PORTB=");
                IntToStr(PORTB, dyna);
                len += putString(dyna);
                len += putConstString(";");

                // add PORTD value (LEDs) to reply
                len += putConstString("var PORTD=");
                IntToStr(PORTD, dyna);
                len += putString(dyna);
                len += putConstString(";");

                // add HTTP requests counter to reply
                IntToStr(httpCounter, dyna);
                len += putConstString("var REQ=");
                len += putString(dyna);
                len += putConstString(";");
                }
        else if(getRequest[5] == 't')                           // if request path name starts with t, toggle PORTD (LED) bit number that comes after
                {
                unsigned char   bitMask = 0;                   // for bit mask

                if(isdigit(getRequest[6]))                      // if 0 <= bit number <= 9, bits 8 & 9 does not exist but does not matter
                        {
                        bitMask = getRequest[6] - '0';         // convert ASCII to integer
                        bitMask = 1 << bitMask;                // create bit mask
                        PORTD ^= bitMask;                      // toggle PORTD with xor operator
                        }
                }

        if(len == 0)                                            // what do to by default
                {
                len =  putConstString(httpHeader);             // HTTP header
                len += putConstString(httpMimeTypeHTML);       // with HTML MIME type
                len += putConstString(indexPage);              // HTML page first part
                len += putConstString(indexPage2);             // HTML page second part
                }

        return(len);                                           // return to the library with the number of bytes to transmit
        }

/*
 * this function is called by the library
 * the user accesses to the UDP request by successive calls to Spi_Ethernet_getByte()
 * the user puts data in the transmit buffer by successive calls to Spi_Ethernet_putByte()
 * the function must return the length in bytes of the UDP reply, or 0 if nothing to transmit
 *
 * if you don't need to reply to UDP requests,
 * just define this function with a return(0) as single statement
 *
 */
unsigned int    SPI_Ethernet_UserUDP(unsigned char *remoteHost, unsigned int remotePort, unsigned int destPort, unsigned int reqLength)
        {
        unsigned int    len;                           // my reply length
        unsigned char   *ptr;                          // pointer to the dynamic buffer

        // reply is made of the remote host IP address in human readable format
        ByteToStr(remoteHost[0], dyna);                // first IP address byte
        dyna[3] = '.';
        ByteToStr(remoteHost[1], dyna + 4);            // second
        dyna[7] = '.';
        ByteToStr(remoteHost[2], dyna + 8);            // third
        dyna[11] = '.';
        ByteToStr(remoteHost[3], dyna + 12);           // fourth

        dyna[15] = ':';                                // add separator

        // then remote host port number
        WordToStr(remotePort, dyna + 16);
        dyna[21] = '[';
        WordToStr(destPort, dyna + 22);
        dyna[27] = ']';
        dyna[28] = 0;

        // the total length of the request is the length of the dynamic string plus the text of the request
        len = 28 + reqLength;

        // puts the dynamic string into the transmit buffer
        SPI_Ethernet_putBytes(dyna, 28);

        // then puts the request string converted into upper char into the transmit buffer
        while(reqLength--)
                {
                SPI_Ethernet_putByte(toupper(SPI_Ethernet_getByte()));
                }

        return(len);           // back to the library with the length of the UDP reply
        }

/*
 * main entry
 */
void    main()
        {
        ANSEL = 0x0C;          // AN2 and AN3 convertors will be used
        PORTA = 0;
        TRISA = 0xff;          // set PORTA as input for ADC

        ANSELH = 0;             // Configure other AN pins as digital I/O
        PORTB = 0;
        TRISB = 0xff;          // set PORTB as input for buttons

        PORTD = 0;
        TRISD = 0;             // set PORTD as output

        /*
         * starts ENC28J60 with :
         * reset bit on RC0
         * CS bit on RC1
         * my MAC & IP address
         * full duplex
         */
        SPI1_Init();
        SPI_Ethernet_Init(myMacAddr, myIpAddr, Spi_Ethernet_FULLDUPLEX);

        while(1)                            // do forever
                {
                /*
                 * if necessary, test the return value to get error code
                 */
                SPI_Ethernet_doPacket();   // process incoming Ethernet packets

                /*
                 * add your stuff here if needed
                 * Spi_Ethernet_doPacket() must be called as often as possible
                 * otherwise packets could be lost
                 */
                }
        }
```

Saludos.


----------



## cosmefulanito04 (Jun 9, 2010)

cristiancrm dijo:


> Hola.
> El código que usé es el que viene en la librería de MikroC:
> ...
> Saludos.



Muchas gracias, me va a ser util, para basarme en algo  .


----------

