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

|
Господа, всем спасибо за участие! Меня срывают в Израиль "спасать проект" - участвовать в дальнейших разборках временно не могу. В боевой фонарь пока зашиваю следующий алгоритм: 1. При старте считываем режим из EEPROM и принимаем его за текущий, инкрементируем режим и записываем обратно в EEPROM. 2. Через 2-3 секунды подмаргиваем диодом и записываем в EEPROM текущий режим (делаем откат). Собсвтвенно и всё. Как выяснилось в другом форуме, фонари с таким алгоритмом тоже есть. Может это даже и правильней - никаких недокументированных возможностей, никаких переходных процессов - все на штатном питании происходит. Цитата(stells @ Jan 18 2010, 16:38)  интересно, а есть на осциллограммах похожий временной интервал? 64 ячейки*8бит*5команд(к примеру)=2500тактов На одной плате есть, но там похоже SUT так зашиты и непонятно когда точно он включается. На второй настолько быстрый старт, что я думаю 2500 тактов там не влезет.
|
|
|
|
|
Jan 18 2010, 16:47
|

Местный
  
Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836

|
Цитата(ARV @ Jan 18 2010, 11:03)  ... вот еще результаты: r0 - стабильно 18 (при очень котортких перерывах питания значение 16, нулевого не добился) r1 - стабильно всегда 34, не добился иного r2 - 0 всегда r3 - помнит 0 до 1 секунды, при больших интервалах принимает значение 4 или 6 r15 - стабильно 1, изредка 3, нуля не добился r20 - стабильно 22, нуля не добился r25 - стабильно 0 при любых перерывах питания r30 - стабильно 16, нуля не добился вот, такие пироги...  Может попробовать проверять скопом несколько ячеек памяти (допустим 10 или 20) и по среднему "обнулению" судить о продолжительности выключения? Брать, так сказать, статистикой.
|
|
|
|
|
Jan 18 2010, 16:50
|

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

|
Цитата(Demeny @ Jan 18 2010, 18:30)  чтобы конденсатор АЦП всегда был подзаряжен и готов к отслеживанию времени выключения. это делали (см. например пост 155), но, во-первых, присутствуют какие-то отклонения результатов измерений, а, во-вторых (как справедливо заметил ISV), в ПИКах АЦП нет, а программа наверняка универсальная при этом, что общего у вариантов на АВР и ПИК: - диод и кондер по питанию; - три драйвера светодиодов; - компаратор на борту (и именно его вход в обоих случаях почему-то подключен к драйверам); - внутренние РОН и ОЗУ вот вероятнее всего что-то из этого списка и работает
Сообщение отредактировал stells - Jan 18 2010, 17:05
|
|
|
|
|
Jan 18 2010, 17:07
|
Группа: Участник
Сообщений: 10
Регистрация: 12-01-10
Из: Оренбург
Пользователь №: 54 756

|
Цитата(stells @ Jan 18 2010, 21:50)  это делали (см. например пост 155), но, во-первых, присутствуют какие-то отклонения результатов измерений, имхо, повторяемость будет не 100%-ная.. а я за 2 года увлечения подобными фонарями ни разу не слышал о браке или глюках с переключением режимов. оно либо работает, либо сгорело  Цитата(stells @ Jan 18 2010, 21:50)  во-вторых (как справедливо заметил ISV), в ПИКах АЦП нет, а программа наверняка универсальная не факт. иначе, зачем было во всех схемах на Tiny вешать резисторы на отдельный порт. Цитата(stells @ Jan 18 2010, 21:50)  при этом, что общего у вариантов на АВР и ПИК: - диод и кондер по питанию; - три драйвера светодиодов; тоже не оно. кондер с диодом - да, везде. а вот выход везде разный. более того, в некоторых тупых схемах проц еще и функции ШИМ-контроллера выполняет (в схеме повышения/понижения напряжения, кроме режимов).
|
|
|
|
|
Jan 18 2010, 17:26
|

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

|
кажется, на диаграмме было видно 2 записи в EEPROM... так вот, я думаю, что одна из записей как раз сохраняет "исходное" состояние тестового регистра, а второе - сам режим работы. при старте сравнивается "исходное" состояние и фактичнское, в итоге не тлько отличаем режимы/состояния, но и делаем автоподстройку... кстати, эффект от АЦП был проверен хотя бы на аре камней? есть уверенность, что он более повторяем, чем состояния регистров?
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jan 18 2010, 18:08
|

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

