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

 
 
> Как распознать кратковременное выключение на Tiny13, Управление режимами фонарика кнопкой питания
VladislavS
сообщение Jan 3 2010, 06:44
Сообщение #1


Местный
***

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



Что-то споткнулся на ровном месте - спасайте!

Китайские светодиодные фонарики. Режимамы работы (яркость ШИМ-ом, стробы, SOS-ы) задаёт Tiny13.
Схема примитивная. Кнопка отключает минус литиевого аккумулятора от корпуса фонаря. Микроконтроллер запитан через
диод и небольшую керамическую ёмкость. На PB2 (ADC1) через резистивный делитель (VCC->10k->3k->GND) заведено
напряжение питания. PB1 используется для управления стабилизатором. Собственно и всё.

Включение следующего режима работы осуществляется кратковременным отключением питания кнопкой.
Причем, это "кратковременно" запросто может быть больше секунды. Если выключить на большее время, то
после включения режим не меняется (помнится).

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

Коллеги, есть свежие идеи?
Go to the top of the page
 
+Quote Post
23 страниц V  « < 8 9 10 11 12 > »   
Start new topic
Ответов (135 - 149)
stells
сообщение Jan 7 2010, 20:05
Сообщение #136


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

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



Цитата(VladislavS @ Jan 7 2010, 22:37) *
А можно чуть подробней что делал?

снял подтяжку на входе, а дальше стало не интересно. в принципе все входы у AVR после перевода в Z-состояние так себя ведут... может и ошибаюсь laughing.gif
правда в тини13 есть возможность отключения цифровых буферов, что снизит утечки... я этого не делал

Сообщение отредактировал stells - Jan 7 2010, 20:16
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jan 7 2010, 20:38
Сообщение #137


Местный
***

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



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

Начну с самого питания. На 8-й ноге при включении вот что видно благодаря высокому выходному сопротивлению ключа по питанию.
Прикрепленное изображение

Я тут вижу следующее:
- через 6 мс после включения, похоже, происходит запись в EEPROM. Там как раз 2 провала по 1.8 мс. Тут у меня вопрос к знатокам. Это видно стирание+запись или запись двух ячеек памяти?
- через те же 6 мс пошли пички частотой около 5 кГц - это ШИМ - его я видел вторым лучём.

То есть, через 6 мс контроллер уже всё для себя решил и дальше только молотит ШИМ. Причем, ШИМ скорее всего аппаратный, поскольку даже в режиме 100% яркости есть короткий импульс нуля.

Дальше 2 и 3 ноги (PB3, PB4). На них диаграмма совершенно одинакова, так что выложу одну.
Прикрепленное изображение

Я думаю, что это опрос наличия перемычек на землю. При замыкании PB4 на землю отключаются лишние режимы работы фонаря - стробы. Опять таки, через 6 мс они уже не нужны и их отпускают.
Go to the top of the page
 
+Quote Post
galjoen
сообщение Jan 7 2010, 20:48
Сообщение #138


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(VladislavS @ Jan 7 2010, 21:25) *
Пока единственное направление, дающее хоть что-то - неинициализированная переменная.
1. Она действительно при включении стремится к какому-то "любимому" состоянию.
2. Увеличение разрядности этой переменной автоматически увеличивает время пока её "колбасит".

Т.е. даже с резистором, включенным параллельно питанию, ОЗУ некоторое время сохраняется? А какое, хотя бы порядок?
Цитата(VladislavS @ Jan 7 2010, 21:25) *
1. Нужен сходящийся алгоритм, позволяющий вычислить "любимое" состояние и потом его уточнять со временем.

