fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

¿Como cuento 1 segundo con un cristal de 32 KHz?

14 Respuestas
3 Usuarios
0 Reactions
3,721 Visitas
morgoz
Respuestas: 208
Topic starter
(@morgoz)
Estimable Member
Registrado: hace 18 años

Hola!!

Quisiera recrear un temporizador/contador que se incrementase o decrementase en función del tiempo real, es decir, por ejemplo que a cada segundo se incremente en 1.

Al parecer con un cristal de 32.768 KHz se puede hacer ya que esta frecuencia equivale a 2 elevado a 15 * 1 Hz, es decir a 32768 incrementos en 1 segundo suponiendo incrementos en 1 ciclo de reloj.

Por otro lado, el temporizador/contador que voy a usar es el de un Atmega16, con el que puedo usar tanto uno de 8 bits (Máximo de 255) como de 16 bits (máximo de 65535).

Mi pregunta es, ¿qué valor se supone que tiene que tener el máximo del contador (suponiendo el cristal de 32.768) para que, una vez sea alcanzado equivalga a 1 segundo de tiempo real? ¿Debo de usar por lo tanto el contador de 8 bits o el de 16?¿Me valdría usar el contador de 16 bits poniendo como tope los 32768?

Gracias por vuestra ayuda!!!

Responder
13 respuestas
joviwap
Respuestas: 301
(@joviwap)
Ardero
Registrado: hace 20 años

Hola MorgoZ,

Desconozco la arquitectura exacta del Atmega16, pero supongo que para haver la cuenta de un segundo estas utilizando un módulo que te permite colocar un reloj externo y contar los pulsos, me equivoco?

Partiendo de esa base lo más sencillo seria utilizar un contador de 16bits ya que la cuenta que quieres realizar (32768) es mayor a la posible con 8 bits (255). Mi recomendación es la de configurar el módulo para que haga saltar una interrupción cuando se devorde el contador, y cada vez que esto suceda reiniciar el contador con el valor 2^16 - (Cuenta deseada) - (Número de instruccioesn en ensambaldor desde la interrupción hasta la actualizacición del contador).

Si tú micro esta funcionando con un reloj mucho más rápido (digamos 4Mhz) puedes despreciar el último valor quedante: 65535 - 32768 - 0 = 32727.

Si te das cuenta un contador de 16 bits tardaría exactamente 2 segundos, así que si necesita contar solo minutos es aún mas sencillo si solo cuentas los desvordamientos del contador.

Un saludo.

Responder
morgoz
Respuestas: 208
Topic starter
(@morgoz)
Estimable Member
Registrado: hace 18 años

Hola joviwap,

muchas gracias por la respuesta.

El reloj que tenía pensado utilizar tanto para el micro como para el contador es el de 32KHz, ya que necesito reducir los consumos de energía al máximo.
Lo que realmente necesito es contar minutos, más que segundos, asi que la idea de utilizar los 16 bits para contar de 2 en 2 segundos me parece muy buena, gracias.
Lo que desconozco es el tiempo que tardará el micro en reiniciar el contador con el valor que le meta, ya que tiene varios modos de contador; lo miraré en las especificaciones e intentaré ajustarlo lo mejor que pueda.

Muchas gracias por tu respuesta, me ha sido de gran ayuda.

Saludos!

Responder
joviwap
Respuestas: 301
(@joviwap)
Ardero
Registrado: hace 20 años

Lo que ocurrirá cuando el contador llegue al máximo es que desvordará y empezará a contar otra vez desde 0, si tienes habilitadas las interrupciones te saltará una interrupción cada 2 segundos y te olvidas del contador.

Responder
beamspot
Respuestas: 1132
(@beamspot)
Noble Member
Registrado: hace 17 años

Hola:

Pues no. Creo que estais equivocados. O al menos, yo lo haría de la siguiente forma: el timer 2 del ATmega16 está diseñado para trabajar de manera asíncrona, con su propio oscilador para conectar el cristal de 32KHz. Este se tiene que conectar entre los pines 28 y 29 del DIP 40 (TOSC1, TOSC2) o pines 25/26 del TQFP/DFN.

Entonces, tienes varias opciones: pones el prescaler para que te divida por 1024, por ejemplo, y entonces configuras el timer para que se autonicialice en modo CTC cada 32 cuentas, y que entonces se te genere la interrupción de compare match. En dicha interrupción, cuentas los segundos directamente, ya que se generará cada 32767/(1024*32) períodos, o sea, cada segundo. Y ya está.

Evidentemente, hay alguna opción más, como poner el prescaler a 256 y contar 128 cuentas para el CTC.

Por supuesto, la rutina que te cuenta los segundos, se puede usar (tal y como hacía yo) para llevar un reloj que te cuente minutos, segundos, horas, días, etc. Mientras tanto, puedes tener la CPU en sleep para ahorrar consumo.

Otra cosa que hacía yo, era trabajar con el oscilador interno a 8MHz, calibrarlo cada cierto tiempo (Atmel tiene una nota de aplicación con el código completo en C para realizar dicha acción) respecto del cristal de 32KHz, y poner el micro a dormir el máximo de tiempo posible. Según el modo de ahorro, puedes reducir mucho el consumo, por debajo del mA, con un M16.

Responder
Página 1 / 3
Compartir: