Я пытаюсь немного строчить некоторые данные из 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;
}
Как я могу получить более быстрый и более точное время отклика?
Компилятор никогда не оптимизирует бесконечный цикл. – JimmyB
@ HannoBinder: Это не универсально. Но вы правы в отношении моего примера, поскольку оператор итерации является константой. Из стандарта C11: _ «Итерационный оператор, контролирующее выражение которого не является постоянным выражением, [...] может быть принята реализацией для завершения». _ Таким образом, бесконечный цикл можно оптимизировать в зависимости от оператора и содержимого итерации цикла. –