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

|
Цитата(Maik-vs @ Jan 11 2010, 22:58)  В общем, сначала нужно ответить на вопрос: зачем диод по питанию, коль скоро 1 мкф не обеспечивает не то, что 2 сек питания, а даже и запись в еепром? Чтобы дым не шел от неправильно вставленной батарейки. Цитата А может быть, он всё же обеспечивает ОЗУ питанием на 2 секунды от перехода в "любимое состояние"? Оно, допустим, хранится в EEPROM и при включении сравнивается с RAM и потом RAM расписывается например нулями. Какое напряжение, по твоему, для этого нужно? А то мой осциллограф никакого не видит. Цитата Зачем тогда нужен делитель напряжения? Напряжение аккумулятора измерять чтобы не допускать его переразряда. Цитата При отключении питания конденсатор АЦП остаётся заряженным внутри кристалла, где изоляция хорошая! И 14пф могут протянуть долго... Я еще не успел досканально проверить эту идею, но слышу её не впервые. Кто-нибудь может подтвердить что такое есть? Цитата Не этот ли пичок мы видим на ногах 2,3 в самом начале на диаграмме из №137? Не думаю, в этот момент напряжение еще не превысило 1.8 и проц еще не стартанул. Да и потом он еще много-много тактов будет в ресете. Цитата Зачем тогда диод, если AMC7135 линейный регулятор? Чтобы проц не спалить неправильно вставленной батарейкой. Цитата Ещё одна ёмкость - 3 входа AMC7135, в дататшите обозванные "band-gap reference", которые можно подать на вход компаратора. Хотя утечка с неё по плате непредсказуема. Этот самый "band-gap reference" я уже общупал со всех сторон. Очень быстро стартует. Я думал его с нарастающим питанием на ADC1 сравнивать - не получается перехода ни при каких условиях. Цитата Нужна полная схема - куда идут ноги 1,2,3,5? Не видно ни на схеме из №64 ни на плате из №94. Никуда. Я же рисовал полную схему. На одной плате просто есть контактные площадки через которые эти ножки можно на землю подключить для управленичя режимами. Есть более качественные фото плат:
|
|
|
|
|
Jan 12 2010, 06:07
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
заразили  провел эксперименты на меге32 (чтобы в терминал выводить). сделал 3 массива по 5 байт в неинициализируемой области ОЗУ: один заполняю 0, второй 0xFF, третий символом 'A'. при включении питания выводил содержимое массивов и сумму всех байтов в каждом. получил следующие результаты: 1. при быстром передергивании питания (менее 1 сек), при среднем (до 5 сек) и при длительном (более 30 сек) невозможно по содежимому ОЗУ определить, как долго оно было обесточено. наверное, при использовании каких-то особых методов анализа шанс определения времени есть, но мне он показался мнимым... 2. каждая ячейка в массивах стремится к своему "любимому" значению при подаче питания, причем с высокой степенью точности: из 30 экспериментов, например, первый байт первого массива у меня всегда был равен 62, второй 188 или 189 и т.д. отклонение в 1 бит, редко в 2. 3. имеется слабая тенденция в увеличении числа единиц при очень долгом обесточивании. такие вот результаты... P.S. экспериментировал на STK500 - питание дергал его выключателем. программа: Код uint8_t __attribute__((section(".noinit"))) str1[5]; uint8_t __attribute__((section(".noinit"))) str2[5]; uint8_t __attribute__((section(".noinit"))) str3[5];
static void prn(uint8_t *s){ uint16_t tmp=0; printf_P(PSTR("\n")); print_line('=',25); printf_P(PSTR("\n")); for(uint8_t i=0; i< 5; i++){ printf_P(PSTR("%u "),s[i]); tmp += s[i]; } printf_P(PSTR("\nSUM=%u"),tmp); }
int main(void){ printf_P(PSTR("\n\nTest RAM")); prn(str1); prn(str2); prn(str3); memset(str1,0,5); memset(str2,255,5); memset(str3,'A',5); while(1); } примерный результат: Цитата Test RAM ========================= 62 188 238 233 34 SUM=755 ========================= 233 22 11 139 253 SUM=658 ========================= 228 195 47 90 155 SUM=715
Test RAM ========================= 62 188 238 233 163 SUM=884 ========================= 233 22 27 139 253 SUM=674 ========================= 228 227 47 90 155 SUM=747
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jan 12 2010, 07:26
|

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

|
Цитата(Maik-vs @ Jan 11 2010, 22:58)  При отключении питания конденсатор АЦП остаётся заряженным внутри кристалла, где изоляция хорошая! И 14пф могут протянуть долго... Тогда при включении питания выбираем ногу 2, висящую в воздухе (?) на вход АЦП и, собственно, АЦПуем  да, есть какой-то эффект! (собственно об этом @Ark давно говорил) взял один свой девайс с тини13 и попробовал. перед выключением цифровые буферы были подключены к одному из висящих в воздухе ADC, вход подтянут к питанию и подключен к АЦП (т.е. внутренний конденсатор заряжается до питания). при включении сразу отключал цифровые буферы от этого входа ADC, оцифровывал вход и отправлял в регистр сравнения ШИМ (смотрел скважность ШИМ). разницу в 1 и 5 секунд видно невооруженным глазом почему-то эффект виден только в том случае, если опорным напряжением АЦП является питание. если в качестве опорного используется внутренний ИОН, то ШИМ всегда зашкален (возможно ИОН не успевает установиться, нужно сдвинуть АЦПирование во времени)
Сообщение отредактировал stells - Jan 12 2010, 07:56
|
|
|
|
|
Jan 12 2010, 11:26
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
я тут продолжал ковыряться с STK500 и мега32 (понятно, что это совсем не тини13 по строению порта)... причем без особых изысков все на Си тестировал. и я обнаружил другой интересный момент: показания АЦП зависят от того, как долго контроллер находился в состоянии сброса при поданном питании!  причем при кратком нажатии на сброс показания АЦП около 1000, а при длительном (минуты 3) опускаются до 390. т.е. я так понимаю, что в данном случае мы наблюдаем как раз постоянную времени разряда по внутрикристальным утечкам... интересно, длительность power-down режима так можно вычислить?  Код int main(void){ ADMUX = _BV(REFS0); ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADPS2); while(ADCSRA & _BV(ADSC)); printf_P(PSTR("\nADC=%u"),ADC); PORTA = 1; while(1); }
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|