roboforum.ru

Технический форум по робототехнике.

eZ430-Chronos

Ответить

Re: eZ430-Chronos

Madf » 12 июн 2012, 00:43

Главное - это чтобы не нарушалась возможность беспроводного обновления и секундомер не сбивал ход хода (впрочем на часы вообще понятное дело ничто не должно влиять), а остальное - полет фантазии. Просто если выкинуть/не использовать беспроводность, то это уже будут ничем не приметные часы на фоне конкурентов по функционалу.

Re: eZ430-Chronos

Dmitry__ » 12 июн 2012, 01:53

Ну, это можно было даже не озвучивать.
Я уже себе с трудом представляю как обновлять прошивку не через радиоканал. Когда брикаю часы, со слезами иду за отверткой. :cry:
Допил точности часов и секундомера для меня тож на первом месте. Прерывания хронометра уже докурил.
Для меня белое пятно в часах только монстроидальная SimpliciTI

Re: eZ430-Chronos

Madf » 21 июл 2012, 23:36

Всё, запарился я с точностью ходьбы в часах относительно секундомера (на работе его часто использую), после длительных мучений по пересборки проекта под 868МГц (от Sonny) - удалось её собрать и залил в часы. Это просто не передаваемый визг от удовольствия, что человек поправил там: секундомер, будильник, отображение даты в днях недели, расширился функционал в разделе "высота над уровнем моря" (можно менять 0 точку и ещё хренова туча функционала) + вниз теперь можно выводить часы, что очень удобно, если сверху выводятся какие-то показания, подсветка по другому работает (более экономно). Вот бы ещё найти более подробное описание возможностей новых, а то куча всего...

зы: IAR - ппц какой-то, ещё более глючной и непонятной IDE не встречал, раньше думал, что Идея и Эклипс капризные, но это чудо...мата не хватает.

Добавлено спустя 50 минут 17 секунд:
На странице проекта есть описание (перевод). Единственная проблема (для меня), не хватает опции отключения короткого сигнала каждый час.

Re: eZ430-Chronos

Dmitry__ » 22 июл 2012, 02:42

Чего-то я больших изменений в исходниках, в сторону повышения точности часов, не увидел.
Глюкавый "logic/stopwatch.c" вообще без изменений :pardon:

Re: eZ430-Chronos

Madf » 22 июл 2012, 10:09

Понятно, я в коде не рылся, видимо разговор об каких-то исправлениях не затронуло данную проблему.
На самом деле есть глючек ещё, когда кнопками на часах пытаешься выставляешь время (основное), то можно так натыкаться, что потом выйти нельзя. Часы перестают реагировать на управляющие кнопки. Надо какое-то время подождать, не трогать их и тогда отпускает.
Дмитрий, может найдется время и желание допилить эту глючность с таймером?
А насчет пика каждый час, надо было его делать не на общее время, а при включении вывода часов вниз (на доп экран)...меня жена чуть не убила, когда это чудо техники начало под ухом, на полке, ночью пикать (два контрольных писка). :)

Re: eZ430-Chronos

Madf » 22 июл 2012, 16:42

Капельку допелил относительно писка каждый час как хотел.

Re: eZ430-Chronos

Dmitry__ » 22 июл 2012, 17:19

Вот тебя бесит разная скорость секундомера и часов :)
Ща допилю часы до одного генератора секундных импульсов.

Re: eZ430-Chronos

Madf » 22 июл 2012, 19:47

Будет здорово. Если всё будет "ок", то могу попробовать собрать на все частоты прошивки и выложить. :good: Это в Sonny версии?
Пробовал в новой версии менять настройки давления, жаль - дает только высоту менять. :pardon:

Re: eZ430-Chronos

Dmitry__ » 23 июл 2012, 03:35

Гыыыы, ну придурки :shock:
Компилятор, их константу "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


Похоже для них две десятых равны одной пятой для вычитания :lol:
Правда, ошибка тут минимальна: 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 секунд:
Проверил, гуд, с тебя пиво :crazy:

Добавлено спустя 46 минут 29 секунд:
Опс, остался глюк при переходе секундомера >20 мин. режима, прибавляет лишнюю секунду.
Завтра допилю...
Да, чтоб на экране часов не появлялся секундомер (не в режиме секундомера) при переходе режима >20 мин., надо в "Sports Watch\logic\stopwatch.c" в функции "void stopwatch_tick(void)" найти и закомментировать (2 шт.):
Код: Выделить всёРазвернуть
display_stopwatch(LINE2, DISPLAY_LINE_UPDATE_FULL);

Re: eZ430-Chronos

Madf » 23 июл 2012, 10:15

Спасибо! Вечером постараюсь внести изменения.
На счет ">20 мин", отказываться от этой возможности не хотелось, если её убирать, тогда просто секундомер нужно ограничивать в максимально отсчитываемом времени (точность же теряется, впрочем для больших временных измерений она не нужна).

