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.
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 se han CS02
establecido en uno. Si CS01
el 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 TIMER0
para 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.
usuario_1818839
adam haile
adam haile
adam haile