Гыыыы, ну придурки
Компилятор, их константу "STOPWATCH_100HZ_TICK" сделал не как они думают (32768 / 100 = 328), a = 327

И получилось: 32700/32768 *60сек * 20 мин = 1197,5 сек, что на 2.5 сек. короче настоящих 20 минут.
Лезем в "stopwatch.h" и корректируем строку:
Код:
#define STOPWATCH_100HZ_TICK 328 //!!! (32768 / 100)
И много вопросов к:
Код:
// Timer interrupts occur every 32768/100 = 328 ACLK
// --> stopwatch runs too slow (1 sec nominal != 100 interupts * 328 ACLK = 32800 ACLK =
// 1.00098 sec)
// --> ideally correct timer value every 10 ticks by (32768 - 32800)/10 = 3.2
// --> correct timer value every 10Hz by 3,
// --> correct timer value every 1Hz correct by 5
value += STOPWATCH_100HZ_TICK;
if (sStopwatch.swtIs1Hz)
{
value -= 5;
sStopwatch.swtIs1Hz = 0;
sStopwatch.swtIs10Hz = 0;
}
else if (sStopwatch.swtIs10Hz)
{
value -= 3;
sStopwatch.swtIs10Hz = 0;
}
Почему это при "(32768 - 32800)/10 = 3.2", они:
Код:
// --> correct timer value every 10Hz by 3,
// --> correct timer value every 1Hz correct by 5
Похоже для них две десятых равны одной пятой для вычитания
Правда, ошибка тут минимальна: 32800 -30 -5 = 32765/32768 *60 * 20 = 1199,89 сек в 20-ти минутах.
Но я бы подправил:
Это:
Код:
if (sStopwatch.swtIs1Hz)
{
value -= 5;
sStopwatch.swtIs1Hz = 0;
sStopwatch.swtIs10Hz = 0;
}
На это:
Код:
if (sStopwatch.swtIs1Hz)
{
value -= 2; //!!! 5;
sStopwatch.swtIs1Hz = 0;
sStopwatch.swtIs10Hz = 0;
}
Да, это в "Sports Watch\logic\stopwatch.c"
Добавлено спустя 14 минут 8 секунд:Проверил, гуд, с тебя пиво
Добавлено спустя 46 минут 29 секунд:Опс, остался глюк при переходе секундомера >20 мин. режима, прибавляет лишнюю секунду.
Завтра допилю...
Да, чтоб на экране часов не появлялся секундомер (не в режиме секундомера) при переходе режима >20 мин., надо в "Sports Watch\logic\stopwatch.c" в функции "void stopwatch_tick(void)" найти и закомментировать (2 шт.):
Код:
display_stopwatch(LINE2, DISPLAY_LINE_UPDATE_FULL);