Jump to content

    
Sign in to follow this  
VladislavS

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

Recommended Posts

Мануалы настоящие любители трудностей читают только в состоянии крайнего отчаяния. Это не наш метод :)
настоящее отчаяние возникает после 600? :biggrin: видимо, здесь не читатели мануалов собрались, а писатели...

Share this post


Link to post
Share on other sites
Мда. 300+ постов. Один(!) человек, который прочитал мануал.

Я счастлив, что он прочитал мануал от чего-то, что в руках не держал. А как быть с фонарями, которые есть у меня?

 

Вот вам программа для алгоритма по коротким включениям:

#include <ioavr.h>
#include <intrinsics.h>

volatile __regvar __no_init unsigned char mode @ 15;
volatile __regvar __no_init unsigned char power_low_counter @ 14;
volatile __regvar __no_init unsigned int adc_c @ 12;

__no_init __eeprom unsigned char ee_mode;

#ifdef __cplusplus
extern "C" {
#endif
char __low_level_init()
{ 
  CLKPR|=(1<<CLKPCE); 
  CLKPR=3; //Снизим тактовую частоту до 9.6/8 МГц
  
  DDRB=(0<<DDB5)|(0<<DDB4)|(0<<DDB3)|(0<<DDB2)|(1<<DDB1)|(1<<DDB0);
  PORTB=(0<<PORTB5)|(0<<PORTB4)|(0<<PORTB3)|(0<<PORTB1)|(0<<PORTB0);
  
  ACSR=(1<<ACD); //Analog Comparator Disable
  DIDR0=(1<<ADC0D)|(0<<ADC1D)|(1<<ADC2D)|(1<<ADC3D)|(1<<AIN1D)|(1<<AIN0D);
  PRR=(1<<PRTIM0)|(0<<PRADC);
  
  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;      
  
  return 1;
}
#ifdef __cplusplus
}
#endif

#pragma vector=ADC_vect
__interrupt void ADC_Interrupt(void)
{  
  switch(mode)
  {
    case 0: // Яркость 100%
      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);
      PORTB|=(1<<PORTB0);      
      break;
    case 1: // Яркость 40%
      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<<PORTB0);
      PORTB&=~(1<<PORTB1);
      break;
    case 2: // Яркость 4%
      if(ADC<558) power_low_counter++; else power_low_counter=0;
      if(power_low_counter>100) { ee_mode=2; mode++; }
      PORTB&=~(1<<PORTB1);
      PORTB|=(1<<PORTB0);
      __delay_cycles(10);      
      PORTB&=~(1<<PORTB0);
      break;
    default: // Защитное выключение
      PORTB&=~(1<<PORTB1);
      PORTB&=~(1<<PORTB0);
      MCUCR=(1<<SE)|(2<<SM0); //Power Down
      __sleep();
      break;
  }
};

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

  ADCSRA|=(1<<ADSC);  
  __enable_interrupt(); 
  for(;;)  
  {   
    MCUCR=(1<<SE)|(1<<SM0); //Sleep
    __sleep();
    if(adc_c<16000) adc_c++;
    else
    {
      if(adc_c==16000)
      {
        __disable_interrupt();
        PORTB&=~(1<<PORTB1);
        PORTB&=~(1<<PORTB0);
        adc_c++;        
        ee_mode=mode;
        __delay_cycles(75000);
        __enable_interrupt();
      }
    }  
  }
}

Share this post


Link to post
Share on other sites

VladislavS, Вы драйвера так и не зашунтировали? хотелось бы уже отбросить и забыть про этот вариант. правда в какую сторону дальше думать - непонятно.

а алгоритм ARV, как я понял, так никто и не попробовал?

Edited by stells

Share this post


Link to post
Share on other sites
А как быть с фонарями, которые есть у меня?

 

И тем не менее. Несмотря на некоторую избитость этих слов, проверьте внимательно, может все-таки время включения (а не выключения) пляшет?

Share this post


Link to post
Share on other sites
И тем не менее. Несмотря на некоторую избитость этих слов, проверьте внимательно, может все-таки время включения (а не выключения) пляшет?

а ещё лучше выложите видео на какой-нибудь youtube.

Share this post


