Подключение микроконтроллера. Ликбез.

Распечатать

Казалось бы простая тема, а однако в комментах меня завалили вопросами как подключить микроконтроллер. Как подключить к нему светодиод, кнопку, питание. Что делать с AGND или AREF. Зачем нужен AVCC и все в таком духе. Итак, раз есть вопросы, значит тема не понятна и надо дать по возможности исчерпывающий ответ. Все описываю для контроллеров AVR, но для каких нибудь PIC все очень и очень похоже. Т.к. принципы тут едины.

Чтобы понимать ряд терминов активно упоминающихся в этой статье, надо сначала прочитать статью про порты ввода-вывода.

Питание
Для работы микроконтроллеру нужна энергия — электричество. Для этого на него естественно нужно завести питалово. Напряжение питание у МК Atmel AVR разнится от 1.8 до 5 вольт, в зависимости от серии и модели. Все AVR могут работать от 5 вольт (если есть чисто низковольтные серии, то просьба уточнить в комментах, т.к. я таких не встречал). Так что будем считать что напряжение питания контроллера у нас всегда 5 вольт или около того. Плюс напряжения питания обычно обозначается как Vcc. Нулевой вывод (а также Земля, Корпус, да как только его не называют) обозначают GND. Если взять за пример комповый блок питания. То черный провод это GND (кстати, земляной провод традиционно окрашивают в черный цвет), а красный это +5, будет нашим Vcc. Если ты собираешься запитать микроконтроллер от батареек, то минус батареек примем за GND, а плюс за Vcc (главное чтобы напряжение питания с батарей было в заданных пределах для данного МК, позырь в даташите. Параметр обычно написан на первой странице в общем описании фич:

• Operating Voltages
–1.8 — 5.5V (ATtiny2313V)
–2.7 — 5.5V (ATtiny2313)
• Speed Grades
–ATtiny2313V: 0 — 4 MHz @ 1.8 — 5.5V, 0 — 10 MHz @ 2.7 — 5.5V
–ATtiny2313: 0 — 10 MHz @ 2.7 — 5.5V, 0 — 20 MHz @ 4.5 — 5.5V

Обрати внимание, что есть особые низковольтные серии (например 2313V низковльтная) у которых нижня граница напряжения питания сильно меньше. Также стоит обратить внимание на следующий пункт, про частоты. Тут показана зависимость максимальной частоты от напряжения питания. Видно, что на низком напряжении предельные частоты ниже. А низковольтные серии раза в два медленней своих высоковольтных коллег. Впрочем, разгону все процессоры покорны ;)))))

Для работы контроллерам серии AVR достаточно только питания. На все входы Vcc надо подать наши 5 (или сколько там у тебя) вольт, а все входы GND надо посадить на землю. У микроконтроллера может быть много входов Vcc и много входов GND (особенно если он в квадратном TQFP корпусе. У которого питалово со всех сторон торчит). Много выводов сделано не для удобства монтажа, а с целью равномерной запитки кристалла со всех сторон, чтобы внутренние цепи питания не перегружались. А то представь, что подключил ты питалово только с одной стороны, а с другой стороны чипа навесил на каждую линию порта по светодиоду, да разом их зажег. Внутренняя тонкопленочная шина питания, офигев от такой токовой нагрузки, испарилась и проц взял ВНЕЗАПНО и без видимых, казалось бы, причин отбросил копыта. Так что ПОДКЛЮЧАТЬ НАДО ВСЕ ВЫВОДЫ Vcc и GND. Соединить их соответственно и запитать.

Отдельные вопросы вызвают AGND и AVCC — это аналоговая земля и питание для Аналого-Цифрового Преобразователя. АЦП это очень точный измеритель напряжения, поэтому его желательно запитать через дополнительные фильтры, чтобы помехи, которые не редки в обычной питающей цепи, не влияли на качество измерения. С этой целью в точных схемах проводят разделение земли на цифровую и аналоговую (они соединены должны быть только в одной точке), а на AVCC подается напряжение через фильтрующий дроссель. Если ты не планируешь использовать АЦП или не собираешься делать точные измерения, то вполне допустимо на AVCC подать те же 5 вольт, что и на Vcc, а AGND посадить на ту же землю что и все. Но подключать их надо обязательно!!! ЕМНИП от AVCC питается также порт А.

Warning!!!
В чипе Mega8 похоже есть ошибка на уровне топологии чипа — Vcc и AVcc связаны между собой внутри кристалла. Между ними сопротивление около (!!!) 5Ом Для сравнения, в ATmega16 и ATmega168 между Vcc и AVcc сопротивление в десятки МЕГА ом! В даташите на этот счет никаких указаний нет до сих пор, но в одном из топиков за 2004 год на AVRFreaks сказано, что люди бодались с цифровым шумом АЦП, потом написали в поддержку Atmel мол WTF??? А те, дескать, да в чипе есть бага и Vcc и AVcc соединены внутри кристалла. В свете этой инфы, думаю что ставить дроссель на AVcc для Mega8 практически бесполезно. Но AVcc запитывать надо в любом случае — кто знает насколько мощная эта внутренняя связь?

Простейшая схема подключения Микроконтроллера AVR приведена ниже:

Это необходимый минимум чтобы контроллер запустился. Провод Vcc до программатора показан пунктиром поскольку он не обязателен. Если ты собираешься питать МК от внешнего источника, то он не нужен. Но я все же рекомендую для начала питать всю систему (МК+программатор) от одного источника — больше вероятность успешной прошивки :) Для учебной цели, диодиком помигать, сойдет и так.

Но настолько все упрощать я не рекомендую. Лучше сразу добавить парочку навесных внешних элементов. Правильней будет. Чтобы было вот так:

Как видишь, добавился дроссель в цепь питания AVCC, а также конденсаторы. Хорошим тоном является ставить керамический конденсатор на сотню нанофарад между Vcc и GND у каждой микросхемы (а если у микрухи много вход питания и земель, то между каждым питанием и каждой землей) как можно ближе к выводам питания — он сгладит краткие импульсные помехи в шине питания вызыванные работой цифровых схем. Конденсатор на 47мКФ в цепи питания сгладит более глубокие броски напряжения. Кондесатор между AVcc и GND дополнительно успокоит питание на АЦП.

Вход AREF это вход опорного напряжения АЦП. Туда вообще можно подать напряжение относительно которого будет считать АЦП, но обычно используется либо внутренний источник опорного напряжения на 2.56 вольта, либо напряжение на AVCC, поэтому на AREF рекомендуется вешать конденсатор, что немного улучшит качество опорного напряжения АЦП (а от качества опоры зависит адекватность показаний на выходе АЦП).

Схема сброса
Резистор на RESET. Вообще в AVR есть своя внутренняя схема сброса, а сигнал RESET изнутри уже подтянут резистором в 100кОм к Vcc. НО! Подтяжка это настолько дохлая, что микроконтроллер ловит сброс от каждого чиха. Например, от касания пальцем ножки RST, а то и просто от задевания пальцем за плату. Поэтому крайне рекомендуется RST подтянуть до питания резистором в 10к. Меньше не стоит, т.к. тогда есть вероятность, что внутрисхемный программатор не сможет эту подтяжку пересилить и прошить МК внутри схемы не удасться. 10к в самый раз.

Есть еще вот такая схема сброса:

Она замечательна чем — при включении схемы конденсатор разряжен и напряжение на RST близко к нулю — микроконтроллер не стартует, т.к. ему непрерывный сброс. Но со временем, через резистор, конденсатор зарядится и напряжение на RST достигнет лог1 — МК запустится. Ну, а кнопка позволяет принудительно сделать сброс если надо.
Задержка будет примерно T=R*C для данного примера — около секунды. Зачем эта задержка? Да хотя бы для того, чтобы МК не стартовал раньше чем все девайсы платы запитаются и выйдут на установившийся режим. В старых МК (АТ89С51, например) без такой цепочки, обеспечивающей начальный сброс, МК мог вообще не стартануть.
В принципе, в AVR задержку старта, если нужно, можно сделать программно — потупить с пол секунды прежде чем приступать к активным действиям. Так что кондер можно выкинуть нафиг. А кнопку… как хочешь. Нужен тебе внешний RESET? Тогда оставь. Я обычно оставляю.

Источник тактового сигнала
Тактовый генератор это сердце микроконтроллера. По каждому импульсу происходит какая нибудь операция внутри контроллера — гоняют данные по регистрам и шинам, переключаются выводы портов, щелкают таймеры. Чем быстрей тактовая частота тем шустрей МК выполняет свои действия и больше жрет энергии (на переключения логических вентилей нужна энергия, чем чаще они переключаются тем больше энергии надо).

Импульсы задаются тактовым генератором встроенным в микроконтроллер. Впрочем может быть и внешний генератор, все очень гибко конфигурируется! Скорость с которой тикает внутренний генератор зависит от настроек микроконтроллера и обвязки.

