Перейти к содержанию
    

Как распознать кратковременное выключение на Tiny13

3.значения РОН сравниваем с сохраненными любимыми значениями из EEPROM. если совпали, то длинное отключение, если хоть 1 бит не совпал - то короткое. меняем или не меняем режим

 

Ууууу.... 300-е сообщение темы, а вы еще верите, что все биты могут совпасть???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...если хоть 1 бит не совпал - то короткое...

Работать не будет.

Прочтите мой пост N138. Там написано почему, и дан алгоритм как это обойти.

Коротко: У некоторых бит нет любимого значения, или оно не очень любимое. Тут нужно по байту EEPROM на бит ОЗУ (ну или хоть по 4 бита). В этом байте знаковое число, соответствующее любимому состоянию бита за 127 экспериментальных включений (бит=0 -> прибавляем 1). В зависимости от реального состояния (бит=0 считаем положительным числом =1, бит=1 считаем отрицательным числом =-1) это число или прибавляется или вычитается (- на - даёт +) из накопителя. Если этот накопител8е было короткое.

А писать в биты инверсный знаu044C получился <0 - выключенк числа из EEPROM при включении нужно...

Но это всё сложно, хотя и теоретически правильно. Моя программа в предыдущем моём посте делает всё тоже самое, но проще...

 

Кстати, никто не попробовал?

 

Ну Мегафон! Ну TCP/IP! Ну как они такого добиваются?!? Уже 2 из 3 пакетов в ошибкой CRC пошли... Это мы на своём сервере в пакеты, именно для таких случаев, дополнительно свою CRC добавляем... А родное TCP/IP CRC видимо замечательно совпадает... Называется контроль целостности данных... Простите за оффтоп. Не могу нормально свой пост из-за этого отправить. Вот так д.б. (если ещё получится):

Работать не будет.

Прочтите мой пост N138. Там написано почему, и дан алгоритм как это обойти.

Коротко: У некоторых бит нет любимого значения, или оно не очень любимое. Тут нужно по байту EEPROM на бит ОЗУ (ну или хоть по 4 бита). В этом байте знаковое число, соответствующее любимому состоянию бита за 127 экспериментальных включений (бит=0 -> прибавляем 1). В зависимости от реального состояния (бит=0 считаем положительным числом =1, бит=1 считаем отрицательным числом =-1) это число или прибавляется или вычитается (- на - даёт +) из накопителя. Если этот накопитель получился <0 - выключение было короткое.

А писать в биты инверсный знак числа из EEPROM при включении нужно...

Но это всё сложно, хотя и теоретически правильно. Моя программа в предыдущем моём посте делает всё тоже самое, но проще...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Работать не будет.

Прочтите мой пост N138. Там написано почему, и дан алгоритм как это обойти.

в посте 138 речь идет о регистрах ОЗУ, а РОН ведут себя по-другому. по крайней мере такое впечатление сложилось

Ууууу.... 300-е сообщение темы, а вы еще верите, что все биты могут совпасть???

пока верю, а где написано опровержение? :)

 

я вот пока другое вижу: пишу в r18 значение и он хранит его несколько минут, пока терпения не хватило прождать столько времени, чтобы он сбросился в любимое состояние

 

это у меня по питанию кондер большой, надо шунтировать

 

вот это да! большой кондер у меня у меня по входу 7805. я его зашунтировал, а РОН все-равно помнит записанное значение. на выходе 7805 стоит 0,1мкФ, зашунтировал и ее 10кОм - РОН помнит значение примерно 1с - то, что надо :biggrin:

 

дааа... и стоило из-за этого 300 постов писать? :lol:

Изменено пользователем stells

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

напряжение на контроллере падает так же, как приводил VladislavS еще в самом начале темы:

post-37401-1263883077_thumb.jpg

цена деления 100мс/1В. видно, где срабатывает BOD (1,8В) и затем идет плавный спад. но видимо РОН хватает где-то 100-200мВ, чтобы удержать значение

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мне кажется, алгоритм готов... протестировал на 2 разных мега32 и на одной мега8 - естественно, все "любимые" значения РОН разные, но алгоритм настраивается на них сам и работает. если есть возможность - протестируйте на возможно большем числе камней...

// переменные в неинициализируемой области ОЗУ, чтобы start-up не обнулил
volatile __attribute__((section(".noinit"))) uint8_t mem;
volatile __attribute__((section(".noinit"))) uint8_t mcucsr;

// функция выполняется сразу после сброса еще до start-up кода Си
__attribute__((section(".init0"), naked)) void get_r10(void){
    register uint8_t r2 asm("r2");
    register uint8_t r3 asm("r3");
    register uint8_t r4 asm("r4");
    register uint8_t r5 asm("r5");
    register uint8_t r6 asm("r6");
    register uint8_t r7 asm("r7");
    mcucsr = MCUCSR;
    MCUCSR = 0;
    mem = r2 + r3 + r4 + r5 + r6 + r7;
}

int main(void){
    uint8_t mode = eeprom_read_byte((void*)12);
    // отладочный вывод
    printf_P(PSTR("\nSUM=%u EEPROM=%u"),mem, mode);
    if(mode == 0xFF){
        // первый старт после прошивки
        if(mcucsr & _BV(PORF)){
            // если холодный сброс - запоминание суммы в качестве критерия короткого отключения
            printf_P(PSTR("\nFirst run - INIT."));
            eeprom_write_byte((void*)12, mem);
        } else {
            // при теплом сбросе ничего не надо делать
            printf_P(PSTR("\nWarm reset - nothing to do"));
        }
    } else {
        // при любом последующем включении питания
        if(mem > mode){
            // с течением времени регистры заполняются единицами, поэтому сумма растет
            printf_P(PSTR("\nOld mode - long power off"));
        } else {
            // если сумма меньше, чем была - запомним ее в качестве критерия
            eeprom_write_byte((void*)12, mem);
            printf_P(PSTR("\nNew mode - short power off"));
        }
    }
    // очищаем регистры
    asm volatile(
            "clr r0 \n"
            "clr r1 \n"
            "clr r2 \n"
            "clr r3 \n"
            "clr r4 \n"
            "clr r5 \n"
            "clr r6 \n"
            "clr r7 \n"
            );
    // ждем отключения
    while(1);
}

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

