Hi
i'm using this scheme to provide my web server, but does not respond to ping. The code i'm using is as follows:
////////////////////////////////////////////////////////////////////////////////////////////////////////
//Este programa sirve para revisar la correcta conexión entre el PIC18F4620 y //
//el modulo ENC28J60, crea un WebServer en la direccion IP 192.168.1.50 //
//El cual muestra el siguiente mensaje "Test Conexión PIC18F4620 y ENC28J60" //
//También emula un puerto serial en el PC donde vamos viendo como se desarrolla el programa //
////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <18f4620.h>
#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT
#use delay(clock=20M)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
// Conexión entre el PIC18F4620 y el Modulo ENC28J60 (Se conecta directamente sin adaptador de voltajes).
// Se adjunta el datasheet del Modulo ENC28J60.
//#define PIN_ENC_MAC_SO PIN_C4 // Conectar con PIN MISO del ENC28J60.
//#define PIN_ENC_MAC_SI PIN_C5 // Conectar con PIN MOSI del ENC28J60.
//#define PIN_ENC_MAC_CLK PIN_C3 // Conectar con PIN SCK del ENC28J60.
//#define PIN_ENC_MAC_CS PIN_D1 // Conectar con PIN CS del ENC28J60.
//#define PIN_ENC_MAC_RST PIN_D0 // Conectar con PIN RST del ENC28J60.
//ESTOS PINES SE LO USA CON EL PIC18F2550
//efine PIN_ENC_MAC_INT PIN_C5 // Conectar con PIN INT del ENC28J60.
//efine PIN_ENC_MAC_WOL PIN_C4 // Conectar con PIN WOL del ENC28J60.
//ESTOS PINES SE LOS USA CON EL PIC18F4550
//#define PIN_ENC_MAC_INT PIN_B0 // Conectar con PIN INT del ENC28J60.
//#define PIN_ENC_MAC_WOL PIN_B1 // Conectar con PIN WOL del ENC28J60.
//Se definen los diferentes modos SPI en terminos de constantes
//nuestro PIC parece que solo funciona en los modos 1 y 3, aunque se supone que deben trabajar con cualquier modo
#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_1 (SPI_L_TO_H)
#define SPI_MODE_2 (SPI_H_TO_L)
#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H)
#define SS_PIN PIN_C0 //podemos coger cualquier pin, hemos cogido el RA0
#define STACK_USE_CCS_PICENS 1
#if STACK_USE_CCS_PICENS
#define STACK_USE_MCPENC 1
#endif
//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;
int val;
// 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=50;
//Mascara de Subred
MY_MASK_BYTE1=255;
MY_MASK_BYTE2=255;
MY_MASK_BYTE3=255;
MY_MASK_BYTE4=0;
//Puerta de Enlace
MY_GATE_BYTE1=192;
MY_GATE_BYTE2=168;
MY_GATE_BYTE3=1;
MY_GATE_BYTE4=1;
}
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");
printf("\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("\r\nHTTP: Connected");
//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");
printf("\r\nHTTP: Got Page Request");
}
lc2=lc;
lc=c;
}
}
break;
case HTTP_ST_PUT:
//Ponemos el conversor ADC a leer desde el pin 0 puerto A
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
//La siguiente sentencia inicializa el Hardware SPI , con este PIC como master ponemos modo 1
//SPI_CLK_DIV_64 ponemos la velocidad del clock SPI--ponemos la velocidad mas baja
setup_spi(SPI_MASTER | SPI_MODE_1 | SPI_CLK_DIV_4);
while(1) {
val = read_adc(); //leemos el valor que vamos a enviar
output_low(SS_PIN); //esclavo, seleccionamos nivel bajo para seleccionar esclavo
delay_us(10); //give the slave time to notice this (may be unnecessary)
spi_write(val); //enviamos el valor
delay_us(10); //delay
output_high(SS_PIN); //liberamos esclavo
delay_ms(10);
}
if (TCPIsPutReady(HTTPSocket))
{
//printf(usb_cdc_putc,"\r\nHTTP: Putting Page Response");
printf("\r\nHTTP: Putting Page Response");
sprintf(content, "<HTML><HEAD><TITLE>WebServer PIC18F4620 ENC28J60</TITLE></HEAD><BODY><H1>TEST CONEXION PIC18F4620 y ENC28J60 POR Oscar Blazquez 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(HTTPPut, "%s", val);
//printf(usb_cdc_putc,"\r\nHTTP: Flushing...");
printf("\r\nHTTP: Flushing...");
TCPFlush(HTTPSocket);
//printf(usb_cdc_putc,"\r\nHTTP: Flushed!");
printf("\r\nHTTP: Flushed!");
state=HTTP_ST_GET;
}
break;
case HTTP_ST_DISCONNECT:
if (TCPIsPutReady(HTTPSocket))
{
//printf(usb_cdc_putc,"\r\nHTTP: Force Disconnect");
printf("\r\nHTTP: Force Disconnect");
TCPDisconnect(HTTPSocket);
state=HTTP_ST_WAIT_CONNECT;
}
break;
}
}
void main(void)
{
MACAddrInit();
IPAddrInit();
StackInit();
while(TRUE)
{
StackTask();
HTTPTask();
}
}
Can you help to check the operation in proteus? When i compile it does not give me any error and the window tells me that it proteus up the NIC, but does not respond to ping.