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

|
Цитата(Rst7 @ Jan 20 2010, 02:00)  Мда. 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(); } } } }
|
|
|
|
Guest_@Ark_*
|
Jan 20 2010, 08:42
|
Guests

|
Не совсем понятно, что, в конечном итоге, желает автор данной темы. Переключение режимов по времени включения питания - сложности никакой не представляет. Алгоритмы переключения по времени выключения - также были предложены. Причем, вполне работоспособные, в том числе - в рамках приведенной схемы фонарика. Хотите непременно узнать, как работает данное конкретное "китайское чудо"? А оно Вам нужно? Пока только видно настойчивое желание реализовать переключение по "любимому состоянию" регистров. IMHO, это метод изначально "кривой" и ненадежный, и не заслуживает того, чтобы на него опираться. По крайней мере, я бы никогда так делать не стал. Тем более в серийных изделиях. Ну, если автор темы хочет, то как говорится - флаг в руки.
|
|
|
|
|
Jan 20 2010, 08:58
|

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

|
Цитата(ARV @ Jan 20 2010, 11:40)  мои эксперименты с STK500 давали эффект все же за счет остаточного напряжения на емкостях по питанию - там их куча... да, экспериментировать проще на конкретной платке, я из-за питания тоже накололся, пришел к выводу, что за сотню-другую миллисекунд и РОН, и ячейки ОЗУ теряют значение и принимают любимое - единицы секунд на этом эффекте не поймать Цитата(@Ark @ Jan 20 2010, 11:42)  Не совсем понятно, что, в конечном итоге, желает автор данной темы. Переключение режимов по времени включения питания - сложности никакой не представляет. Алгоритмы переключения по времени выключения - также были предложены. Причем, вполне работоспособные, в том числе - в рамках приведенной схемы фонарика. Хотите непременно узнать, как работает данное конкретное "китайское чудо"? А оно Вам нужно? так-то оно так, но очень любопытно все-таки узнать, как реализовано переключение по времени отключения в оригинальной прошивке
|
|
|
|
Guest_@Ark_*
|
Jan 20 2010, 09:13
|
Guests

|
Цитата но очень любопытно все-таки узнать, как реализовано переключение по времени отключения в оригинальной прошивке Точно это можно узнать, только считав прошивку. Либо спросить непосредственно у автора. В любом случае, imho, метод будет основан на RC-цепочке с постоянной времени порядка 1с, в том или ином виде. Других методов (если не считать "просадку" батареи и саморазогрев) я что-то не вижу. Может кто предложит?
|
|
|
|
|
Jan 20 2010, 14:14
|
Местный
  
Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017

|
Цитата(SysRq @ Jan 20 2010, 02:03)  Этот алгоритм уже предлагали в #106. ... Перевод не верен. 106-пост начинается со слов "Я бы сделал так...". Я же привел алгоритм с сайта, на котором продается данный драйвер, а не привел свою собственную реализацию алгоритма. А дословно я и не переводил. Просто пересказал принцип. Хотя соглашусь, что между "переключить" и "оставить" в данном случае есть небольшая разница. Цитата(SysRq @ Jan 20 2010, 02:03)  ... эти инструкции или не про этот фонарик, или автор темы чего-то недоговаривает (о времени включения никто ничего не спрашивал)... Цитата(VladislavS @ Jan 20 2010, 07:35)  Я счастлив, что он прочитал мануал от чего-то, что в руках не держал. А как быть с фонарями, которые есть у меня? 2 VladislavS: Я и не утверждал, что это алгоритм именно вашего драйвера. Я привел алгоритм драйвера по указанной ссылке (которых схемотехнически полностью повторяет Ваш) Но, честно говоря, я сомневаюсь, что для данного девайса китайцы наштамповали кучу разных прошивок. Хотя кто их знает. Китайцев много  Еще есть вероятность того, что писатели мануала ошиблись. И все-таки, попробуйте по приведенному алгоритму попереключать. В частности, сменить группу режимов. Если группа менятся не будет, то прошивка точно не та.
|
|
|
|
|
Jan 20 2010, 18:34
|
Местный
  
Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017

|
Цитата Нет там никаких групп режимов... А что-то попробовать смогу только посоле того как.... Поражает Ваша категоричность. Еще не пробывали, а уже заявляете, что групп нету.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|