XMega定时器和微秒

时间:2015-02-28 21:54:18

标签: timer interrupt avr atmega

我试图从atxmega128a3u中剔除一些数据并需要将引脚切换为4us,但到目前为止我还没有接近那个......

在这里,我将我的计时器设置为88us,但是我的计时器大约为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;
}

enter image description here

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

1 个答案:

答案 0 :(得分:3)

那是你的完整代码吗?如果是,控制器将在执行sei()后重置;自从程序代码结束以来。您在示波器上看到的延迟可能是启动和晶振设置时间。

使用

while(true); 

在主要结尾处构建。 我将易失性NOP指令放在那里,以防止编译器优化空的wh​​ile循环。如果循环中有任何其他代码,则可以省略它。