Сканирую вход микроконтролера (ATTiny2313) для измерения длительности импульса (переход от лог 1 к лог 0) 16 разрядным таймером (TIMER1).
Код на С (IAR WB)
while (PINB &= (1 << PB2)); TCCR1B = 0x00; // Stop timer
Дает ошибку в 5 МЦ (машинных циклов) Пример: Разница между измеряными числами кратна 5 06564 06249 06529 06724 06484 06519
асемблерная вставка: asm("nop"); asm("loop: sbic $16, 2"); asm("rjmp loop"); TCCR1B = 0x00; // Stop timer
Ошибка - 3 МЦ
По даташиту это вроде бы как предел точности, из-за того что команда "sbic" выполняется 3 МЦ при выполнении условия и 1 МЦ в противном случае.
Пример: Разница между измеряными числами кратна 3 00425 00425 00425 00434 00425 00428
Может кто подскажет как можно уменьшить ошибку до 1 МЦ?
Сообщение отредактировал MosVit - Nov 12 2008, 20:08
|