cómo mostrar la hora actual

3

Estoy usando el microcontrolador ATmega32-A, codificando en lenguaje C y compilando usando el compilador CodeVisionAVR.

Quiero mostrar la hora actual, lo he intentado con "time.h":

int main(void){
 time_t now; 
 time(&now); 
 printf("(percent)s", ctime(&now)); 
}

pero parece que este compilador y hardware no admiten time.h . Sé que todos los AVR no tienen un RTC / calendario en ellos.

¿Hay alguna otra manera de mostrar la hora actual? Soy muy nuevo en la programación de microcontroladores. ¿Puede alguien ayudarme con algunos ejemplos?

No quiero agregar hardware externo a la placa existente ahora. Estoy mostrando información en la PC (hiperterminal) utilizando la comunicación USART. ¿Hay alguna posibilidad de que pueda obtener la hora actual desde la PC? ¿Si puedes explicarlo un poco?

    
pregunta verendra

4 respuestas

7

No ATmega32 AVR tiene un RTC / calendario incorporado AFAICS.

Suponiendo que la referencia es a un RTC con respaldo de batería externa en la placa AVR, no hay ninguna fuente para la hora actual en una placa sin un chip RTC. En el mejor de los casos, el cargador de arranque que usa con el microcontrolador puede mantener los datos en muchos milisegundos transcurridos desde que se encendió la placa, dentro de la tolerancia de la fuente del reloj y permitiendo interrupciones ocasionales del temporizador.

Si tiene un chip RTC configurado en la placa, con la hora correcta configurada, podría haber una biblioteca RTC adecuada para ese chip. Una biblioteca de este tipo normalmente proporcionaría hour() , minute() , second() y otros métodos de recuperación de tiempo para que su código los use.

El encabezado genérico time.h C no se envía con, y por lo tanto, AVRdude o Arduino, aparentemente, no lo admite.

Hay un buen tutorial sobre el uso del tablero de ruptura de RTC de AdaFruit, aquí .

    
respondido por el Anindo Ghosh
1

Esto no es solo una cuestión de un RTC integrado o no. time.h es parte de la biblioteca estándar de C (por ejemplo, glibc), que no está completamente disponible en AVR (o en cualquier otra MCU). requeriría un sistema operativo adecuado para ser totalmente compatible. En el caso del manejo del tiempo, se necesita, por ejemplo, un manejo adecuado de la zona horaria. Y un archivo CSV que contiene datos para una sola zona horaria (por ejemplo, UTC) tiene un tamaño de aproximadamente 10k, y una biblioteca de C adecuada debería conocer todas las zonas horarias del mundo. Luego hablamos de archivo CSV de 1MB .

Entonces necesitas un RTC separado. Un buen candidato sería el DS1307, para el cual hay varios desgloses disponibles. Puede encontrar un buen tutorial de cómo interactuar con él aquí .

    
respondido por el hli
1

El ATmega32-A tiene tres contadores integrados, y puede configurar el TEMPORIZADOR1 para que funcione como un RTC (esto también es posible con los otros contadores). Hay varias cosas que debe hacer para configurar esto y garantizar un funcionamiento sin errores:

  1. Configure el TEMPORIZADOR1 para generar una interrupción cada segundo ajustando el prescaler del reloj y el valor de comparación de conteo. Esto requerirá que el TIMER1 esté en el modo "Borrar temporizador en comparación de coincidencias", y deberá habilitar la generación de interrupciones en una comparación de comparación.

  2. Agregue su Rutina de servicio de interrupción (ISR) a la tabla de vectores de interrupción, habilite las interrupciones globales y desactive la anidación de interrupciones.

  3. El ISR que atiende la interrupción que genera debe incrementar un espacio en la memoria que se reserva para realizar un seguimiento de los segundos. Dependiendo de la aplicación, es posible que desee hacer este espacio de 1 o más palabras de ancho. En su código C, asegúrese de que este espacio se declare volátil:

    volatile unsigned long sec_count;

  4. Finalmente, al inicio, debe inicializar el espacio en la memoria que reserva con la hora actual desde algún evento (normalmente la época de UNIX) en segundos. Ya tiene la configuración de USART, por lo que podría obtener el valor inicial de su computadora o, alternativamente, podría hacer que el usuario ingrese el valor inicial.

Una vez que tenga el valor inicial, su microcontrolador podrá realizar un seguimiento del tiempo de forma independiente. Escribiría funciones de utilidad, como day() o hour() , que convierten sus "segundos desde un evento determinado" en tiempo de reloj de pared.

El manual ayudará mucho con todo esto: enlace

    
respondido por el Matthew Mellott
0

time.h no está disponible en su caso.

Deberá leer la documentación del AVR sobre cómo usar el RTC, o usar un RTC externo si su dispositivo no lo tiene.

Usted sugiere utilizar la hora recibida desde la PC para configurar el reloj; Esto podría funcionar, pero sin RTC podría comenzar a desviarse y necesitará una forma de mantenerlo actualizado (por ejemplo, una interrupción cada segundo).

    
respondido por el Renan

Lea otras preguntas en las etiquetas