Почему мой Atmega644 TIMER0 работает с половиной скорости ожидаемой тактовой частоты?

#c #timer #microcontroller #clock #atmel

#c #таймер #микроконтроллер #часы #atmel

Вопрос:

Я пытаюсь собрать драм-машину с использованием Atmega644. На драм-машине будет 16 светодиодов, которые будут показывать, на каком 16-м такте он находится. Пользователь должен иметь возможность устанавливать частоту вращения в минуту, и поэтому обновление индикатора будет отличаться для разных частот вращения в минуту.

У меня установлен кристалл 16 МГц на XTAL1 и XTAL2. Я использовал калькулятор предохранителей, чтобы записать биты предохранителей в «Генератор полного хода» и удалить внутреннее разделение часов на 8. Затем я настроил TIMER0 для выполнения этой задачи

 #define F_CPU 16000000UL  // 1MHz internal clock

unsigned int tempo = 250; // Default BPM of 120.
volatile unsigned int seq_timer = 0;


//set-up timer for 0.5 ms update
TIMSK0 = (1<<OCIE0A);
TCCR0A = (1 << WGM01) |(1<<WGM00);
TCCR0B = (0 << WGM02) | (0<< CS02) | (1 << CS01) | (1 << CS00); //divide by 64
OCR0A = 125;

ISR (TIMER0_COMPA_vect) {
if (seq_timer>0) {seq_timer--;}
}

//Update which 16th note we are at.
void step(void){
update_led();
step_number = step_number < 15 ? step_number  1 : 0;
}

//Shift the LED such that the LED corresponding to step_number is lit up.
void update_led(void) {
for (int j = 16; j>=0; j--)
{
    if ((((1 << step_number))>>j) amp; 0x01) {
        PORTD |= (1 << PD5); //Serial Input
    }
    else {
        PORTD amp;= ~(1 << PD5);
    }
    PORTD |= (1 << PD4); //Read clock 
    PORTD amp;= ~(1<< PD4);  
}
    PORTD |= (1 << PD3); //Shift clock 
    _delay_ms(40);
    PORTD amp;= ~(1 << PD3);
}


while (1) 
{   
  if ((seq_timer == 0)) {    
     seq_timer = tempo;
     step();
 } 
  

Функции шага вызывают функцию «update_led ()», которая загорает светодиод, соответствующий step_number. По моим расчетам это должно произойти (16e6 / (64*250*125)) = 8 обновления / сек. Но вместо этого он выполняет 4 обновления в секунду.

Я упускаю что-то важное?

Комментарии:

1. Почему вы просто не мм .. «скорректировали» числа на 2 и продолжили разработку?

2. Потому что я хочу понять, почему он делает то, что делает.

3. Но я думаю, что нашел ошибку, я установил WGM00 < 1. Который должен быть установлен в 0, чтобы иметь таймер CTC.