2015-02-28 1 views
2

Я пытаюсь немного строчить некоторые данные из atxmega128a3u и нужно переключить булавку так быстро, как 4us, но до сих пор я не получаю где-нибудь близко к тому, что ...XMEGA Таймер и микросекунды

Здесь я устанавливаю свой таймер для 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

Как я могу получить более быстрый и более точное время отклика?

ответ

3

Это ваш полный код? Если да, контроллер выполнит сброс после выполнения sei(); так как был достигнут конец программного кода. Задержка, которую вы видите на осциллографе, вероятно, является временем запуска и настройки кристалла.

Используйте

while(true); 

конструкция в конце основной. Я поставил там нестабильную инструкцию NOP, чтобы компилятор не смог оптимизировать пустой цикл while. Вы можете опустить его, если в цикле есть другой код.

+0

Компилятор никогда не оптимизирует бесконечный цикл. – JimmyB

+0

@ HannoBinder: Это не универсально. Но вы правы в отношении моего примера, поскольку оператор итерации является константой. Из стандарта C11: _ «Итерационный оператор, контролирующее выражение которого не является постоянным выражением, [...] может быть принята реализацией для завершения». _ Таким образом, бесконечный цикл можно оптимизировать в зависимости от оператора и содержимого итерации цикла. –

 Смежные вопросы

  • Нет связанных вопросов^_^