Autor Tema: RTC para la hora y para medir tiempo  (Leído 2627 veces)

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

Desconectado valeri23electro

  • PIC10
  • *
  • Mensajes: 3
RTC para la hora y para medir tiempo
« en: 28 de Noviembre de 2017, 07:50:03 »
Hola, hace mucho que sigo el foro para buscar ayuda aunque nunca me ha hecho falta preguntar nada, ahora tengo una duda a ver si alguien me la puede solucionar  :-/.

Tengo una placa con un STM32F0 (por cierto utilizo las librerias HAL), y utilizo el RTC para que el sistema mantenga el reloj y la fecha. el RTC funciona con un cristal de 32,768KHz (El LSI del micro) y para lo demás utilizo el reloj interno del microcontrolador

El problema, es que también tengo que mostrar un cronometro por un display de 7 segmentos, pero claro si utilizo un timer normal y corriente el cronometro no es nada exacto, pero tampoco puedo utilizar el RTC por que entonces el reloj se pierde.

En principio habia pensado en vigilar los segundos del RTC y así llevar la cuenta, pero claro si paro el cronometro ya he perdido la cuenta de los segundos y no puedo volver a tomar el RTC por que no contara un segundo exacto  :(

¿Ha alguien se le ocurre como hacer el cronometro exacto sin perder el RTC?


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:RTC para la hora y para medir tiempo
« Respuesta #1 en: 28 de Noviembre de 2017, 08:52:29 »
Citar
Tengo una placa con un STM32F0 (por cierto utilizo las librerias HAL), y utilizo el RTC para que el sistema mantenga el reloj y la fecha. el RTC funciona con un cristal de 32,768KHz (El LSI del micro) y para lo demás utilizo el reloj interno del microcontrolador

El problema, es que también tengo que mostrar un cronometro por un display de 7 segmentos, pero claro si utilizo un timer normal y corriente el cronometro no es nada exacto, pero tampoco puedo utilizar el RTC por que entonces el reloj se pierde.

El problema no es utilizar el oscilador principal y porque seas mucho mas grande o fuera de los 32Khz llamarlo inexacto. El problema esta en los osciladores que elegiste.

el LSI tiene una frecuencia tipica de 40Khz, la cual su minima es de 30Khz y su maxima de 50Khz, es decir tenes toda esa variacion de frecuencia, no es 32.768Khz!! Sin contar que seguramente tenga una gran desviacion de frecuencia segun el voltaje y temperatura.
Todos los osciladores internos hacen lo mismo, ya que su funcion es que el micro siga siendo util si falla el oscilador principal. Obviamente es posible usarlos si es que no se lleva tiempo.
Entonces... si o si necesitas un cristal. Este cristal mientras menos error tenga mejor exactitud vas a tener. Asi que mas adelante te voy a dar una solucion

Otra cosa el RTC al ir a una frecuencia demasiado menor a la del micro, tiene su tiempo y consideraciones.

- La frecuencia de bus debe ser 7 veces mas que la del RTC, sino deberas leer 2 o 3 veces el valor y comprobar que se mantenga.
- Con el bit BYPSHAD en 0: De leerlo continuamente la unica forma es borrar el bit RSF y esperar que se ponga en 1, ya que cuando se pone en 1 es cuando los registros que mantienen los datos (shadow) actualizan los que uno lee. Si uno continua leyendo, bloquea la actualizacion, pero se sigue actualizando sobre los shadow.
- Con el bit BYPSHAD en 1: Como dice el bit, le hace un bypass a los registros shadow, por lo tanto se actualizaria directamente sobre los registros que leemos. El problema es que hasta que se actualicen todos seguramente va a existir problemas de coherencia, por lo que deberias leer 2 o 3 veces y corroborar que en las 3 veces el valor sea el mismo antes de tomarlo como valido.

En resumen estas leyendo mientras el RTC esta actualizando los valores, como es mas lento lo estas haciendo a la mitad del proceso.

En fin... como solucionamos esto?

Usar un cristal de 32768 Hz con la menor variacion (ppm) que podamos encontrar, el RTC se alimentaria de este LSE y el oscilador interno, deberias trimmearlo con ayuda del cristal asi lo ajustas correctamente, por ejemplo, si lo alimentas con 8Mhz al micro, y eso  es lo que entra al TIM serian 8 millones la cuenta del Timer en el segundo que te de el RTC. Si el oscilador esta con 8.5Mhz suponete, entonces con el Trimm que posee lo bajas a 8Mhz, de esa forma te aseguras que sean 8Mhz, conociendo ahora si correctamente el valor del oscilador interno no deberias tener GRAN error el contabilizar hasta 1 segundo ( los milisegundos )

Desconectado valeri23electro

  • PIC10
  • *
  • Mensajes: 3
Re:RTC para la hora y para medir tiempo
« Respuesta #2 en: 28 de Noviembre de 2017, 09:09:10 »
Gacias KILLERJC, me he confundido con el nombre del reloj, no utilizo el LSI si no el LSE, el reloj externo con 32,768KHZ, el reloj interno lo tengo a 48MHz.

Voy a intentar lo que comentas pero creo que va ha pasar lo mismo que me ocurre ahora:

Ahora mismo comparo los segundo del RTC en el bucle while, por lo tanto leo muchas mas veces de lo que se actualiza por eso no tendría problemas, el problema es que cuando lo paro, si he leido por ejemplo el segundo 18, no se en que parte del segundo 18 lo he leido, lo he leido al principio? al final? entonces cuando lo pongo en marcha de nuevo es posible que ese segundo cambie instantaneamente, ya despues va perfecto pero el segundo en iniciar desde parado, varia  :? :?

Desconectado valeri23electro

  • PIC10
  • *
  • Mensajes: 3
Re:RTC para la hora y para medir tiempo
« Respuesta #3 en: 28 de Noviembre de 2017, 10:16:18 »
Ya he solucionado el problema  :-/ :-/

Lo que he hecho es una rutina en el bucle principal while, creando una estructura identica a los datos del RTC, cuando entramos en la rutina, actualizo esta estructura con los datos del RTC, y cualquier parada marcha o reinicio lo hago sobre la estructura y no sobre el RTC, de esta manera es como si tuviera dos RTC y problema resuelto.

Ya no ocurre el error al detener e iniciar de nuevo.

un saludo


 

anything