зы: эм...пиво? - не вопрос! Вопрос в разных городах! :(

Re: eZ430-Chronos

Змей-Горыныч » 23 июл 2012, 12:26

Я выше в теме писал, как я сделал точную настройку секундомера. А при переключении его в режим >20 мин. действительно добавлялась лишняя секунда - надо её не добавлять.

Re: eZ430-Chronos

Madf » 23 июл 2012, 12:33

Нужно работу вести над одним проектом/контентом, а то сейчас запутаемся.
Змей-Горыныч, если не сложно, то повтори пожалуйста свои изменения на этой версии сборки (Sonny).

Re: eZ430-Chronos

Змей-Горыныч » 23 июл 2012, 12:44

В модуле stopwatch.c поправил функцию stopwatch_tick вот так:

Код: Выделить всёРазвернуть
void stopwatch_tick(void)
{
    static u8 delay = 0;
    static u16 MyKorr = 0;
    static u8 My_First_Add_Sec = 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
        if (sStopwatch.time[7] == 0x3A)
        {
            sStopwatch.time[7] = '0';
            sStopwatch.time[6]++;
            My_First_Add_Sec = 0;

            // 1/10Hz trigger
            sStopwatch.swtIs10Hz = 1;

            // Update draw flag
            sStopwatch.drawFlag = 7;
        }
    }
    else                        // Alternative view (20 minutes .. 20 hours): display and count
                                // HH:MM:SS
    {
        // Just add 1 second
      if (My_First_Add_Sec != 0)
      {
        sStopwatch.time[6] = 0x3A;
      }
      My_First_Add_Sec = 1;
    }

    // Second overflow?
    if (sStopwatch.time[6] == 0x3A)
    {
        // Reset draw flag
        sStopwatch.drawFlag = 1;

        // 1Hz trigger
        sStopwatch.swtIs1Hz = 1;

        // Add data
        sStopwatch.time[6] = '0';
        sStopwatch.time[5]++;                      // second  L (0 - 9)
        if (sStopwatch.time[5] == 0x3A)
        {
            sStopwatch.drawFlag++;                 // 2
            sStopwatch.time[5] = '0';
            sStopwatch.time[4]++;                  // second  H (0 - 5)
            if (sStopwatch.time[4] == '6')
            {
                sStopwatch.drawFlag++;             // 3
                sStopwatch.time[4] = '0';
                sStopwatch.time[3]++;              // minutes L (0 - 9)
                if (sStopwatch.time[3] == 0x3A)
                {
                    sStopwatch.drawFlag++;         // 4
                    sStopwatch.time[3] = '0';
                    sStopwatch.time[2]++;          // minutes H (0 - 5)
                    if (sStopwatch.time[2] == '2')
                    {
                        // SWT display changes from MM:SS:hh to HH:MM:SS when reaching 20 minutes
                        sStopwatch.viewStyle = DISPLAY_ALTERNATIVE_VIEW;
                        display_stopwatch(LINE2, DISPLAY_LINE_UPDATE_FULL);

                    }
                    else if (sStopwatch.time[2] == '6')
                    {
                        sStopwatch.drawFlag++;     // 5
                        sStopwatch.time[2] = '0';
                        sStopwatch.time[1]++;      // hours L (0-9)

                        if (sStopwatch.time[1] == 0x3A)
                        {
                            sStopwatch.drawFlag++; // 6
                            sStopwatch.time[1] = '0';
                            sStopwatch.time[0]++;  // hours H (0-1)

                            if (sStopwatch.time[0] == '2')
                            {
                                // When reaching 20 hours, start over
                                reset_stopwatch();
                                sStopwatch.state = STOPWATCH_RUN;
                                display_stopwatch(LINE2, DISPLAY_LINE_UPDATE_FULL);
                            }
                        }
                    }
                }
            }
        }
    }

    // Always set display update flag
    display.flag.update_stopwatch = 1;
}

Может не очень "красиво", сделал быстро, зато работает.

Re: eZ430-Chronos

Madf » 23 июл 2012, 12:54

Спасибо.
Я так полагаю, это изменения только по части секундомера и ранее корректировки Dmitry__ тоже нужны (т.к. они касаются только часов)? Или нет (уже законченный блок)?

Re: eZ430-Chronos

Dmitry__ » 23 июл 2012, 17:40

Madf писал(а):На счет ">20 мин", отказываться от этой возможности не хотелось

Да нееее, ни какие функции не пропадут. Просто эти придурки в функцию подсчета секундомера засунули вывод на дисплей :)
Глюк проявляется как появление секундомера на короткое время (во время перехода секундомера в режим >20 мин) в любом режиме часов.

Добавлено спустя 1 час 1 минуту 40 секунд:
Опс, понял почему каждую секунду вычитают 5 а не 2.
При выполнении условия "if (sStopwatch.swtIs1Hz)" другие условия не проверяются, а значит в 1/10 секунду не вычитается 3, вот они скопом и отнимают: -3 -2 = -5
Жесть

Добавлено спустя 3 часа 33 минуты 6 секунд:
Допилил секундомер, идут как вкопанные :D
Резюмирую:
Относительно версии "Sports Watch 1_6", к "Sonny_Sports Watch" это тоже подходит, т.к. корректируемые файлы там без изменений

Лезем в "stopwatch.h" и корректируем строку:
Код: Выделить всёРазвернуть
#define STOPWATCH_100HZ_TICK                    328   //!!! (32768 / 100)


В "stopwatch.c":
В функции "void stopwatch_tick(void)" найти и закомментировать (2 шт.):
Код: Выделить всёРазвернуть
//!!!     display_stopwatch(LINE2, DISPLAY_LINE_UPDATE_FULL);


И отнимаем 1 секунду при смене режима >20 мин.
У меня это выглядит так (с закомментированным display_stopwatch) :

Код: Выделить всёРазвернуть
                        // SWT display changes from MM:SS:hh to HH:MM:SS when reaching 20 minutes
                        if (sStopwatch.viewStyle == DISPLAY_DEFAULT_VIEW)
                        {
                          sStopwatch.time[1]--; //!!!
                        }
                        sStopwatch.viewStyle = DISPLAY_ALTERNATIVE_VIEW;
//!!!                        display_stopwatch(LINE2, DISPLAY_LINE_UPDATE_FULL);

Чего еще допилить? 8)
Последний раз редактировалось Dmitry__ 23 июл 2012, 19:00, всего редактировалось 1 раз.


Rambler\'s Top100 Mail.ru counter