Autor Tema: Dolores de Cabeza con LongWord y LongInt  (Leído 2336 veces)

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

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Dolores de Cabeza con LongWord y LongInt
« en: 22 de Octubre de 2008, 18:04:10 »
Hola amigos, estaba preparando un pequeño proyecto para hacer un reloj NTP con PIC y LCD. Después de mucho investigar, leer las RFC's con respecto al protocolo NTP y de que Andrew Gregory muy amablemente me indicara como construir el paquete UDP -andaba perdido en el tema por los benditos flags-, ahora se me presento otro problema.

Sucede que ya puedo enviar el paquete NTP al servidor para solicitar la hora en UTC y el servidor me contesta con el paquete de la hora de inmediato, hasta aquí pensé que lo mas difícil ya había pasado -ja pobre iluso de mi-. El servidor NTP envia el paquete el cual, ademas de algunos bits de configuración, la hora que yo envío y entre otras cosas me envía la hora "actualizada" en un formato de 32bits. Este dato son los segundos transcurridos desde el 1ro de Enero de 1900, con los cuales debo determinar la hora actual.
El problema de la decodificacion UTC aun no esta resuelto pues antes de hacer toda la matemática tengo que juntar los valores recibidos en una variable de 32bits. Los datos recibidos se almacenan en un vector, concretamente los indices 40,41,42,43. Ahora para juntar esos valores en una variable de 32bits hago esto:

Código: FreeBasic
  1. FSR2Ptr  = @UTCseg
  2.    POSTINC2 = NTPr[43]
  3.    POSTINC2 = NTPr[42]
  4.    POSTINC2 = NTPr[41]
  5.    INDF2    = NTPr[40]

Eso segun los de MKE asi se hace para un PIC18 -aunque pregunte porque y como, como siempre no contestan los HP- pero asi se hace. La variable UTCseg es de tipo LONGWORD y tambien he probado con LONGINT pero al querer ver como esta construida y desplegarla en la pagina web o en el LCD se despliega como  -861281878 en decimal lo que equivale a 0xFFFFFFFFCCA9E1AA con signo, suponiendo que:

Código: FreeBasic
  1. NTPr[43]=AA
  2.    NTPr[42]=E1
  3.    NTPr[41]=A9
  4.    NTPr[40]=CC

He intentado hacer un XOR y aun AND para quitar el signo -todas las F's- pero continuan ahi. Lo cual no entiendo luego quise enviar el valor de UTCseg a una consola UDP de VB para ver el valor que posee sin convertirlo a string como lo hago con el LCD y la pagina WEB pero los valores salen al reves como: AAE1A9CC asi que ya me perdi feo en esto tan cerca de sacar el reloj y tan lejos de componer la variable correctamente.

Y bueno a todo esto se preguntaran para que carajos hacer eso si se puede con un RTC o un dispositivo similar. Bueno la contestacion seria: "si claro pero, has pensado en automatizar ese RTC con un solo boton y mantener la sincronia, o prescendir del RTC para hacer mas pequeña tu placa y solo sincronizarte via internet?"

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 navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Dolores de Cabeza con LongWord y LongInt
« Respuesta #1 en: 24 de Octubre de 2008, 21:49:39 »
Bueno me contesto solito, el signo aparece cuando la paso a String. Pero la variable esta sin signo.

Gracias de todos modods.

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 MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Dolores de Cabeza con LongWord y LongInt
« Respuesta #2 en: 25 de Octubre de 2008, 08:46:23 »
No entiendo mucho de MikroBasic, pero da la sensacion que estas componiendo tu palabra de 32 bits con 4 Bytes.
Creo que estas cargando los bytes en el orden inverso, aparentemente esas instrucciones cargan el valor en la variable y luego desplazan 8 bits a la izquierda, cargando el proximo byte y asi hasta terminar.
Si es asi, deberias cargar primero el primer byte donde recibes, para no invertirlo, te quedaria mas o menos asi:

Código: FreeBasic
  1. FSR2Ptr  = @UTCseg  
  2. POSTINC2 = NTPr[40]  
  3. POSTINC2 = NTPr[41]  
  4. POSTINC2 = NTPr[42]  
  5. INDF2    = NTPr[43]

No se si me explico bien. :)
« Última modificación: 25 de Octubre de 2008, 08:50:41 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Dolores de Cabeza con LongWord y LongInt
« Respuesta #3 en: 25 de Octubre de 2008, 12:09:01 »
Si gracias MLGSOFT, tengo que cargar los bytes en orden inverso para que la variable quede conforme el valor que envia el server. Si la cargo asi se invierte.
"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."