使用 Atmega TCNT1

Using Atmega TCNT1

我正在尝试使用 arduino uno 向一些学生展示如何制作他们自己的 'auto tune' 但是我编写的代码没有输出任何信号。目标是以一种速率将值采样到数组中,并以较慢的速率从数组(FIFO)输出数据。我的理解是 TCNT1 在每个时钟滴答中递增,在我的例子中我使用的是 16 MHz,并且我可以根据 TCNT1 的值进行逻辑运算,我在这里使用 mod 函数来获取和存储单个 adc值,然后稍后将该值播放到 dac。 acdT dacT 代表我的时序逻辑。我构建了一个外部 DAC,只从 d0-d7 (PORTD) 读取 8 个(共 10 个)位值。为什么我没有看到信号?

    int i = 0;
    int j = 0;
    int adcT = 328; // 329 clock tics
    int dacT = 349; // 350 clock tics 
    int buff[15]; // 16 length buffer to store adc values

    void setup ()
    {

      PRR &= ~(1<<PRADC);       //ADC turned on
      ADMUX = 0x60;           //AVcc, left adjusted, ADC0 pin
      ADCSRA = 0xC0;//ADC Enabled, no auto trigger 
      DDRD=0xFF; // set portd to d0 thru d7 digital pins
      DDRC=0x00; // accept input from any analog input
      TCCR1B |= 1<<CS10; // sets the clock to the system clock ie no pre scaler
    }

    void loop ()
    { 

       if((TCNT1%acdT == 0) || TCNT1 == 0) // execute at 0 and mod329 clock tics
       {
        ADCSRA|=(1<<ADSC); // take one adc reading
        while(!(ADCSRA & (1<<ADIF))); // wait until the reading is complete
        ADCSRA|=(1<<ADIF); //reset adc for next command
        buff[i] = ADCH; // take the adc value into the array
        i++ // increment
       }

       if((TCNT1%dacT == 0)) %% TCNT1 ~= 0// execute at mod350 clock tics
       {
        PORTD = buff[j]; // send the adc reading to digital output
        j++;
       }

       if(TCNT1 == 5262 ) // LCM/3 of 329(16samples) and 350(15samples) 
       { 
        TCNT1 = 0;// reset ticker
        i = 0;
        j = 0;
       } 

       if(TCNT1 == 336)
       {
        PORTD = buff[15]; // play 16th adc sample  to clear array
       }
    }
TCCR1B |= 1<<CS10; // sets the clock to the system clock ie no pre scaler

这就是你的问题。您正试图找到运行速度比您的代码快的计数器的模数。使用定时器的输出捕获和其他功能触发中断并在适当的时间重置定时器,而不是试图徒手接住经过的子弹。