напряжение на контроллере падает так же, как приводил VladislavS еще в самом начале темы:

post-37401-1263883077_thumb.jpg

цена деления 100мс/1В. видно, где срабатывает BOD (1,8В) и затем идет плавный спад. но видимо РОН хватает где-то 100-200мВ, чтобы удержать значение

 

Когда-то давно для процессора К1820 потребовалось ОЗУ на 4 бита. Была применена м\с

К561ие4 с подпиткой от элемента СЦ-21 через 1 Мом при рабочем питании 5 Вольт.

Так вот, эта конфигурация позволяла сохранять состояние выходов счетчика при отключении питания, хотя напряжение на ножке питания опускалось до 500 мВ.

Причем, при отключении питания 5 вольт выходы становились в одинаковое состояние

( 1 или 0 - не помню), но при подаче питания восстанавливалось ранее записанное состояние со 100% гарантией. Ток потребления в этом случае еле -еле заставлял сдвинуться стрелку тестера на пределе 50 мкА.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я корректнее провел эксперимент - отключил кондер на входе 7805, т.е. в отсутствие питания контроллер питался только от кондера 4,7мкФ на выходе 7805. нифига РОН не сохраняет долго значение... сотни миллисекунд от силы :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очевидно, сохранность данных в РОН зависит от остаточного напряжения на конденсаторе. 7805 не шунтирует выходом конденсатор?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очевидно, сохранность данных в РОН зависит от остаточного напряжения на конденсаторе. 7805 не шунтирует выходом конденсатор?

диод стоит :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если попробовать хранить режим в каком-нибудь регистре, например, в OSCCAL или в другом, который не РОН?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если попробовать хранить режим в каком-нибудь регистре, например, в OSCCAL или в другом, который не РОН?

так они все сбрасываются при включении

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошелся по ссылкам, приведенным в 120-м сообщении, автором коего является топикстартер, и по одной из них нашел алгоритм переключения режимов работы даного драйвера.

Может я чего-то там не так понял, но время выключения в нем не фигурирует:

16-mode consolidated into 3 groups:

Low (10%) - Mid (35%) - High (100%) - Strobe - SOS

Low (10%) - Mid (35%) - High (100%)

Low (10%) - Mid (35%) - High (100%) - Special Police Type Strobe - Slow Strobe (3Hz) - Super Slow Strobe (1Hz) - SOS

 

- To switch mode, stay in any mode for no more than 2 seconds then switch off. The next time the light is turned on it will enter the next mode.

- To change mode group, stay in the LOW mode for about 4 to 5 seconds, wait for a quick flash response then switch off. The next time the light is turned on it will enter the next group of modes. If you do not turn off after the initial quick flash response, the flashlight will quickly flash once more after 2 seconds meaning that mode group switch has been cancelled.

мой вольный перевод:

- если хотим запомнить режим, то нам надо на него переключиться и почти сразу (<2 c) выключить питания. Последующие включения будут стартовать с сохраненного режима.

- если хотим поменять группу режимов, то после переключения в режим LOW через 4-5 сек дождаться вспышки и выключить фонарик. В противном случае через время >2c будет еще одна короткая вспышка, которая сгнализирует о том, что смена группы режимов не состоялась.

 

P.S. Вот только режимов приведено не 16, а 15. А уникальных - и вовсе 7 или 8. Хотя выключенное состояние - тоже режим :) (под номером 0, как в анектоде о том, как программист сумки считал).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мда. 300+ постов. Один(!) человек, который прочитал мануал.

 

Посыпаю голову пеплом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Этот алгоритм уже предлагали в #106.

 

Перевод

- если хотим запомнить режим, то нам надо на него переключиться и почти сразу (<2 c) выключить питания. Последующие включения будут стартовать с сохраненного режима.
не верен.

 

- To switch mode, stay in any mode for no more than 2 seconds then switch off. The next time the light is turned on it will enter the next mode.
"Чтобы переключить режим, оставить в любом режиме не более 2 секунд, и затем выключить. При следующем включении оно переключит режим."

 

Мда. 300+ постов. Один(!) человек, который прочитал мануал.
За неимением чего умного сказать, я google мучал по поводу этих фонариков, и инструкции эти видел. Ничего писать не стал, ибо из темы выходит, что эти инструкции или не про этот фонарик, или автор темы чего-то недоговаривает (о времени включения никто ничего не спрашивал)...

(На форумах поддержки есть еще собственная разработка пользователей для подобного фонарика на PIC. Утверждается, что детектирование кратковременного отключения реализуется посредством BOD.)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Этот алгоритм уже предлагали в #106.

 

Перевод

не верен.

 

"Чтобы переключить режим, оставить в любом режиме не более 2 секунд, и затем выключить. При следующем включении оно переключит режим."

 

:lol:

Ну отпад. 300 постов. :lol:

Предположение, что считается время ВКЛЮЧЕНИЯ я также предлагал в 141 посту, и простейший алгоритм, но он был отвергнут :) :

http://electronix.ru/forum/index.php?s=&am...st&p=702833

 

Мда. 300+ постов. Один(!) человек, который прочитал мануал.

Мануалы настоящие любители трудностей читают только в состоянии крайнего отчаяния. Это не наш метод :)

Изменено пользователем alevnew

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...