|
|
  |
Как распознать кратковременное выключение на Tiny13, Управление режимами фонарика кнопкой питания |
|
|
|
Jan 18 2010, 20:09
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата 3.значения РОН сравниваем с сохраненными любимыми значениями из EEPROM. если совпали, то длинное отключение, если хоть 1 бит не совпал - то короткое. меняем или не меняем режим Ууууу.... 300-е сообщение темы, а вы еще верите, что все биты могут совпасть???
|
|
|
|
|
Jan 18 2010, 20:42
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(stells @ Jan 18 2010, 22:34)  ...если хоть 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 при включении нужно... Но это всё сложно, хотя и теоретически правильно. Моя программа в предыдущем моём посте делает всё тоже самое, но проще...
|
|
|
|
|
Jan 19 2010, 05:02
|

внештатный сотрудник
     
Группа: Участник
Сообщений: 2 458
Регистрация: 10-05-08
Из: МО, Медвежьи озера
Пользователь №: 37 401

|
Цитата(galjoen @ Jan 18 2010, 23:42)  Работать не будет. Прочтите мой пост N138. Там написано почему, и дан алгоритм как это обойти. в посте 138 речь идет о регистрах ОЗУ, а РОН ведут себя по-другому. по крайней мере такое впечатление сложилось Цитата(VladislavS @ Jan 18 2010, 23:09)  Ууууу.... 300-е сообщение темы, а вы еще верите, что все биты могут совпасть??? пока верю, а где написано опровержение?  я вот пока другое вижу: пишу в r18 значение и он хранит его несколько минут, пока терпения не хватило прождать столько времени, чтобы он сбросился в любимое состояние это у меня по питанию кондер большой, надо шунтировать вот это да! большой кондер у меня у меня по входу 7805. я его зашунтировал, а РОН все-равно помнит записанное значение. на выходе 7805 стоит 0,1мкФ, зашунтировал и ее 10кОм - РОН помнит значение примерно 1с - то, что надо  дааа... и стоило из-за этого 300 постов писать?
Сообщение отредактировал stells - Jan 19 2010, 05:59
|
|
|
|
|
Jan 19 2010, 06:59
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
мне кажется, алгоритм готов... протестировал на 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); } да, чуть не забыл: после прошивки надо сделать кратковременное снятие питания - примерно на секунду, иначе возможно неверное запоминание начального значения и в результате потребуется несколько включений-выключений для подстройки. алгоритм с потенциально слабым местом - суммирую в байт, т.е. если регистры будут содержать слишком много единиц, то результат будет случайным - но это лечится, сами понимаете, элементрано  да и фонарик - не атомная бомба, если иной раз сработает не так - не страшно, никто и не заметит (юзер и забудет давно, в каком режиме выключал его, чтобы возмутиться тем, что он включился в новом режиме).
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jan 19 2010, 10:31
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 17-04-09
Из: UA
Пользователь №: 47 867

|
Цитата(stells @ Jan 19 2010, 09:39)  напряжение на контроллере падает так же, как приводил VladislavS еще в самом начале темы:
цена деления 100мс/1В. видно, где срабатывает BOD (1,8В) и затем идет плавный спад. но видимо РОН хватает где-то 100-200мВ, чтобы удержать значение Когда-то давно для процессора К1820 потребовалось ОЗУ на 4 бита. Была применена м\с К561ие4 с подпиткой от элемента СЦ-21 через 1 Мом при рабочем питании 5 Вольт. Так вот, эта конфигурация позволяла сохранять состояние выходов счетчика при отключении питания, хотя напряжение на ножке питания опускалось до 500 мВ. Причем, при отключении питания 5 вольт выходы становились в одинаковое состояние ( 1 или 0 - не помню), но при подаче питания восстанавливалось ранее записанное состояние со 100% гарантией. Ток потребления в этом случае еле -еле заставлял сдвинуться стрелку тестера на пределе 50 мкА.
|
|
|
|
|
Jan 19 2010, 21:14
|
Местный
  
Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017

|
Прошелся по ссылкам, приведенным в 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, как в анектоде о том, как программист сумки считал).
|
|
|
|
|
Jan 20 2010, 00:03
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Этот алгоритм уже предлагали в #106. Перевод Цитата(Александр Куличок @ Jan 20 2010, 00:14)  - если хотим запомнить режим, то нам надо на него переключиться и почти сразу (<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 секунд, и затем выключить. При следующем включении оно переключит режим." Цитата(Rst7 @ Jan 20 2010, 02:00)  Мда. 300+ постов. Один(!) человек, который прочитал мануал. За неимением чего умного сказать, я google мучал по поводу этих фонариков, и инструкции эти видел. Ничего писать не стал, ибо из темы выходит, что эти инструкции или не про этот фонарик, или автор темы чего-то недоговаривает (о времени включения никто ничего не спрашивал)... (На форумах поддержки есть еще собственная разработка пользователей для подобного фонарика на PIC. Утверждается, что детектирование кратковременного отключения реализуется посредством BOD.)
|
|
|
|
|
Jan 20 2010, 04:23
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 17-05-07
Пользователь №: 27 775

|
Цитата(SysRq @ Jan 20 2010, 05:03)  Этот алгоритм уже предлагали в #106. Перевод не верен. "Чтобы переключить режим, оставить в любом режиме не более 2 секунд, и затем выключить. При следующем включении оно переключит режим." Ну отпад. 300 постов. Предположение, что считается время ВКЛЮЧЕНИЯ я также предлагал в 141 посту, и простейший алгоритм, но он был отвергнут  : http://electronix.ru/forum/index.php?s=&am...st&p=702833Цитата Мда. 300+ постов. Один(!) человек, который прочитал мануал. Мануалы настоящие любители трудностей читают только в состоянии крайнего отчаяния. Это не наш метод
Сообщение отредактировал alevnew - Jan 20 2010, 04:20
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|