29.5: Interrupciones internas — Modo CTC
- Page ID
- 82313
Este ejemplo también implica cambiar un pin de salida arbitrario, aunque el pin OCNx
podría ser cuggybacked si se desea. En lugar de PWM, este ejemplo varía la frecuencia de una onda cuadrada usando el modo Clear Timer on Compare (CTC
). Este modo simplemente cuenta hasta el valor almacenado en el registro de coincidencia de comparación de salida (OCR2A
) y luego se restablece de nuevo a cero.
/* Timer/Counter Interrupt Example Uses CTC mode (Clear Timer on Compare) */ #define ARBPINMASK 0x01 #define COMPARE_MATCH 128 void setup() { DDRB |= ARBPINMASK; // enable output driver for OC2A for piggyback! DDRB |= 0x08; TCCR2A = (1<<COM2A0); // non PWM, OC2A pin toggle on compare match TCCR2A |= (1<<WGM21); // add CTC mode, Top=OCR2A TCCR2B = 0x07; // 1024x prescale OCR2A = COMPARE_MATCH; TIMSK2 = (1<<OCIE2A); // enable compare match interrupt } ISR(TIMER2_COMPA_vect) { PORTB ^= ARBPINMASK; } void loop() { }
Tenga en cuenta que se debe establecer un nuevo bit en el registro de máscara de interrupción del temporizador/contador, a saber OCIE2A
(Activación de interrupción de comparación de salida para la unidad 2A). El Registro de Comparación de Salida (OCR2A
) se establece con un valor fijo pero nuevamente, esto podría ser establecido por una variable. Un valor COMPARE_MATCH
de 128 produce una frecuencia de onda cuadrada de un poco más de 60 Hz. Al reducir a la mitad el valor a 64, aproximadamente se duplicará la frecuencia hasta aproximadamente 120 Hz.