TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: navaismo 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:
FSR2Ptr = @UTCseg
POSTINC2 = NTPr[43]
POSTINC2 = NTPr[42]
POSTINC2 = NTPr[41]
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:
NTPr[43]=AA
NTPr[42]=E1
NTPr[41]=A9
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
-
Bueno me contesto solito, el signo aparece cuando la paso a String. Pero la variable esta sin signo.
Gracias de todos modods.
Saludos
-
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:
FSR2Ptr = @UTCseg
POSTINC2 = NTPr[40]
POSTINC2 = NTPr[41]
POSTINC2 = NTPr[42]
INDF2 = NTPr[43]
No se si me explico bien. :)
-
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.