La mayoría de los microcontroladores AVR tienen tres pines dedicados para cada temporizador (por ejemplo, OC1A, OC1B y OC1C) que se pueden alternar automáticamente cuando el contador alcanza el llamado valor superior en los tres registros correspondientes (OCR1A, OCR1B y OCR1C). ).
No estoy seguro de cómo esos tres pines / registros dedicados operan en modo CTC para diferentes valores superiores independientes, y esto es lo que quiero lograr. Quiero cambiar OC1A, OC1B y OC1C (aunque "comparar salida", no a través de interrupciones o algo así) a diferentes intervalos (para ver los tres registros y pines dedicados).
Digamos que quiero programar el temporizador AVR para alternar los pines OC1A, OC1B y OC1C a diferentes intervalos (por ejemplo, 1 segundo, medio segundo, cuarto por segundo), pero no funciona como esperaba. Configuré el registro de coincidencia de comparación A y B y C con los tres valores diferentes, teniendo el mayor valor en A (también intenté tenerlo en C).
Solo OC1A se alterna en la frecuencia necesaria.
Para mí, parece que si solo consiguieran que OC1A supere el contador, sería posible que los tres pines funcionen con tres valores independientes diferentes. ¿Es esto correcto?
Aquí está el segmento que puse en mi Arduino Lenoardo's (basado en ATmega32U4 ) configuración. Dejé loop()
vacío.
// Initialize timer1
noInterrupts(); // Disable all interrupts
TCCR1A = 0;
TCCR1B = 0;
TCCR1C = 0;
TCNT1 = 0;
OCR1A = 62500; // Compare match register 16 MHz/256/1 Hz
OCR1B = 31250; // Compare match register 16 MHz/256/2 Hz
OCR1C = 15625; // compare match register 16 MHz/256/4 Hz
// Toggle OC1A, OC1B and OC1C => (on Lenoardo) PB5, PB6 and PB7 => digital 9, 10, 11
// TCCR1A = 0b01010100;
TCCR1A |= (1 << COM1C0) | (1 << COM1B0) | (1 << COM1A0);
// TCCR1B = 0b1100
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS12); // 256 prescaler
interrupts(); // Enable all interrupts