Comunicacion TCP/IP con Pic 18f4550 y ENC28J60

Hola buenas,
Estoy realizando un proyecto de comunicación tcp/ip con el pic 18f4550 y el controlador ethernet enc28j60 por medio de comunicacion SPI. la programacion del pic la realice con el mikrobasic de mikroelektronica ya me funciona todo ya el pic me hace ping con la pc y la aplicacion en visual basic me enciende los leds, el problema es que cuando programo una entrada y una salida para que funcione de manera autonoma sin utilizar visual basic no lo hace o si lo hace pierdo la comunicacion.

alguien puede ayudarme con esta programacion?
a continuacion dejo toda la informacion del proyecto de lo q llevo.
aqui dejo el link del proyecto:

http://ingeniedia.blogspot.com/2009/04/m2eth-board-conecta-tu-pic-ethernet.html

son 3 paginas para ver todo le dan en la parte de abajo entradas mas recientes y ahi se ve toda la programacion.
por favor cualquier ayuda me seria muy util :)
 
Hola ... oie me podrias enviar el codigo (o postearlo) q estas utilizando para conectar el pic al enc28j60....
la pagina que dejas tira un error...
De antemano muchas gracias
Saludos
 
Tu blog no existe más. Igual ahora en las ultimas versiones de proteus podés simular el ENC28J60 y funciona perfecto...yo mismo lo he probado con los ejemplos que trae
 
Ahora disculpá pero tenés que tener en cuenta algo antes:
Tenés que instalar el software WinPCAP para que te simule una conección de red activa.

Luego de instalar este soft podés simular tus ejemplos siempre y cuando estés conectado a internet
 
Hola a todos!!
Estoy enviando datos por ethernet y para esto utilizo un PIC y el ENC28J60, comunicandose a traves de SPI (a 8MHz). Si bien puedo enviar los datos me di cuenta que el ENC se toma cerca de 4ms antes de enviar los paquetes de datos. La hoja de datos no me ayudo en encontrar el motivo de tal delay.
Si alguien ya tuvo oportunidad de trabajar con este controlador ethernet, tuvieron este de problema???
Les agradeceria cualquier aporte.
Saludos!!!
 
hola,

estoy haciendo funcionar el ENC28J60 con el PIC 18F2550, he probado todos los ejemplos por Internet y no soy capaz ha hacer ping al pic. Para el encapsulado ENC28J60 tengo el de OLIMEX que viene ya preparado para conectarlo al puerto SPI.

¿Como se pone la velocidad del SPI a 8Mhz?

Si alguien me pude ayudar.

Muchas gracias
 
hola,

estoy haciendo funcionar el ENC28J60 con el PIC 18F2550, he probado todos los ejemplos por Internet y no soy capaz ha hacer ping al pic. Para el encapsulado ENC28J60 tengo el de OLIMEX que viene ya preparado para conectarlo al puerto SPI.

¿Como se pone la velocidad del SPI a 8Mhz?

Si alguien me pude ayudar.

Muchas gracias

Hay muy poca información para ayudarte, por favor se más específico y gráfico. Explica con detalle que proceso de investigación has llevado a cabo...caso contrario no creo que nadie pueda ayudarte.

Saludos !
 
hola,

ahora mismo tengo un ENC28J60 de olimex y un PIC 18F2550, estoy intentando hacer ping al pic, pero no soy capaz. Estoy usando un ejemplo que hay por los foros que se llama "11 Ethernet", que lo he visto publicado en varios foros.
Este ejemplo es para le PIC 18F4550 y he hecho unas modificaciones para el PIC 18F2550.(Modificados los pines del PIC y los FUSES XTPLL por HSPLL; y el PLL1 por el PLL5(Tengo un cristal de 20MHz))
El problema es que no pasa de la funcion StackInit.
El problema puede ser por la MAC?, debería cambiarla?
Las modificaciones que he realizado son correctas?
deberia tocar algo en la libreria "tcpip/stacktsk.c"?


Muchas gracias y saludos.

os adjunto el codigo:

