Использование Prescaler выше 64 на ATTiny45

Я пытаюсь настроить 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.

Одна вещь, которую нужно проверить, это то, что сторожевой таймер окончательно отключен, иначе более длительные задержки приведут к тайм-аутам сторожевого таймера! Работает ли короткая задержка (OCR0A=маленькая) при более высоких настройках предварительной шкалы?
Хм... вечером проверю на маленьком OCR0A. Но как отключить сторожевой таймер?
Без радости... попробовал установить OCR0A в 1 и wdt_disable(); выключить WDT. По-прежнему ничего при использовании /256 или /1024
Кстати... ISR переполнения не работает ни при использовании /256, ни /1024

Ответы (1)

Я подозреваю, что код запуска Arduino устанавливает регистры таймера, особенно TCCR0Bна значение, отличное от нуля по умолчанию при запуске. Попробуйте следующий код, который удаляет ИЛИ:

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

Глядя на таблицу данных / 256 и / 1024, оба установлены CS02на единицу. Если CS01в коде Arduino установлено значение 1, это будет включать внешний источник тактового сигнала, когда вы пытаетесь установить более высокие значения делителя.

Еще одна вещь, на которую стоит обратить внимание, это то, что Arduino обычно использует TIMER0такие функции, как delay() и millis(). После того, как вы изменили настройку таймера, эти функции не будут работать, как обычно, поэтому вам, возможно, потребуется написать свои собственные процедуры синхронизации, если это необходимо.

Правильно ты! Работал как шарм. Думаю, |= была просто привычкой. Привычка, которую я должен сломать.