Link to post
Share on other sites
а алгоритм ARV, как я понял, так никто и не попробовал?
попробовал... :unsure: я сам... боюсь, что мои эксперименты с STK500 давали эффект все же за счет остаточного напряжения на емкостях по питанию - там их куча... когда я стал передергивать питание перемычкой V.TARGET - эффект исчез :( это был выстрел в молоко :(

Share this post


Link to post
Share on other sites
Guest @Ark

Не совсем понятно, что, в конечном итоге, желает автор данной темы.

Переключение режимов по времени включения питания - сложности никакой не представляет. Алгоритмы переключения по времени выключения - также были предложены. Причем, вполне работоспособные, в том числе - в рамках приведенной схемы фонарика. Хотите непременно узнать, как работает данное конкретное "китайское чудо"? А оно Вам нужно?

Пока только видно настойчивое желание реализовать переключение по "любимому состоянию" регистров. IMHO, это метод изначально "кривой" и ненадежный, и не заслуживает того, чтобы на него опираться. По крайней мере, я бы никогда так делать не стал. Тем более в серийных изделиях. Ну, если автор темы хочет, то как говорится - флаг в руки. :)

Share this post


Link to post
Share on other sites
мои эксперименты с STK500 давали эффект все же за счет остаточного напряжения на емкостях по питанию - там их куча...

да, экспериментировать проще на конкретной платке, я из-за питания тоже накололся, пришел к выводу, что за сотню-другую миллисекунд и РОН, и ячейки ОЗУ теряют значение и принимают любимое - единицы секунд на этом эффекте не поймать

 

Не совсем понятно, что, в конечном итоге, желает автор данной темы.

Переключение режимов по времени включения питания - сложности никакой не представляет. Алгоритмы переключения по времени выключения - также были предложены. Причем, вполне работоспособные, в том числе - в рамках приведенной схемы фонарика. Хотите непременно узнать, как работает данное конкретное "китайское чудо"? А оно Вам нужно?

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

Share this post


Link to post
Share on other sites
так-то оно так, но очень любопытно все-таки узнать, как реализовано переключение по времени отключения в оригинальной прошивке
а вот мне чисто из академического интереса хотелось бы получить надежный алгоритм решения задачи, даже не алгоритм, а конкретный код, применимый всегда или почти всегда :) главное, одинаковый результат, а процесс его достижения не обязательно должен совпадать...

Share this post


Link to post
Share on other sites
Guest @Ark
но очень любопытно все-таки узнать, как реализовано переключение по времени отключения в оригинальной прошивке

Точно это можно узнать, только считав прошивку. Либо спросить непосредственно у автора. :)

В любом случае, imho, метод будет основан на RC-цепочке с постоянной времени порядка 1с, в том или ином виде.

Других методов (если не считать "просадку" батареи и саморазогрев) я что-то не вижу. Может кто предложит?

Share this post


Link to post
Share on other sites
а вот мне чисто из академического интереса хотелось бы получить надежный алгоритм решения задачи

ну для АВР с делителем на питании и внутренним АЦП алгоритм понятен и опробован. он сбоил, но видимо потому, что контроллер отключался спонтанно. если ловить момент отключения питания и оставлять кондер УВХ в одинаковом состоянии, то сбои исчезнут

Share this post


Link to post
Share on other sites

Может заняться вопросом поиска сколупывающего прошивку устройства? ;)

Share this post


Link to post
Share on other sites
Этот алгоритм уже предлагали в #106.

...

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

106-пост начинается со слов "Я бы сделал так...". Я же привел алгоритм с сайта, на котором продается данный драйвер, а не привел свою собственную реализацию алгоритма.

А дословно я и не переводил. Просто пересказал принцип. Хотя соглашусь, что между "переключить" и "оставить" в данном случае есть небольшая разница.

 

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

Я счастлив, что он прочитал мануал от чего-то, что в руках не держал. А как быть с фонарями, которые есть у меня?

2 VladislavS:

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

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

Еще есть вероятность того, что писатели мануала ошиблись.

 

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

Share this post


Link to post
Share on other sites

Нет там никаких групп режимов...

А что-то попробовать смогу только посоле того как вот эту штуку починю.

A-50

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