|
Цитата(ARV @ Jan 18 2010, 20:26)  я думаю, что одна из записей как раз сохраняет "исходное" состояние тестового регистра так Вы же сами провели исследование по способности регистров устанавливаться в любимое состояние - там не видно, что наверняка через 2-3 секунды регистр его принимает хотя по группе регистров можно попробовать. если это самое первое включение контроллера после прошивки, сформировать какой-нибудь избыточный код (CRC, LRC или Хэмминга) для группы (или всех) регистров и записать его в EEPROM. также в EEPROM записать, что первое включение уже было (поставить битик, что контрольный код уже сформирован). тогда при коротком отключении с высокой степенью вероятности контрольный код не совпадет с сохраненным. так? или даже не заморачиваться с избыточными кодами, а сохранить в EEPROM копию любимых состояний всех РОН (только один раз это делать и поставить битик, что любимые состояния сохранены). тогда если хоть 1 бит неправильный, то было короткое отключение, а если все совпали - то длинное
Сообщение отредактировал stells - Jan 18 2010, 18:27
|
|
|
|
|
Jan 18 2010, 18:25
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Вот, выкладываю программу, предположительно определяющую длительность выключения питания: Код .org 0 rjmp begin .SET BegRAM=0x60; начало участка ОЗУ включительно .SET EndRAM=0x90; конец участка ОЗУ включительно ; длину больше 0x1FFF байт не делать т.к. возможно переполнение (не проверяется) .DEF RG00=R26 ; это будет регистр всегда =0 .DEF Rtemp=R27 ; это будет рабочий регистр
.org 0x100 ; адрес после таблицы прерываний begin: eor RG00,RG00 ; регистр =0 ldi R28,0 ; 2 байта ldi R29,0 ; счётчика 1 (N1) ldi R30,low(EndRAM) ; регистр указатель Z ldi R31,high(EndRAM)
Loop1:; цикл подсчёта кол-ва едениц в R29:R28 (35 тактов на байт) ld Rtemp,Z ; читаем проверяемый байт st Z,RG00 ; обнуляем на следующий раз ror Rtemp ; выдвигаем бит N0 adc R28,RG00 ; прибавляем его adc R29,RG00 ; к накопителю N1 ror Rtemp ; бит N1 adc R28,RG00 adc R29,RG00 ror Rtemp ; бит N2 adc R28,RG00 adc R29,RG00 ror Rtemp ; бит N3 adc R28,RG00 adc R29,RG00 ror Rtemp ; бит N4 adc R28,RG00 adc R29,RG00 ror Rtemp ; бит N5 adc R28,RG00 adc R29,RG00 ror Rtemp ; бит N6 adc R28,RG00 adc R29,RG00 ror Rtemp ; бит N7 adc R28,RG00 adc R29,RG00 subi R30,1 ; передвигаем sbci R31,0 ; указатель ldi Rtemp,high(BegRAM); проверим на конец cpi R30,low(BegRAM) cpc R31,Rtemp brcc Loop1 ; C=0 - циклимся ; получили в R29:R28 кол-во битов=1 в выбранной части ОЗУ subi R28,low((EndRAM-BegRAM+1)<<1); сравним с количеством бит sbci R29,high((EndRAM-BegRAM+1)<<1); в этой части ОЗУ /4 (Nn) brcc LgPoff ; это было короткое выключение питания ; тут зажигаем к.н. лампочку о коротком выключении nop ; команда включения короткой лампы rjmp Cnte LgPoff:; это было длинное выключение питания ; тут зажигаем к.н. лампочку о долгом выключении nop ; команда включения длинной лампы Cnte:; тут начинается основная программа rjmp Cnte Просьба, у кого есть возможность - попробуйте на реальных устройствах. Будет хоть какая то статистика. К сожалению, у меня сейчас проверить в реале возможности нет. Всё сделал максимально железонезависимо. Нужно только задать начало и конец области ОЗУ. BegRAM и EndRAM соответственно. Но длина куска д.б. не больше 0x1FFF. Если у кого подключено внешнее ОЗУ - попробуйте на нём. Тоже интересно... ЗЫ У нас сейчас жутко глючит интернет (3G Мегафон). В своих программах, которые это дело проверят, каждый 3-й пакет с ошибкой CRC. А тут без проверки, поэтому могут быть ошибки в коде. Что и было при первой попытке выложить...
|
|
|
|
|
Jan 18 2010, 19:34
|

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

|
Цитата(stells @ Jan 18 2010, 21:08)  сохранить в EEPROM копию любимых состояний всех РОН (только один раз это делать и поставить битик, что любимые состояния сохранены). тогда если хоть 1 бит неправильный, то было короткое отключение, а если все совпали - то длинное P.S. естественно после контроля программа должна изменить содержимое РОН (проинвертировать). итак: 1.если при первом включении в первом регистре EEPROM записаны 1, то делаем п.2, иначе п.3 2.нулевую ячейку EEPROM пропускаем (на всякий случай), в первую ячейку записываем нули (копии любимых состояний сохранены), в следующие 32 ячейки копируем РОН и переходим к п.4 3.значения РОН сравниваем с сохраненными любимыми значениями из EEPROM. если совпали, то длинное отключение, если хоть 1 бит не совпал - то короткое. меняем или не меняем режим 4.инвертируем все РОН 5.выполняем основную программу
Сообщение отредактировал stells - Jan 18 2010, 19:46
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|