Code: Select all
// DEFINICIONES
#define Ethernet_HALFDUPLEX 0
#define Ethernet_FULLDUPLEX 1
#define true 1
#define false 0
#define DELAY_TIME 3000
// CONSTANTES Y VARIABLES DEL SERVIDOR WEB
const unsigned char httpHeader[] = "HTTP/1.1 200 OK\nContent-type: " ; // HTTP header
const unsigned char httpMimeTypeHTML[] = "text/html\n\n" ; // HTML MIME type
const unsigned char httpMimeTypeScript[] = "text/plain\n\n" ; // TEXT MIME type
unsigned char httpMethod[] = "GET /"; // GET type
unsigned char getRequest[7]; // Buffer para peticiones GET
unsigned char cadena[30]; // Buffer enviar variables a los script
// Página Web alojada
const char *indexPage = // Change the IP address of the page to be refreshed
"<html><head><title>PIC18F87J60 WEB SERVER</title></head><body bgcolor=\"#003366\"><script src=/v></script>"
"<div align=\"center\"><font color=\"#FFFFFF\" size=\"5\" face=\"Arial, sans-serif\">PIC18F87J60 WEB SERVER</font></div>"
"<p><div align=\"center\"><font color=\"#FFFFFF\" size=\"2\" face=\"Arial, sans-serif\">PORTC = <script>document.write(PORTC)</script></p><p>by TROMEX</p></font></div>"
"</body></html>";
// VARIABLES DE LA CONEXIÓN ETHERNET
// CONFIGURACIÓN DE RED DEFAULT
unsigned char myMacAddr[6] = {0x00, 0x16, 0xd3, 0x9E, 0x30, 0x2e} ; // MAC address
unsigned char myIpAddr[4] = {0, 0, 0, 0 }; // IP address
unsigned char gwIpAddr[4] = {192, 168, 1, 1 }; // gateway (router) IP address
unsigned char ipMask[4] = {255, 255, 255, 0 }; // network mask
unsigned char dnsIpAddr[4] = {0, 0, 0, 0 }; // DNS server IP address
// PROCESAMIENTO DE PROTOCOLO TCP/IP
unsigned int Ethernet_UserTCP(unsigned char *remoteHost, unsigned int remotePort, unsigned int localPort, unsigned int reqLength)
{
unsigned int lenght = 0; // Cantidad de bytes a enviar
unsigned char i = 0; // Byte de proposito general
// Verifica el puerto 80
if(localPort != 80)
return(0x00); // No es por el puerto 80, no responde
// Copia la petición HTTP realizada
for (i = 0; i < 6; i++)
getRequest[i] = Ethernet_getByte(); // Lee de a un byte
getRequest[6] = 0; // Coloca el fin de cadena
// Se asegura que la petición sea GET
if (memcmp(getRequest, httpMethod, 5))
return(0x00); // Si no es GET, no responde
// Si la petición GET comienza con 'v' envía el estado de las variables
if (getRequest[5] == 'v')
{
lenght = Ethernet_putConstString(httpHeader);
lenght += Ethernet_putConstString(httpMimeTypeScript);
// ENVIA EL ESTADO DEL PORTC
lenght += Ethernet_putConstString("var PORTC=");
intToStr(PORTC, cadena);
lenght += Ethernet_putString(cadena);
lenght += Ethernet_putConstString(";");
}
// Envía la página WEB
if (lenght == 0x00)
{
lenght = Ethernet_putConstString(httpHeader);
lenght += Ethernet_putConstString(httpMimeTypeHTML);
lenght += Ethernet_putConstString(indexPage);
}
// Devuelve la cantidad de bytes enviados
return(lenght);
}
// PROCESAMIENTO DE PROTOCOLO UDP/IP
unsigned int Ethernet_UserUDP(unsigned char *remoteHost, unsigned int remotePort, unsigned int destPort, unsigned int reqLength)
{
unsigned char data = 0x40;
Ethernet_putByte(data);
return(0x01);
}
// MUESTRA EN EL LCD EN EL CurrentCursorPosition UN NUMERO ENTERO (de 000 hasta 255)
void Lcd_Int_Cp(unsigned char num)
{
unsigned char c, d, u; // Variables locales
// Calculo de centenas, decenas, unidades
c = (unsigned char)(num / 100);
d = (unsigned char)(num / 10 - c * 10);
u = (unsigned char)(num - c * 100 - d * 10);
// Representación en LCD
Lcd_Chr_Cp((char)('0' + c));
Lcd_Chr_Cp((char)('0' + d));
Lcd_Chr_Cp((char)('0' + u));
}
// MUESTRA EN EL LCD UNA SERIE DE CARTELES CON LA CONFIGURACIÓN ETHERNET
void Lcd_Net_Conf()
{
// Setea la IP asignada en un arreglo
memcpy(myIpAddr, Ethernet_getIpAddress(), 4);
// Mostramos la IP asignada
Lcd_Cmd(LCD_CLEAR);
Lcd_Out_Cp("IP:");
Lcd_Cmd(LCD_SECOND_ROW);
Lcd_Int_Cp(myIpAddr[0]);
Lcd_Chr_CP('.');
Lcd_Int_Cp(myIpAddr[1]);
Lcd_Chr_CP('.');
Lcd_Int_Cp(myIpAddr[2]);
Lcd_Chr_CP('.');
Lcd_Int_Cp(myIpAddr[3]);
Delay_ms(DELAY_TIME);
// Setea la NETWORK MASK asignada en un arreglo
memcpy(ipMask, Ethernet_getIpMask(), 4) ;
// Mostramos la NETWORK MASK asignada
Lcd_Cmd(LCD_CLEAR);
Lcd_Out_Cp("NETWORK MASK:");
Lcd_Cmd(LCD_SECOND_ROW);
Lcd_Int_Cp(ipMask[0]);
Lcd_Chr_CP('.');
Lcd_Int_Cp(ipMask[1]);
Lcd_Chr_CP('.');
Lcd_Int_Cp(ipMask[2]);
Lcd_Chr_CP('.');
Lcd_Int_Cp(ipMask[3]);
Delay_ms(DELAY_TIME);
// Setea la GATEWAY IP asignada en un arreglo
memcpy(gwIpAddr, Ethernet_getGwIpAddress(), 4) ;
// Mostramos la GATEWAY IP asignada
Lcd_Cmd(LCD_CLEAR);
Lcd_Out_Cp("GATEWAY IP:");
Lcd_Cmd(LCD_SECOND_ROW);
Lcd_Int_Cp(gwIpAddr[0]);
Lcd_Chr_CP('.');
Lcd_Int_Cp(gwIpAddr[1]);
Lcd_Chr_CP('.');
Lcd_Int_Cp(gwIpAddr[2]);
Lcd_Chr_CP('.');
Lcd_Int_Cp(gwIpAddr[3]);
Delay_ms(DELAY_TIME);
// Setea la DNS SERVER IP asignada en un arreglo
memcpy(dnsIpAddr, Ethernet_getDnsIpAddress(), 4) ;
// Mostramos la DNS SERVER IP asignada
Lcd_Cmd(LCD_CLEAR);
Lcd_Out_Cp("DNS SERVER IP:");
Lcd_Cmd(LCD_SECOND_ROW);
Lcd_Int_Cp(dnsIpAddr[0]);
Lcd_Chr_CP('.');
Lcd_Int_Cp(dnsIpAddr[1]);
Lcd_Chr_CP('.');
Lcd_Int_Cp(dnsIpAddr[2]);
Lcd_Chr_CP('.');
Lcd_Int_Cp(dnsIpAddr[3]);
}
void Default_Conf()
{
// Vuelve a asignar un valor DEFAULT a myIpAddr
myIpAddr[0] = 192;
myIpAddr[1] = 168;
myIpAddr[2] = 1;
myIpAddr[3] = 69;
// Vuelve a asignar un valor DEFAULT a gwIpAddr
gwIpAddr[0] = 192;
gwIpAddr[1] = 168;
gwIpAddr[2] = 1;
gwIpAddr[3] = 1;
// Vuelve a asignar un valor DEFAULT a ipMask
ipMask[0] = 255;
ipMask[1] = 255;
ipMask[2] = 255;
ipMask[3] = 0;
// Vuelve a asignar un valor DEFAULT a dnsIpAddr
dnsIpAddr[0] = 0;
dnsIpAddr[1] = 0;
dnsIpAddr[2] = 0;
dnsIpAddr[3] = 0;
}
// CADENA MOSTRADA EN EL LCD
char *texto[] = { "INICIALIZANDO ", "DHCP... " };
char *tit[] = { " PIC18F87J60", "WEB SERVER v0.2" };
// MAIN
void main()
{
unsigned char usingDHCP = false; // Indica si se esta usando DHCP
unsigned char marce = 0;
TRISA = 0xFC; // OUT: RA0-1 ---- IN: RA2-7
TRISC = 0xFF; // IN: RC0-7
// CONFIGURACIÓN DEL LCD (4-bit interface connection) para LV18J board
TRISB = 0x00; // PORTB es salida
Lcd_Config(&PORTB, 0, 1, 7, 5, 4, 3, 2); // Inicializa LCD
Lcd_Cmd(LCD_CLEAR); // Limpia el LCD
Lcd_Cmd(LCD_CURSOR_OFF); // Apaga el cursor
// Inicializa y configura la conexión ETHERNET (MANUAL)
Ethernet_Init(myMacAddr, myIpAddr, Ethernet_FULLDUPLEX);
marce = Ethernet_InitDHCP(5);
if(marce == true)
{
usingDHCP = true;
Lcd_Net_Conf(); // Muestra en el LCD la configuración de la RED
// Muestra en el LCD el cartel de 'tit'
Delay_ms(DELAY_TIME);
Lcd_Cmd(LCD_CLEAR);
Lcd_Out(1, 1, tit[0]); // Muestra 'tit[0]'
Lcd_Out(2, 1, tit[1]); // Muestra 'tit[1]'
}
else
{
// Asigna a la variables la configuración DEFAULT
Default_Conf();
// Inicializa y configura la conexión ETHERNET (MANUAL)
Ethernet_Init(myMacAddr, myIpAddr, Ethernet_FULLDUPLEX);
Ethernet_confNetwork(ipMask, gwIpAddr, dnsIpAddr);
usingDHCP = false;
Lcd_Net_Conf(); // Muestra en el LCD la configuración de la RED
// Muestra en el LCD el cartel de 'tit'
Delay_ms(DELAY_TIME);
Lcd_Cmd(LCD_CLEAR);
Lcd_Out(1, 1, tit[0]); // Muestra 'tit[0]'
Lcd_Out(2, 1, tit[1]); // Muestra 'tit[1]'
}
// EMPIEZA A PROCESAR PAQUETES
while(true)
{
Ethernet_doPacket(); // Procesa
if(usingDHCP == true)
{
if(Ethernet_doDHCPLeaseTime() == true)
{
if(Ethernet_renewDHCP(5) == true)
{
Lcd_Net_Conf(); // Muestra en el LCD la configuración de la RED
// Muestra en el LCD el cartel de 'tit'
Delay_ms(DELAY_TIME);
Lcd_Cmd(LCD_CLEAR);
Lcd_Out(1, 1, tit[0]); // Muestra 'tit[0]'
Lcd_Out(2, 1, tit[1]); // Muestra 'tit[1]'
}
else
{
// Asigna a la variables la configuración DEFAULT
Default_Conf();
// Inicializa y configura la conexión ETHERNET (MANUAL)
Ethernet_Init(myMacAddr, myIpAddr, Ethernet_FULLDUPLEX);
Ethernet_confNetwork(ipMask, gwIpAddr, dnsIpAddr);
usingDHCP = false;
Lcd_Net_Conf(); // Muestra en el LCD la configuración de la RED
// Muestra en el LCD el cartel de 'tit'
Delay_ms(DELAY_TIME);
Lcd_Cmd(LCD_CLEAR);
Lcd_Out(1, 1, tit[0]); // Muestra 'tit[0]'
Lcd_Out(2, 1, tit[1]); // Muestra 'tit[1]'
}
}
}
}
}
When a DHCP Server is found i dont have any problem, but when DHCP is no present, when i call Ethernet_Init(); i think the library have a BUG because the Ethernet Port of the PIC doesn't close after the call to connect with DHCP Server... :( And the program get inside of an infinite loop.
Excuse me for my BAD ENGLISH!!!
...TROMEX...