Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Timer XMega定时器和微秒_Timer_Interrupt_Avr_Atmega - Fatal编程技术网

Timer XMega定时器和微秒

Timer XMega定时器和微秒,timer,interrupt,avr,atmega,Timer,Interrupt,Avr,Atmega,我正试图从atxmega128a3u中取出一些数据,需要以4us的速度切换pin,但到目前为止,我还没有接近这一点 在这里,我设置了我的计时器为88,但我周围的146us int main(void) { //CRYSTAL SETUP OSC_XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_16KCLK_gc; // 16Mhz Crystal OSC_CTRL |= OSC_X

我正试图从atxmega128a3u中取出一些数据,需要以4us的速度切换pin,但到目前为止,我还没有接近这一点

在这里,我设置了我的计时器为88,但我周围的146us

    int main(void)
    {

    //CRYSTAL SETUP
        OSC_XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_16KCLK_gc; // 16Mhz Crystal
        OSC_CTRL |= OSC_XOSCEN_bm;
        while(!(OSC_STATUS & OSC_XOSCRDY_bm)); //Wait for crystal to stabilize.
        CCP = CCP_IOREG_gc;
        CLK_CTRL = CLK_SCLKSEL_XOSC_gc;
        //END CRYSTAL SETUP

        cli();
        TCC0.PERL = 0x80; //88us
        TCC0.PERH = 0x05;
        TCC0.CTRLA = 0x01;
        TCC0.INTCTRLA = 0x02;
        PMIC.CTRL = 0x02;
        sei();
    }
ISR(TCC0_OVF_vect) {
   PORTF.OUTTGL = PIN3_bm;
}


如何获得更快、更准确的响应时间?

这是您的完整代码吗?如果是,控制器将在执行sei()后复位;由于程序代码已到达末尾。您在示波器上看到的延迟可能是启动和晶体设置时间

使用

while(true); 

在主管道末端施工。我将volatile NOP指令放在那里,以防止编译器优化空while循环。如果循环中有任何其他代码,您可以忽略它。

编译器永远不会优化掉一个无止境的循环。@HannoBinder:这不是普遍正确的。但是关于我的例子,你是对的,因为迭代语句是一个常量。根据C11标准:“其控制表达式不是常量表达式的迭代语句,[…]可能会被实现假定为终止。”因此,可以根据迭代语句和循环的内容优化出无止境的循环。可以使用USART或SPI模块实现这一点。USART有一个2字节的输入缓冲区。如果需要输出更多数据,可以使用DMA模块。我在另一个项目中使用它作为位信号输出,您可以得到启发:。