Usando Prescaler por encima de 64 en ATTiny45

4

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 dispare. 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 sobre por qué este podría ser el caso?

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

    
pregunta Adam Haile

1 respuesta

5

Sospecho que el código de inicio de Arduino está configurando los registros del temporizador, especialmente TCCR0B a 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 ambos tienen CS02 establecido en uno. Si CS01 se establece en uno por el código de Arduino que habilitará la fuente del reloj externo cuando intentes establecer los valores de divisor más altos.

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

    
respondido por el PeterJ

Lea otras preguntas en las etiquetas