Генератор может быть:

  • Внутренним с внутренней задающей RC цепочкой.
    В таком случае никакой обвязки не требуется вообще! А выводы XTAL1 и XTAL2 можно не подключать вовсе, либо использовать их как обычные порты ввода вывода (если МК это позволяет). Обычно можно выбрать одно из 4х значений внутренней частоты. Этот режим установлен по дефолту.
  • Внутренним с внешней задающей RC цепочкой.
    Тут потребуется подключить снаружи микроконтроллера конденсатор и резистор. Позволяет менять на ходу тактовую частоту, просто подстраивая значение резистора.
  • Внутренним с внешним задающим кварцем.
    Снаружи ставится кварцевый резонатор и пара конденсаторов. Если кварц взят низкочастотный (до 1МГц) то конденсаторы не ставят.
  • Внешним.
    С какого либо другого устройства идет прямоугольный сигнал на вход МК, который и задает такты. Полезен этот режим, например, если надо чтобы у нас несколько микроконтроллеров работали в жестком синхронизме от одного генератора.

У разных схем есть разные достоинства:
В случае внутренней RC цепи мы экономим место на плате, нам не нужно дополнительных деталек, но мы не можем развить максимальную частоту и частота немного зависит от температуры, может плавать.
У внешнего кварца отличные показатели точности, но он стоит лишних 15 рублей и требует дополнительных деталей и, что самое обидное, часто съедает пару ног I/O. Также на внешнем же кварце можно добиться максимальной производительности от МК. Частота МК определяется частотой на которую заточен выбранный кварц. Внешная RC цепь позволяет тикать генератору МК быстрей чем от внутренней, стоит дешевле кварца, но имеет те же проблемы со стабильностью частоты, что и внутренняя RC цепь.

Способы тактования МК описаны в даташите в разделе System Clock and Clock Options и всецело определяются конфигурацией Fuse Bit’s. Пока же я настоятельно рекомендую НЕ ТРОГАТЬ FUSE пока ты не будешь твердо знать что ты делаешь и зачем. Т.к. выставив что нибудь не то, можно очень быстро превратить МК в кусок бесполезного кремния, вернуть к жизни который будет уже очень непросто (но возможно!)

Подключение к микроконтроллеру светодиода и кнопки
Сам по себе, без взаимодействия с внешним миром, микроконтроллер не интересен — кому интересно что он там внутри себя тикает? А вот если можно как то это отобразить или на это повлиять…

Итак, кнопка и светодиод подключаются следующим образом:

Для кнопки надо выбраную ножку I/O подключить через кнопку на землю. Сам же вывод надо сконфигурировать как вход с подтяжкой (DDRxy=0 PORTxy=1). Тогда, когда кнопка не нажата, через подтягивающий резистор, на входе будет высокий уровень напряжения, а из бит PINху будет при чтении отдавать 1. Если кнопку нажать, то вход будет положен на землю, а напряжение на нем упадет до нуля, а значит из PINxy будет читаться 0. По нулям в битах регистра PINх мы узнаем что кнопки нажаты.
Пунктиром показан дополнительный подтягивающий резистор. Несмотря на то, что внутри AVR на порт можно подключить подтяжку, она слабоватая — 100кОм. А значит ее легко придавить к земле помехой или наводкой, что вызовет ложное срабатывание. А еще эти внутренние подтягивающие резисторы очень любят гореть от наводок. У меня уже с десяток микроконтроллеров с убитыми PullUp резисторами. Все работает, но только нет подтяжки — сгорела. Вешаешь снаружи резистор и работает как ни в чем ни бывало. Поэтому, для ответственных схем я настоятельно рекомендую добавить внешнюю подтяжку на 10кОм — даже если внутреннюю накроет, внешняя послужит. В процессе обучения на это можно забить.

Светодиод подключается на порт двумя способами. По схеме Порт-земля или Порт-Питание. В первом случае для зажигания диода надо выдать в порт лог1 — высокий уровень (примерно равен Vcc). Во втором случае для зажжения диода требуется выдать в порт лог0 — низкий уровень (около нуля). Для AVR разницы вроде бы нет, а вот многие старые серии микроконтроллеров вниз тянули куда лучше чем вверх, так что схема Порт-Питание распространена чаще. Я применяю и ту и другую схему исходя из удобства разводки печатной платы. Ну, а на программном уровне разницы особой нет.
Вывод порта для работы со светодиодом надо сконфигурировать на выход (DDRxy=1) и тогда в зависимости от значения в PORTxy на ножке будет либо высокий либо низкий уровень напряжения.

Светодиод надо подключать через резистор. Дело в том, что прямое сопротивление светодиода очень мало. И если не ограничивать ток через него, то он просто напросто может сгореть нафиг. Либо, что вероятней, пожечь вывод микроконтроллера, который, к слову, может тянуть что то около 20-30мА. А для нормального свечения обычному светодиоду (всякие термоядерные ультраяркие прожектора мы не рассматриваем сейчас, эти монстры могут и ампер сожрать) надо около 3…15мА.

Так что, на вскидку, считаем:

  • Напряжение на выходе ноги МК около 5 вольт, падение напряжени на светодиоде обычно около 2.5 вольт (выше нельзя, иначе диод сожрет тока больше чем надо и подавится, испустив красивый дым)
  • Таким образом, напряжение которое должен взять на себя ограничительный резистор будет 5-2.5 = 2.5В.
  • Ток нам нужен 5мА — нефига светодиод зря кормить, нам индикация нужна, а не освещение :)
  • R=U/I= 2.5/5E-3 = 500Ом. Ближайший по ряду это 510 Ом. Вот его и возьмем. В принципе, можно ставить от 220 Ом до 680 Ом что под руку попадется — гореть будет нормально.

Если надо подключить много светодиодов, то на каждый мы вешаем по собственному резистору. Конечно, можно пожадничать и поставить на всех один резистор. Но тут будет западло — резистор то один, а диодов много! Соответственно чем больше диодов мы запалим тем меньше тока получит каждый — ток от одного резистора разделится между четырьмя. А поставить резистор поменьше нельзя — т.к. при зажигании одного диода он получит порцию тока на четверых и склеит ласты (либо пожгет порт).

Немного схемотехнических извратов или пара слов о экономии выводов

То что не удается запаять приходится программировать. (С) народная мудрость.

Очень часто бывает так, что вроде бы и памяти контроллера под задачу хватает с лихвой, и быстродействия через край, а ножек не хватает. Вот и приходится ставить избыточный и более дорогой микроконтроллер только потому, что у него банально больше выводов. Покажу парочку примеров как можно за счет усложнения программного кода сэкономить на железе.

Во главу угла такой экономии обычно ставится принцип динамического разделения назначения выводов во времени. То есть, например, вывод может работать на какую-либо шину, а когда шина не активна, то через этот же вывод можно проверить состояние кнопки, или что нибудь передать по другой шине. Быстро (десятки или даже тысячи раз в секунду) переключаясь между двумя разными назначениями можно добиться эффекта «одновременной работы».

Главное, тут следовать двум правилам:

  • Два разных применения не должны мешать друг другу т.е. разделение во времени должно быть построено таким образом, чтобы смежная функция не искажала результат работы проверяемой функции.
  • Ни в коем случае нельзя допускать конфликта уровней напряжений.

Приведу пример:

  • У есть у нас вывод на который повешан выход с некого датчика и кнопка. Выход с датчика может быть 0, 1 в активном режиме и Hi-Z когда на датчик не приходит сигнал Enable.
  • Кнопка же дает на линию жесткий 0, путем короткого замыкания.

Как это должно работать:
Скажем, основную часть времени у нас ввод микроконтроллера настроен на вход Hi-Z и мы снимаем показания с датчика на который подан еще и сигнал Enable. Когда нам надо опросить кнопку, то мы отбираем у датчика Enable и его выходы становятся в режим Hi-Z и нам не мешают. Вывод микроконтроллера мы переводим в режим Pull-Up и проверяем нет ли на входе нуля — сигнал нажатой кнопки. Проверили? Переводим вход МК в Hi-Z вход и подаем Enable на датчик снова. И так много раз в секунду.

Тут у нас возникает два противоречия:

  • Логическое противоречие
    0 на линии может быть в двух случаях от датчика или от кнопки. Но в этом случае, пользуясь здравым смыслом и требуемым функционалом, мы логическое противоречие можем не брать во внимание.
    Просто будем знать, что нажатие кнопки искажает показания датчика, а значит когда датчик работает — мы кнопку жать не будем. А чтобы показания датчика не принять за нажатие кнопки мы, в тот момент когда ждем данные с датчика, просто не опрашиваем кнопку. От тупых действий, конечно, это не защитит. Но для упрощения примера защиту от дурака я сейчас во внимания не беру.
  • Электрическое противоречие
    Если датчик выставит 1, а мы нажмем кнопку, то очевидно, что GND с Vcc в одном проводе не уживутся и кто нибудь умрет. В данном случае умрет выход датчика, как более слабый — куда там хилому транзистору тягаться с медной кнопкой.
    Организационными методами такое противоречие не решить — на глаз нельзя определить напряжение на линии и решить можно жать кнопку или нет. Да и в каком месте сейчас программа можно тоже только догадываться. Поэтому решать будем схемотехнически.
    Добавим резистор в цепь кнопки, резистор небольшой, рассчитывается исходя из максимального тока самого слабого вывода линии.
    Если у нас, например, вывод датчика может дать не более 10мА, то резистор нужен такой, чтобы ток через него от Vcc до GND не превышал этой величины. При питании 5 вольт это будет 510Ом. Теперь, даже если на линии со стороны датчика будет лог1, высокий уровень, то нажатие на кнопку не вызовет даже искажения логического уровня т.к. резистор рассчитан с учетом максимальной нагрузки порта

