Цитата(aaarrr @ Jul 4 2011, 15:22)

Нет, он обязан считать до 47.
А вот и нет!
На практике оказалось не так!
Уже был уверен, после Ваших слов, что глюк с "убеганием" таймера вносит мой софт, но всё же когда пришёл с работы решил прогнать простенький цикл и сохранить значения счётчика TC0 на протяжении его цикла так:
Код
byte dbuf[4096];
for (int i = 0; i < sizeof(dbuf); i++)
{
dbuf[i] = (byte)AT_TC0->TC_CV;
}
то есть считав все его значения на протяжении относительно большого времени.
Напомню, конфигурация счётчика была такая:
Код
AT_TCB0->TCB_TC0.TC_CMR = AT_TC_CLKS_TIMER_DIV32_CLOCK | AT_TC_WAVESEL_UP_AUTO | AT_TC_WAVE | AT_TC_ACPA_SET |
AT_TC_ACPC_CLEAR; //| AT_TC_ASWTRG_CLEAR;
AT_TCB0->TCB_TC0.TC_RA = 24;
AT_TCB0->TCB_TC0.TC_RC = 48;
то есть upcounter со сбросом по RC compare, RC = 48(!).
И что же получил:
Код
00 00 00 01 01 01 01 02 02 02 02 03 03 03 03 04 04 04 04 05 05 05 05 06 06 06 06 06 07 07 07 08 08 08 08 08 09 09 09 09 0a 0a 0a 0a 0b 0b 0b 0b 0c 0c 0c 0c 0d 0d 0d 0d 0e 0e 0e 0e 0e 0f 0f 0f 10 10 10 10 10 11 11 11 11 12 12 12 12 13 13 13 13 14 14 14 14 14 15 15 15 16 16 16 16 16 17 17 17 17 18 18 18 18 19 19 19 19 1a 1a 1a 1a 1b 1b 1b 1b 1c 1c 1c 1c 1c 1d 1d 1d 1e 1e 1e 1e 1e 1f 1f 1f 1f 20 20 20 20 21 21 21 21 22 22 22 22 23 23 23 23 24 24 24 24 25 25 25 25 25 26 26 26 27 27 27 27 27 28 28 28 28 29 29 29 29 2a 2a 2a 2a 2b 2b 2b 2b 2c 2c 2c 2c 2d 2d 2d 2d 2d 2e 2e 2e 2f 2f 2f 2f 2f 00 00 00
то есть прекрасно видно, что значением 48 - 0x30 - и не пахнет!
Сброс идёт мгновенно и после 0х2f сразу получается 0!
Теперь понятно, почему была такая погрешность.
К слову, весьма необычная особенность аппаратуры, первый раз сталкиваюсь с таким поведением

Цитата
Так из картинок и текста все в общем-то понятно...
А Вы говорите, что всё понятно в мануале. Вот если бы была диаграмма с растактовкой переполнения\сброса\установки (что встречается довольно часто), тогда действительно многих вопросов бы не возникало, и не приходилось бы прибегать к практическим исследованиям, с чём Вы сами соглашаетесь

Цитата(aaarrr @ Jul 4 2011, 16:37)

Если прерывания гарантированно укладываются в 65мс, то не нужно.
Хм, да хоть прерывания будут длиться 650 миллисекунд - что изменится?
Код считывания таймера такой:
Код
dword sys_counter()
{
dword hw, lw;
do
{
hw = AT_TCB0->TCB_TC2.TC_CV;
lw = AT_TCB0->TCB_TC1.TC_CV;
}
while (hw != AT_TCB0->TCB_TC2.TC_CV);
return (hw << 16) | lw;
}
Переполнение 32 битного счётчика возможно за период равный 71 минуте.
Всё, что меньше этого периода, внести ошибку не в состоянии, по моему...