Código:
//////////////////////////////////////////////////////////////////////////////////////////////
//Este programa sirve para revisar la correcta conexión entre el PIC18F4550 y                 //
//el modulo ENC28J60, crea un WebServer en la direccion IP 192.168.1.111                    //
//El cual muestra el siguiente mensaje "Test Conexión PIC18F4550 y ENC28J60 V1.0"             //
//También emula un puerto serial en el PC donde vamos viendo como se desarrolla el programa //                                                                            //
//////////////////////////////////////////////////////////////////////////////////////////////
//original
//#include <18F4550.h>
//#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN   // Ocupa cristal 4Mhz, cambiar a PLL5 para ocuparlo con 20Mhz.
//modificaciones para PIC 18F2550
#include <18F2550.h>
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN   // Ocupa cristal 4Mhz, cambiar a PLL5 para ocuparlo con 20Mhz.
#use delay(clock=48000000)

#define  ON    output_high
#define  OFF   output_low

#define  LedV  PIN_B4
#define  LedR  PIN_B2

// Conexión entre el PIC18F4550 y el Modulo ENC28J60 (Se conecta directamente sin adaptador de voltajes).
// Se adjunta el datasheet del Modulo ENC28J60.
/*Original
#define  PIN_ENC_MAC_SO    PIN_C7   // Conectar con PIN MISO del ENC28J60.
#define  PIN_ENC_MAC_SI    PIN_B0   // Conectar con PIN MOSI del ENC28J60. 
#define  PIN_ENC_MAC_CLK   PIN_B1   // Conectar con PIN SCK del ENC28J60. 
#define  PIN_ENC_MAC_CS    PIN_B3    // Conectar con PIN CS del ENC28J60. 
#define  PIN_ENC_MAC_RST   PIN_B5   // Conectar con PIN RST del ENC28J60. 
#define  PIN_ENC_MAC_INT   PIN_D2   // Conectar con PIN INT del ENC28J60. 
#define  PIN_ENC_MAC_WOL   PIN_D3   // Conectar con PIN WOL del ENC28J60. 
*/
//Modificaciones para PIC18F2550
#define  PIN_ENC_MAC_SO    PIN_C7   // Conectar con PIN MISO del ENC28J60.
#define  PIN_ENC_MAC_SI    PIN_B0   // Conectar con PIN MOSI del ENC28J60. 
#define  PIN_ENC_MAC_CLK   PIN_B1   // Conectar con PIN SCK del ENC28J60. 
#define  PIN_ENC_MAC_CS    PIN_B3    // Conectar con PIN CS del ENC28J60. 
#define  PIN_ENC_MAC_RST   PIN_B5   // Conectar con PIN RST del ENC28J60. 
#define  PIN_ENC_MAC_INT   PIN_B2   // Conectar con PIN INT del ENC28J60. 
#define  PIN_ENC_MAC_WOL   PIN_C4   // Conectar con PIN WOL del ENC28J60. 

#include "usb/usb_cdc.h"         // Descripción de funciones del USB.
#include "usb/usb_desc_cdc.h"    // Descriptores del dispositivo USB.

//Protocolos a utilizar.

#define  STACK_USE_MCPENC  TRUE
#define  STACK_USE_ARP     TRUE
#define  STACK_USE_ICMP    TRUE
#define  STACK_USE_TCP     TRUE

#include "tcpip/stacktsk.c"

#define MY_HTTP_SOCKET  80

int8 HTTPSocket=INVALID_SOCKET;

// Microchip VendorID, MAC: 00-04-A3-XX-XX-XX
void MACAddrInit(void)
{
   MY_MAC_BYTE1=0x00;
   MY_MAC_BYTE2=0x04;
   MY_MAC_BYTE3=0xA3;
   MY_MAC_BYTE4=0x00;
   MY_MAC_BYTE5=0x00;
   MY_MAC_BYTE6=0x01;
}

