реклама на сайте
подробности

 
 
23 страниц V  « < 19 20 21 22 23 >  
Closed TopicStart new topic
> Как распознать кратковременное выключение на Tiny13, Управление режимами фонарика кнопкой питания
VladislavS
сообщение Jan 18 2010, 20:09
Сообщение #301


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



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


Ууууу.... 300-е сообщение темы, а вы еще верите, что все биты могут совпасть???
Go to the top of the page
 
+Quote Post
galjoen
сообщение Jan 18 2010, 20:42
Сообщение #302


Знающий
****

Группа: Свой
Сообщений: 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 при включении нужно...
Но это всё сложно, хотя и теоретически правильно. Моя программа в предыдущем моём посте делает всё тоже самое, но проще...
Go to the top of the page
 
+Quote Post
stells
сообщение Jan 19 2010, 05:02
Сообщение #303


внештатный сотрудник
******

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



Цитата(galjoen @ Jan 18 2010, 23:42) *
Работать не будет.
Прочтите мой пост N138. Там написано почему, и дан алгоритм как это обойти.

в посте 138 речь идет о регистрах ОЗУ, а РОН ведут себя по-другому. по крайней мере такое впечатление сложилось
Цитата(VladislavS @ Jan 18 2010, 23:09) *
Ууууу.... 300-е сообщение темы, а вы еще верите, что все биты могут совпасть???

пока верю, а где написано опровержение? smile.gif

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

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

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

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

Сообщение отредактировал stells - Jan 19 2010, 05:59
Go to the top of the page
 
+Quote Post
stells
сообщение Jan 19 2010, 06:39
Сообщение #304


внештатный сотрудник
******

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



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

Прикрепленное изображение

цена деления 100мс/1В. видно, где срабатывает BOD (1,8В) и затем идет плавный спад. но видимо РОН хватает где-то 100-200мВ, чтобы удержать значение
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 19 2010, 06:59
Сообщение #305


Профессионал
*****

Группа: Свой
Сообщений: 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);
}

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

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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
akken
сообщение Jan 19 2010, 10:31
Сообщение #306


Участник
*

Группа: Участник
Сообщений: 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 мкА.
Go to the top of the page
 
+Quote Post
stells
сообщение Jan 19 2010, 11:10
Сообщение #307


внештатный сотрудник
******

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



я корректнее провел эксперимент - отключил кондер на входе 7805, т.е. в отсутствие питания контроллер питался только от кондера 4,7мкФ на выходе 7805. нифига РОН не сохраняет долго значение... сотни миллисекунд от силы sad.gif
Go to the top of the page
 
+Quote Post
МП41
сообщение Jan 19 2010, 11:18
Сообщение #308


4 синих кубика
****

Группа: Участник
Сообщений: 526
Регистрация: 19-09-08
Из: полупроводника, металла и стекла
Пользователь №: 40 326



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


--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
Go to the top of the page
 
+Quote Post
stells
сообщение Jan 19 2010, 11:31
Сообщение #309


внештатный сотрудник
******

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



Цитата(МП41 @ Jan 19 2010, 14:18) *
Очевидно, сохранность данных в РОН зависит от остаточного напряжения на конденсаторе. 7805 не шунтирует выходом конденсатор?

диод стоит sad.gif
Go to the top of the page
 
+Quote Post
МП41
сообщение Jan 19 2010, 11:44
Сообщение #310


4 синих кубика
****

Группа: Участник
Сообщений: 526
Регистрация: 19-09-08
Из: полупроводника, металла и стекла
Пользователь №: 40 326



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


--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
Go to the top of the page
 
+Quote Post
stells
сообщение Jan 19 2010, 11:47
Сообщение #311


внештатный сотрудник
******

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



Цитата(МП41 @ Jan 19 2010, 14:44) *
А если попробовать хранить режим в каком-нибудь регистре, например, в OSCCAL или в другом, который не РОН?

так они все сбрасываются при включении
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Jan 19 2010, 21:14
Сообщение #312


Местный
***

Группа: Свой
Сообщений: 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. Хотя выключенное состояние - тоже режим smile.gif (под номером 0, как в анектоде о том, как программист сумки считал).
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 19 2010, 23:00
Сообщение #313


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



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

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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
SysRq
сообщение Jan 20 2010, 00:03
Сообщение #314


Чайник, 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.)
Go to the top of the page
 
+Quote Post
alevnew
сообщение Jan 20 2010, 04:23
Сообщение #315


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 17-05-07
Пользователь №: 27 775



Цитата(SysRq @ Jan 20 2010, 05:03) *
Этот алгоритм уже предлагали в #106.

Перевод
не верен.

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


lol.gif
Ну отпад. 300 постов. lol.gif
Предположение, что считается время ВКЛЮЧЕНИЯ я также предлагал в 141 посту, и простейший алгоритм, но он был отвергнут smile.gif :
http://electronix.ru/forum/index.php?s=&am...st&p=702833

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

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

Сообщение отредактировал alevnew - Jan 20 2010, 04:20
Go to the top of the page
 
+Quote Post

23 страниц V  « < 19 20 21 22 23 >
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 00:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01511 секунд с 7
ELECTRONIX ©2004-2016