Я когда защиту делал, то биты ОЗУ на 3 категории делил:
1. Которые в 1 устанавливаются.
2. Которые в 0 устанавливаются
3. Которые то так то сяк, поэтому с ними дела лучше не иметь.
Тут другой случай, но попробовать можно. EEPROMа для этого в тиньке маловато, но я бы предложил так:
1. Реализовать всё это счётчиками (знаковый байт) в EEPROM, по байту на бит ОЗУ. По полбайта лучше, но сложней. Как там с местом во FLASH?
2. При включении бит=1 -> счётчик+=;, при включении бит=0 -> счётчик-=;.
3. За переполнением счётчиков следим и не допускаем.
4. У битов, которые относятся к VarR, счётчики не трогаем.
5. При каждом следующем включении сдвигаем VarR и ConstR на 1 бит (где что хранится в EEPROM). Чтобы все счётчики периодически обновлялись - см. п. 4.
6а. Значимость битов пропорциональна произведению его значения (1 эквивалентен 1, 0 эквивалентен -1) на соответствующий ему счётчик. Произведение (числа на 1 или -1) это сильно сказано, произведение знаков имеется ввиду.
6б. Т.е. считаются 2-е знаковые кумулятивные суммы ConstN и VarN.
7. Эти суммы сравниваются примерно так, как я предлагал в предыдущем алгоритме.
Цитата(VladislavS @ Jan 7 2010, 21:25) *
2. Внешние воздействия (висящие провода, поднесённая рука и т.д.) сильно влияют на прцесс.

У меня такого не было, хотя особо не экспериментировал. Но нагревание паяльником сильно не влияло.

А м.б. вам стоит выложить код, относящийся к определению времени выключенного состояния? Сделаем опенсоурсе проект. А? Я бы поучаствовал...
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jan 7 2010, 21:08
Сообщение #139


Местный
***

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



На 5-й ноге (PB0) всё подругому.
Прикрепленное изображение

Комментировать не буду - не знаю.


На 7-й ноге (ADC1) ничего интересного - с точностью до резистивного делителя повторяет питание.


При коротком (со сменой режима) и длинном (без смены режима) диаграммы на всех ногах не отличаются.

Цитата
А м.б. вам стоит выложить код, относящийся к определению времени выключенного состояния?

Ух, как всё сложно описали. А эти гады через 6 мс после старта уже знаю режим...
Код хоть сейчас могу выложить, но куска, отвечающего за определение времени выключенного состояния там нет, ибо решение еще не найдено. А так, пожалуйста - программа фонарика, переключающего режим при каждом включении, управление ШИМ-мом ( 100% - 35% - 4%) и защитой АКБ от переразряда.

Код
#include <ioavr.h>
#include <intrinsics.h>

__regvar __no_init unsigned char mode @ 15;
__regvar __no_init unsigned char power_low_counter @ 14;

__no_init __eeprom unsigned char ee_mode;