void IPAddrInit(void)
{
   //Direccion IP
   MY_IP_BYTE1=192;
   MY_IP_BYTE2=168;
   MY_IP_BYTE3=1;
   MY_IP_BYTE4=111;

   //Puerta de Enlace
   MY_GATE_BYTE1=192;
   MY_GATE_BYTE2=168;
   MY_GATE_BYTE3=1;
   MY_GATE_BYTE4=1;

   //Mascara de Subred
   MY_MASK_BYTE1=255;
   MY_MASK_BYTE2=255;
   MY_MASK_BYTE3=255;
   MY_MASK_BYTE4=0;
}

void HTTPPut(char c)
{
   TCPPut(HTTPSocket, c);
}

void HTTPTask(void)
{
   static enum {HTTP_ST_CONNECT=0, HTTP_ST_WAIT_CONNECT=1, HTTP_ST_GET=2, HTTP_ST_PUT=3, HTTP_ST_DISCONNECT=4} state=0;
   static TICKTYPE timeout_counter;
   static char lc, lc2;
   char c;
   char content[250];

   if (HTTPSocket==INVALID_SOCKET)
      state=HTTP_ST_CONNECT;
   else if (!TCPIsConnected(HTTPSocket))
      state=HTTP_ST_WAIT_CONNECT;
   else if (TickGetDiff(TickGet(), timeout_counter) > TICKS_PER_SECOND*60)
      state=HTTP_ST_DISCONNECT;

   switch(state) {
      case HTTP_ST_CONNECT:
         HTTPSocket=TCPListen(MY_HTTP_SOCKET);
         if (HTTPSocket!=INVALID_SOCKET) {
            printf(usb_cdc_putc,"\r\nHTTP: Listening");
            state=HTTP_ST_WAIT_CONNECT;
            timeout_counter=TickGet();
         }
         break;

      case HTTP_ST_WAIT_CONNECT:
         timeout_counter=TickGet();
         if (TCPIsConnected(HTTPSocket)) {
            state=HTTP_ST_GET;
            printf(usb_cdc_putc,"\r\nHTTP: Connected");
         }
         break;

      case HTTP_ST_GET:
         if (TCPIsGetReady(HTTPSocket)) {
            while (TCPGet(HTTPSocket, &c)) {
               if ( (c=='\n') && (lc2=='\n') ) {
                  state=HTTP_ST_PUT;
                  printf(usb_cdc_putc,"\r\nHTTP: Got Page Request");
               }
               lc2=lc;
               lc=c;
            }
         }
         break;

      case HTTP_ST_PUT:
         if (TCPIsPutReady(HTTPSocket)) {
            printf(usb_cdc_putc,"\r\nHTTP: Putting Page Response");
            sprintf(content, "<HTML><HEAD><TITLE>WebServer PIC18F4550 ENC28J60</TITLE></HEAD><BODY><H1>Test Conexión PIC18F4550 y ENC28J60 V1.0</H1>");
            sprintf(&content[0]+strlen(content),"</BODY></HTML>");
            printf(HTTPPut, "HTTP/1.1 200 OK\r\n");
            printf(HTTPPut, "Content-Type: text/html\r\n");
            printf(HTTPPut, "Content-Length: %u\r\n",strlen(content));
            printf(HTTPPut, "\r\n");
            printf(HTTPPut, "%s", content);
            printf(usb_cdc_putc,"\r\nHTTP: Flushing...");
            TCPFlush(HTTPSocket);
            printf(usb_cdc_putc,"\r\nHTTP: Flushed!");
            state=HTTP_ST_GET;
         }
         break;

      case HTTP_ST_DISCONNECT:
         if (TCPIsPutReady(HTTPSocket)) {
            printf(usb_cdc_putc,"\r\nHTTP: Force Disconnect");
            TCPDisconnect(HTTPSocket);
            state=HTTP_ST_WAIT_CONNECT;
         }
         break;
   }
}

