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

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

Тинька, конечно, заметно не сможет "просадить". Но если включить светодиоды (фонарь же?), то "просадка" батареи может быть существенной. АЦП тиньки должно ее определить....

Кстати, да. Интересно, как схема ведет себя при работе от сетевого БП, который не проседает?

 

Светодиод, конечно же, просаживает. Я сейчас играюсь с двумя диодами - первый 1A кушает, а второй вообще до 2.8А.

Но сам драйвер работает как задумано и без диода. И от источника пиитания тоже. Так что, версия с отслеживанием напряжения на акб на 99% ошибочна. Думаю там просто защита акб от переразряда организована.

 

Уверены насчет выделенного слова? А то может всегда помнит? Тогда достаточно при подаче питания выбирать следующий режим. Номер его, естественно, хранить в EEPROM.

Не, именно ПОМНИТ. Короткое нажатие - смена режима, длительное выключение - нет смены режима.

 

Я делал такую потеху основываясь на битах BORF и PORF регистра MCUSR.

Если PORF - берем из епрома режим и работаем

Если только BORF - берем из епрома режим инкрементируем записываем и работаем.

До какого значение опускалось питание при этом?

 

Кстати, Автор, Вы опять про BOD и т.п., а если все поотключать, в т.ч. АЦП и компаратор чтоб внутрений ИОН тоже выключился - то потремление становится микроамперы, что возможно и позволит выиграть нужные пару секунд.

 

Я же писал, что мне удалось проспать 4 мс до наступления BOR в то время как c оригинальной прошивкой всего 320 мкс до BOR. Раздел даташита "Minimizing Power Consumption" могу уже наизусть цитировать. Отключал всё что там написано. Да, отключение BOD увеличивает время сна, но не в требуемые 250 раз. Просто с включенным BOD проще замерять время по характерному перелому осциллограммы на 1.8 В.

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


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

Гость @Ark
Светодиод, конечно же, просаживает... Так что, версия с отслеживанием напряжения на акб на 99% ошибочна.

Да, не ищите Вы "китайское решение". :) Вполне возможно, оно настолько "кривое", что его трудно будет угадать... Сделайте свое. Если не хотите зависеть от прихотей источника, то я бы рекомендовал вариант, предлагаемый rx3apf:

А сам бы я попробовал именно с отдельным (для порядка - с последовательным токоограничивающим резистором), подключив его на какую-нибудь ногу ADC. При включении - измерить, что на нем, потом включить и оставить под напряжением. 0.1 uF и параллельно 10 MOhm для утечки. Ну да, при выключении он разрядится через защитный диод входа, но не ниже 0.6V, а дальше - через резистор. До единиц секунд можно поймать, я полагаю (только вот керамика очень уж от температуры плавает...).

Могу только добавить, что сопротивление входов МК, обычно, порядка гигаом, емкость порядка пикофарад. Соорудить RC-цепочку с нужной постоянной времени, добавив небольшую емкость - совсем не сложно.

P.S. А может и добавлять ничего не придется. Поробуйте ацп-ировать значение на свободном входе АЦП, которое имеется, непосредственно, при включении питания. Естественно, до выключения на нем нужно постоянно поддерживать высокий уровень...

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


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

Попробовал неинициализированную переменную проверять при старте. Хранится в памяти где-то 75 мс после выключения питания. После этого принимает произвольное значение, так как проверку ни на 0, ни на FF при старте не проходит. Маловато будет...

Что-то маловато 75 mS. Это все биты или только некоторые сбрасываются?

Давным-давно делал защиту от копирования на том принципе, что ОЗУ при включении всегда похожее состояние принимает. Именно похожее, а не одинаковое. Так у меня как-раз единицы секунд проходили от выключения до сброса в это состояние. Приходилось различать ситуацию, когда простото ненадолго выключили, и из-за этого ОЗУ в нормальное состояние не успело прийти.

А тут наоборот, можно на этом принципе время выключенного состояния оценить...

Например так:

1. Выделяем и в ОЗУ и в EEPROM по две 8-ми байтных переменных. 1-ю пару назовём ConstR (ОЗУ) и ConstE (EEPROM), а 2-ю соответственно VarR и VarE.

2. При запуске побитно сравниваем ConstR с ConstE и VarR с VarE. Считаем кол-во отличающихся бит. ConstN и VarN соответственно.

3. Если ConstN > 0.8*VarN, то {времени от выключения прошло много; ConstE=ConstR; VarE=VarR; VarR=!VarR; }

иначе{времени от выключения прошло мало; ConstE=ConstR; VarR=!VarE;}

 

Как алгоритм?

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


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

В стремлении к совершенству полез программировать и пока не могу понять КАК они детектируют кратковременное отключение питания. Осциллографом вижу, что питания от конденсатора до BOD хватает где-то на 4 мс как бы я не усыплял контроллер. Это на 3 порядка меньше требуемого значения.

типовое время записи в EEPROM для tiny13 - 3,4мс. в чем вопрос? с кнопки сигнал на компаратор, с конденсатора за диодом - питание контроллера, по прерыванию от компаратора можно менять режим. откуда 3 порядка у Вас появились?

ну или непрерывное АЦ-преобразование, раз компаратор не используется

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

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


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

типовое время записи в EEPROM для tiny13 - 3,4мс. в чем вопрос?

Вопрос в том ЗАЧЕМ и ЧТО надо писать в EEPROM при пропадании питания? Что мне это даст?

 

galjoen, спасибо, попробую завтра так сделать. А на каком микроконтроллере и с какой схемой питания так делали?

 

Да, не ищите Вы "китайское решение". Вполне возможно, оно настолько "кривое", что его трудно будет угадать... Сделайте свое.

