Я пытаюсь настроить Timer0 на ATTiny45, используя ядро arduino-tiny. TIM0_COMPA_vect отлично работает для предделителей 1,8 и 64, но 256 и 1024 приводят к тому, что ISR не срабатывает. Я запускаю чип на частоте 1 МГц.
Код установки выглядит следующим образом:
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();
}
предохранители:
low_fuses=0x62
high_fuses=0xD7
extended_fuses=0xFF
Любые мысли о том, почему это может быть так?
Обновление: предварительные делители /256 и /1024 не только не работают для COMPA или COMPB, но они также не работают для ISR переполнения. Я не совсем понимаю, поскольку, согласно таблице 11-6 в таблице данных ATTinyx5 , он поддерживает прескалеры /1, /8, /64, /256 и /1024 через регистр TCCR0B.
Я подозреваю, что код запуска Arduino устанавливает регистры таймера, особенно TCCR0B
на значение, отличное от нуля по умолчанию при запуске. Попробуйте следующий код, который удаляет ИЛИ:
TCCR0B = (_BV(CS02) | _BV(CS00)); //Prescale 1024
Глядя на таблицу данных / 256 и / 1024, оба установлены CS02
на единицу. Если CS01
в коде Arduino установлено значение 1, это будет включать внешний источник тактового сигнала, когда вы пытаетесь установить более высокие значения делителя.
Еще одна вещь, на которую стоит обратить внимание, это то, что Arduino обычно использует TIMER0
такие функции, как delay() и millis(). После того, как вы изменили настройку таймера, эти функции не будут работать, как обычно, поэтому вам, возможно, потребуется написать свои собственные процедуры синхронизации, если это необходимо.
пользователь_1818839
Адам Хейл
Адам Хейл
Адам Хейл