void main(void)
{
   ON(LedR);
   OFF(LedV);
   
   usb_cdc_init();
   usb_init();                    //Inicializamos hardware USB del PIC18F4550.
   usb_task();                    //Habilita periferico usb e interrupciones.
   usb_wait_for_enumeration();    //Esperamos hasta que el PicUSB sea configurado por el host.
   
   printf(usb_cdc_putc,"USB Configurado");

   MACAddrInit();
   IPAddrInit();
   StackInit();

   ON(LedV);
   OFF(LedR);   

   while(TRUE)
   {      
      StackTask();
      HTTPTask();
   }
}
 
Última edición por un moderador:
Te voy a intentar responder de la manera más concreta posible. Igual no tengo muchos datos de tu parte para hacerlo de manera objetiva.

1) - Si usas un módulo ENC28J60, nos tenés que especifar cuál es. Igual sea cuál sea no hace falta que hagas ningún adaptador de tensión, lo podés conectar directo con el PIC, respetando el sentido de las señales del puerto SPI.

2) - Hay que configurar bien los fusibles del microcontrolador, en caso de que uses un PIC18F2550 o PIC18F4550, es indiferente. Hay que tener en cuenta la configuración del oscilador para poderlo trabajar a 48Mhz, en caso de usar el puerto USB.

3) - Si haces un análisis minucioso, paso a paso, (lo cuál obviamente es lo recomendable), te vas a dar cuenta que en el archivo ENC28J60, se implementan 2 maneras de comunicarnos por SPI, una por software y otra por hardware. Trabajando por software, el compilador automáticamente regulará las velocidades para que sean las adecuadas en la comunicación con el dispositivo.

En caso de que trabajes con el puerto por Hardware, vas a tener que configurar el puerto SPI y los pines asociados a este. Teniendo en cuenta que a 48Mhz, sería imposible que la velocidad del puerto SPI se adaptara a los requerimientos de velocidad del ENC28J60.

4) - Tanto la MAC, como la dirección IP y la puerta de enlace son configurables totalmente por el usuario. Lo único que no se recomienda es cambiar la MAC.

5) - La conexión con la PC se realiza mediante un cable de red UTP cruzado y con el router se hace con un cable de red UTP recto.

6) - Hay que configurar la IP de nuestro dispositivo y la puerta de enlace para poder enlazarnos con el módulo:

arealocal2.png


Con estas recomendaciones y un estudio más minucioso lo vas a lograr (y)

Saludos !
 
muchas gracias por la ayuda pero sigo igual :confused:

Mi ENC28J60 es uno de la marca olimex que he comprado en RS:
http://es.rs-online.com/web/p/kits-de-desarrollo-de-interfaz/7055259/
Estoy sigueindo las funciones paso a paso y hay de una que no me pasa:

la MacInit()