Собственно я и ищу своё. Совпадёт ли оно в конце концов с "китайским" всё равно узнать не представляется возможным - оригинальная прошивка защищена. Единственное ограничение - схема остаётся такой какая она есть.

 

Поймите меня правильно. Если бы вопрос стоял в переделке нескольких моих фонариков, то я бы уже давно поставил электролит 100 мкФ, который позволил бы находиться в режиме Power Down нужное время и с мыслью "зато всё сделано правильно" не стал бы поднимать вопрос. Только я думаю, что люди, обитающие на данном форуме даже во время новогодних праздников, не только ради денег рисуют схемы и пишут программы. Я уже несколько лет на AVR ничего не делал - всё на молодых специалистов и студентов скинул. А тут зацепил меня этот китайский контроллер.

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


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

Гость @Ark
Единственное ограничение - схема остаётся такой какая она есть.

А можно попросить схему в студию? Желательно с номиналами. А то не совсем ясно, что обсуждаем.

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


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

Я в первом сообщении писал про схему. Питание от литиевого акб 3.7-4.2В. Контроллер запитан через диод и конденсатор. Диод обычный - падает на нём 0.65 В. Номинал конденсатора не измерял, но по цвету похож на 0.1 - 1 мкф. С резистивного делителя VCC->10к->3k->GND подано напряжение на ADC1. PORTB1 используеся для управления стабилизаторами тока AMC7135.

 

p1040415f.jpg

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


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

А может все проще - питание на проц всегда подается?

А с кнопки идет на просто на вход ?

Думаю, если проц спит больше всего времени в выключенном режиме, то не сильно нагружает аккумуляторы.

 

Или все совершенно точно ?

 

 

А если вот такая бредовая идея: к примеру после включения неинициализированное ОЗУ с высокой долей вероятности содержит в основном нули (или единицы, не суть важно).

Проц при включении считает кол-во единичных битов в озу и примерно оценивает время, сколько был проц выключен. Чем больше нулей, тем больше было время выключения. А после подсчета снова заполняет ОЗУ единичками.

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

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


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

Поробуйте ацп-ировать значение на свободном входе АЦП, которое имеется, непосредственно, при включении питания. Естественно, до выключения на нем нужно постоянно поддерживать высокий уровень...

подтяжкой поддерживать? попробовал на меге8 - за 10мкс напряжение падает до 0. если только подтяжку выключать перед отключением питания? но все-равно при Rвх=100МОм, Cвх=10пФ получатся миллисекунды

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


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

А на каком микроконтроллере и с какой схемой питания так делали?

Делал на разных, начиная с 1816ВЕ35. Когда было внешнее ОЗУ - делал привязку к нему. Работало всегда. И на советских микроконтроллерах_с_внутренним_статическим_ОЗУ/внешних_микросхемах_статического_ОЗУ и на импортных. Когда была возможность использовал для этого больше байт ОЗУ. Часто, все неиспользуемые в программе байты ОЗУ, под это дело применял. Т.к. с используемыми, при недолгом выключении (единицы секунд), этот фокус не проходил. С динамическим ОЗУ не пробовал, но думаю, что с ним тоже будет работать.

 

Если заработает, то с вас переделанный фонарик :)

 

alevnew, по опыту могу сказать, что нулей и едениц там примерно одинаково. Разные микросхемы ОЗУ из одной партии могут вести себя по разному. В принципе можно считать кол-во едениц/нулей, но без записи в EEPROM всё равно не обойтись. А в данном приложении EEPROM всё равно с избытком, а вот с ОЗУ м.б. напряг.

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


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

А если вот такая бредовая идея: к примеру после включения неинициализированное ОЗУ с высокой долей вероятности содержит в основном нули (или единицы, не суть важно).

Проц при включении считает кол-во единичных битов в озу и примерно оценивает время, сколько был проц выключен. Чем больше нулей, тем больше было время выключения. А после подсчета снова заполняет ОЗУ единичками.

тоже попробовал. одна и та же ячейка у меня после подачи питания всегда (ну или может почти всегда) содержит значение 00001110. какое время она будет хранить другое (модифицированное) значение? мне кажется этот вопрос уже поднимался

 

там точно конденсатор на питании контроллера?

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

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


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

Цитата

Я делал такую потеху основываясь на битах BORF и PORF регистра MCUSR.

Если PORF - берем из епрома режим и работаем

Если только BORF - берем из епрома режим инкрементируем записываем и работаем.

До какого значение опускалось питание при этом?

Не мерял, но работает.

 

“меньше знаешь – крепче спишь” :)

 

P.S. разломал недавно современную видюху на кондючки и был сильно удивлен "килофарадными" керамическими кондючками.

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


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

...

P.S. разломал недавно современную видюху на кондючки и был сильно удивлен "килофарадными" керамическими кондючками.

1000 Ф конденсаторы на видео карте? может "кило-микрофарадные"="миллифарадные", т.е. 1000 мкФ ёмкость ?

хотя мне не встречалась керамика больше десятков мкФ, а тут килофарада. значит я сплю крепче :)))

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


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

Гость @Ark
Я в первом сообщении писал про схему...

Простите, но я просил не описание схемы (которое Вы дали, аж два раза), и не ее топологию. А точную, восстановленую по топологии, электрическую схему с номиналами. Только тогда можно что-то конкретно обсуждать, не занимаясь догадками...

P.S. Кстати, Вы уверены, что там Тинька стоит? Вполне может быть и PIC12, например. Или еще что-то...

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


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

P.S. Кстати, Вы уверены, что там Тинька стоит? Вполне может быть и PIC12, например. Или еще что-то...

Если топикстартер подключался программатором, стирал исходную программу, заливал свою и его программа работала, то я таки думаю, что он правильно идентифицировал микроконтроллер...

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


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

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