Пример получился немного сумбурный, но суть думаю понятна. Я хочу чтобы ты увидел и понял не только как делается, но и зачем это делается :)

Ну и несколько примеров нескольких функций на одной ноге:
Во-первых, ISP разьем. Я уже давным давно забыл что такое тыкать микроконтроллер вначале в колодку программатора, потом в плату, потом обратно и так по многу раз, пока прогу не отладишь. У меня на плате торчат 6 выводов ISP разьема и при отладке программатор вечно воткнут в плату, а программу я перешиваю порой по нескольку раз в 10 минут. Прошил — проверил. Не работает? Подправил, перепрошил еще раз… И так до тех пор пока не заработает. Ресурс у МК на перепрошивку исчисляется тысячами раз. Но ISP разьем сжирает выводы. Целых 3 штуки — MOSI, MISO, SCK.
В принципе, на эти выводы можно еще повесить и кнопки. В таком случае никто никому мешать не будет, главное во время прошивки не жать на эти кнопки. Также можно повесить и светодиоды (правда в этом случае простейший программатор Громова может дать сбой, а вот USBasp молодцом!) тогда при прошивке они будут очень жизнерадостно мерцать :)))

На линии под ISP можно повесить и что нибудь другое, главное, чтобы при прошивке это ЧТОТО не начало ВНЕЗАПНО чудить. Например, управление стокилограммовым манипулятором висит на линии ISP и во время прошивки на него пошла куча бредовых данных — так он может свихнуться и кому нибудь бошку разнести. Думать надо, в общем. А вот с каким нибудь LCD вроде HD44780, который работает по шинному интерфейсу прокатит такая схема:

Резисторам в 10к отделяем линии программатора от основной схемы. В таком случае, даже если там будут какие либо другие логические уровни, то программатор их легко пересилит и спокойно прошьет микросхему. А при нормальной работе шины эти 10к резисторы особо влиять не будут.

Ножки можно зажать, например, на светодиодах:

Переключаем выход с 0 на 1 и зажигаем то верхний то нижний диод. Если надо зажечь оба, то мы просто переводим вывод микроконтроллера в режим Hi-Z и словно нет его, а диоды будут гореть сквозным током. Либо быстро быстро переключать диоды между собой, в этом случае на глаз они будут оба гореть. Недостаток схемы очевиден — диоды нельзя погасить. Но если по задумке хотя бы один должен гореть, то почему бы и нет? UPD: Тут подумал, а ведь можно подобрать светодиоды и резисторы так, чтобы их суммарное падение напряжения было на уровне напряжения питания, а суммарные резисторы в таком случае загонят ток в такой мизер, что когда нога в Hi-Z то диоды вообще гореть не будут. По крайней мере на глаз это будет не заметно совсем. Разве что в кромешной тьме.

Следующий вариант он не дает экономию ножек, зато позволяет упростить разводку печатной платы, не таща к двум диодам еще и шину питания или земли:

Тут все просто — превращая один из выводов то в 0 то в 1 гоняем ток то в одну сторону то в другую. В результате горит то один то другой диод. Для погашения обоих — переводим ноги в какое то единое положение 11 или 00. Два диода сразу зажечь не получится, но можно сделать динамическую индикацию — если их быстро быстро переключать, то глаз не заметит подставы, для него они будут оба горящими. А добавив третью линию можно по трем ногам прогнать до 6 светодиодов на том же принципе.

А применив сходную тактику к кнопкам можно либо упростить разводку, либо по трем ножкам развести 6 кнопок.
Тут тоже все просто — одна нога дает подтяг, вторая косит под землю. Нажатие кнопки дает просадку напряжения на подтягивающей ножке. Это чует программа, поочередно опрашивающая каждую кнопку. Потом роли ножек меняются и опрашивается следующая кнопка.
В шестикнопочном режиме ситуация схожая — одна ножка дает подтяг, другая землю, а третья прикидывается ветошью Hi-Z и не отсвечивает. Но тут есть один побочный эффект. Например, опрашиваем мы кнопку «В». Для этого у нас верхняя линия встает на вход с подтяжкой (PORTxy=1, DDRxy=0), средня дает низкий уровень на выходе (PORTxy=0, DDRxy=1), нижняя не участвует в процессе ибо стоит в Hi-Z (PORTxy=0, DDRxy=0). Если мы нажмем кнопку «В» то верхняя линия в этот момент просядет и программа поймет что нажата кнопка «В», но если мы не будем жать «В», а нажмем одновременно «Е» и «Б» то верхняя линия также просядет, а программа подумает что нажата «В», хотя она там и рядом не валялась. Минусы такой схемы — возможна неправильная обработка нажатий. Так что если девайсом будут пользоваться быдло-операторы, жмущие на все подряд без разбора, то от такой схемы лучше отказаться.

Ну и, напоследок, схема показывающая как можно обьединить кнопку и светодиод:

Работает тоже исключительно в динамике. То есть все время мы отображаем состояние светодиода — то есть выдаем в порт либо 0 (диод горит) либо Hi-Z (диод не горит). А когда надо опросить кнопку, то мы временно (на считанные микросекунды) переводим вывод в режим вход с подтягом (DDRxy=0 PORTxy=1) и слушаем кнопку. Режим когда на выводе сильный высокий уровень (DDRxy=1 PORTxy=1) включать ни в коем случае нельзя, т.к. при нажатии на кнопку можно пожечь порт.
Минусы — при нажатии на кнопку зажигается светодиод как ни крути. Впрочем, это может быть не багой, а фичей :)

Вот такие пироги. А теперь представьте себе прогу в которой реализованы все эти динамические фичи + куча своего алгоритма. Выходит либо бесконечная череда опросов, либо легион всяких флагов. В таких случаях простейшая диспетчеризация или кооперативная RTOS это то что доктор прописал — каждый опрос гонишь по циклу своей задачи и не паришься. Зато юзаешь везде какую-нибудь ATTiny2313 и ехидно глядишь на тех кто в ту же задачу пихает Mega8 или что пожирней :)

Я ничего не знаю и боюсь что либо сжечь, что мне делать???
Не бояться и делать. В конце концов, микроконтроллер не такая уж дорогая вещь чтобы сокрушаться по поводу его смерти. Выкинул в помойку и достал из пакетика новый. На худой конец, если совсем уж страшно, то можно купить готовую демоплату на которой все уже спаяно и разведено как надо. Тебе останется только программировать и смотреть результат.
А потом, на примере того как сделана демоплата, попробовать сделать что то свое. Сама же демоплата представляет собой микроконтроллер + немного стартовой периферии, которой хватит на ряд несложных опытов и которая может облегчить подключение и исследование других устройств. Демоплаты есть разные, например фирменные комплексы вроде STK500 или AVR Butterfly или моя Pinboard которая была спроектированна исходя из моего опыта и на которой будет строится весь дальнейший учебный курс.

Ссылки по теме:
Как управлять через микроконтроллер электромагнитным реле.
Как подключить к микроконтроллеру что либо гораздо более мощное чем светодиод.
Как управлять через микроконтроллер мощной нагрузкой переменного тока.
Как подключить к микроконтроллеру текстовый ЖК дисплей на контроллере HD44780.
Как подключить к микроконтроллеру ОЧЕНЬ МНОГО КНОПОК — Матричная клавиатура
Как замерить микроконтроллером аналоговый сигнал (Использование АЦП)
Как связать микроконтроллер и компьютер (по проводам, радио каналу, локальной сети)
Как научить микроконтроллер отличать свет от тьмы — трактат о фотодатчиках

З.Ы.
Камрад Dsiss снял видео о том, как Мега48 без подтяжки RESET сбрасывается от касания пальцем:

Подтягивайте RESET!!!

Запись опубликована в рубрике AVR. Учебный курс с метками , , , , . Добавьте в закладки постоянную ссылку.

