eZ430-Chronos

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: eZ430-Chronos

Сообщение Madf » 12 июн 2012, 00:43

Главное - это чтобы не нарушалась возможность беспроводного обновления и секундомер не сбивал ход хода (впрочем на часы вообще понятное дело ничто не должно влиять), а остальное - полет фантазии. Просто если выкинуть/не использовать беспроводность, то это уже будут ничем не приметные часы на фоне конкурентов по функционалу.
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: eZ430-Chronos

Сообщение Dmitry__ » 12 июн 2012, 01:53

Ну, это можно было даже не озвучивать.
Я уже себе с трудом представляю как обновлять прошивку не через радиоканал. Когда брикаю часы, со слезами иду за отверткой. :cry:
Допил точности часов и секундомера для меня тож на первом месте. Прерывания хронометра уже докурил.
Для меня белое пятно в часах только монстроидальная SimpliciTI
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: eZ430-Chronos

Сообщение Madf » 21 июл 2012, 23:36

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

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

Добавлено спустя 50 минут 17 секунд:
На странице проекта есть описание (перевод). Единственная проблема (для меня), не хватает опции отключения короткого сигнала каждый час.
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: eZ430-Chronos

Сообщение Dmitry__ » 22 июл 2012, 02:42

Чего-то я больших изменений в исходниках, в сторону повышения точности часов, не увидел.
Глюкавый "logic/stopwatch.c" вообще без изменений :pardon:
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: eZ430-Chronos

Сообщение Madf » 22 июл 2012, 10:09

Понятно, я в коде не рылся, видимо разговор об каких-то исправлениях не затронуло данную проблему.
На самом деле есть глючек ещё, когда кнопками на часах пытаешься выставляешь время (основное), то можно так натыкаться, что потом выйти нельзя. Часы перестают реагировать на управляющие кнопки. Надо какое-то время подождать, не трогать их и тогда отпускает.
Дмитрий, может найдется время и желание допилить эту глючность с таймером?
А насчет пика каждый час, надо было его делать не на общее время, а при включении вывода часов вниз (на доп экран)...меня жена чуть не убила, когда это чудо техники начало под ухом, на полке, ночью пикать (два контрольных писка). :)
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: eZ430-Chronos

Сообщение Madf » 22 июл 2012, 16:42

Капельку допелил относительно писка каждый час как хотел.
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: eZ430-Chronos

Сообщение Dmitry__ » 22 июл 2012, 17:19

Вот тебя бесит разная скорость секундомера и часов :)
Ща допилю часы до одного генератора секундных импульсов.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: eZ430-Chronos

Сообщение Madf » 22 июл 2012, 19:47

Будет здорово. Если всё будет "ок", то могу попробовать собрать на все частоты прошивки и выложить. :good: Это в Sonny версии?
Пробовал в новой версии менять настройки давления, жаль - дает только высоту менять. :pardon:
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

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);
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: eZ430-Chronos

Сообщение Madf » 23 июл 2012, 10:15

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

зы: эм...пиво? - не вопрос! Вопрос в разных городах! :(
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: eZ430-Chronos

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

Я выше в теме писал, как я сделал точную настройку секундомера. А при переключении его в режим >20 мин. действительно добавлялась лишняя секунда - надо её не добавлять.
В электронике чудес не бывает! Бывают плохие контакты!
Аватара пользователя
Змей-Горыныч
 
Сообщения: 70
Зарегистрирован: 01 мар 2005, 14:54
Откуда: г. Томск

Re: eZ430-Chronos

Сообщение Madf » 23 июл 2012, 12:33

Нужно работу вести над одним проектом/контентом, а то сейчас запутаемся.
Змей-Горыныч, если не сложно, то повтори пожалуйста свои изменения на этой версии сборки (Sonny).
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

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;
}

Может не очень "красиво", сделал быстро, зато работает.
В электронике чудес не бывает! Бывают плохие контакты!
Аватара пользователя
Змей-Горыныч
 
Сообщения: 70
Зарегистрирован: 01 мар 2005, 14:54
Откуда: г. Томск

Re: eZ430-Chronos

Сообщение Madf » 23 июл 2012, 12:54

Спасибо.
Я так полагаю, это изменения только по части секундомера и ранее корректировки Dmitry__ тоже нужны (т.к. они касаются только часов)? Или нет (уже законченный блок)?
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

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 раз.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 1