Timer0 en Atmega16A
# Timer0 en Atmega16A

El Timer0 es un módulo para la función de registro de conteo y temporización de un microcontrolador. En el Atmega16A creado por Atmel, que pertenece a la serie megaAVR y consta de varias funciones, este timer es una de ellas.

## Timer0 en Atmega16A

El Timer0 del ATmega16A es de 8 bits, por lo que puede contar de 0 a 255 pulsos de reloj. Puede programarse en cuatro diferentes formas de operación:

* Modo Normal
* Modo CTC (Clear on Compare Match)
* Fast PWM (Pulse Width Modulation)
* Phase Correct PWM Mode

Para utilizar el Timer0, es importante cargarle un valor a todos los siguientes registros.

### TCCR0

Para utilizar el tipo deseado, se debe de cargar el valor correcto en el registro TCCR0 en los bits WGM01 y WGM00

| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| - | - | - | - | - | - | - | - | - |
| | FOC0 | WGM00 | COM01 | COM00 | WGM01 | CS02 | CS01 | CS00 |
| Valor Inicial | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Modo | WGM01 | WGM00 | Modo de operación |
| 0 | 0 | 0 | Normal |
| 1 | 0 | 1 | PWM, "Phase Correct" |
| 2 | 1 | 0 | CTC |
| 3 | 1 | 1 | "Fast PWM" |

Una vez elegido el modo de operación, se debe seleccionar el prescaler con el que se desea trabajar. Para seleccionarlo hay que darle valor a los registros CS00, CS01, y CS02. A los bits FOC0, COM00 y COM01 se les carga un 0.

| CS02 | CS01 | CS00 | Descripción |
| - | - | - | - |
| 0 | 0 | 0 | "No clock source" |
| 0 | 0 | 1 | $clk_{I/O}$ ("No prescaling") |
| 0 | 1 | 0 | $clk_{I/O}/8$ ("From prescaler") |
| 0 | 1 | 1 | $clk_{I/O}/64$ ("From prescaler") |
| 1 | 0 | 0 | $clk_{I/O}/256$ ("From prescaler") |
| 1 | 0 | 1 | $clk_{I/O}/1024$ ("From prescaler") |
| 1 | 1 | 0 | "External clock source on T0 pin. Clock on falling edge" |
| 1 | 1 | 1 | "External clock source on T0 pin. Clock on rising edge" |

Cuando se quiere que el timer se encuentre apagado deben ponerse los bits en 000. En 001 el timer comenzará a incrementarse por cada ciclo de reloj. Cualquier otro valor activaría el prescaler.

### Registro TCNT0

Este registro de ocho bits se incrementará cada vez que ocurra un nuevo pulso de reloj.

### Registro TIMSK

| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| - | - | - | - | - | - | - | - | - |
| | OCIE2 | TOIE2 | TICIE1 | OCIE1A | OCIE1B | TOIE1 | OCIE0 | TOIE0 |
| Valor Inicial | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |

Este registro indica si se requiere que el Timer0 genere una interrupción cada vez que ocurra un desbordamiento (overflow al alcanzar el TCNT un valor de 255), o que genere una interrupción toda vez que el valor del TCNT0 sea igual al valor del OCR0. Del bit siete al bit dos el valor tiene que ser 0. Si se requiere que se habilite la interrupción por comparación se deberá cargar un 1 al bit OCIE0 y si se desea que se habilite la interrupción por overflow hay que cargarle un 1 al bit TOIE0.

### Registro OCR0

Este registro se utiliza para indicar hasta donde tiene que llegar el TCNT0 para habilitar la interrupción por comparación.

### Registro TIFR

Este registro es el que indica cuando una interrupción esta activa. No es necesario cambiar los valores de este registro, ya que cambian sus valores por automático.

| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| - | - | - | - | - | - | - | - | - |
| | OCF2 | TOV2 | ICF1 | OCF1A | OCF1B | TOV1 | OCF0 | TOV0 |
| Valor Inicial | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |

Los últimos dos bits son los que indican si están activas las interrupciones. Cuando el bit OCF0 está en 0 indica que se activó una interrupción por comparación y cuando el bit TOV0 está en 0 indica que se activó una interrupción por overflow.

