Dmitry__ писал(а):Исходник часов - унылое гамно.
Да, вы правы, мало того что гамно, так ещё и унылое!
Поэтому то я сразу и не смог разобраться, где искать в куче исходных файлов, спасибо что указали место.
Dmitry__ писал(а):Компилить исходники умеем?
Умеем
Правда по специфике работы пишу в основном для AVR и на ассемблере (чтоб не зависить от прихотей С-компилятора), ибо при разработки моих систем реального времени на счету буквально каждый такт контроллера. На С приходилось не часто писать, всего несколько проектов, где не требуется жёстких пребований по быстродействию и объёму кода.
Не очень разобрался в описанном вами алгоритме, как и в самом исходнике. Здесь ведь delay используется для "// Draw flag minimizes display update activity" как они пишут, хотя я тоже не понимаю ЗАЧЕМ, т.к. при отладке поглядел что дисплей не обновляется только первые 17 сотых секунды, а затем всё равно каждую сотую...
Сначаля я попытался подогнать константу STOPWATCH_100HZ_TICK==(32768/100) в модуле stopwatch.h, но это грубая подстройка времени срабатывания таймера, и хотя стал секундомер точнее тикать, мне хотелось иметь возможность точно подстроить. В итоге завёл свою переменную (MyKorr), в которой считаются тики таймера и через определённое кол-во их происходит пропуск одного прерывания таймера. Так можно точно подогнать. В случае моих часов, например получилось опытным путём, что нужно вычитать 0,01 с каждые 3,2 секунды.
- Код: Выделить всё
void stopwatch_tick(void)
{
static u8 delay = 0;
static u16 MyKorr = 0;
// Default view (< 20 minutes): display and count MM:SS:hh
if (sStopwatch.viewStyle == DISPLAY_DEFAULT_VIEW)
{
// Add 1/100 sec
sStopwatch.time[7]++;
// Draw flag minimizes display update activity
//
// swt.drawFlag = 1: second L
// swt.drawFlag = 2: second H/L
// swt.drawFlag = 3: minutes L, second H/L
// swt.drawFlag = 4: minutes H/L, second H/L
// swt.drawFlag = 5: hours L, minutes H/L, second H/L
// swt.drawFlag = 6: hours H/L, minutes H/L, second H/L
// swt.drawFlag = 7: 1/10 sec, 1/100 sec
// swt.drawFlag = 8: 1/100 sec (every 17/100 sec to reduce display draw activity)
if (delay++ > 17)
{
sStopwatch.drawFlag = 8; //8
delay = 0;
}
if (MyKorr++ == 320) //Каждые 3.20 секунды вычитаем 0.01 сек. для коррекции секундомера
{
sStopwatch.time[7]--;
MyKorr = 0;
};
// Add 1/10 sec
Теперь первые 20 мин. секундомер идёт точно, но заметил, что как только переключается в режим > 20 мин., сразу перепрыгивает на одну секунду вперёд. Погляжу позже, откуда берётся эта лишняя секунда, надо её ампутировать.