Temporizador en ATmega2560

0
//TIMER4 initialize - prescale:256
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Hz
// actual value:  1.000Hz (0.0%)
void timer4_init(void)
{
     TCCR4B = 0x00; //stop
     TCNT4H = 0x1F; //Counter higher 8 bit value
     TCNT4L = 0x01; //Counter lower 8 bit value
     OCR4AH = 0x00; //Output Compair Register (OCR)- Not used
     OCR4AL = 0x00; //Output Compair Register (OCR)- Not used
     OCR4BH = 0x00; //Output Compair Register (OCR)- Not used
     OCR4BL = 0x00; //Output Compair Register (OCR)- Not used
     OCR4CH = 0x00; //Output Compair Register (OCR)- Not used
     OCR4CL = 0x00; //Output Compair Register (OCR)- Not used
     ICR4H  = 0x00; //Input Capture Register (ICR)- Not used
     ICR4L  = 0x00; //Input Capture Register (ICR)- Not used
     TCCR4A = 0x00; 
     TCCR4C = 0x00;
     TCCR4B = 0x04; //start Timer
}

Estoy tratando de averiguar cómo usar el temporizador 4 en ATmega2560. Este es el código que he encontrado para un temporizador de 1 seg. Una interrupción de temporizador tiene lugar después de cada 1 seg. ¿Cómo puedo usar este código para lograr un temporizador de 0.1 segundos (es decir, programar el ISR para cada 0.1s)?

    
pregunta user87877

1 respuesta

3

Usar un temporizador es más fácil de lo que parece. Funciona así:

Tienes un temporizador que se alimenta con un reloj. El reloj puede ser el reloj del sistema, una fuente externa (no disponible en todos los AVR) o el reloj del sistema dividido por un escalador previo. Puede activar un ISR en un desbordamiento del temporizador. El temporizador de registro puede ser de 8 o 16 bits de ancho. (No estoy seguro de si existe un registro de temporizador de 32 bits de ancho)

Ejemplo:

El uso de un temporizador de 8 bits con un reloj de 1 MHz le dará un desbordamiento cada 255us , lo que significa que su ISR se llamará cada 255us:

También hay una opción para ajustar el umbral de activación con los registros para que pueda activar valores diferentes al valor de desbordamiento, como 127us . También hay otra forma de lograrlo: inicialice el valor del contador del temporizador a un valor distinto de cero y espere a que ocurra el desbordamiento. Si se produjo el desbordamiento, restablece el temporizador a su posición inicial nuevamente.

Nota corta: si tu ISR tarda más que tu intervalo ISR, ¡perderás algunos ISR!

Si va a utilizar temporizadores, siempre debe tener en cuenta lo siguiente:

  • ¿Qué frecuencia necesito?
  • ¿Qué ciclo de trabajo quiero? (para aplicaciones PWM)
  • ¿Qué reloj del sistema estoy usando?
  • ¿Deseo que se active un ISR o que active un pin de salida?

¡Si puedes responder a todas estas preguntas, entonces puedes avanzar!

La hoja de datos proporciona todas las respuestas sobre cómo configurar el temporizador:

Desea utilizar el temporizador 4 en el ATmega2560 que tiene 16 bits de ancho (fuente: página 158 de la hoja de datos completa del ATmega2560).

Luego, debe calcular un escalador previo apropiado para su reloj y calcular un valor de umbral de desbordamiento del temporizador de ajuste ...

Sé que la hoja de datos a veces puede ser engañosa a primera vista, pero tómate un poco de tiempo y lo entenderás.

    
respondido por el d3L

Lea otras preguntas en las etiquetas