230 комментариев: Подключение микроконтроллера. Ликбез.

  1. semak говорит:

    С метками тоже не все гладко — например pwm и шим. Иногда поодиночке стоят
    зы 6 проводов по 3 проводам похоже на мою индейку (ru_radio_electr), я там анонимусом пробегал :о)

    • DI HALT говорит:

      С метками бардак тоже, ага.

      Экономия проводов вспомнилась иммено из-за того случая, когда мне пришлось сильно поджаться чтобы по ногам уложиться. А МК менять ой как не хотелось :)

  2. firehacker говорит:

    На первой схеме не хватает жирной точки на стыке AGND-линии и GND-шины.

      • West говорит:

        А еще, упоминать нанофарады в схеме — ну как то совсем не по ГОСТу. Я однажды попался, отдал BOM в виде «как есть» со схемы, а там было 100nF, купили 100пФ — поди разберись, кто верблюд. Так что или в пикофарадах, тысячи их, без обозначения, либо с запятой в микрофарадах (начиная от 0,01).

        • DI HALT говорит:

          эээ…. Стоп, всегда сколько помню, во всех схемах какие видел, пики шли без обозначений, нанофарады так и обозначались — nF. ну и микрофарады подписывались uF.
          Или нанофарады вообще не обозначаются? Только пики и микры?

          • West говорит:

            Это у басурман нанофарады и прочие обозначения пишутся, чтобы избежать чтения стандартов. Да, в их схемах применяются номиналы вида «100uF 100nF 1000pF». А в этой стране принято емкости обозначать в пикофарадах без запятой, т.е. «4700″, «330″ и в микрофарадах с запятой, т.е. «100,0″, «1,5″, «0,1″ без обозначения единиц измерения. Граница раздела 0,01 мкФ, все что меньше пишется в пиках, все что выше — в мкФ.

          • nwanomaly говорит:

            не знаю, как у тебя «в этой стране», а в моей стране бывает разное. в моём инсте есть госты и стп, которым я следую (или меня нормоконтроль направляет). а на просторах инета пишут, как хотят. обычно через неск пропущенных разных схем начинает пониматься любое написание.

          • West говорит:

            Я не говорю, какое написание лучше понимается. Мне вообще удобнее воспринимать номинал в виде двух-трехзначной мантиссы и порядка. См. ГОСТ 2.702-75, п.3.36. Справедливости ради, отмечу, что вчера был неправ насчет отсутствия единиц измерения у микрофарадных емкостей, так видимо было в старом ГОСТ 2.702-69. А ныне «от 1е-8 до 9999е-6 Ф — в микрофарадах с обозначением единицы измерения строчными буквами мк.» А схема, она на то и схема, чтобы и на «просторах инета» был порядок.

  3. Lerman говорит:

    1) Чето GND -ов многовато.

    2) Неужели у кварцев есть нижний предел 1 Мгц ???

    • DI HALT говорит:

      1) У Меги 8535 в PLCC, например, целых 4 выхода GND с каждой стороны.

      2) Для этой схемы да. На более медленных кварцах просто кондеры не ставятся.

    • Volldemar говорит:

      1) GND-ов много не бывает :) чем лучшее земля, тем стабильней работает устройство

      Одно из основных правил: на каждую мелкосхему (к каждому её выводу GND) цепляется кондёрчик на на 10…100 с минимальными проводниками к полигону GND. Если кто видел, помнит, старые советские платы на рассыпухе, так там на каждой микросхеме по КМке.

  4. Syrok говорит:

    в принципе и так все это известно, но «Распечатать и на стенку», чтобы не потерялось… ;-)
    Большое спасибо.

  5. STT говорит:

    DI, немного не в той теме, но все же это относится к улучшениям…
    В форуме, если добавлять что-то к тобой же открытым топикам, они (обновленные топики) не появляются в Most Recent Topics, т.е., получается, чтоб заметили твой СОС, нужно открывать новый топик. Заметил сегодня.

  6. wowa говорит:

    Ещё рекомендуют на RESET паралельно резистору ставить диод в обратном напралении… Чтобы при выключении питания быстро разряжал конденсатор — иначе не всегда реагирует сбросом на короткое исчезновение питания и получается что данные похерились а сброс не прошел….

  7. А почему надо AVCC и AGND подключать?
    У меня и бех них всё работает %)

    правда, на прототипе и ацп не используется.

    • DI HALT говорит:

      От них еще линии порта А работают. У тебя в прототипе порт А юзается?

      • да. вполне успешно моргает отладочными светодиодами :) причём второй ногой диоды на земле. мега32.

        • DI HALT говорит:

          Хм. Удивлен. Надо в даташит глянуть по поводу питания порта А

        • DI HALT говорит:

          AVCC

          AVCC is the supply voltage pin for Port A and the A/D Converter. It should be externally connected to Vcc, even if the ADC is not used. If the ADC is used, it should be connected to VCC through a low-pass filter.

          Вот что гласит даташит на мегу32. Почему работает порт я хз :)

          • SWG говорит:

            Поди через защитные диоды подсасывает. Когда — то был довольно распространенный дефект у КМОП 561 серии: Отгорал вывод питания, но микросхемка работала. Но только до тех пор, пока на всех входах не оказывались «0″… Пока не знали, ловить такую микросхему было довольно сложно (В аппарате РТА-80 их было более 400 штук, по 60-80 штук на плате, да еще с десяток БИС).
            А аналоговая земля у многих микросхем соединена внутри с цифровой через небольшое сопротивление, порядка нескольких ом. Вполне достаточно, чтобы не протекали паразитные токи, в то же время спасает микросхему в случае обрыва аналоговой земли. Не знаю точно про Мегу 32, но у многих других микросхем такое соединение попадалось.

  8. Hermes говорит:

    эм, что-то в чип-дипе нет дроссилей на 120 мкГн, т.е. они там есть , но только сдвоенный… :(
    только не бейте блаженного

  9. nwanomaly говорит:

    кстати, отличная статья. для «хацкера» подошла бы )

  10. SiemX говорит:

    Где же была эта статья когда я сдуру кнопку на mosi при программирований нажал

  11. and говорит:

    DI подскажи пожалуйста, можно ли при программировании меги8 оставлять AGND не подключенным? Паяю универсальную переходную колодку для программатора и не хочется делать лишнюю перемычку между 8 и 22 ногой.

  12. foxit говорит:

    А можно обьяснение или статью как законектить 5В AVR с 3,3В девайсом.
    Сильно не хочеться спалить второй

    • DI HALT говорит:

      Сделай делитель напряжения между сигнальными линиями. А от 3.3 вольтового в сторону 5 вольтового этот делитель зашунтируй диодом. Должно работать.

  13. KAlciver говорит:

    А вот на второй схеме из нижней левой ноги GND показано что земля ещё заземляется. Это зачем? И ещё зачем там дроссель?

  14. uaNorb говорит:

    Дроссели на 120 мкГ оказывается дефицит в Киеве :) Взял на 150 мкГ и на 100 мкГ. Какой будет лучше поставить? И из каких соображений выбран номинал дросселя именно на 120 мкГ?

    • DI HALT говорит:

      Тут чем больше тем лучше :) Видимо из соображений минимальной достаточности.

      • West говорит:

        Если все делать по-простому, то на номинал дросселя можно забить в пределах порядка значений. А ежели делать по уму, то надо выбирать дроссель (точнее говоря, ферритовую бусину) не по микрогенрям, а по вносимому затуханию на рабочей частоте микроконтроллера. И будет она зваться не «дроссель 120 мкГн», а что-нибудь типа NFW31SP106X1E4.

  15. Melted Metal говорит:

    Хорошая статья, спасибо!

  16. haze говорит:

    Отличная статья, спасибо Вам, DI HALT, до этого даже не думал о питании контроллера, как-то все само собой подключалась. Развеяли некоторые сомнения. Написано, как всегда замечательно.

  17. pspost говорит:

    На AVR Freaks увидел: «Vcc and AVcc are connected internally on the ATmega8″. WHAT???!!!» (http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=20967&start=0)

    Ну, ладно, думаю, там пост за 2004 год. Беру свою tiny461, просто подаю 5В на Vcc-GND, и подключаю диод к AVcc. Горит) На AVcc 4.3В.
    Что-то я не допонял тут наверно с этим AVcc….

    • DI HALT говорит:

      Проверил свои меги8 — сопротивление 5 ом, как в топике том. Проверил мегу16 — там огромное сопротивление. Проверил Мегу168 — сопротивление тоже большое. А у этой какой сопротивление?

      • pspost говорит:

        Не удаётся померять сопротивление. Там, наверно, как и указывал SWG, стоит диод. В дешёвом китайском мультиметре есть тест диодов, вот он и срабатывает, причём в оба напрваления, независимо от полярности.
        А сопротивление GND-AGND точно ноль Ом (или около того).

  18. pspost говорит:

    Аналогично с AGND — диод загорается. При этом модуль АЦП работал.

  19. SWG говорит:

    Чесать правое ухо можно и левой пяткой, но лучше все делать по даташиту. Несложно подцепить пару лишних ног. Если проработало какое — то время, в нестандартных условиях, это не значит, что всегда и все будет нормально. В любой микросхеме, кроме основных элементов, в процессе изготовления получается и масса паразитных. Обычно их влияние стараются свести к минимуму. В нестандартных же включениях поведение микросхемы непредсказуемо. Хрен знает, по какому пути у вас там токи текут, и к чему это приведет. Разница в 0,7v как раз соответствует падению на каком — то диоде. Выкинуть микросхему в несколько баксов из за того, что поленился одну ногу запаять — не проблема. Проблема, если она стоит в серьезном устройстве, отказ которого может вызвать серьезные последствия. А еще хуже то, что позволишь себе нарушить раз, другой, и со временем это станет привычкой, избавится от которой очень трудно. Лучше с самого начала вбивать себе в подсознание, что ТАК ДЕЛАТЬ НЕЛЬЗЯ. Избавит на будущее от кучи проблем и репутации «халтурщика». А утверждение, что «а я сделал неправильно, и у меня все равно все работает!» — аргумент хреновый. Серьезные люди могут подумать о вас нехорошо…

    • Melted Metal говорит:

      Ничто не сохнет так долго как подмоченная репутация ©

      Надо всегда делать на совесть. Особенно это касается девайсов, которые идут «на экспорт», тобишь делаются на заказ другу/соседу/знакомому. Чтоб потом краснеть за свое творение не пришлось.

  20. noblako говорит:

    Как сделать на ножке Hi-Z состояние.Комманда cbi дает 0, sbi — 1. А Hi-Z это неопределенность,т.е не ноль и не единица,к примеру от 0.7вольт до 4.2в(или как там по ДШ,могу соврать)

    • DI HALT говорит:

      Состояние вывода вообще то определяется Тремя битами. Бит в DDR и бит в PORT и бит PUD в SFIOR:)
      На PUD пофигу его можно не трогать. А Вот DDR и PORT надо тебе раскурить :)

      Hi-Z это не 0 и не 1 это вообще не напряжение, это ВХОД в режиме большого сопротивления, по сути дела обрыв. А напряжение тут определяется извне тем что на ногу подключено.

  21. Ageofenigma говорит:

    А зачем нужны конденсаторы на кварце? Никак не могу понять

  22. Ещё полезно при подсчёте ограничивающего резистора держать в уме, что падение напряжения на красных светодиодах около 1.75в а зелёного — 2.75в.
    Слева график зелёных и синих светодиодов, справа ВАХ красного:

    От типа светодиода падение не зависит, зависит только максимальный ток, после которого диод сгорает.

  23. Reactor говорит:

    Вы советуете подтягивать ноги внешним резистором, независимо от внутренней подтяжки (100 кОм) (как в случае с подключением кнопки. А если этих кнопок 2 и обе подтянуты внешним резистор на 10 кОм. Когда нажмем одну кнопку, то ток пойдет по наименьшему сопротивлению (10 кОм) и напряжение сядит на 1 и 2 линии. Т.е. как будто нажали обе кнопки.Может там ещо диод надо вставить?

  24. patsay говорит:

    В схеме «две ноги — два светодиода» можно ставить только один общий резистор 510 (а не два отдельно на каждый диод)

  25. Reactor говорит:

    Почему везде рекомендуете делать внешную подтяжку сопротивлением именно 10 кОм. А 5кОм или 20 кОм нельзя? с чем связан такой выбор?

  26. eliran говорит:

    Собрал этот программатор:
    http://easyelectronics.ru/avr-shag-pervyj-programmator.html

    подключил его к tiny2313,

    uniprof его видит, прошивает тот примерчик “гребенку” и даже сверяет прошивку и все ок…только вот “гребенка” не работает, на всех портах нули,

    com кабель я конечно вытащил, подал на vcc 5вольт + 100нaнофарад на землю, и подключил reset на vcc через 10Ком, кварц на 8 Мгерц с 22пикофарадами…вроде ниче не забыл

    • DI HALT говорит:

      А зачем там тебе кварц? Тини2313 прекрасно и без него может.

      Чуть чуть изменил код гребенки, попробуй перекомпилировать и зашить его. Скорей всего у тебя более новая версия компилера, она строже относится к директивам сегментации, а она прописана не была.

  27. lan_tosno говорит:

    А такая схема: На одной шине SPI висят STK200, два микроконтроллера, ну и для примера парочка микросхем типа at45db161 или любые другие. хочется программировать оба контроллера масимум перетыкая джампер на RESET, и что бы взаимного влияния не было.

    вопрос: будет ли работать такая схема если к каждой микросхеме (для каждой линии spi) подтянуть резюк скажем килоом 5 и собрать их в шину типа звезды. а из точки соединения бросить резюк на землю килоом 100?

  28. ukrman говорит:

    С10 на 47mF полярный? или можно керамику? неужели для каждого девайса надо такое городить?

    • DI HALT говорит:

      Если хочешь качественной и стабильной работы, а не просто диодом помигать Just 4 Fun то лучше все же ставить. Четкое и стабильное питание залог надежной работы.

      Керамики больших емкостей ты не найдешь, а больше 2мкф еще и дороже будет.

  29. Stalker46 говорит:

    http://easyelectronics.ru/img/AVR_kurs/AVR_connect/con6.GIF
    скажи, а можно без резисторов на 10к для линий ISP? во время программирования я не буду цеплять к выводам программирования нагрузку.

  30. ukrman говорит:

    скажи DI, а если я просто в панельке заливаю, то ей тоже такой обвяз нужен?

  31. semak говорит:

    Слушай, Ди, а как сэкономить на одной единственной кнопке?
    У большинства фонариков с мк режимы переключаются кратковременным прерыванием питания. Как различить прерывание меньше и больше 1.5сек?

  32. YashinIA говорит:

    Здравствуйте все и персонально DI HALT!
    Вот и я, наконец, перешел от сферических коней к работе с железяками. И сегодня ковыряясь в макетке, вспомнил, что у меня не стоит конденсатор между ресетом и землей. Поставил 100мкФ, за что, после подачи питания на плату, на меня обиделся AVRISP mkII, замигав оранжевым диодом — «Мол, штекер неправильно воткнут в плату». Выключил, вынул конденсатор, включил — горит зеленым «Готов прошивать».
    Я бы понял его еще, если бы он красным замигал — «Короткое замыкание!!!». Ресет-то в момент включения через конденсатор на земле лежит.
    Вот такой вот эффект. Ваши мысли по этому поводу?

  33. stolyars говорит:

    простите не грамотного но вопрос:47uF это какой кондер?электролит?мкФ?объясните если не трудно по этим обозначениям…и критична ли Именно такая емкость?(с10 или с14 в схеме подключения).заранее спасибо.

  34. portvein говорит:

    Заметил, в некоторых устройствах(заводского изготовления) питание микросхем заземлено электролитическими конденсаторами на 100мФ, а керамические конденсаторы используются только для заземления кварца. Устройства эти, правда, слегка китайские(работают однако вполне себе ничего=) ). На сколько критичен тип конденсаторов (между питанием и землёй)? И на сколько схема с такими кондёрами помехоустойчива? Вопрос весьма актуальный, ибо все керамические конденсаторы такой ёмкости, продающиеся в локальных лабазах, имеют весьма внушительные габариты (с половину 8-ой меги), что очень беспонтово =(

    зыЖ есть ли ещё какие-нибудь способы, дополнительно повысить помехоустойчивость схемы (без извращенства и экзотических деталей) — необходимо в связи с автоматизацией техпроцесса, завязанного на аппаратах 30-ти летней давности, ещё и в критических условиях (бывает, что подтянутые кнопки нажимаются самостоятельно)?

    • kitekat говорит:

      Электролиты до 100мкф х 10в имеют достаточно малый размер. А шунтировать их на входе платы и на ножках питания МК — нормально будет керамическими многослойными конденсаторами 0.1мкф (100нф, на них маркировка 104) до 50в, их размер не больше 3-4мм в диаметре. Брать можно китайские, совсем НЕаудиофильские.

      Маркировка конденсаторов — две цифры и еще одна, которая показывает, сколько нулей нужно приписать после. Все переводится в пикофарадах. 0.1мкф будет как 104 = 100000пф.

  35. rulet говорит:

    Прошьется ли микроконтроллер Atmega8 если на компе стоит Pentium 4 3.2Ghz?
    Или же же частота процессора не повлияет на это?

  36. neon-f говорит:

    Такой вопрос. Если по питанию поставить 1500мкф. никаких подводный камней не будет? Дело в том, что мне нужно именно определенное расстояние между ножками конденсатора на плате, а это «определенное» расстояние я нашел только у конденсаторов от 1500мкф и выше.

  37. neon-f говорит:

    Ну по бп вопросов не будет. Используется комповый блок. Основная нагрузка по 12 вольтам, а по 5 вольтам — только схема управления (6 микрух 1533 серии+ мега8. На каждом корпусе всех микросхем стоит по 0,1мкф.
    Других подводных камней не будет??? имею ввиду работу микроконтролера, с остальным — все понятно.

    Керамику прикупить в моем городе сложновато, только под заказ….

  38. blah говорит:

    http://easyelectronics.ru/img/AVR_kurs/AVR_connect/con2.GIF
    как я понял, 100n конденсаторы сделаны для сглаживания скачков питания, происходящих на каждом цикле дискретного времени у микропроцессора.

    47μF — для сглаживания общего питания.

    Будь любезен, поясни смысл параллельного подключения c10 и c8? Они не будут себя вести как один конденсатор?

    • DI HALT говорит:

      Не совсем. Дело в том, что у них разные характеристики. Конденсаторы то не идеальные математические.

      Керамика она четче реагирует на скоростные изменения -иголки. А вот у электролитов есть еще и неслабая индуктивность. Ну и внутренние сопротивления у них тоже разнятся.

      • blah говорит:

        Ага, спасибо. Оно, конечно, ответ из разряда «ибо такова суть вещей», в голове математика не сильно проясняет :)
        Означает ли это, что тут есть неявным образом заданные типы компонент (электролит-керамика для конденсаторов, хз что для остального)?

        например,
        http://i3.ebayimg.com/02/i/001/03/de/9fbe_12.JPG
        220 µH — такое подходит в качестве индуктивности?
        Спасибо ещё раз!

        • DI HALT говорит:

          Ну найди эквивалентную схему реального конденсатора поймешь математику процесса. Там целых три элемента. Резистор, конденсатор и индуктивность. Вот у керамики и электролита эти параметры паразитные сильно разнятся.

          А вот это похоже на индуктивность. Если это действительн оно, а не резистор и его номинал 220мкН то подойдет. Я примерно такие ставлю, но у меня они все зелененькие.

  39. Panferov_ivan говорит:

    если я подключаю контроллер к программатору с общим питанием, то на AGND и AVCC тоже следует подать питание и землю соответсвенно??

  40. Sergas5 говорит:

    Доброго времени суток! Возник вопрос про ISP разъем: когда в магазине радиодеталей спросил есть ли у них ISP разъем, мне ответили что такого не бывает. Может быть он как-то по другому называется? Если да, то как? И еще, можно ли его купить в обычном компьютерном магазине или только в радиодеталях?

  41. A_ndrej говорит:

    Здравствуйте.
    Подскажите пожалуйста: Хочу сделать спидометр на Atmega8 для мотороллера. Как подключить схему к аккумулятору, что бы питать ее нормальным током? Поставить кренку на 5В? А как уменьшить ток? Как я понимаю для Atmega8 нужны одни токи, а для 7сегментных светодиодов — другие(большие? Вообщем, как сделаать что бы вся моя схема не сгорела при первом старте? :-)
    Если знаете — подскажите.

  42. Savenkot говорит:

    читаю статью, балуюсь с тинькой 2313 на макетке… Смотрю [url=http://www.atmel.com/dyn/resources/prod_documents/2543s.pdf]распиновку[/url] — нет SCK ! PB7 (UCSK/SC[b]L[/b]/PCINT7) — это оно? Очепятка, что-ли?

  43. Savenkot говорит:

    Извиняюсь за плохой HTML : читаю статью, балуюсь с тинькой 2313 на макетке… Смотрю распиновку — нет SCK ! PB7 (UCSK/SCL/PCINT7) — это оно? Очепятка, что-ли?

  44. blah говорит:

    а почему тут нарисована связка фильтрующих конденсаторов 47uF + 0.1uF, а в самой первой демоплате 100uF + 10uF?
    http://easyelectronics.ru/demoplata.html

    потому что напряжение выше до регулятора?

    И если у меня будет стоять 100uF на ноге резета (правда, с соотв. резистором) — то не стухнет ли БП питать разом 2×100 + 10 uF?

    • DI HALT говорит:

      Что было то и поставил. Принципиальной разницы тут нет. Главное чтобы одного порядка были.

      • blah говорит:

        Ага, спасибо, но я продолжаю задвать глупые вопросы :)
        Зачем на демоплате два конденсатора — до и после реуглятора?
        И почему их номиналы отличаются в десять раз?

        • DI HALT говорит:

          Такова схема включения линейного стабилизатора LM7805 если поставить слишком малые емкости то он может самовозбудиться и устроить армагедец с эффектами

          • blah говорит:

            http://www.fairchildsemi.com/ds/LM/LM7805.pdf
            на странице 22 и 23 нарисованы два конденсатора на 100 и на 330 нанофарад?
            то есть на два порядка меньше того, что стоит у тебя.. Почему?

            а на ногу резета 100uF — ты ж сам нарисовал вон там на картинке повыше, я ж тупой, я копирую что другие делают :)
            10кОм + 100uФ получим секунду задержки?

          • DI HALT говорит:

            Это минимально допустимые емкости. Меньше ставить не рекомендуется, может быть самовозбуждение.

            Выше емкость — лучше отрабатывает броски напряжения (сглаживает их). Но емкости больших номиналов (десятки и сотни микрофарад) обычно электролиты, а электролиты имеют некоторую инертность и большее внутреннее сопротивление, поэтому они не отрабатывают импульсные ВЧ помехи. Для этого в параллель им ставят керамику на несколько сотен нанофарад.

            Секунда задержки это я с запасом для примера дал. Можно делать намного меньше. скажем 1мкФ. Впрочем, за нагрузку от кондеров на БП можешь не париться, он тут заряжается через резистор, поэтому ток будет мизерный.

          • blah говорит:

            Погоди, два конденсатора вокруг стабилизатора без резисторов ведь?
            Итого нагрузка…

            Порылся у себя, у меня весьма ограниченное количество номиналов —
            100uF, 47uf, .1uF

            Все три на 47 пойдёт?
            ну и одну керамику .1uF в параллель перед стабилизатором.

          • DI HALT говорит:

            Любой нормальный БП от такой нагрузки не сдохнет. Она же импульсная. А у него либо трансформатор на выходе либо дроссель. А это индуктивность, которая не даст случится броску тока.

            Вполне.

          • blah говорит:

            спасибо!

          • ptichki_pichuzhki_gde_u_emelki_ushki говорит:

            а L7805LV чем отличается от LM без суффикса — там какие конденсаторы должны быть?

          • DI HALT говорит:

            Открой два даташита и сравни. Там же, кстати, должна быть и рекомендуемая схема. А на память я разницу не знаю.

    • DI HALT говорит:

      А зачем тебе 100uF на ноге ресета? Это слишком много.

  45. dundich говорит:

    У меня возник вопрос: «Можно ли ни один генератор использовать для тактирования нескольких МК, а один кварцевый резонатор распараллелить на несколько МК?»

  46. IDOL 1234 говорит:

    1)Я так понимаю, что для несложного устройства не стоит выпрыгивать из штанов и вешать всю периферию на пару линий. Или это — как «хороший» стиль программирования? ;)
    2)Насколько я помню, RESET (во всяком случае, на атмеге48) совмещён с каким-то портом. Значит ли это, что если при слабой подтяжке подать на него 0 (изнутри контроллера), МК рестартанёт?
    3)Так как всё таки добиться hi-z? Правильно ли я понял, что DDRD.0 = 0;PORTD.0 = 0xFF;?

    • DI HALT говорит:

      1) Да если уверен, что ничего добавлять больше не будешь, то юзай линии так как тебе хочется. А у меня это даже не красивый стиль, это просто пример того, как можно выкрутиться когда линий нехватает катастрофически, чтобы изза одной двух лампочек не переходить на МК с большим числом ног.

      2) Там где ресет совмещен с портом есть фуз бит rstdsbl который отключает (по дефолту) линию порта вообще. Т.е. запись в нее ничего не дает, а чтение возвращает 0. Так что это всего лишь ресет. Но если ОЧЕНЬ сильно надо, то линию можно включить как порт. Ресет при этом теряется вообще. И также при этом отпадает возможность прошивать МК внутрисхемно. Только через параллельный программатор.
      3) записать в порт и в ддр нули. Только не так как у тебя, так вообще не корректно (в бит байт не записать ;) ), а так. Не могу быть уверен в синтаксисе, т.к. с свавр не работаю

      Для линии D0 режим hiz ставится так:
      DDRD.0=0;
      POPRTD.0=0;

  47. IDOL 1234 говорит:

    На все линии порта D и на нулевую линию В повесил по светодиоду, на B6 — динамик. Все VCC и GND подключены, питание — от юсб. Лампочки мигают, пищалка пищит, но есть одно НО: при одновременном ОТКЛЮЧЕНИИ всех светодиодов, микроконтроллер, по-видимому, зависает. Т.е. перестаёт подавать признаки жизни до отключения питания или ресета. Светодиоды работают при лог. 1 на линии. Из-за чего может происходить такая фигня?

  48. IDOL 1234 говорит:

    Люди! ОБЯЗАТЕЛЬНО ставьте конденсатор между gnd и vcc! Без него даже при работе от батареек жуткие глюки вам обеспечены!

  49. Sadness говорит:

    Уважаемый DI HALT, у меня вопрос:

    «ISP разьем сжирает выводы. Целых 3 штуки — MOSI, MISO, SCK.
    В принципе, на эти выводы можно еще повесить и кнопки. В таком случае никто никому мешать не будет.»

    Как это сделать?

  50. Sadness говорит:

    И ещё, извините что не очень в тему, но какие конденсаторы ставить на часовой кварц (+ Мега8) ?

  51. Skull133 говорит:

    Доброго времени суток. Господа, подскажите пожалуйста — почему при тупом включении порта на вывод (высокий уровень) подключенный светодиод не постоянно светится, а моргает с частотой примерно 10-20 Гц? МК Tiny13. Причем во время действия delay_ms светится постоянно..

    • DI HALT говорит:

      Телепаты в отпуске

    • neon-f говорит:

      ищи в своем коде обнуление этого порта!

      • Skull133 говорит:

        ок, спасибо, поищу ) да я не в смысле телепатов, может, кто-то сталкивался.. )

        • neon-f говорит:

          а я тебе и пишу, потому что сталкивался. когда отлаживаешь программу, часто для понимания как что работает, ставишь в различных местах кода метки в виде вывода единички на какой то пин. после можно забыть убрать эту метки, и будет она вылазить у тебя и разрушать твой мозг.

          • Skull133 говорит:

            не, хохма не в этом. За совет спасибо огромное, но загвоздка в том, что даже при создании проекта в CVision и там выставления ЗАРАНЕЕ порта в 1 (!!! в основном цикле нет ни строчки !!!), все равно там какой-то меандр. То ли я туплю и так и должно быть, то ли CodeVision где-то врет. Я новичок, так что простите за такие элементарные вопросы )

          • DI HALT говорит:

            А нет ли у этой тиньки хитрого фуза который на один из выводов дает тактовую частоту?

          • Skull133 говорит:

            да вроде нет. Там набор фуз минимальный. Fuck ) спасибо за помощь! буду копать вглубь

          • Skull133 говорит:

            Это был Watchdog. Получено методом научного тыка..

  52. CardSloater говорит:

    Добрый день, у меня есть адаптер на выходе выдает 6V 0.5A как мне правильно запитать ATmega8 (в том числе и АЦП) так чтобы не сжечь его ?? Может как-то надо ток ограничить ??

    • DI HALT говорит:

      Надо понизить напряжение. Например стабилизатором LM7805

      • CardSloater говорит:

        а ток будет нормальным ?? я имею ввиду он не сожжет МК

        • DI HALT говорит:

          Ток может быть хоть 50А это нагрузочные возможности БП, а не тот ток который он вкчает в МК.

          • CardSloater говорит:

            Спасибо !!!

          • CardSloater говорит:

            И еще забыл спросить а что сделать чтоб на подать 3 вольта ??

          • CardSloater говорит:

            И еще забыл спросить а что сделать чтоб на АЦП подать 3 вольта ??

          • DI HALT говорит:

            Тебе надо опорное в 3 вольта? Можно поставить спец микросхему (ИОН) которая даст тебе точные 3 вольта. Можно стабилитроном сделать. Также в меге есть внутренний ИОН на 2.54 вольта.

          • CardSloater говорит:

            а если я на вход 6 вольтового источника поставлю делатель из двух одинаковых сопротивлениями это будет плохо ????

          • neon-f говорит:

            если 6 вольт стабилизированные, и сопротивления возьмете «точные» — то в принципе не плохо. но твой адаптер скорее всего обычный транс с выпрямителем, и там будет не 6 вольт, а фиг знает что(в зависимости от нагрузки и качестве твоего адаптера). да и зачем чтото выдумывать, ставить лишние детали, и тратить лишнюю ногу контроллера. Используй внутренний ИОН.

          • CardSloater говорит:

            А если я включу внутренний ИОН мне на вывод AREF ничего подавать ненадо, а питание АЦП AVCC давать такое же как и самого МК VCC ???

          • neon-f говорит:

            выше в статье, написано как следует поступать с выводами AREF и AVCC.

          • DI HALT говорит:

            Да. Ну разве что AREF повесить через кондер на землю. Чтобы постабильней было.

          • CardSloater говорит:

            С этим справился.
            А такой вопрос, мне нужно на МК сделать амперметр, я просто поставил на ножку АЦП 1 Ом и меряю на нем напряжение. Так будет правильно ??

          • DI HALT говорит:

            Вполне. Но Можно сделать еще точней — взять калиброваный шунт на 0.1 ом, операционный усилитель инструментальынй, а с него уже на АЦП.

          • CardSloater говорит:

            Мне впринципе чем проще тем лучше. Мне по заданию курсовой надо сделать измеритель тока, напряжения и сопротивления, особой точности я не добиваюсь, главное чтоб работал. Програмно я все сделал, а вот по части электроники неуверен что не сгорит чтонибудь.
            Вот схема в протеусе и хекс на МК гляньте что там не так !!!
            http://zalil.ru/29847731

          • CardSloater говорит:

            А когда я мераю ток (напряжение) на «одном оме» мне надо вешать резисторы на порт чтоб ограничить ток ??

          • DI HALT говорит:

            А какой ток? Весь ток уйдет по шунту. А тебе надо порт поставить в состояние Hi-Z и тогда через него вообще мизерные токи пойдут (наноамперы) Можешь еще резистор в 10кОм поставить. Он там, что слону ветерок (сопротивление порта гигаомы) и плюс минус 10к ничего не изменят. ГЛавное чтобы напряжение снимаемое с шунта не превысило питающее. Это возможно в том случае, если у тебя измеряемая нагрузка имеет больший вольтаж (чем питание), а по шунту рванет очень большой ток. Скажем КЗ нагрузки. Это высадит на нем все напряжение силового питания схемы, а контроллеру пробьет вход. Но тут ничего не сделать. Разве что супрессор поставить, но не знаю как он повлияет на точность. У него все же есть свои паразитные емкости, а ток в нагрузке может прыгать весьма быстро и будет смазывание измеряемой картины.

          • neon-f говорит:

            поставь предохранитель.

  53. ZMIY говорит:

    [quote]
    Схема сброса
    Резистор на RESET. Вообще в AVR есть своя внутренняя схема сброса, а сигнал RESET изнутри уже подтянут резистором в 100кОм к Vcc. НО! Подтяжка это настолько дохлая, что микроконтроллер ловит сброс от каждого чиха. Например, от касания пальцем ножки RST, а то и просто от задевания пальцем за плату. Поэтому крайне рекомендуется RST подтянуть до питания резистором в 10к. Меньше не стоит, т.к. тогда есть вероятность, что внутрисхемный программатор не сможет эту подтяжку пересилить и прошить МК внутри схемы не удасться. 10к в самый раз.
    [/quote]
    Простите за ламерский вопрос, но я в электронике пока полный ноль.
    Судя по описанию, питание должно от програматора идти через резистор, а на схеме, которая предшествует описанию оно через резистор идёт только по питанию схемы, питание же от програматора на схеме идёт непосредствено на ногу МК. Так как всётаки правильно ?

    • DI HALT говорит:

      Питание всегда идет напрямую, без каких либо резисторов. Не путай питание и подтяжку. Подтяжка на RESET идет через резистор, но сам RESET идет на программатор напрямую.

  54. neon-f говорит:

    а будет ли разница, если к примеру в конструкции, поставить вместо одного электролита на 100мкф, — 10шт по 10мкф раскинутых по плате?? (0,1мк на каждый корпус само собой тоже будут естественно )

    • DI HALT говорит:

      Будет, при зарядке этих электролитов будут большие токи в плате, что вызовет перекосы уровней и ложные срабатывания логики. Так что его надо воткнуть на выходе из источника.

      • neon-f говорит:

        т.е. один на 100мк на выходе источника предпочтительнее 10 шт по 10 мкф раскинутых по плата(например на каждый корпус)???

        • DI HALT говорит:

          Да. Тем более у каждого корпуса по электролиту ставить смысла нет. Электролит ставится перед мощными потребителями, чтобы их броски тока не так сильно отражались на всей схеме. Обычно же потребителем является вся схема, а перед каждым корпусом ставят только керамику.

  55. zaratustra говорит:

    Мужики, а не у кого нет DATASHEET на любой контроллер на русском. Английский учу, но медленно. Но я стараюсь

  56. novichok говорит:

    Добрый день, у меня проблема с запуском конроллера. Пробовал запустить AT90S2312 -не получилось. ATMega8515- тот же результат. Программу писал уже простейшую, чтобы просто на порты высокий уровень подать. А контроллеры «спят» мёртвым сном. В чём же может быть проблема?

    • jacek говорит:

      Возможно, не прав — сам с контроллерами только начал возиться. Знатоки поправят)))
      Фузы у Вас правильно выставлены, уверены? Возможно, в фузах выставлена работа от внешнего тактового генератора, а Вы его не учли. RST подтянут к питанию? Питание откуда берете?

      • novichok говорит:

        Фьюзы выставлял как для работы от внутреннего генератора, так и от внешнего кварца, а на выходе тишина. Думал может WD сбрасывает постоянно контроллер.WD-таймер отключил фьюзом. Ресет подтянут 10k к питанию. Питание стабилизированное через 7805. Контроллер (ATMEGA8515) заведомо исправный, так как снят с работающего устройства. Бьюсь как рыба об лёд. Идей не нахожу что дальше делать…

        • DI HALT говорит:

          А самую элементарную программу пробовал прошивать? Где тупо в цикле зажигается уровень на нужном порту (даже не мигает) а на остальных выводах нули. Работает?

          • novichok говорит:

            Да, пробовал. Поднимал выводы порта в единицу. Пробовал со всеми портами. Программу писал в AVR Studio. Зашивал контроллер программатором Мастер-02(есть такой в природе). Может что то путаю в программировании…
            Сейчас уже заказал для эксперементов ATMEGA16 c AVRDraron-ом. Всё равно не успокоюсь пока результата не получу!)

          • DI HALT говорит:

            Ну код тогда чтоль покажи (только кинь в репозиторий, а то в комментах его неудобно смотреть)

    • DI HALT говорит:

      Для S2313 вроде бы нужен внешний кварц в любом случае.

  57. jacek говорит:

    Уважаемые, подскажите пожалуйста, не могу понять.
    Допустим, МК выполняет программу, пока на ноге RST лог.1. Как только сбрасываем RST в лог.0, прога перестает выполняться. Устанавливаем опять на RST лог.1 — прога начинает работать «с нуля».
    А при прошивке МК как? RST устанавливается в 1 и тот час начинается прошивка? Или как? А зашитая до этого прога почему не будет выполняться? Почему контроллер однозначно будет прошиваться, а не выполнять по установке в лог.1 RST зашитую программу?
    Заранее благодарю.

  58. jacek говорит:

    Ди, а у тебя на схеме правильно R3 подключен (рис. «Согласование линий ISP и схемы»)? По-моему, его надо слева, перед разветвлением на кондеры и reset ставить, ну, или второй резюк поставить перед этим разветвлением, а R3 не трогать. Это ж не RC-цепочка у тебя: конденсатор заряжается напрямую от +5В, а надо, чтоб через резистор заряжался, чтоб время зарядки растянуть.

    • DI HALT говорит:

      Нет там все верно. Это кондер блокирующий в питании. Не смотри на него. А резистор просто подтягивающий. Напрямую ресет там в питание соединять нельзя — программатор тогда не сможет прошить.

  59. enq говорит:

    Если не запитал AVCC и AGND и при первом включении (еще без прошивки) mega16a сильно раскалилась как раз в районе ног птиания АЦП, то МК сдох? Хотя ни до, ни после он не определялся Громовым.

    • DI HALT говорит:

      Вообщет не должен он был раскалиться. Скорей ты питание перепутал. Либо словил тиристорную защелку как раз на этом порту. Тоже есть такой вариант, но не большой. Если вовремя выключил, то не сдох.

      А почему увереность что именно в этом месте? ЩУпал?

      • enq говорит:

        Щупал канеш)) Начинался нагрев на верхней поверхности корпуса (PDIP) около тех самых ног, и постепенно раскаливался весь. Так 2 раза было, потом перестал. Переполюсовки не, 100 раз проверял. Питалово от USB.

  60. Алекс говорит:

    На днях купил ATMega48 в мелком корпусе (TQFP). В отличии от DIP варианта, там два дополнительных входа АЦП (ADC6 и ADC7). В разработке АЦП не используется. Подскажи пожалуйста, как с ними поступать (посадить на землю? подтянуть к VCC через резистор? зашунтировать конденсатором на землю?).
    И еще, подскажи как поступать с ногами, которые не используются (висят в воздухе), где то у тебя встречал, сейчас не могу найти. Спасибо…

  61. v.m.s. говорит:

    «(если есть чисто низковольтные серии, то просьба уточнить в комментах, т.к. я таких не встречал)»

    ATxmega питание 1.6-3.6В.

  62. v.m.s. говорит:

    «Провод Vcc до программатора показан пунктиром поскольку он не обязателен.»

    Наверное, зависит от программатора. Для тех кто собирается юзать АVR Dragon питание надо заводить на вывод Vtg разъема прорграммирования, дабы Дракон смог «подогнать» (сравнять) уровни своих сигналов с уровнями сигналов на целевой плате.

  63. ptichki_pichuzhki_gde_u_emelki_ushki говорит:

    а что можно ожидать на ногах микроконтроллера в момент его включения? если мы управляем какой-нибудь силовой нагрузкой — как избежать случайного включения этой нагрузки при включении микроконтроллера?

    • DI HALT говорит:

      По идее нули. Но гарантии никто не дает ессесно.

      Поэтому тогда где действительно страшно я параноидально перестраховываюсь — выводы пропускаю через буферную микросхему, А вход enable на нее подаю через логическую цепочку дающую 1 на выходе только при хитром коде (обычно 4ре бита) на входе.

  64. Dexiny говорит:

    Зачем тут 2 резистора ставить, когда можно один? :) http://easyelectronics.ru/img/AVR_kurs/AVR_connect/con8.GIF

  65. GeoDX говорит:

    А почему 20 ma? По даташиту МК вроде 40 ма на ногу выдерживает. Или это только на бумаге и кратковременно — а реально нога горит при 20 ма?

    • DI HALT говорит:

      Раньше было везде 20мА ныне может что и изменилось. Но я стараюсь выше 20мА не превышать. Т.к. есть еще и ограничение на кристалл. Т.е. разом со всех ног по 20мА не снять.

  66. У меня почему-то резистор 10k не смог подтянуть reset (и другие ноги) ATmega168-20PU при питании 5V, пришлось уменьшить сопротивление аж до 510R. Боюсь сжечь порты. Подскажи пожалуйста почему такое может быть.

  67. Theo говорит:

    Просмотрел даташиты на меги и там везде параметры LC фильтра: 100nF и 10uH. тоесть номинал дроселя там не сильно критичен? можно и 100uH ставить?

  68. mikevlz говорит:

    Господа, подскажите несмышленому. Надо мегой нажимать на кнопку пульта. Кнопка организована так, что в ненажатом состоянии на входе шифратора Vcc, в нажатом, соотв., земля. Как подключить этот пульт к меге? Да, нажимать некоторые кнопки одновременно нельзя. Шифратор обидится. Я предполагаю, что надо организовать подтяжку к питанию для этих кнопок, а мегой просто выдавать логический ноль, когда надо нажать. Когда надо отпустить кнопку — лог 1 на выходе. Или стоит таки переводить выход в Hi-Z? Величину подтяжки(если нужна) для устройств с рабочим напряжением 3.3В(и контроллер и пульт) как подсчитать? Или городить что-то из транзисторов предпочтительнее? Вроде напрямую подключал, ничего не померло. Но вот беспокоюсь я, за время перезагрузки контроллера пульт может неадекватно себя вести, ведь при прямом подключении там вплоть до инициализации порта и выставления уровня будет ноль, значит все кнопки нажаты…

  69. easyelectronics говорит:

    Добрый вечер. Ув. DI HALT. Маленькая просьбочка. Не могли бы Вы еще ответить на один вопросик. Вот если я питаю мк от батареек. Напряжение будет от 1,7-3Вольта. Паралельно хочу запитать эмитерный поворитель на одном транзисторе NPN. На выходе эмитерного повторителя будет напряжение при питании 1,7В = 0,54В; при питании 3В = 1,5В; А вот вход контроллера это 1 и 0 при каких напряжениях? Или к примеру 1 это при полном замыкании входа контроллера на GND, а 0 при полном замыкании на Vсс? Заранее спасибо большое.

    • DI HALT говорит:

      пороговые напряжения 0 и 1 надо смотреть в даташите на конкретный микроконтроллер, в разделе электрических минимумов и максимумов. Там показаны логические уровни в зависимости от питающигео напряжения.

  70. easyelectronics говорит:

    Ок. Спасибо. Буду изучать. Я на англицком только материться могу, особенно когда палец об паяльник обожгу 8).Даташит смотрел запутался 8)

  71. parsifal говорит:

    Ув. DI HALT. Мне случайно досталось устройство — контроллер сигнализации с GSM доступом промышленного производства на ATTiny2313. Этот контроллер предназначен для работы с пультом на ПК. Я попытался переписать программу под существующую схему для работы с телефоном и столкнулся с следующей проблемой. Напряжение на выводах МК в замкнутом на землю состоянии — состоянии охраны — равно половине питания 2,5 — 2,8В (лог.0 по ДШ для этого МК равен 1,9В). В разомкнутом состоянии — состоянии тревоги — напряжения близки к напряжению питания 4,9 — 5,0В. Естественно, у меня не получилось написать программу под эту схему, а схему изменять не хочется.
    Подскажите пожалуйста, как заставить МК понимать половину питания на выводе как логический 0 в PINx. Или хотя бы подскажите направление, где копать.
    Выводы в МК задействованы самые разнообразные: 3 из порта В, 4 из порта D, причём не по порядку, а вразнобой!
    Заранее благодарю!!!

    • DI HALT говорит:

      В уже имеющейся схеме никак. Ищите почему оно так, а не как должно. А вообще можно поставить тот же делитель напряжения, который поделит напругу так, чтобы низкий уровень был на уровне лог0, а высокий выше этого предела. Да, ты уверен, что этот вход идет на PIN а не на аналоговый компаратор?

      • parsifal говорит:

        Но оно же как-то работало!
        Там и так куча делителей, я могу прислать схему входных цепей.
        Про компаратор тоже думал, но в ATTiny2313 компаратор один и на определённых ногах МК, а в устройстве входных цепей аж целых 7 с одинаковой реализацией.

Добавить комментарий