Autor Tema: Reloj ethernet con NTP  (Leído 7743 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Reloj ethernet con NTP
« en: 26 de Octubre de 2008, 23:53:07 »
Hola amigos la primera version de este proyecto la publique en el Foro de www.micros.mforos.com quien ha sido mi casa ultimamente, con esta publicacion no pretendo llenar los foros que visito con el mismo material, pero queria compartir con todopic esto tambien.

El proyecto en el concepto es muy simple: "hacer un reloj sin RTC's o Timer's, solo con el protoclo de red NTP", aunque la programacion me ha llevado toda una semana no resulto muy sencillo que digamos; ademas todavia falta añadir las rutinas para poder cambiar el GMT y el servidor NTP. Por ahora solo muestra la hora GMT de México sin el Horario de Verano que entro hoy por la noche y tiene un server estatico.

Bueno vamos con un poco de teoria tambien acerca de lo que es NTP:

Cita de: Wikipedia
Network Time Protocol (NTP) es un protocolo de internet para sincronizar los relojes de los sistemas informáticos a través de ruteo de paquetes en redes con latencia variable. NTP utiliza UDP como su capa de transporte, usando el puerto 123. Está diseñado para resistir los efectos de la latencia variable.

NTP utiliza el Algoritmo de Marzullo con la escala de tiempo UTC, incluyendo soporte para características como segundos intercalares. NTPv4 puede mantenerse a tiempo con hasta 10 milisegundos (1/100 segundos) a través de Internet, y puede llegar a acercarse hasta 200 microsegundos (1/5000 segundos) o más en redes de área local sobre condiciones ideales.

NTP es uno de los protocolos de internet más viejos que siguen en uso (desde antes de 1985). NTP fue diseñado originalmente por Dave Mills de la Universidad de Delaware, el cual lo sigue manteniendo, en conjunto con un equipo de voluntarios.

NTP utiliza un sistema de jerarquía de estratos de reloj, en donde los sistemas de estrato 1 están sincronizados con un reloj externo tal como un reloj GPS ó algún reloj de radio. Los sistemas de estrato 2 de NTP derivan su tiempo de uno ó más de los sistemas de estrato 1, y así consecutivamente (cabe mencionar que esto es diferente de los estrato de reloj utilizados en los sistemas de telecomunicaciones).

Las estampas de tiempo utilizadas por NTP consisten en un segundo de 32-bit y una parte fraccional de 32-bit, dando con esto una escala de 232 segundos (136 años), con una resolución teórica de 2−32 segundos (0.233 nanosegundos). Aunque las escalas de tiempo NTP se redondean cada 232 segundos, las implementaciones deberían desambigüar el tiempo NTP utilizando el tiempo aproximado de otras fuentes. Esto no es un problema en la utilización general ya que esto solamente requiere un tiempo cercano a unas cuantas décadas.

Los detalles operacionales de NTP se encuentran ilustrados en el RFC 778, RFC 891, RFC 956, RFC 958 y RFC 1305. (NTP no debe ser confundido con daytime (RFC 867) ó los protocolos de tiempo (RFC 868)). La versión actual de NTP es la versión 4; hasta el 2005, sólo las versiones superiores a la versión 3 han sido documentadas en los RFCs. El grupo de trabajo de NTP IETF ha sido formado para estandarizar el trabajo de la comunidad de NTP desde RFC 1305.

La construccion del paquete es la siguiente:

Byte 0: flags:
   Bits 7-6: Leap Indicate (zero for request)
   Bits 5-3: Version (4)
   Bits 2-0: Mode (i.e. 3 for client (or maybe 1 for symmetric active))
Byte 1: stratum (zero for request)
Byte 2: poll (zero for request)
Byte 3: precision (zero for request)
Bytes 4-7: root delay (zero for request)
Bytes 8-11: root dispersion (zero for request)
Bytes 12-15: reference id (zero for request)
Bytes 16-23: reference timestamp (zero for request)
Bytes 24-31: originate timestamp (zero for request)
Bytes 32-39: receive timestamp (zero for request)
Bytes 40-47: transmit timestamp (set to current time)

Por ejemplo el byte 0 puede ser 00 100 011 = 0x23
Los bytes 1 a 39 pueden ser 0. Los Bytes 40-47 contienen el tiempo que nosotros transmitimos tambien puede ser 0

El server nos va a contestar con un paquete de igual tamaño, como usamos NTP en formato largo, los bytes 40-43 son un numero de 32 bits,el MSB primero, Este numero de 32 bits representa los segundos transcurridos desde el 1ro de Enero de 1900. los Bytes 44-47 son un numero de 32 bits tambien y representan la precision en segundos del tiempo. Usar un servidor NTP nos da una precision de 232 lo cual permite ser muy muy precisos, pero en mi proyecto descartamos este valor no busco ser super exacto.

Entonces los bytes que nos interesan captar son los bytes 40 al 43 para pasarlo a una variable de 32 bits y poder hacer el calculo. Como para todo lo de ethernet estoy usando Mikrobasic nos facilita el trabajo ya que MKB posee una libreria para el tiempo EPOCH, este tiempo esta representado en segundos tambien pero desde el 1ro de Enero de 1970 lo que nos permite hacer uso de esta libreria, basta con hacer la diferencia entre los segundos UTC a los segundos UNIX -asi tambien se llama el tiempo EPOCH-.

La RFC958 es imperdible   pues es donde explican la constuccion del paquete NTP, aunque yo no lo tenia muy claro hasta que Andrew Gregory me lo puso justo como arriba.

Ahora que ha quedado a grosso modo medio explicado aqui va el programa lo mas comentado que pude.

El programa hace la peticion NTP cada 10s y es mostrada la hora que nos envia el servidor NTP en un LCD de 16x2 y tambien en la pagina web del PIC la cual corresponde a la direccon IP del PIC. La Hora del LCD y la de la pagina WEB se muestran con diferencia en los segundos pues no se despliegan al mismo tiempo. Sobre todo porque la pagina WEB se recarga automaticamente cada 20s. Por lo que los segundos no son continuos. El formato de hora es UTC Mexico, es decir el tiempo UTC - GMT correspondiente a mi Pais.

El circuito -que habia olvidado- guardando las diferencias ya que uso la M2ETHBOARD:




Ahora si, aqui el codigo el cual esta divido en 3 partes, El proyecto y 2 modulos:

Código: FreeBasic
  1. program PICNTP
  2.  
  3. include "enc_ss"        ' modulo donde se implementa el codigo
  4. include "eth_enc28j60"  ' modulo usado por el compilador
  5.  
  6.   dim mymacaddr as byte [6]   ' variables para MAC, IP, DNS,GW,MASCARA, Paquete NTP
  7.   dim myipaddr  as byte [4]
  8.   dim gwipaddr  as byte [4]
  9.   dim dnsipaddr as byte [4]
  10.   dim ipmask    as byte [4]
  11.   dim NTP_Pack  as byte [48]
  12.   dim dum       as byte
  13.  
  14.  sub procedure pausa()   ' Pausa para el retardo NTP y recepcion de Paquetes
  15.   for i=0 to 100
  16.   spi_ethernet_dopacket()  ' aun en la Pausa escuchamos peticiones UDP o TCP
  17.   delay_ms(100)
  18.   spi_ethernet_dopacket()
  19.   next i
  20.  end sub
  21.  
  22. '///////////////////  Datos del Paquete UDP explicacion Gracias a: Andrew Gregory  //////////////////////
  23. '
  24. 'http://tools.ietf.org/html/rfc1305
  25. 'http://tools.ietf.org/html/rfc867
  26. '
  27. 'Byte 0: flags:
  28. ' Bits 7-6: Leap Indicate (zero for request)
  29. ' Bits 5-3: Version (4)
  30. ' Bits 2-0: Mode (i.e. 3 for client (or maybe 1 for symmetric active))
  31. 'Byte 1: stratum (zero for request)
  32. 'Byte 2: poll (zero for request)
  33. 'Byte 3: precision (zero for request)
  34. 'Bytes 4-7: root delay (zero for request)
  35. 'Bytes 8-11: root dispersion (zero for request)
  36. 'Bytes 12-15: reference id (zero for request)
  37. 'Bytes 16-23: reference timestamp (zero for request)
  38. 'Bytes 24-31: originate timestamp (zero for request)
  39. 'Bytes 32-39: receive timestamp (zero for request)
  40. 'Bytes 40-47: transmit timestamp (set to current time)
  41. '
  42. '////////////////////////////////////////////////////////////////////////////////////////////
  43.  
  44.  sub procedure req_ntp()     ' Construccion de Paquete NTP
  45.   NTP_Pack[0]= 0x23          ' Enviamos modo Cliente, sin estrato
  46.    for dum=1 to 47           ' Todos los demas Bytes son 0
  47.     NTP_Pack[dum]=0
  48.    next dum
  49.   spi_ethernet_sendudp(IPD,123,123,@NTP_Pack,48) 'Enviamos el paquete NTP al Servidor
  50.  end sub
  51.  
  52.  
  53.  
  54. '//////////////////////////////////// Configuracion de Variables ////////////////////////////
  55.  main:
  56.  
  57.   adcon0=0     ' Sin ADC's, Sin Comparadores PORTA Entrada
  58.   adcon1=15
  59.   cmcon=7
  60.   trisa=255
  61.   porta=0
  62.  
  63.   trisd=0     ' PORTD de Salida =0
  64.   portd=0
  65.  
  66.   mymacaddr[0]= 0x00  ' MAC del PIC
  67.   mymacaddr[1]= 0x00
  68.   mymacaddr[2]= 0x00
  69.   mymacaddr[3]= "M"
  70.   mymacaddr[4]= "A"
  71.   mymacaddr[5]= "X"
  72.  
  73.   myipaddr[0]=20    ' IP del PIC
  74.   myipaddr[1]=0
  75.   myipaddr[2]=4
  76.   myipaddr[3]=20
  77.                      ' Mascara del PIC
  78.   ipmask[0]=255
  79.   ipmask[1]=255
  80.   ipmask[2]=255
  81.   ipmask[3]=0
  82.  
  83.   dnsipaddr[0]=20   'DNS y GW del PIC
  84.   dnsipaddr[1]=0
  85.   dnsipaddr[2]=4
  86.   dnsipaddr[3]=1
  87.  
  88.   gwipaddr[0]=20
  89.   gwipaddr[1]=0
  90.   gwipaddr[2]=4
  91.   gwipaddr[3]=1
  92.  
  93.   IPD[0]=20'148
  94.   IPD[1]=0'243      'IP del Servidor NTP
  95.   IPD[2]=4'7
  96.   IPD[3]=10'30
  97.  
  98.  
  99.  
  100.   LCD_CONFIG(PORTB,7,6,5,4,PORTB,0,2,1)   'Configuramos el PORTB para el LCD
  101.   LCD_OUT(1,1,"INICIALIZANDO")
  102.   DELAY_MS(3000)
  103.  
  104.   spi_init()  'iniciamos SPI en el PIC
  105.   spi_ethernet_init(portc,0,portc,1,mymacaddr,myipaddr,1) 'Configuramos e Iniciamos el Ethernet del PIC
  106.   spi_ethernet_confnetwork(ipmask,gwipaddr,dnsipaddr)
  107.  
  108.   for i=0 to 2   ' Blink para ver si esta vivo Termina con RD7 en ON
  109.    portd.7=0
  110.    delay_ms(500)
  111.    portd.7=1
  112.    delay_ms(500)
  113.   next i
  114.  
  115.   tryntp:                    ' empezamos la recepcion de paquetes
  116.    while true
  117.     spi_ethernet_dopacket()  ' Escuchamos peticiones TCP y UDP
  118.      req_ntp()               ' Pedimos la hora UTC cada 10s.
  119.      cls                     ' Limpiamos el LCD
  120.      lcd_out(1,1,fecha.str1) ' Mostramos en la primer linea el dia, mes y año
  121.      lcd_out(2,1,fecha.str2) ' Mostramos en la segunda linea la Hora sin puntitos
  122.     pausa()                  ' Llamamos a Pausa
  123.     spi_ethernet_dopacket()  ' Escuchamos peticiones TCP y UDP
  124.    wend
  125.  goto tryntp                 ' Loop
  126. end.

Código: FreeBasic
  1. module enc_ss
  2.  
  3. include "eth_enc28j60_api"        ' modulo del compilador
  4. include "unixtime"
  5.  
  6. dim    getRequest  as byte[20]    ' variables de uso general
  7.        dyna        as byte[30]
  8.        NTPr        as byte[48]    ' Variable donde se guarda los datos provenienes del Server
  9.        txt         as string[20]
  10.        i,l         as byte
  11.   dim  IPD         as byte [4]
  12.  
  13. const httpHeader         as string[31] = "HTTP/1.1 200 OK"+chr(10)+"Content-type: "  ' HTTP header
  14. const httpMimeTypeHTML   as string[13] = "text/html"+chr(10)+chr(10)                 ' HTML MIME type
  15. const httpMimeTypeScript as string[14] = "text/plain"+chr(10)+chr(10)                ' TEXT MIME type
  16. const httpMethod         as string[5]  = "GET /"
  17.  
  18. '/////////////////////////////  ' Pagina a mostrar ////////////////////////////////
  19. const pagina as string [837]=
  20. "<meta http-equiv=" + Chr(34) + "refresh"  + Chr(34) + " content="  + Chr(34) + "20;url=/"  + Chr(34) + chr(62)+
  21. "<html>"+
  22. "<head>"+
  23. "<script src=/x></script>"+
  24. "<title>PIC NTP</title>"+
  25. "</head>"+
  26. "<body>"+
  27. "<div align='center'  style='font-size:3cm'>"+
  28.   "<strong><script>document.write(Fecha)</script></strong><br>"+
  29.   "<strong><script>document.write(Hora)</script></strong><br>"+
  30.   "</div>"+
  31. "<hr><br>"+
  32. "Actualice la Configuración<br><br>"+
  33. "<form method='get'><table width='273' border='1' bordercolor='black'>"+
  34.   "<tr>"+
  35.     "<td width='119' height='40'>"+
  36.   "Servidor NTP&nbsp;<br>"+
  37.       "</td>"+
  38.     "<td width='144'><input type='text' maxlength='15' name='ip'></td>"+
  39.   "</tr>"+
  40.   "<tr>"+
  41.     "<td height='40'>GMT"+
  42.       "<input type='checkbox' name='m'>"+
  43. chr(43)+
  44. "<input type='checkbox' name='n'>"+
  45. " -&nbsp;</td>"+
  46.     "<td><input type='text' maxlength='4' name='g'></td>"+
  47.   "</tr>"+
  48.   "<tr>"+
  49.     "<td height='47' colspan='2'>&nbsp;"+
  50.       "<div align='center'>"+
  51.         "<input name='Enviar' type='submit' value='Actualizar'>"+
  52.       "</div></td>"+
  53.   "</tr>"+
  54. "</table></form>"+
  55. "</body>"+
  56. "</html>"
  57.  
  58. '/////////////////////////// Implementacion TCP
  59. sub function Spi_Ethernet_UserTCP(dim byref remoteHost as byte[4], dim remotePort, localPort, reqLength as word) as word
  60.   result=0
  61.  
  62.   if localport<>80 then 'escuchamos puerto 80
  63.    result=0
  64.   end if
  65.  
  66.    for i = 0 to 23
  67.       getRequest[i] = Spi_Ethernet_getByte()
  68.     next i
  69.  
  70.     getRequest[i] = 0
  71.  
  72.     i = 0
  73.  
  74.     while (httpMethod[i] <> 0)
  75.       txt[i] = httpMethod[i]
  76.       i = i + 1
  77.     wend
  78.  
  79.     if(memcmp(@getRequest, @txt, 5)<>0) then       ' Solo se soporta en metodo GET
  80.       result = 0
  81.       exit
  82.     end if
  83.     if(getRequest[5] = "x") then 'Si el byte 5 corresponde a "x" mostramos los valores
  84.       'el texto puede interpretarse como javascritp /x
  85.       result = Spi_Ethernet_putConstString(@httpHeader)                   ' HTTP header
  86.       result = result + Spi_Ethernet_putConstString(@httpMimeTypeScript)   '  MIME type
  87.  
  88.      'Mostramos Fecha  Contruyendo una variable tipo string JS: var= " fecha";
  89.       dyna = fecha.str1
  90.       txt  = "var Fecha= "
  91.       result = result + Spi_Ethernet_putString(@txt)
  92.       txt  = ""+chr(34)
  93.       result = result + Spi_Ethernet_putString(@txt)
  94.       result = result + Spi_Ethernet_putString(@dyna)
  95.       txt  = ""+chr(34)
  96.       result = result + Spi_Ethernet_putString(@txt)
  97.       txt  = ";"
  98.       result = result + Spi_Ethernet_putString(@txt)
  99.  
  100.       ' Mostramos Hora Contruyendo una variable tipo string JS: var= " Hora";
  101.       txt  = "var Hora= "
  102.       result = result + Spi_Ethernet_putString(@txt)
  103.       dyna = fecha.str2
  104.       txt  = ""+chr(34)
  105.       result = result + Spi_Ethernet_putString(@txt)
  106.       result = result + Spi_Ethernet_putString(@dyna)
  107.       txt  = ""+chr(34)
  108.       result = result + Spi_Ethernet_putString(@txt)
  109.       txt  = ";"
  110.       result = result + Spi_Ethernet_putString(@txt)
  111.     end if
  112.  
  113.     if(result = 0) then                                    'Mostrar por defalt
  114.       result = Spi_Ethernet_putConstString(@httpHeader)                   ' HTTP header
  115.       result = result + Spi_Ethernet_putConstString(@httpMimeTypeHTML)    ' HTML MIME type
  116.       result = result + Spi_Ethernet_putConstString(@pagina)           ' Pagina HTML
  117.     end if
  118. end sub
  119.  
  120.  
  121.  
  122. '//////////////////////////// Implementacion UDP
  123. sub function Spi_Ethernet_UserUDP(dim byref remoteHost as byte[4], dim remotePort, destPort, reqLength as word) as word
  124.   result = 0   ' reseteo de la funcion
  125.  
  126.   if destport = 123 then      ' Escuchamos por el puerto 123 para capturar datos NTP
  127.    for i=0 to 47
  128.     NTPr[i]=spi_ethernet_getbyte() 'Grabamos los datos en la variable
  129.    next i
  130.  
  131.    FSR2Ptr  = @UTCseg   ' Converimos los valores separados en una variable de 32bits
  132.    POSTINC2 = NTPr[43]
  133.    POSTINC2 = NTPr[42]
  134.    POSTINC2 = NTPr[41]
  135.    INDF2    = NTPr[40]
  136.   actualdate() ' Llamamos al Procedimiento para convertir la hora.
  137.   end if
  138. end sub
  139. end.

Código: FreeBasic
  1. module UnixTime
  2.  
  3.   dim  diat        as string[3]   ' Variables para convertir a cadena
  4.        mdt         as string[3]
  5.        mes         as string[3]
  6.        yyt         as string[5]
  7.        hht         as string[3]
  8.        mmt         as string[3]
  9.        sst         as string[3]
  10.        UnixTimec    as longword    ' Variable para  tiempo UNIX
  11.        UTCseg      as longword    ' Variable que contiene los segundos UTC de 32bits
  12.      const  USRGMT  = 18000       ' Constante GMT para Mexico
  13.  
  14. structure TIEMPO
  15.      dim ss as byte     ' segundos
  16.      dim mn as byte     ' minutos
  17.      dim hh as byte     ' Horas
  18.      dim md as byte     ' Dia del mes de 1 a 31
  19.      dim wd as byte     ' Dia de la Semana Lunes=1....Domingo=6
  20.      dim mo as byte     ' Mes del año de 1 a 12
  21.      dim yy as word     ' Año YK2
  22.      dim str1 as string[17]   'Donde guardamos la Fecha
  23.      dim str2 as string[16]   'Donde Guardamos la Hora
  24. end structure
  25.  
  26. dim    fecha       as TIEMPO   ' variable para la fecha
  27.  
  28. const offset  = 2208988800     ' Diferencia en segundos entre 1900 y 1970
  29.  
  30. sub procedure cls
  31.    lcd_cmd(lcd_clear)    ' Rutina para limpiar LCD
  32.    delay_ms(200)
  33. end sub
  34.  
  35. '//////////////////////////////////////// Procedimiento Para obtener Fecha en Formato Humano /////////////////////////////
  36.  sub procedure ActualDate()
  37.  
  38.  UnixTimec = ((UTCseg - USRGMT)+ 9) - offset   ' Calculamos el TiempoUnix restando a los segundos UTC el gmt del usuario y el offset UNIX
  39.    Time_epochToDate(UnixTimec,fecha)           ' Obtenemos la fecha actual en Formato Humano
  40.    select case fecha.wd                        ' Escogemos el Dia segun su valor
  41.     case 0
  42.      diat="Lun"
  43.     case 1
  44.      diat="Mar"
  45.     case 2
  46.      diat="Mie"
  47.     case 3
  48.      diat="Jue"
  49.     case 4
  50.      diat="Vie"
  51.     case 5
  52.      diat="Sab"
  53.     case 6
  54.      diat="Dom"
  55.    end select
  56.  
  57.   select case fecha.mo                          'Escogemos el mes segun su valor
  58.     case 1
  59.      mes="Ene"
  60.     case 2
  61.      mes="Feb"
  62.     case 3
  63.      mes="Mar"
  64.     case 4
  65.      mes="Abr"
  66.     case 5
  67.      mes="May"
  68.     case 6
  69.      mes="Jun"
  70.     case 7
  71.      mes="Jul"
  72.     case 8
  73.      mes="Ago"
  74.     case 9
  75.      mes="Sep"
  76.     case 10
  77.      mes="Oct"
  78.     case 11
  79.      mes="Nov"
  80.     case 12
  81.      mes="Dic"
  82.   end select
  83.                              ' convertimos a cadena la Fecha
  84.  bytetostr(fecha.md,mdt)
  85.  wordtostr(fecha.yy,yyt)
  86.  bytetostr(fecha.hh,hht)
  87.  bytetostr(fecha.mn,mmt)
  88.  bytetostr(fecha.ss,sst)
  89.  
  90. fecha.str1= diat             'Asignamos el dia a la variable Fecha.str1 y anexamos despues los demas valores
  91. strcat(fecha.str1,mdt)
  92. strcat(fecha.str1,mes)
  93. strcat(fecha.str1,yyt)
  94.  
  95. fecha.str2= hht              'Asignamos la hora a la variable Fecha.str2 y anexamos despues los demas valores
  96. strcat(fecha.str2,mmt)
  97. strcat(fecha.str2,sst)
  98.  
  99. end sub
  100. end.

Las imagenes correspondientes:

La pagina web








Por ultmio agradecer a Andrew gregory por el apoyo y a mi Hermano pues me ayudo toda esta semana a comprender como se saca la fecha en formato humano sin necesidad de una libreria.

Saludos.
« Última modificación: 27 de Octubre de 2008, 01:40:02 por navaismo »
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."


Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Reloj ethernet con NTP
« Respuesta #2 en: 27 de Octubre de 2008, 19:01:32 »

Saludos

Sin palabras compañero.
Un saludo desde Pereira - Colombia

Desconectado ema

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1078
Re: Reloj ethernet con NTP
« Respuesta #3 en: 27 de Octubre de 2008, 20:39:03 »
Me sumo a las felicitaciones :-/ :-/ :-/


P/D: Que manotas manolo!!!

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Reloj ethernet con NTP
« Respuesta #4 en: 28 de Octubre de 2008, 12:08:17 »
si señor,muy bueno tu proyecto.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Reloj ethernet con NTP
« Respuesta #5 en: 28 de Octubre de 2008, 13:18:35 »
guau me dejaste sin palabras, muy buen trabajo, felicidades!!!

 :-/ :-/ :-/
.

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Reloj ethernet con NTP
« Respuesta #6 en: 05 de Noviembre de 2008, 22:19:48 »
Gracias a todos por  el apoyo, ya por ultimo le dejo como quedo la pagina y el LCD; solo se le añadio los puntos y comentar que ya no se comunica con mi debian server si no directamente con el servidor mx.pool.ntp.org el cual le da la informacion. Tambien tuvo su breve publicacion web.








Saludos.
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado LABmouse

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Reloj ethernet con NTP
« Respuesta #7 en: 06 de Noviembre de 2008, 00:26:50 »
Felicidades, una gran aplicación y sobradisima la explicación.

SALUDOS!

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Reloj ethernet con NTP
« Respuesta #8 en: 06 de Noviembre de 2008, 13:21:30 »
Exelente navaismo, exelente.  :-/ :-/ :-/
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.