Убил две меги, что делать?
- Войдите на сайт для отправки комментариев
Доброго времени суток!
Есть вот такой девайс:
Внизу mega2560, на нем ethernet shield w5500, сбоку в гребенке часы реального времени на базе чипа 1302 (задействованы пины с 16 по 20, причем 19 и 20 в качестве питания). Питание внешнее 9 в.
В течении недели писал код, вроде все было нормально, но вчера перестали заливаться скетчи. Порт определяется но в момент заливки разово всыхивают диоды rx/tx и все зависает. Пробовал подключать к другим портам и к другому ПК и отдельно плату МК, результат тот же.
Решил либо внешнее питание либо статика убило мой МК.
Достал новую mega2560, собрал тот же бутерброд, но подключил к ноутбуку с гарантированно рабочими портами. Питание исключительно через USB. Запустил, залил тестовую прошивку, которая blink диодом на 13 пине. Работает.
Начал заливать свою прошивку - девайс умер с точно такими же симптомами, один раз вспыхивают диоды rx/tx и зависает.
В скетче ничего такого нет, размер 600 строк. Неужели скетчем можно убить девайс? Или же проблема в модулях? Есть еще одна mega, но что то страшно стало, решил с вами посоветоваться, что делать дальше?
Без всяких плат проверить питание ( хотя-бы на ISP коннекторе).
Если 5 Вольт есть - прошить blink with delay
а если вытащить шилд ардуина также не прошивается?
Неужели скетчем можно убить девайс?
Можно. Точно не помню всех танцев, но идея была в том, что пины rx/tx используешь как обычные - подаёшь постоянный HIGH сразу же при загрузке (может на один HIGH, а на другой LOW - не помню) - кирдык, больше ничего не прошивается. Может там чего-то ещё было (не в одном HIGH дело) - не знаю, но был у меня скетч. который убивал nano'ки на раз.
Без всяких плат проверить питание ( хотя-бы на ISP коннекторе).
Если 5 Вольт есть - прошить blink with delay
Прошивка через ISP имеете ввиду? Не пробовал еще, надо почитать
При том скетче, что у меня, прошивка через ICSP не помогала.
а если вытащить шилд ардуина также не прошивается?
Нет
Неужели скетчем можно убить девайс?
Можно. Точно не помню всех танцев, но идея была в том, что пины rx/tx используешь как обычные - подаёшь постоянный HIGH сразу же при загрузке (может на один HIGH, а на другой LOW - не помню) - кирдык, больше ничего не прошивается. Может там чего-то ещё было (не в одном HIGH дело) - не знаю, но был у меня скетч. который убивал nano'ки на раз.
Вот тут у меня для питания используется пин 19 и 20, но это вроде дополнительные последовательные порты UART, а заливка идет через пины 0, 1? Неужели это может быть причиной?
Попробуйте все лишнее отключить, открыть блинк, нажать заливку и в этот момент несколько раз нажать кнопку ресет на плате. Если не пойдёт заливка, секцию сетап из скетча сюда.
Можно. Точно не помню всех танцев, но идея была в том, что пины rx/tx используешь как обычные - подаёшь постоянный HIGH сразу же при загрузке (может на один HIGH, а на другой LOW - не помню) - кирдык, больше ничего не прошивается. Может там чего-то ещё было (не в одном HIGH дело) - не знаю, но был у меня скетч. который убивал nano'ки на раз.
идея в том, что
А этот скетч еще остался? Хотелось бы посмотреть.
Не знаю, я честно использовал 0 и 1 и этим убил Nano.
На отдельно стоящей микросхеме (не на ардуино, а на голой atmega328) пользую 0 и 1 пины в хост и в гриву - всё отлично.
Нет, нету. давно дело было. Я тогда даже разбираться не стал что именно произошло, просто запомнил на будущее, что если скетч для ардуино, а не для голой микросхемы, то пинов 1 и 2 у меня "просто нет". С тех пор так и живу :)
Нет, нету. давно дело было. Я тогда даже разбираться не стал что именно произошло, просто запомнил на будущее, что если скетч для ардуино, а не для голой микросхемы, то пинов 1 и 2 у меня "просто нет". С тех пор так и живу :)
Наверное имеете ввиду пины 0, 1?
Нет, не получилось. Вот код, там довольно много:
Наверное имеете ввиду пины 0, 1?
Да, конечно, очепятка.
Там в ходе инициализации используется функция для проверки свободной памяти, вот ее код:
Вот мои наблюдения:
1. В момент заливки переодически загорается диод rx с переодичностью 10 сек.
2. Иногда, примерно 50 на 50 при подключении меги к usb порту компьютер уходит в ребут.
3. При подключении к USB порту ноутбука выходит сообщение о нехватке питания для устройства
И что? Пусть используется. Она никого не обижает. Она, кстати, не объём свободной памяти возвращает, а расстояние от стека до кучи.
И что? Пусть используется. Она никого не обижает. Она, кстати, не объём свободной памяти возвращает, а расстояние от стека до кучи.
это продолжение предыдущего поста с кодом, там есть вызов функции Serial.print(_FreeRam()); поэтому и привел код данной функции. То что она безобидна, я это знаю. А вот то что это место между стеком и кучей не знал, спасибо!
2. Иногда, примерно 50 на 50 при подключении меги к usb порту компьютер уходит в ребут.
3. При подключении к USB порту ноутбука выходит сообщение о нехватке питания для устройства
Это похоже на аппаратную проблемму, защита usb срабатывает при токе на шине более 0,5 А.
Так быть не должно.
У Вас похоже проблема с прерываниями, вкуривать лень мне сейчас, но в скетче каша полная.
Теперь по сути, нужно успеть залить скетч до того, как произойдёт инициализация.
Попробуйте открыть блинк, при отключенной Дуне, нажать залить и когда пойдёт процесс воткнуть Дуню и так, пока не пойдет процесс заливки. Нажатие ресета тут может не помочь, только подача питания, важно, чтоб устройство своевременно определилось системой и иде не успело сообщить об ошибке.
Можно ещё попробовать втыкать Дуню в usb с зажатой кнопкой ресет и отпускать её втнужный момент.
Можно. Точно не помню всех танцев, но идея была в том, что пины rx/tx используешь как обычные - подаёшь постоянный HIGH сразу же при загрузке (может на один HIGH, а на другой LOW - не помню) - кирдык, больше ничего не прошивается. Может там чего-то ещё было (не в одном HIGH дело) - не знаю, но был у меня скетч. который убивал nano'ки на раз.
идея в том, что
Что то логика от меня ускользает. Т.е. если пин RX выставить как OUTPUT, а затем тыкать в него 5 вольт он сгорит? Тогда вопрос, а чем отличается OUTPUT от INTPUT на физическом уровне?
2. Иногда, примерно 50 на 50 при подключении меги к usb порту компьютер уходит в ребут.
3. При подключении к USB порту ноутбука выходит сообщение о нехватке питания для устройства
Хм, сработало! Причем оба способа, но с удержанием ресета проще. Огромное человеческое спасибо! Осталось только определить место в коде, убивающим МК. Как найду, обязательно отпишусь.
Не верно прерывания назначены на ноги, посмотрите распиновку, там полный атас... У Вас начинает обрабатывать прерывания на уарте, когда проходит инициализация. Отработайте код частями, тупо куском провода симулируйте срабатывание прерывания и скажем зажигайте светодиод, как отработаете его стабильное срабатывание, можете использовать в готовом проекте.
Gres, спасибо, я тоже попробую свою нанку оживить как доберусь до неё.
Вау! Пасибки, включать дуньку с зажатым ресетом оказывается штатный способ залить скетч до инициализации .. тоже, когда обнаружил что накосячил с прерыванием не мог залить нифига. Потом дошло зажать ресет. Пасибки. Я думал мне просто свезло, что залился блинк.
Тут на сайте косяк в референсмануалах по прерываниями меги, инфа не соответствует расспиновке, вот и шагают все массово по этим граблям.
У меня заливка скетча идет примерно 8 сек. Если в этот момент завершится инициализация прерывания, все МК умирает. Поставил задержку перед инициализацией на 15 сек. Теперь все нормализовалось.
Но появилась другая проблема, первый раз заливается нормально, на второй зависает, приходится передергивать USB
UPD. Девайс работает до первой перезагрузки, т.е. открыл окно терминала - работает, закрыл, снова открыл - нет. Передернул USB, опять работает. Буду копать.
Когда МК стартует, при наличии бутлоадера, начинается с его выполнения, он в свою очередь проверяет есть ли данные в уарте, на то он и бутлоадер. Если данные есть, он загружает прошивки, если нет, переходит к выполнению секции сетап Вашего скетча. А в сетапе у Вас начинается каша с прерываниями и МК уже не до уарта и прошивки, он занят глухим циклом обработки прерываний. Потому и нужно успеть залить скетч до того, как дойдёт до исполнения кода прерываний. Его и отрабатывайте отдельно, отдельным, маленьким скетчем, потом встаавите в свой проект.
Косяк Ваш в том, что у Вас инициализированно прерывание, а функция его обработки отсутствует, он поймал прерывание, просто встал и тихо курит незная, что ему делать дальше.
Хотя..., для точной причины нужно видеть весь скетч и схему подключений.
В общем поигайтесь с этим отдельно, отладьте, а потом в рабочий проект.
Ну почему, функция у меня есть
и она нормально отрабатывала. И каши с прерыванием у меня нет, там всего одна строчка отвечающая за инициализацию прерывания
Все остальное это для вывода на экран текущего прерывания и его пина, исключительно в информативных целях
Есть подозрение что в данный момент у меня пин прерывания не подтянут к земле и потому куча срабатываний прерывания. Завтра все причешу и попробую еще раз.
А вообще, вот полный скетч, может кому пригодится. Это файловый веб сервер с функцией отправки срабатывания датчика на сервер сбора данных. Скетч не полный, на данный момент дописываю функционал для сбора данных во временный буфер при недоступности сервера.
Ну почему, функция у меня есть
Блин ну пошто народ так любит в полной темноте бродить с растопыренными по сторонам руками и предполагать, что там впереди?
Закоментируйте все в этой функции, вставьте включение и выключение светодиода встроенного на плате и Вы точно будете знать, что у Вас происходит.
Подобным образом (играми с ногами 0,1) я спалил мегу. Через ISP она прошивается легко. Исследовал ноги (резал плату) они сдохли именно у меги. Ну и ничего - нет одного СОМ порта и заливать сложнее... но жива в остальном.
Что то логика от меня ускользает. Т.е. если пин RX выставить как OUTPUT, а затем тыкать в него 5 вольт он сгорит? Тогда вопрос, а чем отличается OUTPUT от INTPUT на физическом уровне?
Свойства порта вводы/вывода (pin), сконфигурированного как порт ввода
Выводы Arduino (Atmega) стандартно настроены как порты ввода, таким образом, не требуется явной декларации в функции pinMode(). Сконфигурированные порты ввода находятся в высокоимпедансном состоянии. Это означает то, что порт ввода дает слишком малую нагрузки на схему, в которую он включен. Эквивалентом внутреннему сопротивлению будет резистор 100 МОм подключенный к выводу микросхемы.
Свойства порта ввода/вывода, сконфигурированного как порт вывода
Выводы, сконфигурированные как порты вывода, находятся в низкоимпедансном состоянии. Данные выводы могут пропускать через себя достаточно большой ток. Выводы микросхемы Atmega могут быть источником (положительный) или приемником (отрицательный) тока до 40 мА для других устройств. Такого значения тока достаточно чтобы подключить светодиод (обязателен последовательно включенный резистор), датчики, но недостаточно для большинства реле, соленоидов и двигателей.
Короткие замыкания выводов Arduino или попытки подключить энергоемкие устройства могут повредить выходные транзисторы вывода или весь микроконтроллер Atmega.
http://arduino.ru/Tutorial/DigitalPins
Проблема с зависаниями оказалась в глючном модуле W5500, а не в прерываниях. После замены модуля все заработало. Всем спасибо!
Спасибо Gres. Помогло залить рабочий но "незаливаемый" скетч. Буду пользовать.