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

VladislavS

Свой
  • Постов

    1 242
  • Зарегистрирован

  • Посещение

  • Победитель дней

    9

Весь контент VladislavS


  1. Я вот ещё что заметил. В сообщении #138 диаграмма китайской прошивки на 5-й ноге. Взял второй вариант платы - там другая прошивка, так как запись в EEPROM и включение нужного режима происходит уже через 400 мкс после старта. Диаграммы 5-й ноги этой прошивки. Мне кажется, или это АЦП работает на этой ноге?
  2. Не осознал. Кого подзаряжаем? Если и правда НОЖКУ, то я могу туда пулап подцепить.
  3. Щупа нет. Слепить что-то в приемлемое время не смогу. Ну так что, пытаться с помощью АЦП измерять отклонение от пол питания?
  4. Легко. Код такой же как на самой первой диаграмме. Щуп 10 МОм 15 пФ. Вот тут запустил три преобразования АЦП подряд. Как в книжке - первое 25 тактов, еще 2 по 13. Забыл написать. Питание отключается генератором импульсов где-то на 166 мс перед съемом этих диаграмм. Щуп при этом держу на ножке, естественно.
  5. ЗЫ: ещё я посмотрел на своей прошивке как выглядит запись одного байта в EEPROM. Один в один совпадает с тем что видим на 6-й мс китайской прошивки. Дальше идет код, который я уже постил. АЦП подключаю навсегда к ADC1 - на нём где-то 4В * 3/13 = 0.9 В. И оставляю его в Free Running режиме. Когда пропадает напряжение, при 1.8 срабатывает BOD. ADC1 при этом, по идее, должнбыть 1.8 * 3/13 = 0.4 В. Но ни как не около 1В, которые показывает осциллограф и тем более не 2В, которые намеряет АЦП.
  6. Немого повозился на обеде. Пока не стал сильно мудрить. PB4 (ADC2) никуда не подключен. При включении питания подключаю на него АЦП и измеряю. ADMUX=(0<<REFS0)| 2; ADCSRA=(1<<ADEN)|(1<<ADSC)|(0<<ADATE)|(0<<ADIF)|(0<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0); while(ADCSRA & (1<<ADSC)); DDRB=(0<<DDB5)|(1<<DDB4)|(0<<DDB3)|(0<<DDB2)|(1<<DDB1)|(1<<DDB0); PORTB=(0<<PORTB5)|(0<<PORTB4)|(0<<PORTB3)|(0<<PORTB1)|(0<<PORTB0); temp=ADC; после всего temp равно 560 где-то. 2.1 В. Ставлю щуп на PB4. Желтый луч - питание, Зеленый - PB4 (ADC2). Хорошо видно подключение АЦП и момент оцифровки. Во-первых, напряжение далеко не 2.1 В, как это намерил АЦП. Во-вторых, в начале оно выше чем было на АЦП в момент выключения. В-третьих, занчение АЦП меняется от длительности выключенного состояния, но зависимость достаточно сложная. От питания, самом собой, тоже зависит. В-четвертых, на китайской прошивке ничего подобного и в помине нет ни на одной ножке. Ну да хрен с ними - мы идем своим путем. То же самое, но поставил фузы на, чтобы стартовал через (14CK + 4 ms).
  7. Ну если подключен, то я не понимаю как это вообще может работать. Проц без единицы на ресете не может работать. Либо при выключенном АЦП этот пресловутый конденсатор отключен от мультиплексора, либо одно из двух...
  8. ISV, добро пожаловать на форум! All, вот видите!!! Не только у меня фонарик с "волшебной" кнопкой есть! Ресет естественно не отключен, иначе SPI-программирование не будет работать. А вот мультиплексор то при включении действительно на ADC0 включен. Получается, искать свободную ногу и не надо - вот она! Интересно, подключен ли физически аналоговый вход ADC0 при использовании первой ноги как ресет?
  9. Обещаю завтра всё опробовать, но я что-то запутался... Где находится та ёмкость, напряжение на которой надо измерять? Между мультиплексором и АЦП или в самом АЦП? Тогда мне стоит испробовать следующее: - При штатной раоте АЦП постоянно подключен ко входу ADC1 и делает свои дела. - При пропадании питания я должен успеть отключить АЦП от входа? Для этого ADEN=0 надо сделать? Или преключить мультиплексор на свободную ногу? Или он сам отключится при срабатывании BOD? - При включении переключить мультиплексор АЦП к любой свободной ноге, настроенной на вход без пулапа. - Включить АЦП и одновременно запустить преобразование. - На основании показаний АЦП ставлю нужный режим и перехожу к штатной работе. На бумаге вроде красиво выглядит - посмотрим что в железе получится...
  10. И пропадает сразу как выходим на режим. Наверняка ведь важно чтобы в момент выключения там 1 было.
  11. Здорово что на АЦ что-то нащупали. Сейчас посленовогоднюю текучку раскидаю - пощупаю тоже. Только я вот думаю на какой ноге они могли бы это делать? На всех свободных при выключении нули. Остается только ADC1 - на ней 0.8 В висит. Не помешают ли они в момент включения?
  12. Чтобы дым не шел от неправильно вставленной батарейки. Какое напряжение, по твоему, для этого нужно? А то мой осциллограф никакого не видит. Напряжение аккумулятора измерять чтобы не допускать его переразряда. Я еще не успел досканально проверить эту идею, но слышу её не впервые. Кто-нибудь может подтвердить что такое есть? Не думаю, в этот момент напряжение еще не превысило 1.8 и проц еще не стартанул. Да и потом он еще много-много тактов будет в ресете. Чтобы проц не спалить неправильно вставленной батарейкой. Этот самый "band-gap reference" я уже общупал со всех сторон. Очень быстро стартует. Я думал его с нарастающим питанием на ADC1 сравнивать - не получается перехода ни при каких условиях. Никуда. Я же рисовал полную схему. На одной плате просто есть контактные площадки через которые эти ножки можно на землю подключить для управленичя режимами. Есть более качественные фото плат:
  13. Ещё раз напомню для вновьподтянувшихся после выходных: вопрос не в доделке конкретно этой платы. Я легко могу поставить электролит любой емкости, перепаять все резисторы - хоть час будем спать. Задача стоит не так! Если честно, не помню ни автора, ни названия фантастического расказа... Там собрали ученых-инженеров и показали фильм про то как мужик сделал антигравитационный ранец. Изобретатель одел его за спину и полетел, но через несколько секунд взорвался, у неся с собой тайну изобретения. Собравшиеся, поверив что это реально, через некоторое время сделали аналог, но размером со стиральную машину. Как оказалось потом, фильм был постановкой, единственной целью которого было задеть честолюбие разработчиков, которые решили задачу раньше считавшуюся неразрешимой. Вот тут как раз та же постановка задачи, с одной лишь разницей, что такой фонарик может купить каждый и убедиться что это действительно работает!
  14. Вчера попробовал с компаратором повозиться. В даташите на каждом углу написано, что опорное напряжение появялется не сразу, должно стабилизироваться и т.д. Подал на + компаратора опорное напряжение 1.1, а на минус вход ADC1. И... Что-то я не заметил, что оно с каким-то опозданием появляется.
  15. На 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(); } }
  16. Снял осциллограммы включения. Видно намного больше чем ожидал. Сейчас потихоньку выложу - будем трактовать. Начну с самого питания. На 8-й ноге при включении вот что видно благодаря высокому выходному сопротивлению ключа по питанию. Я тут вижу следующее: - через 6 мс после включения, похоже, происходит запись в EEPROM. Там как раз 2 провала по 1.8 мс. Тут у меня вопрос к знатокам. Это видно стирание+запись или запись двух ячеек памяти? - через те же 6 мс пошли пички частотой около 5 кГц - это ШИМ - его я видел вторым лучём. То есть, через 6 мс контроллер уже всё для себя решил и дальше только молотит ШИМ. Причем, ШИМ скорее всего аппаратный, поскольку даже в режиме 100% яркости есть короткий импульс нуля. Дальше 2 и 3 ноги (PB3, PB4). На них диаграмма совершенно одинакова, так что выложу одну. Я думаю, что это опрос наличия перемычек на землю. При замыкании PB4 на землю отключаются лишние режимы работы фонаря - стробы. Опять таки, через 6 мс они уже не нужны и их отпускают.
  17. Проверено. Все что касается WD сбрасывается при ресете намертво. Ну настолько точного измерения я сделать не смогу. Пока единственное направление, дающее хоть что-то - неинициализированная переменная. 1. Она действительно при включении стремится к какому-то "любимому" состоянию. 2. Увеличение разрядности этой переменной автоматически увеличивает время пока её "колбасит". Прошу прощения за жаргон, просто пока не удаётся обуздать этот процесс: 1. Нужен сходящийся алгоритм, позволяющий вычислить "любимое" состояние и потом его уточнять со временем. 2. Внешние воздействия (висящие провода, поднесённая рука и т.д.) сильно влияют на прцесс.
  18. Да, драйвер обычный стабилизатор тока. ШИМ делает контроллер. 1 на VDD - 350 мА, 0 на VDD - 0 мА :)
  19. Ну почему же офтоп? С фонарика всё и началось. Меняешь драйвер, и будет тебе мультирежим :) Ну расшифруй, что ли? Чем без АЦП лучше чем с АЦП?
  20. http://www.dealextreme.com/products.dx/category.940 - выбирай :) 99% из них с торцевой кнопкой. Так что, те что многорежимные и те что с памятью это оно. http://www.dealextreme.com/details.dx/sku.6190 - отдельно драйвер. http://www.dealextreme.com/details.dx/sku.7612 - отдельно драйвер. Думаю что вот эти точно с таким драйвером: http://www.dealextreme.com/details.dx/sku.32720 http://www.dealextreme.com/details.dx/sku.15335
  21. Спишем на НГ :) Ибо предложил ты алгорит определения кратковременного включения :)
  22. Ну собственно это оно и есть, только топология чуть другая. Со стабилизированным источником питания, с нагрузкой и без переключение режимов работает. Максимум может "подготовиться" к последующему включению - установить какой-то признак, который недолго хранится... С праздником всех! По этому поводу жена отобрала все приборы на сегодня. :)
  23. Без нагрузки режимы переключаются. PB1 падает быстрей чем питание :)
×
×
  • Создать...