LV18FJ Board with DHCP and DEFAULT conf ERROR

General discussion on mikroC.
Post Reply
Author
Message
tromex
Posts: 1
Joined: 05 Sep 2008 21:47

LV18FJ Board with DHCP and DEFAULT conf ERROR

#1 Post by tromex » 05 Sep 2008 21:57

Hello! The code is this:

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...

caporaleo
Posts: 1
Joined: 21 Oct 2011 17:55

Re: LV18FJ Board with DHCP and DEFAULT conf ERROR

#2 Post by caporaleo » 29 Nov 2011 17:23

Es porque el la dirección ip tenes 0.0.0.0 esa es la ip que debes usar cuando tenes activado el DHCP.
tenes otros ejemplos de ethernet con mickoc? porque hay muy poco y menos en castellano.

Gracias y espero que te haya servido.

Post Reply

Return to “mikroC General”