Jump to content

    
Sign in to follow this  
VladislavS

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

Recommended Posts

А можно чуть подробней что делал?

снял подтяжку на входе, а дальше стало не интересно. в принципе все входы у AVR после перевода в Z-состояние так себя ведут... может и ошибаюсь :laughing:

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

Edited by stells

Share this post


Link to post
Share on other sites

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

 

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

post-4140-1262895575_thumb.png

Я тут вижу следующее:

- через 6 мс после включения, похоже, происходит запись в EEPROM. Там как раз 2 провала по 1.8 мс. Тут у меня вопрос к знатокам. Это видно стирание+запись или запись двух ячеек памяти?

- через те же 6 мс пошли пички частотой около 5 кГц - это ШИМ - его я видел вторым лучём.

 

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

 

Дальше 2 и 3 ноги (PB3, PB4). На них диаграмма совершенно одинакова, так что выложу одну.post-4140-1262896431_thumb.png

Я думаю, что это опрос наличия перемычек на землю. При замыкании PB4 на землю отключаются лишние режимы работы фонаря - стробы. Опять таки, через 6 мс они уже не нужны и их отпускают.

Share this post


Link to post
Share on other sites
Пока единственное направление, дающее хоть что-то - неинициализированная переменная.

1. Она действительно при включении стремится к какому-то "любимому" состоянию.

2. Увеличение разрядности этой переменной автоматически увеличивает время пока её "колбасит".

Т.е. даже с резистором, включенным параллельно питанию, ОЗУ некоторое время сохраняется? А какое, хотя бы порядок?

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. Эти суммы сравниваются примерно так, как я предлагал в предыдущем алгоритме.

2. Внешние воздействия (висящие провода, поднесённая рука и т.д.) сильно влияют на прцесс.

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

 

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

Share this post


Link to post
Share on other sites

На 5-й ноге (PB0) всё подругому.

post-4140-1262896868_thumb.png

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

 

 

На 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();
  }
}

Share this post


Link to post
Share on other sites
Я тут вижу следующее:

- через 6 мс после включения, похоже, происходит запись в EEPROM. Там как раз 2 провала по 1.8 мс. Тут у меня вопрос к знатокам. Это видно стирание+запись или запись двух ячеек памяти?

- через те же 6 мс пошли пички частотой около 5 кГц - это ШИМ - его я видел вторым лучём.

 

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

 

что происходит с питанием на протяжении 5-ти секунд после включения? может там еще пару провалов будет?

Share this post


Link to post
Share on other sites

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

Edited by alevnew

Share this post


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

А если захочется переключить эффект через 5 секунд работы? Два раза нажимать? :biggrin:

Share this post


Link to post
Share on other sites

Вчера попробовал с компаратором повозиться. В даташите на каждом углу написано, что опорное напряжение появялется не сразу, должно стабилизироваться и т.д. Подал на + компаратора опорное напряжение 1.1, а на минус вход ADC1. И... Что-то я не заметил, что оно с каким-то опозданием появляется.

Share this post


Link to post
Share on other sites
А если захочется переключить эффект через 5 секунд работы? Два раза нажимать? :biggrin:

 

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

 

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

 

Вот если примерно по такой схеме сделать при почти тех же деталях - то тогда по остаточномй напруге на кондере можно время выкл. определять. :)

Но это уже схема другая :)

qqq.bmp

Share this post


Link to post
Share on other sites

Если в Power-Down проц тянет 0.1 мкА, при 1.8 В(согласно описанию для ATtiny13V) , получается его сопротивление 18 Мом.

Значит при T=R*C, проц в Power-Down должен протянуть 18 сек.

Но тут встает вопрос делителя, может он все-таки стоит ближе к акуму? (до диода)

Тогда, в теории, при обнаружении выключения, загнать проц в Power-Down, может заряда хватит продержаться пару секунд ?

Просто мысли вслух.

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

Вот тут как раз та же постановка задачи, с одной лишь разницей, что такой фонарик может купить каждый и убедиться что это действительно работает!

Share this post


Link to post
Share on other sites
Вот тут как раз та же постановка задачи, с одной лишь разницей, что такой фонарик может купить каждый и убедиться что это действительно работает!

разницы две. этот фонарик сделали китайцы, которых все вечно хают. а вот попробуй, повтори! :biggrin:

сорри за оффтоп

Share this post


Link to post
Share on other sites
Вот тут как раз та же постановка задачи, с одной лишь разницей, что такой фонарик может купить каждый и убедиться что это действительно работает!

Фонарик пока только у вас. Я просто предлагал еще раз проверить схему.

(В схеме написано ATTiny13, на фото видно ATTiny13V,небольшая разница, но все-таки.)

Share this post


Link to post
Share on other sites

В общем, сначала нужно ответить на вопрос: зачем диод по питанию, коль скоро 1 мкф не обеспечивает не то, что 2 сек питания, а даже и запись в еепром?

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

Зачем тогда нужен делитель напряжения?

 

Напряжение с делителя идёт на 7-ю ногу, которая только вход АЦП, какой смысл мерить напряжение на ней? А чтобы сравнить его с внутренней опорой 1,1 вольт. Потому что 4.6 вольта* 3КОм/13КОм = 0,97вольт при максимальном напряжении батарейки - как раз сходится.

При отключении питания конденсатор АЦП остаётся заряженным внутри кристалла, где изоляция хорошая! И 14пф могут протянуть долго... Тогда при включении питания выбираем ногу 2, висящую в воздухе (?) на вход АЦП и, собственно, АЦПуем :). Понимаем, что кондёр разряжен совсем/не совсем, записываем режим в EEPROM, соединяем вход АЦП с делителем, имеем понятие о напряжении батарейки и заряженный на будущее конденсатор АЦП.

Не этот ли пичок мы видим на ногах 2,3 в самом начале на диаграмме из №137?

Зачем тогда диод, если AMC7135 линейный регулятор?

 

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

 

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

Edited by Maik-vs

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this