Амбер, проект еще не закончен, и я только попросил помощи у более знающих форумчан, т.к. моих знаний не хватило. За что им огромное спасибо! Требовать не нужно, все будет чуть позже (мне не жалко), как только проверю в железе и отполирую прошивку и все прокомментирую. P.S. Все разрабатывалось для такого фонаря:
Продолжаю "балет" с драйвером, снова возникли проблемы: перекинул порты для удобства разводки платы. Теперь PB2 - кнопка, PB4 - полевик, подтягивающий делитель к минусу, PB3 - АЦП. Так вот АЦП перестал работать на макетке (никак не реагирует на положение движка переменника, напряжение на входе АЦП меняется). В протеусе все норм. Макетка: Плата, под которую подгоняю прошивку: Схема в протеусе: Исходник Atmel Studio 7:
if ((PINB & (1 << PB2)) && !flgLngPress) { _delay_ms(10); // задержка (защита от дребезга) while (PINB & (1 << PB2)) { butCount++; // начало отсчета нажатия кнопки _delay_ms(10); if (butCount > 200) break; // выходим после 2 сек в любом случае (время повтора) }// end while if (butCount >= 50){ // ~1 сек flgLngPress = true; flgPress = false; // сбрасываем флаг нажатия butCount = 0; // обнуляем счетчик времени нажатия }// end if else flgPress = true; // клик }// end if
if (flgLngPress && (PINB & (1 << PB2)) == 0){ // если отпустили после длительного нажатия switchLED = false; flgLngPress = false; flgPress = false; // сбрасываем флаг нажатия flgClick = false; }// end if
if (flgPress && (PINB & (1 << PB2)) == 0){ // отпустили кнопку flgClick = true; // устанавливаем флаг клика flgPress = false; // сбрасываем флаг нажатия butCount = 0; // обнуляем счетчик времени нажатия }// end if
if (flgLngPress && !switchLED){ // было удержание кнопки LedMode = !LedMode; // переключаем на другой светодиод i = 1; Set_PWM(); // устанавливаем режим светодиода switchLED = true; }// end if
if (flgClick){ // был клик flgClick = false; // сбрасываем флаг клика i++; // инкрементируем режим PWM if (i > 3) i = 0; // обнуляем счетчик Set_PWM(); // устанавливаем режим светодиода if (i == 0) sleep_MODE = true; else sleep_MODE = false; }// end if
if (lowBat){ i = 0; BlinkLed(); RunSleep(); }// end if
if (sleep_MODE) RunSleep();
}// end while(1) }// end main
Самое интересное, что в "железном" варианте на плате вообще беда какая-то - при увеличении напряжения больше 3.3В начинает все глючить не реально (тинька другая). Зашил туда обычный блинк (1 сек пауза) для проверки, тоже ведет себя не адекватно, начинает хаотично частота меняться, потом вообще может потухнуть. При уменьшении напряжения все приходит в норму...
Проверил АЦП на макетке, убрав не используемые строки - он работает!
На макете блокировочный конденсатор имеется? Питание МК не просаживается (прямо на выводах)? Светодиоды к макету уже подключены мощные или пока сигнальные? Какой ток прогнозируется в цепях светодиодов? Делитель напряжения питания до АЦП на макете уже коммутируется ненужным (дополнительным) транзистором или пока подключен постоянно?
Добавлено (09.07.2019, 22:00) --------------------------------------------- Никогда не использую такие макеты. Делаю приблизительную печатную плату с пятаками для внутрисхемного программирования, на ней прошивки и проверяю. Печатка корректируется крайне редко. И никаких проблем с плохими контактами, наводками из-за длинных проводов и т.д.
На макетке блокировочного конденсатора нет (до этого все работало). На макетке не просаживается, на плате не проверял. На макетке стоят обычные диоды через резисторы (имитация затвора N-канального полевика), на печатке схема уже собрана (печатку с номиналами выше выложил) Ток для светодиодов до 0,5 - 0,7А (в оригинале 0,5А) Делитель на макетке выполнен в виде переменника 25кОм, подключен постоянно +-, средний вывод на АЦП. На печатке висит от + в воздухе (на PB4 через 27кОм), когда подается питание, полевик должен притянуть его к минусу.
По поводу макетки - первый раз такой геморрой.
Самое главное, что если оставляю строки работы с АЦП и просто типа блинка (код выше), то АПЦ (код) работает, как нужно.
На макетке разобрался в чем дело - ADCSRA |= (1<<ADEN), видимо, после выхода из сна не включает полностью АЦП. Наверное при обнулении этого бита регистра обнуляются еще какие-нибудь биты. Проинициализировал АЦП полностью.
Собрал макетку, включил, посмотрел, исправил - заработало. Ничего там не обнуляется, просто после выключения АЦП опять нужно запустить: ADCSRA |= (1<<ADEN)|(1<<ADSC); Непонятно только как
Цитата34kilowatt ()
до этого все работало
.
Цитата34kilowatt ()
Ток для светодиодов до 0,5 - 0,7А (в оригинале 0,5А)
Или провода от аккумулятора до платы должны быть очень толстыми, или питание МК и силовых цепей нужно разделить, иначе правильного измерения напряжения аккумулятора не получится.
Цитата34kilowatt ()
"железном" варианте на плате вообще беда какая-то - при увеличении напряжения больше 3.3В начинает все глючить не реально
Насмотрелся когда-то дебильных видео о лужении плат с помощью глицерино-спирто-канифольного флюса. Залудил печатку "чего-то", сделал "что-то", работает, но плохо. Пока не отмыл плату ацетоном (спирт не помог) "что-то" нормально не заработало. Глицерин после этого только для обуви.
Вот я и говорю, что бит обнулился. Оно работало! Тоже не знаю как. Поставил провода с этого фонаря, очень тонкие но потерь значимых на них нет. Думаю на вход АЦП поставить кондерчик маленький 1-10нФ, думаю, должно хватить. После первого включения и глюков плату отмыл и спиртом и ацетоном, хотя может по тинькой еще ЛТИ мог остаться, попробую сегодня отпаять и протереть еще. Раньше никогда на стадии проверки флюс не отмывал, даже в импульсниках , только в готовом устройстве, всегда все работало, как нужно.
Если погуглить "флюс лти проблема" получим кучу такого: "Флюс хороший ,достаточно активный.Лужу стальные изделия предварительно подогревая металл. Проводимость всё таки есть По крайней мере, то что оставалось под большими крпусами микросхем с невозможностью промыть, делало устройство совершенно не работоспособным. К сожалению очень много подделок." Хотя оригинал должен быть нейтральным.
На самом деле я им не лужу уже давно, за редким исключением (этот случай), хотя у меня и оригинальный (покупался лет 8 назад, так и стоит). В основном раствором паяльной кислоты с последующей нейтрализацией содой и мылом. Когда отмыл плату от ЛТИ стало гораздо лучше работать, но... Выше я уже писал.
питание МК и силовых цепей нужно разделить, иначе правильного измерения напряжения аккумулятора не получится. Цитата 34kilowatt ()
Вы меня натолкнули на мысль, и она оказалась верной. У светиков при повышении напряжения ток потребления резко возрастает. Подумал, что при первом импульсе кратковременно просаживается напряжение. Мультик такие резкие даже не увидит, а этого хватает, чтобы МК отрубился, т.к. у меня только блокировочный кондер стоит в питании на 0,1 мкФ. Поставил в разрыв резисторы 10 Ом и "о чудо", все заработало, как и должно.