Проблема с UART на самодельной плате
- Войдите на сайт для отправки комментариев
Здравсвуйте!
Сделал для своего проекта печатную плату с колодкой под микросхему в корпусе DIP28 с резистором на RESET, конденсаторами и кварцем. Использовал Atmega328p, такая используется в Arduino pro mini. Поскольку работать будет от 3.3В, кварц использовал на 8МГц.
Для проверки рабоспособности загрузил в нее загрузчик с помощью Arduino Mega. Загрузчик залился. Попытался загрузить скетч Blink через преобразователь USB-UART на микросхеме PL2303. Загрузить не удалось, выдавало ошибку синхронизации. Тогда я попробовал загрузить скетч через программатор. Это получилось. Светодиод мигает. В этот скетч я добавил отправку строчки по Serial и в мониторе порта получил какой-то мусор.
В попытках разобраться с этой проблемой я добавил еще SoftwareSerial на пины 7 и 8 и считывал их с помощью UART на плате Arduino Mega. Там тоже был мусор, причем другой. Если поменять USB адаптер и мегу местами, это мусор немного меняется. Бодрейт менял - на всех скоростях не то, что мне нужно. Грешил на кварц, но светодиод мигает правильно - с периодом в 1 секунду (вкл - 500мс - выкл - 500мс - вкл...)
Гугл курил, бодрейт в скетче и мониторе порта одинаковый (позже стал использовать putty) фьюзы проверял, разводку проверял, правильность подключения проверял, пробовал другой микроконтроллер, перепаивал другой кварц - ничего не помогло. Земли подключить не забыл. RX TX подключены правильно, иначе бы в мониторе было бы пусто. Плата, МК, COM-port и программатор в IDE выбраны правильно, иначе бы прошивка не залилась.
Кто может подсказать, в чем может быть проблема? Перепробовал уже всё, что мог, прочитал кучу форумов и статей, ни у кого такого не было.
Если вдруг это проблема с кодировкой или количеством бит, то почему она могла возникнуть, если скетч я писал в Arduino IDE и программировал МК через нее же?
Скетч, фотографии платы (прошу прощения за качество фото) и скрин окон putty прилагаю:
#include <SoftwareSerial.h> SoftwareSerial mySerial (7, 8); void setup() { pinMode(A5, OUTPUT); Serial.begin(9600); mySerial.begin(9600); } void loop() { digitalWrite(A5, HIGH); Serial.println ("ON"); mySerial.println ("ON"); delay(500); digitalWrite(A5, LOW); Serial.print ("OFF"); mySerial.print ("OFF"); delay(500); }
Сверху - монитор с USB адаптера, снизу - с Mega.
Спасибо!
залейте стандартный блинк
вангую, частота мигания будет не 1 сек.
Изначально это и был стандартный Blink, в котором я просто поменял пин. Частота мигания была 1 сек.
как это
Попытался загрузить скетч Blink через преобразователь USB-UART на микросхеме PL2303. Загрузить не удалось, выдавало ошибку синхронизации. Тогда я попробовал загрузить скетч через программатор. Это получилось. Светодиод мигает. В этот скетч я добавил отправку строчки по Serial и в мониторе порта получил какой-то мусор.
соотнести с этим ?
Плата, МК, COM-port и программатор в IDE выбраны правильно, иначе бы прошивка не залилась.
USB адаптер в винде подписан как COM12. Выбрал его в списке портов, в качетсве программатора - AVR ISP. Пробовал прошиться так, то есть через загрузчик, который был залит ранее. Не удалось. Тогда выбрал порт - COM6 (Arduino Mega), программатор - Arduino as ISP. На меге залит скетч Arduino ISP, использовал ее в качестве программатора. Прошивал командой "Загрузить через программатор". Загрузилось.
отсюда делаем вывод - СОМ порт не работает как надо!
ссылку на загрузчик и фьюзы, можно в студию ?
Какой COM порт Вы имеете в виду? Если порт в МК, то почему SoftwareSerial не работает? Плюс я пробовал два МК, вряд ли у двух мк сразу он неисправен. За правильность настройки UART отвечает IDE, тут проблем быть не должно.
Если речь о COM портах компьютера, то с ними тоже все в порядке, так как мега, например, спокойно работает в качестве программатора, а ее общение с компом происходит именно по COM порту.
Загрузчик я использовал встроенный в IDE, то есть заливал в мк с помощью кнопки "Записать загрузчик"
Фьюзы такие
я извиняюсь, вы сами фьюзы выставляли ?
Их должна выставлять Arduino IDE, как я понимаю. Эти фьюзы я прочитал SinaProg'ом (GUI надстройка над avrdude). На каком-то зарубежном форуме я нашел тему, в которой у человека была проблема, схожая с моей, и ему посоветовали выставить такие фьюзы. Я их просто прочитал и увидел, что они выставлены именно так, как там посоветовали. Тому человеку это помогло
под рукой нет атмеги, вечером дома гляну...
бахр. если не лень - прошейте фьюзы
Lfuse:0xE2 Hfuse:0xDA
и попробуйте, заработает ли.
Lfuse:0xE2 Hfuse:0xDA
этож внутренее тактирование с отлюченым делителем, или нет ?
бахр, кстати, а вы когда скетч в плату программатором заливали - вы какую плату в настройках Ардуино ИДЕ указывали?
этож внутренее тактирование с отлюченым делителем, или нет ?
да, это оно. Уверен, что с ним заработает.
Но, в принципе, можно и не ставить экспериментов - пусть ТС сначаа ответит, какую он плату в ИДЕ выбирал
бахр. если не лень - прошейте фьюзы
Lfuse:0xE2 Hfuse:0xDA
Спасибо большое, завтра попробую
бахр, кстати, а вы когда скетч в плату программатором заливали - вы какую плату в настройках Ардуино ИДЕ указывали?
Я указывал Arduino Pro Mini с процессором Atmega328p (3.3В, 8Мгц), Как раз такие мк и кварц я использую. COM - тот, на котором Mega сидит, так как она была программатором. Программатор, соответственно, Arduino as ISP
Основная беда всех самопальных плат - как правило непропай. Ещё возможны особые на-водки из-за неграмотно разведенной земли и/или питания.
Скорость на которой работает загрузчик
не совпадает с той на которой вы пытаетесь грузить, нет?
По софварному сериалу, скорее всего несовпадение скорости. А сигнал DTR используется, или шьете с помощью кнопки RESET?
бахр. если не лень - прошейте фьюзы
Lfuse:0xE2 Hfuse:0xDA
Попробовал, фьюзы прошились, в мониторе порта всё тот же самый мусор)
По софварному сериалу, скорее всего несовпадение скорости. А сигнал DTR используется, или шьете с помощью кнопки RESET?
Пробовал и так, и так. Думаю, проблема с UART, из-за этого IDE не может засинхронизироваться с загрузчиком и соответственно загрузить прошивку
IDE сама задает скорость при программировании. Ее я, конечно, могу изменить с помощью avrdude, но в этом по-моему нет никакого смысла, так как в загрузчике выставлена скорость такая, которую по идее IDE и использует
Основная беда всех самопальных плат - как правило непропай. Ещё возможны особые на-водки из-за неграмотно разведенной земли и/или питания.
Вероятнее всего Вы правы. На счет качества пайки я уверен, а вот по поводу грамотности разводки, может быть, глянете?
2 по 22пФ на кварце, 2 0.1мкф на VCC и AVCC, 0.1мкф на AREF, 4.7мкф на питании, 10кОм на RESET.
Земля и питание идут под микросхемой, плюс есть перемычка на цепи питания.
Также я припаял электролит на 47мкФ между землей и питанием в месте подключения источника питания.
Запитываю от пинов ардуинки, так что напряжение должно быть стабилизировано.
Кстати, если отключить плату от питания и оставить одни только землю и TX, то тоже приходят какие-то данные. Может быть, действительно есть какая-то наводка? Как с ней справиться?
6axp, по-моему первое, что нужно было сделать -проверить на какой частоте работает МК. Залейте этот скетч:
на 11 ноге будет половина тактовой МК. Измерить частотометром.
6axp, по-моему первое, что нужно было сделать -проверить на какой частоте работает МК. Залейте этот скетч:
на 11 ноге будет половина тактовой МК. Измерить частотометром.
Спасибо, с этого я и начал. Проверял частоту с помощью светодиода и скетча Blink. Если частота настроена правильно, то все задержки будут правильными. Светодиод мигал, как положено, раз в секунду. Проверить так, как Вы предлагаете, я, к сожалению, не могу, у меня нет частотомера, но по косвенным признакам все в порядке. Плюс, я попробовал настроить фьюзы на внутренний генератор - ситуация не изменилась.
6axp, если у вас есть другая ардуина, -значит есть частотометр. Можно штатную библиотеку загрузить
Да на картинке-то всё достаточно кучеряво, разве что проводники толстоваты, но это - мелочи тут.
Чего не сказать за фото. У Вас там столько припоя, и в таких невероятных формах (острые углы), что оно будет отличаться от картинки "только так" под осцилоскопом. Если есть - смотрите форму сигналов на вашем Тх, там может быть видно всё. попробуйте пропаять все со спиртовым раствором канифоли или каким ещё флюсом, поубрать лишнее и потом качественно промыть плату спиртом...
Ну и ещё: качество провода идущего от Тх к компу .. "электроника - наука о контактах", в смысле что "плохая земля" может быть и в ином месте. Как и наводки.
Когда делал макетную плату своей "Ардуино как лего" (ATmega2560) тоже столкнулся с тем, что по SPI она шьется, а по COM-порту "фигвам" или "местами" (от фазы Луны) .. оказался банальный непропай контактов .. да, да точно таких же как ваши "штырьки" .. пропаят с кислотным флюсом - заработало. Промыл .. прошло полгода .. и "опять глюки" .. полез смотреть и .. ага, опять непропай. Как так?!? Но ведь "на лице"! Так шта .. если с виду оно "надежно пропаяно" это ещё ни разу не означает что там "есть контакт".. :)
1. Загрузить "привет мир" и простым перебором скорости терминала выяснить
во сколько раз скорость больше-меньше.
2. Возможно вы собрали "инверсный" драйвер........
3. Его нужно проверить на "эхо".
6axp, если у вас есть другая ардуина, -значит есть частотометр. Можно штатную библиотеку загрузить
Спасибо! Не знал, что ардуинки будет хватать для таких функций. Померил частоту. Если фьюзы выставлены на внутренний генератор, то частота колеблется, а среднее значение - 3934780 Гц. Когда МК настроен на внешний кварц - частота гораздо более стабльна и держится на уровне 4004036 Гц.
Насколько критично такое расхождение от эталонных 4МГц?
Да на картинке-то всё достаточно кучеряво, разве что проводники толстоваты, но это - мелочи тут.
Чего не сказать за фото. У Вас там столько припоя, и в таких невероятных формах (острые углы), что оно будет отличаться от картинки "только так" под осцилоскопом. Если есть - смотрите форму сигналов на вашем Тх, там может быть видно всё. попробуйте пропаять все со спиртовым раствором канифоли или каким ещё флюсом, поубрать лишнее и потом качественно промыть плату спиртом...
Ну и ещё: качество провода идущего от Тх к компу .. "электроника - наука о контактах", в смысле что "плохая земля" может быть и в ином месте. Как и наводки.
Когда делал макетную плату своей "Ардуино как лего" (ATmega2560) тоже столкнулся с тем, что по SPI она шьется, а по COM-порту "фигвам" или "местами" (от фазы Луны) .. оказался банальный непропай контактов .. да, да точно таких же как ваши "штырьки" .. пропаят с кислотным флюсом - заработало. Промыл .. прошло полгода .. и "опять глюки" .. полез смотреть и .. ага, опять непропай. Как так?!? Но ведь "на лице"! Так шта .. если с виду оно "надежно пропаяно" это ещё ни разу не означает что там "есть контакт".. :)
Спасибо большое за ответ! Обязательно попробую еще раз пройтись паяльником и промыть, как следует. А так вообще, контакт вроде есть, прозванивал мультиметром.
1. Загрузить "привет мир" и простым перебором скорости терминала выяснить
во сколько раз скорость больше-меньше.
Мои ON и OFF по Serial'y ИМХО сойдут за "примет мир". Код там минимальный и мне в правильные моменты времени приходят данные в монитор. Скорости терминала я перебирал, даже пробовал нестандартные, на всех - мусор.
2. Возможно вы собрали "инверсный" драйвер........
Что значит инверсный драйвер?)
3. Его нужно проверить на "эхо".
Эхо - это прозвонить контакты? Или замкнуть RX с TX? С этим все в порядке. Замкнуть RX и TX микроконтроллера не вижу смысла, ведь я в любом случае не смогу увидеть, что пришло.
Померил частоту. Если фьюзы выставлены на внутренний генератор, то частота колеблется, а среднее значение - 3934780 Гц. Когда МК настроен на внешний кварц - частота гораздо более стабльна и держится на уровне 4004036 Гц.
Насколько критично такое расхождение от эталонных 4МГц?
Нормально все. Частота 8 МГц.
В принципе, уже когда вы фьюзы на внутренний генератор переставили и это не помогло - стало ясно, что дело, скорей всего, не в частоте.
Теперь остается проверить, не брак ли это. Вероятность невелика, но все же... У вас сколько МК в запасе? - все из одной партии?
Если не брак - тогда ставлю на какую-то смешную ошибку в разводке платы или внешнего сериала...
Когда МК настроен на внешний кварц - частота гораздо более стабльна и держится на уровне 4004036 Гц. Насколько критично такое расхождение от эталонных 4МГц?
Расхождение большое, если перевести в привычные единицы это будет 1000ppm, при норме в 30. Да, конечно нужно принять во внимание, что измеряющий МК тоже не эталон. Но всё равно много. Я бы поигрался с ёмкостями на ногах кварца, ими можно немного подстроить частоту. Ещё стоит проверить ваш переходник USB-UART с чем-то ещё, можно с той-же вашей мегой. Подключить его на свободный uart меги, и попередовать что-нибудь из одного порта в другой.
PS: измерил частоту на ардуине с говёным керамическим резонатором - отклонение 230ppm. Делайте выводы.
Какое напряжение питания? Попробуйте запитать от 5В .
Сделал для своего проекта печатную плату с колодкой под микросхему в корпусе DIP28 с резистором на RESET, конденсаторами и кварцем. Использовал Atmega328p, такая используется в Arduino pro mini. Поскольку работать будет от 3.3В, кварц использовал на 8МГц
Вот просто интересно, а зачем делатся такие проекты, если собранная Ардуино Про Мини стОит меньше, чем голая Атмега328 в DIP-корпусе?
Вот просто интересно, а зачем делатся такие проекты, если собранная Ардуино Про Мини стОит меньше, чем голая Атмега328 в DIP-корпусе?
Мне в моем возрасте, гораздо удобнее работать с ДИП корпусами. Собираю все конструкции навесухой с минимально необходимыми элементами. Менее чем за год третий десяток 328 разменял. Правда иногда и мини использую, или ПРО, но с голой 328 быстрее и удобнее. Никаких плохик контактов и непропаев, и китайцев винить не в чем.
А насчет загрузки, я-бы поставил кондючок на 0,1 мкф с ресета 328 на DTR переходника USB-UART. В Про Мини он стоит и без него программатору нечем ресет дернуть.
так чем все закончилось ?
Ещё стоит проверить ваш переходник USB-UART с чем-то ещё
так чем все закончилось ?
Я попробовал замкнуть RX и TX и написать что-нибудь, чтобы проверять хотя бы работоспособность преобразователя. На меге я в ответ ничего не получил, может быть, там есть какая-то защита или что-то вроде того, не знаю. На преоброзвателе на микросхеме PL2303 при замыкании все в порядке. Получаю именно тот символ, который отсылаю.
Смог достать еще один преобразователь, теперь уже на микросхеме CH340g. И каково было мое удивление, когда с него я с атмеги получал правильную строчку в мониторе порта! Причем работало, как в IDE, так и в Putty.
Мистика какая-то! Настройки порта везде стоят одинаковые, перепроверял несколько раз. Откуда взялась такая аппаратная (или уж не знаю, какая) "несовместимсость" микросхем с МК совершенно непонятно. Но факт остается фактом: из трех преобразователей работает только один. В работоспособности СОМ порта меги я уверен, так как ардуино спокойно сама прошивается и прошивает МК. С PL2303 вроде тоже понятно, что работает. С этим бы, конечно, хотелось бы разобраться.
Но я столкнулся еще с одной проблемой. При попытке залить прошивку в мк, он может умереть. Поскольку при первой попытке у меня были старые драйвера на USBASP (который я позже также убил при попытке обновить в нем прошивку), а IDE его не смогла распознать, пришлось прошивать с помощью SinaProg. Спустя какое-то время после нажатия на кнопку Program, мне высветилась надпись Programming Failed. После этого я уже ничего не мог считать и зашить. Device Signature всегда был 0х000000. Позже я обновил драйвер для USBASP и попытался обновить на нем прошивку, скачанную с оф. сайта, тем же SinaProg'ом с помошью меги в качестве программатора. Сначала все было в порядке, но потом МК опять начал выдавать сигнатуру 000000. Следующий МК умер при попытке залить скетч уже с помощью IDE и команды "Загрузить через программатор". Еще один просто так перестал отвечать. Сначала выдавал сигнатуру, а в какой-то момент перестал. Для уже пятого МК я решил сделать печатную плату с развокой для кондеров (до этого использовал макетку), чтобы максимально избавиться от, возможно, помех или чего-нибудь еще. С этим МК тоже начались проблемы. Именно с ним я был предельно аккуратным. Сразу после прошивки отключал программатор на всякий случай. Заливал только через IDE. Вот вроде разобрался с UARTом, решил начать зашивать с помощью бутлоадера, а он, зараза, не хочет записываться: писало какую-то ошибку. Ну решил опять с помощью SinaProg залить прошивку: скомпилировал бинарники, попытался запрогать. Опять сигнатура - нули. В итоге осталась последняя мега, которая почему-то сигнатуру выдает нестабильно: то правильную, свою, то нули, то 0х000102. Высоковольтного программатора, то бишь доктора, у меня нет, но мб потом соберу. Но что-то мне подсказывает, что он тоже не справится, так как даже сигнатура не читается, а она вообще-то должна читаться даже при залоченном МК. Единственное предположение - сбился бит настройки ноги RESET, но как такое могло произойти - ума не приложу.
Если посчитаете, что я не умею пользоваться SinaProg'ом, или, что это он виноват в их смерти, то сомневаюсь: я до этого прошивал атмегу8 (бинарник для нее компилировался не IDE'шкой, а Atmel Studio) с помощью него и все было в порядке.
Фьюзы при прошивке не трогаются, поэтому я даже не знаю, в чем может быть косяк.
Надеюсь, не сильно загрузил) Может, у кого-то есть мысли?
Вот просто интересно, а зачем делатся такие проекты, если собранная Ардуино Про Мини стОит меньше, чем голая Атмега328 в DIP-корпусе?
Мне в последствии нужно будет спроектировать печатную плату с несколькими датчиками и для проверки своей рукожопости я решил начать с изготовления собственной печатной платы - аналога ардуино про мини, для теста, так сказать, в полевых условиях. Сначала я сделал плату для атмеги в корпусе AU, т.е. SMD. Все даже работало, но когда она умерла, я понял, что мне удобнее будет использовать именно DIP корпус с колодкой, в которой я всегда смогу поменять вышедший из строя контроллер.
Кстати, найти нужную мне миньку оказалось не таким простым занятием. Мне нужна именно мега328 с частотой 8МГц, а в магазинах, как правило, встречаются либо 168-ые, либо 328 на 16МГц. Заказывать из Китая и ждать месяц, к сожалению, нет возможности.
Вот просто интересно, а зачем делатся такие проекты, если собранная Ардуино Про Мини стОит меньше, чем голая Атмега328 в DIP-корпусе?
Мне в моем возрасте, гораздо удобнее работать с ДИП корпусами. Собираю все конструкции навесухой с минимально необходимыми элементами.
Мне в последствии нужно будет спроектировать печатную плату с несколькими датчиками
...
Мне нужна именно мега328 с частотой 8МГц, а в магазинах, как правило, встречаются либо 168-ые, либо 328 на 16МГц.
А я печатные платы развожу так, что в них Ардуино Мини вставляется на колодки или впаивается как компонент. Посколькy Мини в сборе мало чем отличается от большой микросхемы в ДИП корпусе. Мини по размеру побольше, зато навешивать на нее ничего не надо, уже все есть. А кварц заменить или регулятор выпаять - не проблема.
А я печатные платы развожу так, что в них Ардуино Мини вставляется на колодки или впаивается как компонент. Посколькy Мини в сборе мало чем отличается от большой микросхемы в ДИП корпусе. Мини по размеру побольше, зато навешивать на нее ничего не надо, уже все есть. А кварц заменить или регулятор выпаять - не проблема.
В моем случае нужно будет использовать именно голый микроконтроллер для экономии места. Я буду использовать в корпусе tqfp, именно такой используется на Мини. DIP корпус я использую сейчас исключительно для удобства замены контроллера в случае чего.
Мистика какая-то! Настройки порта везде стоят одинаковые, перепроверял несколько раз. Откуда взялась такая аппаратная (или уж не знаю, какая) "несовместимсость" микросхем с МК совершенно непонятно. Но факт остается фактом: из трех преобразователей работает только один.
Думаю у всех ваших бед с МК какая-то одна причина, но такие вещи диагностируются хорошим осциллографом по стандартным методикам, а не методом тыка. Коли нету -меняйте всё что можно. Кварц, БП, провода пропаивайте. Всё должно читаться/писаться идеально 100 раз из 100, неуверенно читаящаяся сигнатура -признак великой ж@пы, которая творится с сигналами.
Думаю у всех ваших бед с МК какая-то одна причина, но такие вещи диагностируются хорошим осциллографом по стандартным методикам, а не методом тыка. Коли нету -меняйте всё что можно. Кварц, БП, провода пропаивайте. Всё должно читаться/писаться идеально 100 раз из 100, неуверенно читаящаяся сигнатура -признак великой ж@пы, которая творится с сигналами.
Питание я использовал либо от юсб компьютера, либо от ардуинки. Подключал, правда, без пайки на разьемах. Остальное все менял, у меня даже две печатные платы было. Я и программаторы разные использовал.
Что касается неуверенно читающейся сигнатуры - сначала-то все читается и прошивается хорошо, но в какой-то момент по непонятным причинам летит к чертям. После этого сигнатура стабильно не читается)
У вас какая-то системная ошибка.
Тотальная.
Во первых вы скрываете что вы профессиональный киллер.
Вас ждёт большое и светлое будущее на этом поприще.
И это только начало.
Во вторых смените блок питания.
В третьих старайтесь не использовать всякие беспаечные макетки.
В них сейчас не докладывают золота.
В четвертых пока не разберётесь с причинами никогда не начинайте пограммировать
не считав МНОГОКРАТНО И СТАБИЛЬНО Синапрогом
сигнатуру фьюзы и прошивку.
Попытка пошить по принципу " а ну давай попробуем что получится"
как раз приводит к достигнутому вами результату по количеству трупов.
В пятых - всегда используйте последнее фирмваре в программаторе, последние драйвера (кроме FTDI) компортов и последнюю официальную версию ИДЕ (а не ночные билды).