Uso de Prescaler por encima de 64 en ATTiny45

Estoy tratando de configurar Timer0 en un ATTiny45 usando el núcleo arduino-tiny. TIM0_COMPA_vect funciona bien para los preescaladores 1, 8 y 64, pero 256 y 1024 hacen que el ISR no se active. Estoy ejecutando el chip a 1MHz.

El código de configuración es el siguiente:

void setup()
{
  ADCSRA &= ~(1<<ADEN); //Disable ADC
  ACSR = (1<<ACD); //Disable the analog comparator
  DIDR0 = 0x3F; //Disable digital input buffers on all ADC0-ADC5 pins.

  DDRB |= _BV(PINB0); // Set Pin 5 (PB0) as output;
  PORTB &= ~_BV(PINB0); //Set it to low, just to be safe

  //cli();
  TCCR0A |= _BV(WGM01); //CTC Mode
  TCCR0B |= (_BV(CS02) | _BV(CS00)); //Prescale 1024
  TIMSK  |= _BV(OCIE0A); //enable CTC interrupt
  OCR0A = 243; 

  sei();
}

los fusibles son:

low_fuses=0x62
high_fuses=0xD7
extended_fuses=0xFF

¿Alguna idea de por qué podría ser así?

Actualización: los preescaladores /256 y /1024 no solo no funcionan para COMPA o COMPB, sino que tampoco funcionan para el ISR de desbordamiento. Realmente no lo entiendo, ya que según la tabla 11-6 en la hoja de datos de ATTinyx5 , admite preescaladores /1, /8, /64, /256 y /1024 a través del registro TCCR0B.

¡Una cosa que debe verificar es que el perro guardián esté definitivamente apagado, o las demoras más largas resultarán en tiempos de espera del perro guardián! ¿Funciona un retraso corto (OCR0A=pequeño) con configuraciones de preescala más altas?
Hmmm... comprobaré esta noche en el pequeño OCR0A. Pero, ¿cómo se apaga el perro guardián?
No hay alegría ... intenté configurar OCR0A en 1 y wdt_disable (); para apagar el WDT. Todavía nada al usar /256 o /1024
Por cierto... el ISR de desbordamiento tampoco funciona cuando se usa /256 o /1024

Respuestas (1)

Sospecho que el código de inicio de Arduino está configurando los registros del temporizador, especialmente TCCR0Ba un valor distinto del valor predeterminado de inicio de cero. Pruebe el siguiente código que elimina el OR:

TCCR0B = (_BV(CS02) | _BV(CS00)); //Prescale 1024

Mirando la hoja de datos, / 256 y / 1024 se han CS02establecido en uno. Si CS01el código Arduino lo establece en uno, habilitará la fuente de reloj externa cuando intente establecer los valores de divisor más altos.

Lo único que vale la pena señalar es que Arduino tiende a usarse TIMER0para funciones como delay() y millis(). Una vez que haya cambiado la configuración del temporizador, esas funciones no funcionarán como de costumbre, por lo que es posible que deba escribir sus propias rutinas de tiempo si es necesario.

¡Correcto eres! Trabajado como un encanto. Supongo que el |= era solo un hábito. Un hábito que debería romper.