#ifdef __cplusplus
extern "C" {
#endif
char __low_level_init()
{
  CLKPR|=(1<<CLKPCE);
  CLKPR=3;
  
  DDRB=(0<<DDB5)|(0<<DDB4)|(0<<DDB3)|(0<<DDB2)|(1<<DDB1)|(0<<DDB0);
  PORTB=(0<<PORTB5)|(0<<PORTB4)|(0<<PORTB3)|(0<<PORTB1)|(0<<PORTB0);
      
  ADMUX=(1<<REFS0)| 1; // Vref=1.1V , ADC1
  ADCSRA=(1<<ADEN)|(0<<ADSC)|(1<<ADATE)|(0<<ADIF)|(1<<ADIE)|(0<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
  ADCSRB=0;      
  
  ACSR=(1<<ACD); //Analog Comparator Disable
  DIDR0=(1<<ADC0D)|(0<<ADC1D)|(1<<ADC2D)|(1<<ADC3D)|(1<<AIN1D)|(1<<AIN0D);
  PRR=(1<<PRTIM0)|(0<<PRADC);
  
  return 1;
}
#ifdef __cplusplus
}
#endif

#pragma vector=ADC_vect
__interrupt void ADC_Interrupt(void)
{
  switch(mode)
  {
    case 0:
      if(ADC<600) power_low_counter++; else power_low_counter=0;
      if(power_low_counter>100) { ee_mode=0; mode=2; power_low_counter=0; }
      PORTB|=(1<<PORTB1);
      break;
    case 1:
      if(ADC<600) power_low_counter++; else power_low_counter=0;
      if(power_low_counter>100) { ee_mode=1; mode=2; power_low_counter=0; }
      PORTB|=(1<<PORTB1);
      __delay_cycles(32);
      PORTB&=~(1<<PORTB1);
      break;
    case 2:
      if(ADC<558) power_low_counter++; else power_low_counter=0;
      if(power_low_counter>100) { ee_mode=2; mode=3; power_low_counter=0; }
      PORTB|=(1<<PORTB1);
      __delay_cycles(2);      
      PORTB&=~(1<<PORTB1);
      break;
    default: //Защитное выключение
      PORTB&=~(1<<PORTB1);
      break;
  }  
};

int main( void )
{  
  __delay_cycles(20000);
  power_low_counter=0;
  mode=ee_mode;
  switch(mode)
  {
    case 0:
    case 1:
      ee_mode++;
      break;
    default:
      mode=2;
      ee_mode=0;
      break;
  }

  ADCSRA|=(1<<ADSC);  
  __enable_interrupt();
  for(;;)  
  {  
    MCUCR=(1<<SE)|(1<<SM0);
    __sleep();
  }
}
Go to the top of the page
 
+Quote Post
andrikk
сообщение Jan 8 2010, 05:45
Сообщение #140


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 23-07-08
Пользователь №: 39 167



Цитата(VladislavS @ Jan 7 2010, 22:38) *
Я тут вижу следующее:
- через 6 мс после включения, похоже, происходит запись в EEPROM. Там как раз 2 провала по 1.8 мс. Тут у меня вопрос к знатокам. Это видно стирание+запись или запись двух ячеек памяти?
- через те же 6 мс пошли пички частотой около 5 кГц - это ШИМ - его я видел вторым лучём.

То есть, через 6 мс контроллер уже всё для себя решил и дальше только молотит ШИМ. Причем, ШИМ скорее всего аппаратный, поскольку даже в режиме 100% яркости есть короткий импульс нуля.


что происходит с питанием на протяжении 5-ти секунд после включения? может там еще пару провалов будет?
Go to the top of the page
 
+Quote Post
alevnew
сообщение Jan 11 2010, 05:41
Сообщение #141


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

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



А не может ли случаем контроллер считать время ВКЛЮЧЕНИЯ, а не выключения? Т.е. если включен более 1с (к примеру), то не меняем режим, а если меньше, то при следующем включении режим меняем ? Тогда все получается просто. После включения инвертируем один бит в еепром, а через секунду ( к примеру) - другой. Если при следующем включении данные биты разные - меняем режим, если одинаковые - не меняем.

Сообщение отредактировал alevnew - Jan 11 2010, 05:46
Go to the top of the page
 
+Quote Post
adc
сообщение Jan 11 2010, 07:39
Сообщение #142


Местный
***

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



Цитата(alevnew @ Jan 11 2010, 08:41) *
А не может ли случаем контроллер считать время ВКЛЮЧЕНИЯ, а не выключения? Т.е. если включен более 1с (к примеру), то не меняем режим, а если меньше, то при следующем включении режим меняем ? Тогда все получается просто. После включения инвертируем один бит в еепром, а через секунду ( к примеру) - другой. Если при следующем включении данные биты разные - меняем режим, если одинаковые - не меняем.

А если захочется переключить эффект через 5 секунд работы? Два раза нажимать? biggrin.gif
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jan 11 2010, 09:24
Сообщение #143


Местный
***

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



Вчера попробовал с компаратором повозиться. В даташите на каждом углу написано, что опорное напряжение появялется не сразу, должно стабилизироваться и т.д. Подал на + компаратора опорное напряжение 1.1, а на минус вход ADC1. И... Что-то я не заметил, что оно с каким-то опозданием появляется.
Go to the top of the page
 
+Quote Post
alevnew
сообщение Jan 11 2010, 10:39
Сообщение #144


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

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



Цитата(adc @ Jan 11 2010, 12:39) *
А если захочется переключить эффект через 5 секунд работы? Два раза нажимать? biggrin.gif


Ну да. Вернее получается вроде так - отпустили кнопку, нажали, отпустили, нажали smile.gif

Кнопка же нормально разомкнутая ?

Вот если примерно по такой схеме сделать при почти тех же деталях - то тогда по остаточномй напруге на кондере можно время выкл. определять. smile.gif
Но это уже схема другая smile.gif
Прикрепленные файлы
Прикрепленный файл  qqq.bmp ( 16.2 килобайт ) Кол-во скачиваний: 37
 
Go to the top of the page
 
+Quote Post
Marian
сообщение Jan 11 2010, 12:55
Сообщение #145


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

Группа: Участник
Сообщений: 148
Регистрация: 23-02-07
Пользователь №: 25 618



Если в Power-Down проц тянет 0.1 мкА, при 1.8 В(согласно описанию для ATtiny13V) , получается его сопротивление 18 Мом.
Значит при T=R*C, проц в Power-Down должен протянуть 18 сек.
Но тут встает вопрос делителя, может он все-таки стоит ближе к акуму? (до диода)
Тогда, в теории, при обнаружении выключения, загнать проц в Power-Down, может заряда хватит продержаться пару секунд ?
Просто мысли вслух.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jan 11 2010, 16:18
Сообщение #146


Местный
***

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



Ещё раз напомню для вновьподтянувшихся после выходных: вопрос не в доделке конкретно этой платы. Я легко могу поставить электролит любой емкости, перепаять все резисторы - хоть час будем спать. Задача стоит не так!

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

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

Вот тут как раз та же постановка задачи, с одной лишь разницей, что такой фонарик может купить каждый и убедиться что это действительно работает!
Go to the top of the page
 
+Quote Post
stells
сообщение Jan 11 2010, 16:48
Сообщение #147


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

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



Цитата(VladislavS @ Jan 11 2010, 19:18) *
Вот тут как раз та же постановка задачи, с одной лишь разницей, что такой фонарик может купить каждый и убедиться что это действительно работает!

разницы две. этот фонарик сделали китайцы, которых все вечно хают. а вот попробуй, повтори! biggrin.gif
сорри за оффтоп
Go to the top of the page
 
+Quote Post
Marian
сообщение Jan 11 2010, 18:27
Сообщение #148


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

Группа: Участник
Сообщений: 148
Регистрация: 23-02-07
Пользователь №: 25 618



Цитата(VladislavS @ Jan 11 2010, 18:18) *
Вот тут как раз та же постановка задачи, с одной лишь разницей, что такой фонарик может купить каждый и убедиться что это действительно работает!

Фонарик пока только у вас. Я просто предлагал еще раз проверить схему.
(В схеме написано ATTiny13, на фото видно ATTiny13V,небольшая разница, но все-таки.)
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Jan 11 2010, 19:58
Сообщение #149


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



В общем, сначала нужно ответить на вопрос: зачем диод по питанию, коль скоро 1 мкф не обеспечивает не то, что 2 сек питания, а даже и запись в еепром?
А может быть, он всё же обеспечивает ОЗУ питанием на 2 секунды от перехода в "любимое состояние"? Оно, допустим, хранится в EEPROM и при включении сравнивается с RAM и потом RAM расписывается например нулями.
Зачем тогда нужен делитель напряжения?

Напряжение с делителя идёт на 7-ю ногу, которая только вход АЦП, какой смысл мерить напряжение на ней? А чтобы сравнить его с внутренней опорой 1,1 вольт. Потому что 4.6 вольта* 3КОм/13КОм = 0,97вольт при максимальном напряжении батарейки - как раз сходится.
При отключении питания конденсатор АЦП остаётся заряженным внутри кристалла, где изоляция хорошая! И 14пф могут протянуть долго... Тогда при включении питания выбираем ногу 2, висящую в воздухе (?) на вход АЦП и, собственно, АЦПуем smile.gif. Понимаем, что кондёр разряжен совсем/не совсем, записываем режим в EEPROM, соединяем вход АЦП с делителем, имеем понятие о напряжении батарейки и заряженный на будущее конденсатор АЦП.
Не этот ли пичок мы видим на ногах 2,3 в самом начале на диаграмме из №137?
Зачем тогда диод, если AMC7135 линейный регулятор?

Ещё одна ёмкость - 3 входа AMC7135, в дататшите обозванные "band-gap reference", которые можно подать на вход компаратора. Хотя утечка с неё по плате непредсказуема.

Нужна полная схема - куда идут ноги 1,2,3,5? Не видно ни на схеме из №64 ни на плате из №94.

Сообщение отредактировал Maik-vs - Jan 11 2010, 20:09
Go to the top of the page
 
+Quote Post
МП41
сообщение Jan 11 2010, 20:44
Сообщение #150


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

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



Диод нужен, чтобы после отключения батареи конденсатор питал только контроллер. А может и от любителей поставить батарейки задом наперёд.


--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 11th August 2025 - 19:31
Рейтинг@Mail.ru


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