Полная версия этой страницы:
Сбой при включении
Lexdaw
Sep 29 2011, 08:04
Прибор (mega8515) опрашивает по USART, производит вычисления,выдает управляющий сигнал.
При подаче питания иногда(1 из 3..5 раз) не вычисляет один из параметров(=0).Есть кнопка перехода в стартовый режим.
По ней всё работает - всегда.При переходе в стартовый режим производиться обнуление ОЗУ,полная иницилизация всех таймеров,Usart и тп(всё как и при включении).Даже завел этот переход на старт МК.Добиться устойчивого этого сбоя тоже не получается.
По Reset тоже всё работает.
Где туплю?
какая травка поможет словить этот глюк?
AlexFTF
Sep 29 2011, 08:23
Цитата(Lexdaw @ Sep 29 2011, 15:04)

При подаче питания иногда(1 из 3..5 раз) не вычисляет один из параметров(=0).......
По Reset тоже всё работает.
Не совсем понятно, так как при подаче питания происходит аппаратный сброс мк.. Проблема как мне видится в коде...
Насколько я понял: неверное вычисление параметра получается из-за неверных принятых данных по USART. Следовательно - какая-то "беда" при первом опросе: получаете неверные данные. Кнопка перехода в стартовый режим - это "не честный" сброс: USART уже проинициализирован...
Вероятно, какая-то помеха проходит по линиям USART от момента включения устройства (подачи питания) до инициализации USART.
Lexdaw
Sep 29 2011, 08:35
Видимо не точно объяснил.До вычисления, по USART принимается куча данных и не один раз и правильно.
А вход в стартовый режим специально делал чтобы сбить - не выходит.
Сам в шоке.
Цитата(Lexdaw @ Sep 29 2011, 12:35)

Видимо не точно объяснил.До вычисления, по USART принимается куча данных и не один раз и правильно.
А вход в стартовый режим специально делал чтобы сбить - не выходит.
Сам в шоке.
Если у вас по ресету работает нормально, а сбоит только при подаче питания, то причина сбоя может быть в том, что напряжение питания нарастает слишком медленно, и МК пытается делать вычисления на напряжении питания, которое еще не достигло номинала. Поставьте нужный BODLEVEL в фузах, чтобы МК не просыпался при недостаточном напряжении. Или поставьте аппаратный супервизор.
Цитата(Xenia @ Sep 29 2011, 12:43)

Поставьте нужный BODLEVEL в фузах, чтобы МК не просыпался при недостаточном напряжении.
BODEN запрограммировать не забудьте.
AlexFTF
Sep 29 2011, 09:05
Цитата(Xenia @ Sep 29 2011, 15:43)

причина сбоя может быть в том, что напряжение питания нарастает слишком медленно и МК пытается делать вычисления на напряжении питания, которое еще не достигло номинала.
Вряд ли, ведь в мк есть POR и если напряжение питания не достигнет определенного уровня, мк даже не запуститься.
ILYAUL
Sep 29 2011, 09:05
QUOTE (Xenia @ Sep 29 2011, 12:43)

..... и МК пытается делать вычисления на напряжении питания, которое еще не достигло номинала.
Что-то не так. МК не начнёт вычисления, пока напряжение питания не достигнет минимально допустимого предела , при котором он работоспособен.
Значит он вычисления сделает правильно и reset по питанию в любом случае отработает , пока он не достигнет порогового значения за которым МК работает надёжно . Можно просто удлинить SUT.
Цитата(NSTU @ Sep 29 2011, 13:05)

в мк есть POR и если напряжение питания не достигнет определенного уровня, мк даже не запуститься.
Не факт, что после достижения Vpot и запуска МК напряжение питания не просядет вследствии запуска МК и увеличения потребления. Кроме того, типичное значение Vpot=1.4V, когда производитель гарантирует работоспособность МК при напряжении питания 2.7V.
ILYAUL
Sep 29 2011, 09:43
QUOTE (Палыч @ Sep 29 2011, 13:31)

Не факт, что после достижения Vpot и запуска МК напряжение питания не просядет вследствии запуска МК и увеличения потребления. Кроме того, типичное значение Vpot=1.4V, когда производитель гарантирует работоспособность МК при напряжении питания 2.7V.
Но и мин. напряжения BOD 1.8V и ставить его на этот уровень смысла не имеет , если MK, при таком питании, не запускает генератор - стоит. Порог выше , не означает , что
QUOTE
напряжение питания не просядет вследствии запуска МК
и будет опять reset. Всё таки проще "затянуть" timeout reset
Lexdaw
Sep 29 2011, 10:04
Ещё раз все вычисления происходят через 3- 5 мин. инфа по USART читается.
Только что сделал эксперимент Вкл питние - Reset пинцетом - сбой
Не выключая питания - Reset - все нормально.
Питание нормальное.
Цепочка расчета до последнего действия верна(тем паче всё работает потом )
менял действия местами - эффект тот же.
Бьюсь неделю.Уже начинаю глупо ххихикать.
AlexFTF
Sep 29 2011, 10:16
Цитата(Lexdaw @ Sep 29 2011, 17:04)

Ещё раз все вычисления происходят через 3- 5 мин. инфа по USART читается.
Только что сделал эксперимент Вкл питние - Reset пинцетом - сбой
Не выключая питания - Reset - все нормально.
Питание нормальное.
Цепочка расчета до последнего действия верна(тем паче всё работает потом )
менял действия местами - эффект тот же.
Бьюсь неделю.Уже начинаю глупо ххихикать.
Зачем резет пинцетом? Кнопки нет? Схему можно глянуть?
Lexdaw, если я правильно понял сбой возникает иногда и только после включения питания?
ILYAUL
Sep 29 2011, 10:17
QUOTE (Lexdaw @ Sep 29 2011, 14:04)

