28.2: Modo Normal
- Page ID
- 81928
El modo normal (WGM 22:0
son claros) es el modo de operación más simple. El TC simplemente cuenta hasta que se desborda y se vuelve a cero. En caso de desbordamiento, el indicador TOV2
(Timer Overflow) se establece en el registro de indicadores TIFR2
. Más precisamente, este bit se establecerá en el mismo ciclo de reloj que cuando el registro temporizador/contador TCNT2
se convierte en cero. No hay restricciones de acceso en TCNT2
. Su código podrá sobrescribir el contenido de este registro en cualquier momento con el fin de alterar el comportamiento de conteo.
A continuación se muestra un ejemplo de código corto. El programa usa TC2 para crear un retardo de tiempo similar a la función delay ()
. Este retardo se utiliza entonces para parpadear un LED conectado a PORTB.0
.
/* Simple LED blinker using TC2 to create a time delay Active high LED connected to PORTB.0 */ #define LEDMASK 0x01 #define COUNTOFFSET 15 void setup() { DDRB |= LEDMASK; TCCR2A=0; // normal mode TCCR2B=0x07; // 1024x prescale } void mydelay(int x) { while(x) { TCNT2=COUNTOFFSET; //count up from here to 255 then overflow TIFR2=1<<TOV2; // clear flag, bit is set on overflow while( !(TIFR2&(1<<TOV2)) ); // wait for overflow bit x--; } } void loop() { PORTB |= LEDMASK; mydelay(120); PORTB &= ~LEDMASK; mydelay(30); }
La función setup ()
establece la dirección para que salga el pin del controlador LED, coloca TC2 en modo normal y establece el preescalador de reloj en 1024. Esto significa que cada conteo ocurrirá a una velocidad apenas más lenta que 16 kHz dado el reloj de 16 MHz del Uno. La función mydelay ()
inicializa el registro principal del contador a un valor predefinido (COUNTOFFSET
). Contará a partir de ahí hasta 255 tras lo cual se desbordará y establecerá el indicador TOV2
. Nos aseguramos de que este bit esté claro antes de continuar usando el comando aparentemente hacia atrás TIFR2=1<<TOV2;
Primero aparece que este comando debería establecer el bit flag pero de hecho lo borra (como se verifica en la documentación de Atmel). En este punto estamos ocupados-esperar en este bit esperando que se establezca. En este ejemplo tardará 241 recuentos en desbordarse o cerca de 15 milisegundos. Este proceso se itera entonces x
veces para lograr un retardo más largo y variable. Tenga en cuenta que los valores más grandes de COUNTOFFSET
producirán tiempos de parpadeo más cortos.