Código:
void MACInit(void)
{
   BYTE i;

   ENCSPIInit();

   // Wait for CLKRDY to become set.
   // Bit 3 in ESTAT is an unimplemented bit.  If it reads out as '1' that
   // means the part is in RESET or otherwise our SPI pin is being driven
   // incorrectly.  Make sure it is working before proceeding.
   do
   {
      i = ReadETHReg(ESTAT).Val;
   } while((i & 0x08) || (~i & ESTAT_CLKRDY));

se me queda en el while y no pasa.

he puesto una puerta ADN logica despues del ENC28J60 para aumentar la tension de 3.3v a 5v. no se si estara bien.

el WOL esta sin conectar y el CLK tampoco(¿El que se conecta al pic es el SCK?)

Si alguein puede ayuidarme para poder pasar de este paso??


Muchas gracias de nuevo

PD: Tengo varios pic en 18F4550, el 18F2550 y el 18F4620, y con todos ellos me pasa lo mismo.
PD: estoy siguiendo los ejemplos del CCS. El ejemplo 11.

 
Última edición:
1 - Cuál es el ejemplo 11...que tipo de verificación hace.
2 - Estás seguro de haber conectado bien el módulo. Acordate que se hace de manera directa, sin la necesidad de un adaptador.
3 - Necesitas un cable de red cruzado para poder establecer comunicación.
4 - El stack TCP-IP de CCS funciona bien, vas a tener que revisar el hardware que estás utilizando y el driver del CCS, donde se define si la comunicación es por software o por hardware.
5 - Si pudiste leer algo del stack, te vas a dar cuenta que se define el debug, para hacer pruebas en las diferentes capas, usálo y fijate que está fallando.

Saludos !

PD: El ejercicio 11 lo tenés que conectar al router para que te de IP, si lo conectas a la PC no te va a asignar la IP automáticamente.
 
Hola,

muchas gracias por la ayuda.
1 - El ejemplo 11 es el ex11.c que esta en PICC\TCP-IP\PIC Examples Source
2 - Tengo conectado el modulo ENC28J60 directamente al pic he quitado la puerta logica.
3 - El ejemplo 11 lo estoy probando conectando el cable UTP directo al router, he probado otro ejemplo con el UTP cruzado y tampoco me funciona
4 - Como puedo chequear el HW(ENC28J60) para comprobar que funciona.

¿La comunicacion tiene que ser port HW o por SW??

5- Como hago el debug? Yo ahora estoy poniendo printf y los saco a traves del puerto serie. Se queda pillado en la inicializacion de la MAC.


Muchas gracias por intentar ayudarme.

1 - Cuál es el ejemplo 11...que tipo de verificación hace.
2 - Estás seguro de haber conectado bien el módulo. Acordate que se hace de manera directa, sin la necesidad de un adaptador.
3 - Necesitas un cable de red cruzado para poder establecer comunicación.
4 - El stack TCP-IP de CCS funciona bien, vas a tener que revisar el hardware que estás utilizando y el driver del CCS, donde se define si la comunicación es por software o por hardware.
5 - Si pudiste leer algo del stack, te vas a dar cuenta que se define el debug, para hacer pruebas en las diferentes capas, usálo y fijate que está fallando.

Saludos !

PD: El ejercicio 11 lo tenés que conectar al router para que te de IP, si lo conectas a la PC no te va a asignar la IP automáticamente.
 
muchas gracias por la ayuda, ya lo conseguí!!!!!!!!!!!!

Al final, volví a rehacer todo el circuito quitando otros que tenia unidos al pic, los cuales forman parte de un proyecto mas grande y conseguí hacer ping y abrir la pagina en el navegador. Mi trabajo me costo. jeje

no he necesitado hacer ninguna modificación en el código del ejemplo "11 Ethernet", lo único que he modificado han sido el PID y el VID, para poner instalar los drivers del USB y modificado los fuses del pic para adaptarlo a un crystal de 20MHz(XTPLL por HSPLL; y PLL1 por PLL5)

Las conexiones del pic al ENC son directas MOSI(ENC) en SI(PIC) y MISO(ENC) en SO(PIC), por lo menos en este encapsulado(ENC28J60 de Olimex).
 
Hola de nuevo

Ahora me ha surgido una duda, la interrupción WOL. He mirado por Internet y no he encontrado mucha información.
Mi pregunta es la siguiente. Cuando envías un paquete a través de ethernet de wake-on-lan a través del encapsulado, este tendría que activar el WOL, sin necesidad de pasar por el PIC? o primero tendría que recibir el paquete el pic y luego enviarle la señal al ENC por el SPI, para que este active el WOL??

Mi problema es que a veces se me queda trabado el pic, debido a radiación, y quisiera resetearlo, enviando una señal desde el PC de wake-on-lan.

sabe alguien algo de este tema??

muchas gracias y un saludo.
 
Hola, ahora tengo otro problema.(Todos son problemas).

He conectado el ENC28J60 a un switch y este a un router y si conecto un PC al switch, desde este se puede hacer ping y acceder a la pagina web a traves del navegador.
En cambio si conecto el PC al router solo puedo hacer ping, la pagina web no se abre.

He observado que las luces del switch, en la boca que esta conectado el ENC28J60 solo se enciende el led de link, pero no se enciende la de velocidad(10Mb, 100Mb), sin embargo en la boca del PC se encienden las dos.

Sabe alguien cual es el problema si hay que modificar algo de velocidades en el codigo?

Gracias por la ayuda.

Saludos.
 
Atrás
Arriba