Только что сделал эксперимент Вкл питние - Reset пинцетом - сбой
Это значит , что при вкл. питания reset удерживали пинцетом? Поясните
1. Убедиться, что при неверных расчетах данные, принятые по USART - верны.
2. Внимательно просмотреть глобальные и статические переменные на предмет их начальной инициализации.
Lexdaw
Sep 29 2011, 10:54
Понимаю, что звучит как бред. Но я, честное слово, пишу не из психушки.
Итак.
1. Подаю питание на прибор, запускаю в работу(по кнопке).Дойдя до нужного места нет расчета параметра.
Делаю Reset (или по кнопке переход в начальное состояние),запускаю в работу - параметр расчитан.
2. Подаю питание на прибор, запускаю в работу(по кнопке).НЕ Доходя до нужного места
делаю Reset (или по кнопке переход в начальное состояние),запускаю в работу - нет расчета параметра.
Но при переходе на старт ,я очищаю ОЗУ,и РОН.По новой инициализирую счетчики и USART.
Использую прерывания по переполнению сч Т0, компаратор А сч Т1, и прерывания для USART.
Где я упускаю.
Цитата(Lexdaw @ Sep 29 2011, 14:54)

Где я упускаю.
Ну, очень похоже, что что-то не инициировано при старте программы. Попробуйте при неверных расчетах произвести расчет ещё раз не принимая новых данных. Если при повторном расчете всё пройдёт верно - что-то не проинициализировали/не дотёрли/не установили....
ILYAUL
Sep 29 2011, 11:14
А у Вас переход на старт и reset это одна и та же метка?
QUOTE
при переходе на старт ,я очищаю ОЗУ,и РОН.
Обычно это делается и по reset
Очень похоже, что при расчетах используется некая переменная/флаг, котороя не инициируется при старте программы. При выполнении расчетов в эту переменную/флаг попадает "разумное" значение и остаётся в памяти при ресете, поэтому все последующие расчеты после первого расчета и последующего ресета проходят нормально. При выключении питания - память (ОЗУ) портится и первый расчет опять производится с ошибкой. Нестабильность неверных расчетов после включения питания объясняется "случайным" содержимым неинициированной ячейки, которое может восприниматься программой как "хорошее".
Lexdaw
Sep 29 2011, 12:08
Я это как бы понимаю,но глаз замылился.Все вроде чищу,ан нет.
Видать нужны капли покрепче.(Вот оно то самое где без 100 грамм никак)!
Цитата(Lexdaw @ Sep 29 2011, 16:08)

Я это как бы понимаю,но глаз замылился.Все вроде чищу,ан нет.
Если программа - "не секретная", хорошо структурированная и откоментированная, то выложите проект - может быть кто свежим взглядом "баг" найдёт...
zhevak
Sep 29 2011, 18:35
Забудьте про 100 г. Вообще. Навсегда.
Алкоголь -- это не пищевой продукт, а слабо действующий яд, который при даже небольших дозах все равно разрушает организм хоть и минимально. Зачем это Вам надо? У Вас в жизни проблем нет? Приходится придумывать, изобретать?
Задавайте вопросы не тут на форуме, а самому себе. Разгадывать Ваши шарады наверно кому-то и будет интересно, но ядреные специалисты вряд ли будут вестись на Ваши "кроссворды", у них своих дел выше крыши. Они, конечно, помогут Вам, но при условии -- максимально предоставленная информация с Вашей стороны.А пока от Вас исходят одни только эмоции. Загадки угадывать -- не интересно. Интересно исследовать.
Как самому бороться с проблемой? -- Копать. Копать глубже. Не происходит инициализация чего-то там к указанному сроку? Хорошо! Почему не происходит? Кто эту инициализацию осуществляет? Что является критерием правильно инициализации? Как проверить? Достаточно-ли просто для этого повесить на свободную гогу ЛЭД и зажечь его или нужно "вывести наружу" целый блок информации?
Думайте, стройте предположения, проверяйте. Запаяйте два ЛЭДа. Выводите на них разные данный из разных частей программы.
Откуда нам знать, что там у Вас твориться? Играть в угадайку -- неблагодарное занятие. Жизнь и без этих Что-Где-Куда быстро проходит.
Уважайте тех, кто может Вам помочь. Не пытайтесь захомутать в свою игру. Либо мы работаем, и помогаем друг другу решать проблемы, либо мы балаганим.
Я очень надеюсь, что Вы не обидитесь на мои нравоучения, а сделаете правильный вывод. Пожалуйста, добавьте серьезности и у Вас все начнет получаться.
Итак. С чего начнем?
Lexdaw
Sep 30 2011, 05:14
Благодарю всех за участие. Проблема, хм , глупость побеждена.
Моя истерика была конечно неуместна, но принцип «пытаясь объяснить другим –наконец-то сам поймешь чего творишь» сработал.
Выкладывать текст кода посчитал неоправданной жестокостью Я ж не садист заставлять бродить по этим сумеречным лабиринтам.
Оказалось в одной из п/п математики(пользуемой давно и часто) не было предварительной очистки одного из рабочих регистров.
Ёще раз всем спасибо.
P.S.А обижаться, я давно такой глупой привычки не умею.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.