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

Казалось бы простая тема, а однако в комментах меня завалили вопросами как подключить микроконтроллер. Как подключить к нему светодиод, кнопку, питание. Что делать с 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!!!

299 thoughts on “Подключение микроконтроллера. Ликбез.”

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

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

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

        1. Можно. Можно, но тебе там такой огромный не нужен. У меня в демоплаты идет тип CESL, но это не важно. Любой маломощный. Там дроссель надо на токи мизерные, чем компактней тем лучше. оптимально что то вида 10282 (с твоей же ссылки). Тот что ты назвал 25580 это силовой, на нем блоки питания делают.

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

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

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

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

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

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

        И как тогда получается на схеме?
        XLAL1 — ZQ — XTAL2 и без всяких отводов на GND???

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

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

        1. Да да :)
          Но всё ж приятно было смотреть на такие устройства, с сотнями корпусов, и всё это работало :) правда потребление тока было огромное :) прогресс не стоит на месте :)

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

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

        1. 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. Почему работает порт я хз :)

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

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

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

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

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

  7. На 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….

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

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

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

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

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

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

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

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

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

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

    1. А для синих вообще 3,7В, а для белых, рабочий элемент которых излучает УФ, и того больше. Можно даже без резистора запитывать.
      Кстати, лимит напряжения питания дает ограничения на цвет применяемых диодов: оно должно быть не меньше, чем падение напряжения на желаемом диоде.

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

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

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

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

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

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

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

      1. Дело в том что я не компилировал, а взял готовый hex отсюда
        http://easyelectronics.ru/files/AVR/add.zip

        Кстати какойто глюк, на резисторе со стороны reset напряжение сидит чуть выше нуля…

        А насчет без кварца…я должен гдето сконфигурировать чтоб он работал от внутреннего такта? как вообще он знает от какого работать?

        1. Возьми еще раз. Я и его только что перекомпилировал и заменил на сайте. Теперь точно работает, проверил в железе.

          ПО дефолту стоит работа от внутреннего кварца.

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

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

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

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

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

        1. Не, подключить конденсатор через резистор к питанию и ногой мерить напряжение на нем. А еще добавить разрядный резистор с диодом. Через который кондер будет быстро разряжаться при отключении питания.

        2. Или еще проще:

          На ногу вешается кондер, а в параллель ему резистор.

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

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

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

        1. Можно ставить где то в районе 10..100мкф Если его не поставишь меньше тоже не особо критично, но нежелательно — стабилизатор может в разгон пойти. Сильно больше ставить опять же плохо — большая нагрузка на источник питания при его заряде будет.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                  Вполне.

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

      1. ОК!!!понял, спасибо. А в каких-то разделах этого сайта есть схема внешнего генератора? Просто, как я понял, на вашем сайте все схемы проверены на практике, а в гугле есть вероятность наткнуться на какие-нибудь грабли.

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

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

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

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

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

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

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

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

      1. Если в районе 10к, то не будет. Программатор подключается напрямую к выводам, а если к этим выводам подключается что то еще, то это что то подцепляется через резисторы в 1…10к

    1. если именно мега8, то кондеры можно не ставить, у неё есть встроенные. как их подключить — смотри даташит. если хочешь всеже отдельные кондеры, то их емкость зависит от типа кварца. скорее всего у тебя какой-нибудь безымянный кварц выдранный из материнки, или еще от куда, поэтому ставь на угад пик на 15-22.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    1. переведенные даташиты есть на некоторые PIC А также есть книги Евстифеева которые чуть более чем полностью являются компиляцией и переводом даташитов на avr

    2. Есть на АТМега128. Собственно, чего только не напихали в эту АТМегу: можно брать даташит АТМеги8 и по аналогии многие вещи «понимать». Есть книга по Тини2313: почти даташит, но с небольшими комментариями, примерами, задачками в конце книги. Если актуально, куда выслать?

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

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

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

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

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

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

      1. Похоже, мне придется вскоре «поставить автору пива» ))) Спасибо за оперативность, нормальное отношение и в который раз развеивающий мое недопонимание ответ.
        … надеюсь, лимит вопросов у меня еще не исчерпан? :D

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

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

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

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

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

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

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

      1. Понятно, не подключенные подтянуть программно к Vcc, а что с ADCn? Это не выводы порта, а просто входы АЦП, на сколько я понимаю к ним программного доступа через DDRPn PORTn нет.

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

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

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

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

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

        1. я думаю нигде. вряд ли вы строите автомат управления башенного крана…. а в остальных случаях, микросекунда ничего не успеет спалить. Но! мне кажется такой очевидный вопрос атмел продумала, и на всех ногах контроллера во время всяких «переходных процессов» будут нули. ИМХО.

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

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

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

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

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

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

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

  42. DI HALT, я вот уже не в первый раз головой бьюсь об правильном подключении МК mega16… прошу помощи. Программатор у меня MasterKit BM9010 — USB (AVR910 compatible, слизанный со схемы Protoss который). Не работает внутрисхемное программирование. :( Отдельно микруху шьет, а внутри схемы — нет. Фьюзы на МК выставлены на внутренний генератор 8Мгц, задержка 6 тактов+64 мс. Земли у программатора и схемы — общие. V+ питания — разные. Привожу схему и топологию платы моего устройства:

    Схема:
    http://smotr.im/3tDQ
    Разводка платы:
    http://smotr.im/3tDR
    Вид изделия:
    http://smotr.im/3tDS
    http://smotr.im/3tDT

    Так запрограммировано, что красный светодиод на плате загорается по команде МК, когда он загрузится. А желтые подключены к ногам МК в режиме выходов с нулевым логуровнем. Однако, один желтый светодиод горит в пол силы (на нем 1,27В), а я все никак не найду причины. Все перепроверил, никаких недотравок между дорожками нет, вроде бы косяк с разводкой тоже не нахожу, но загорается он:
    а) как только подается питание на плату, перед тем как загрузится МК (судя по моменту включения красного)
    б) если МК не установлен на плату, тогда он не загорается, стоит установить даже чистый МК (с очищенной flash-памятью), как он загорается в пол силы немедленно при подаче питания.

    Быть может это как-то связано с неработающим ISP?
    Еще один факт: в такой вот конфигурации у меня при первом подключении устройства удалось запустить внутрисхемное программирование: МК определился, и начал прошиваться, но на полпроцесса CVAVR выдал ошибку и больше на этой плате увидеть подключенный МК не удавалось (Ошибка: «не могу войти в режим программирования»).

    Питание к МК подключил вроде точно так, как описано в этой статье, даже дроссель на 150мкГн поставил.

    От платы к плате я повторяю одну и ту же ошибку — не работает ISP. В чем же косяк?

          1. Да, действительно дело было в питании. Этот мастеркитовский программатор вообще не выводит +5V на ISP разъем, он у них висит в воздухе. Прежде чем портить товарный вид устройства, я решил к своей плате подключить питание от компьютерного БП. Все определилось прошиваться стало на ура.

            БП не тот, что внутри компа, к которому подключен программатор, а сторонний.

  43. Глупый вопрос: а если я параллельно сглаживающим конденсаторам на входе захочу подключить светодиод для индикации питания (через соотв. резистор) — его лучше включить до конденсаторов или после? Или без разницы?

  44. У кого-то работает без подтяжки резета, у кого-то нет — все из-за того что там не обызятельно 100кОм. та вполне спокойно может быть 20кОм, ну для меги 16. А для 32 меги там уже резистор 30-60кОм, на мегу 8 — 30-80кОм. поэтому у кого-то работают, а у кого-то нет :\

    Кстати, вот спрашивали атмеловцев по поводу подключения всех ног, вот ответ:
    Dear Customer,
    For better performance of the device one must have them independently on each side. Correct and sufficient decoupling of power lines is crucial for stable microcontroller behaviour, and for minimising the emitted noise from the device.
    To make the fact clear, we have to start from the bounding wire made inside the die. We say that each bounding wire can handle 100 mA which is done at the time of manufacturing the device package wise.
    Hence for the PDIP packages of this device, it is 200mA and for the TQFP package, it is 400mA for each Vcc/Gnd pair.
    It is not recommended to connect only one pair of Vcc and Gnd and expect the device to perform as per the specification.
    We recommend you to refer one of our application notes «AVR040: EMC Design Considerations» available in our website under section «4.6 Power Supply, Power
    Routing and Decoupling Capacitors» in page number 9 for more information on the same.
    The application note is available at:
    http://www.atmel.com/devices/ATMEGA8535.aspx?tab=docu.. —>AVR040: EMC Design Considerations
    Hope this clarifies the issue and serves your need.

    Best Regards,
    Srinivasan Mariappan
    Atmel Technical Support Team

    Ну просто подумал, что это тут будет кстати))

  45. Очень хорошая статья, Благодарю!

    Очень понравилось решение 6 кнопок по 3 проводам… размышлял над тем как ещё можно уменьшить габариты и пришла в голову идея сделать 6 кнопок на 3 проводах и двух диодах, если бы можно было как то картинку кинуть, я бы с радостью.

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

    На на основе выше предложенной схемы это выглядит так, вместо всех диодов:
    Располагается первый диод на среднем проводе в области между кнопками «А»,»Б»,»В»,»Г»(так что бы на кнопки «А»,»Б» он не действовал во время сканирования, а на кнопки «В»,»Г» действовал ).
    А второй на нижнем или верхнем проводе в области между кнопками «Е»,»Д» (впрочем можно просто оставить диод на конопке «Д», а с кнопки «Е» убрать)

    1. Естественно для подстраховки при сканировании «по принципу обнаружения логического 0 на контакте», например, кнопок «А»»В», нужно «+» установить на средний и нижние контакты , а верхний на «-«

    2. Первом сканировании «А»»В»:
      При первом сканировании ddr0 «+» на средний контакт и нижний, ddr1 «-» на верхний.
      При втором сканировании ddr0 «+» на верхний контакт и нижний, ddr1 «-» на средний.

  46. Доброго времени суток.
    DI, вообще-то если есть 3 ноги, по 2 состояния на каждой, то получаем количество возможных вариантов 2 в кубе = 8. Таким образом, можно подключить 7 кнопок, да и считывать данные с портов надо будет только один раз.

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

  48. почему в студии при трассировки кода цифровой шарманки SETB PORTD,6,R16; CLRB DDRD,6,R16 не выставляется PIND в единицу? ведь PORTD=1 DDRD=0 режим входа с подтяжкой. (а в реальном контролере все работает)

  49. ISP разьем. Я уже давным давно забыл что такое тыкать микроконтроллер вначале в колодку программатора, потом в плату, потом обратно и так по многу раз, пока прогу не отладишь. У меня на плате торчат 6 выводов ISP разьема и при отладке программатор вечно воткнут в плату, а программу я перешиваю порой по нескольку раз в 10 минут. Прошил — проверил. Не работает? Подправил, перепрошил еще раз… И так до тех пор пока не заработает. Ресурс у МК на перепрошивку исчисляется тысячами раз. Но ISP разьем сжирает выводы. Целых 3 штуки — MOSI, MISO, SCK.

    Я неопытен. Позвольте Уточняющий вопрос: А при нормальной работе Микроконтроллера можно не отключать Программатор/Отладчик (в частности, AVR Dragon) от целевой платы?
    В случае, если выводы MOSI, MISO, SCK используются как выходные… микроконтроллер выдаёт на выход произвольные уровни напряжений, обусловленные логикой его работы… а отладчик (в частности, AVR Dragon) остаётся подключенным к целевой плате — он гарантированно переводит свои MOSI, MISO, SCK в Hi-Z?
    (BSVi писал: у AVR Dragon есть некие «аналоговые ключи», кажется, для этой цели?..)

    А если, при нормальной работе Микроконтроллера, используется его отладка через debugWire — то обязательно ли отключать, на время отладки, AVR Dragon от выводов микроконтроллера MOSI, MISO, SCK?
    Меня смутила фраза, которую написал BSVi: «После конфигурации Микроконтроллера через ISP, перед его отладкой через debugWire… Отключаем питание, отключаем ISP от контроллера (можно и оставить, если SPI не используется), оставляем только RESET, VTG и GND подключенными…» Однако же, ниже, BSVi также пишет: «В подавляющем большинстве проектов SPI не используется, поэтому можно один раз подключиться и ничего не трогать…»
    Здесь, под «SPI не используется» подразумевается, ЧТОБЫ Микроконтроллер на отлаживаемой плате, при своей нормальной работе, НЕ ИСПОЛЬЗОВАЛ полноценный протокол SPI для обмена данными с другими [ведомыми] Микроконтроллерами на отлаживаемой плате (чем может, случайно, зацепить и инициировать сеанс с микроконтроллером отладчика AVR Dragon, если последний не отключен)?
    Однако, сами выводы MOSI, MISO, SCK — микроконтроллер может использовать как выходные (например, как обычный порт B), при неотключенном отладчике AVR Dragon, если активна отладка по debugWire?

    1. Ага, кажется, я готов сам себе ответить на этот вопрос:
      «Introducion AVR Dragon.pdf» guide говорит:
      Connecting AVR Dragon probe to 6-pins ISP header using a 6-pin cable
      «When DWEN fuse is programmed, there is onlyneed for GND, VTref and RESET line for using the debugWIRE interface. However to ease the task of changing between ISP mode and debugWIRE mode, it is recommended to do debugWIRE with all six lines connected. The AVR Dragon will automatically tristate all unused ISP pins when running debugWIRE.»

      И вообще, этот guide, неоднократно, всячески рекомендует всегда использовать полноценный 6-проводный разъём ISP (что, как бы, намекает на безопасность и продуманность решения): «…The debugWIRE interface itself cannot enable this fuse… For this reason it is recommended to place the full 6-pin ISP connector on your target board to simplify emulation and programming.»

    2. Хороший программатор всегда переводит свои выводы в HiZ режим. Через дебугвайр можно же вроде и шить и отлаживать. Программатор там отдельно не нужен. Там он имеет ввиду то, что цепляемся по ISP программатором один раз, чтобы сконфигурировать debugWire и больше ISP нам не нужен. А оставить его можно (только зачем? Лишние сопли) только если мы не используем SPI интерфейс контроллера, который висящий программатор может принять за попытку контроллера с ним пообщаться.

  50. Здравствуйте!
    У меня вопрос — не знаю точно, по чему, но, кажется, по подключению.
    Спаял на днях один из первых своих приборов на микроконтроллере — игрушку на Atmega8A, c матричной клавиатурой, дисплеем от Nokia 1100, часовым кварцем и Li-Ion Акб . Сделал плату, спаял, прошил, отладил, убрал в корпус из оргстекла.
    Так вот, пока прибор лежит дома на столе, он работает. Когда засовываю в карман синтетической куртки и бегу с ним по улице — начинает жутко глючить: иногда перезагружается, иногда отключает дисплей, иногда высылает на него команды, отсутствующие в прошивке.
    Посоветуйте, пожалуйста, с чем это может быть связано (статика? где-то плохой контакт или трещина в дорожке?) и как оно лечится?

  51. Привет DI HALT! Дня три как я интересуюсь микроконтроллерами — причём интерес возник не просто так, а по причине того, что нужно сделать одно интересное устройство. Сначала я поискал электронщиков, но потом капнул чуть глубже и всё стало настолько интересно, что это устройство я решил сделать сам — для этого придётся освоить много чего интересного — начиная с пайки и продолжая ассемблером. Благо наткнулся на тебя(трудно вообще на тебя не наткнуться по этой теме)
    В общем настало время вопросов — если будет время и желание — ответь пожалуйста на них. Я буду очень признателен.
    Вопрос номер ноль — в минимально-возможной-схеме-подключения-микроконтроллера (не в той конечно, которая вообще минимальная) можно ли заменить катушку индуктивности 120 микроГенри на 100 микроГенри или что то близкое к 120 — не могу отыскать в наших краях именно на 120.
    Вопрос номер один — к программатору «необязательным пунктиром» идёт питание на +5в — я нем могу вникнуть — у меня скажем программатор Громова — куда там в принципе можно воткнуть 5 вольт? Или имеется в виду, что лучше взять источник тока из порта, откуда шьём?
    Вопрос номер два — спалил at90s2323 когда подключил к программатору Громова — нагрелся так, что провода от ножек отпаялись нафиг — неправильно спаял? Плюс сюда же — есть блок питания на 5 вольт и 3А — вот эти 3А это же запас, который этот блок может потянуть? То есть схеме, которая в миллиамперах потребляет это не страшно?
    И последний, наиболее интересующий меня вопрос номер три — почему at90s2323 стоит в 3 раза дороже той же атмеги8 при том, что и ног мало и характеристики по сравнению с мегой не айс?
    Буду признателен, если поможешь! Кстати девайс который собираюсь сделать — это автоматическая домашняя пивоварня. МОжно было бы обойтись какой-нить аналоговой шнягой вроде терморелешек, таймеров — но в виду перспектив решил сделать всё по-взрослому! И с меня минимум 2-3 пинты пива тебе просто за то, что ты вот такой полезный ресурс ведёшь! Будь здоров!

    1. 0. Можно заменить даже куском провода. Вряд ли тебя волнует точность АЦП на данном этапе. Да и потом хватит того, что есть.
      1. Возьми с USB там 5 вольт. Подать надо на питание контроллера иначе ничего работать не будет.
      2. Видимо да.
      4. 3А это запас по току. Все правильно понял.
      5. Блин, где вы все берете эти АТ90S2323 и прочие? Они уже лет 15 как сняты с производства и продаются как антиквариат, т.е. дорого и исключительно для тех кто сильно в них нуждается т.к. не может заменить ни на что другое по каким-либо причинам.

  52. Доброе утро всем, если тема ещё жива, прошу помощи у автора темы.
    Такая проблема: есть контроллер тини2313 с внешним кварцем на 10 МГц (ресет подтянут) — на USI как SPI весит семисегментная индикация на сдвиговых регистрах, есть вход под ик-датчик через оптопару, транзисторный выход под реле, и 4 кнопки для настройки некого техпроцесса.. (на АВР уже не первый проект, но были 32е меги..) Код написан и вполне так себе отлично работает, но вот работает он только от программаторского питания 3в. В устройстве предусмотрено питание на DС-DС преобразователе (МС34063А) 24/5 в, от него работает с дикими глюками: вечно портит епром, постоянно ресетится, и в целом не корректно работает. Но самое обидное, что не работает мое устройство ни от одного другого источника питания, кроме как от юсб программатора с ноута (ни трансформаторный БП, ни отдельный импульсный компьютерный БП — не работает!!!). Мыслей уже нету что проверять, производилась замена программатора (910 на АВРИСП/стк500), и кврца с кондерами, и контроллера свеже испеченным, и оптрона, БП. На осциле проверялось питание (хоть и на МС34063А есть пульсации, что навеевало на мысли нахождения причины, но стоило подать потом другое абсолютно чистое питание все происходило абсолютно так же). Могу предоставить что угодно (схему, разводку, проект в проетусе, код на си). Помогите люди добрые =(.

    1. Запитай от батареек. Если не работает от них, то дело не в питании. А если от батареек все ок, то ищи косяки в разводке. Тут могут быть земляные петли, разделенный кварц и много чего еще на что с сетевого питателя легко прорвется мусор:
      Подробней тут:

      http://easyelectronics.ru/razvedenie-pitaniya.html

      1. Спасибо большое за совет, будем пробовать. А по поводу статьи так самое печальное что потребитель, в роли которого 6 сдвиговых регистров и 6 7-сегментных индикаторов, разведен именно так как есть не желательно по описанному. Пусть там токи и не 10 ампер, но все же хреново
        Вот разводка в протеусе http://rghost.ru/50958115

        1. От батареек не работает: отдельных 2 проводка на плату с батареек — не работает, а отдельных 2 проводка с программатора — работает. И кстати усилил шину минуса на плате на всяк случай после прочтения статьи. На плате ни одного кондера по питанию. ось така херня малята =(

          1. Вот насчет батареек странно. У тебя точно питание правильно приходит? А попробуй те же батарейки/Бп завести не на гнездо или что там у тебя в качестве ввода, а тем же путем откуда оно к с программатора идет. Может у тебя питалово тупо не доходит и вся схема питается паразитно через что нибудь. Например через порты.

            1. Не, я туда же и сажу что с программатора сформированный на штырьках разъем, что с батареек/другого бп на те же штырьки. Чуть выше на эрджихосте разводка в протеусе, если есть чем открыть можешь поглядеть… но я уже подумываю под мегу32 переписывать код ))) других мыслей тупо нету

  53. Да в конце вашего ролика посмотрел топологию… на сколько увидел…
    на сколько понял — вы сильно «прислушиваетесь» к знаниям автора «ликбеза»… но datasheet ведь никто не отменял…
    1. смотрите стр. 24 — где емкости?
    2. у вас много цифровых ИМС, в том числе и сам контроллер… где на каждый корпус по кондеру на 0.1-0.33 nF?
    3. на вашей топологии не вижу в упор цепи сброса на 1 ноге…. (а с программатора «1» конечно формируется)…
    … в общем все что смог на топологии увидеть в вашем ролике…

    1. Спасибо большое за уделенное внимание и советы! Но я забыл сюда отписаться, так как все у меня решилось заменой контроллера на мегу32 (мои любимые бо с них начинал =) ).
      С самой платой я поступил по-варварски — взял и отрезал ее часть, где контроллер и его обвязка. Развел по новой все под 32ю мегу, распаялся.. после естественно переписал код слегка под новый МК, бо все же есть отличия и работы Епром и SPI (впрочем наверное и все). Шью, и вуаля — все работает как часы, вся моя заложенная логика…

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

  54. А мне вот в голову пришла безумная идея. А если подключить светодиод к ножке МК без резистора и запитать это дело ШИМом? Будет работать или сгорит от импульсов?

    1. В принципе можно. Диод дохнет от перегрева, а на большой частоте шима он не будет успевать нагреваться, но будет превышение тока через кристалл и вообще довольно большой ток через шину питания мк (особенно если питание МК 5 вольт), что может грохнуть сам контроллер.

  55. Всем доброго! Господа, помогите, пожалуйста, с проблемкой на ATtiny13A, если кто знает. Проблема внешне чем-то сходна с проблемой mastah_killah. Во многих «бытовых» проектах, встречаемых на просторах Сети, в качестве питалова используют зарядное устройство для мобильника. Так же решил поступить и я, но оказалось, что МК корректно не запускается. Причина, в принципе, понятна — пляски питания в момент запуска «БП». Запитал от компьютерного БП (отдельный на столе) — тоже плохо переносит запуск блока. Попробовал поставить ёмкость (кажется, был 10 мкФ электролит и 1 мкФ керамика, после — только 1 мкФ керамика) возле МК — на затянутый подъём питания МК реагировал тем же «висом». В ходе экспериментов было обнаружено, что тинька нормально запускается только при резком фронте питания. Пробовал задействовать встроенную систему контроля питания (BOD) — результат тот же, пробовал ввести банальную программную задержку при запуске — ему пофиг. Кстати, по Reset’у МК тоже нормально не перезапускается — виснет. Та же программа в tiny2313A работает без проблем (по крайней мере, не с такими). Кто знает, эти мелкие тиньки 13 реально такие глючные или у меня всё же руки немного непрямые? Ещё один замеченный глюк «тринадцатой»: не могу изменить режим работы таймера во время работы программы — как выставил его при старте, так он и работает. Сразу скажу, дело не в конкретном кристалле, пробовал на двух разных, результат один.
    Просьба помидорами сильно не бросать. Всем заранее спасибо!

    1. А тупая замена тини13 на 2313 (ну там на соплях повесить) решает проблему? А то слишком странно как то. Я С тини13 делал вещи и никаких особых ее пищевых пристрастий не заметил.

  56. Прошу прощения за долгое отсутствие — обстоятельства.
    А по делу — его величество Случай, чтоб его… В общем, как выяснилось, причина некорректной работы схемы — в разводке. Тут, думаю, нелишним будет сказать, что тружусь над сенсорным выключателем. И при запуске МК от сетевого адаптера, видать, неправильно калибровка проходит и он на прикосновение не реагирует. Как выяснилось, проблема в прохождении дорожек питания на двухсторонней плате под площадкой сенсора. А случай тут вот причём: когда на макетке игрался с разными процами, сенсором была медная пластинка на проводке и совпало несколько раз так, что при установке на плату 2313 пластинка лежала в стороне, а при установке 13 — ложилась над шиной питания. Вот вам и теория вероятности. Теперь весь вопрос в том, как сделать так, чтобы это всё нормально заработало. Кстати, DI, у тебя здесь есть что-нибудь на тему сенсоров? Когда-то, кажись, натыкался на статью, а сейчас что-то не нашёл. Попробую ещё по форуму посмотреть — может, там кто подскажет что-то. И в завершение: по Reset 2313 тоже нормально не стартует. Вот в чём причина — понять не могу. Программа начинается с начала, регистры очищаются, а идёт затык. Кстати, после Reset’а стартует нормально только первый раз после прошивки — включаю программатор, шью, убираю Reset — стартует чудненько. Нажимаю на кнопочку сброса — всё, писец. Все дальнейшие перезапуски — только питанием.

  57. У меня вопрос. Что будет, если при ВЫКЛЮЧЕННОМ питании контроллера на какую-нибудь ногу порта придет 5 вольт? В каком состоянии находятся порты при выключенном питании?

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

          1. Все буферы управляются инверсным сигналом. Когда я снимаю питание с контроллера, на управлении должно быть 5 В, тогда выходы будут в HI-Z. Наколхозил схему на 74HC125:

            http://i57.fastpic.ru/big/2015/0303/26/992b73e03759ce37be5f19b13956c026.png

            a,b,c,d — внешние сигналы, гуляют сами по себе.

            Будет работать? Или может изящнее вариант есть? Только без логических инверторов — еще одну микруху городить не хочется.

            1. Вообще, мне кажется, задача довольно распространенная: отключить входные сигналы при снятии питания с контроллера. Неужели нет простого решения? Нигде не могу найти такую схему.

  58. Меняешь пространственную конфигурацию — все твои емкости уплывают непойми куда. Калибруй заново.

    То, что они уплывают, это понятно. И дабы избежать подобного, при включении контроллер замеряет ёмкость сенсора и дальше уже «пляшет» от неё, т.е. калибровка автоматическая и, теоретически, топология и пр. влиять не должны. Получается, что мк при дорожках питания под сенсором при калибровке насчитывает слишком большую ёмкость, так что-ли? Но почему? И, что главное, как от этого уйти?

  59. Если между ногой МК и катодом светодиода, соединённым с кнопкой, воткнуть обычный диод катодом на ногу МК, то мы получим защиту от того случая, когда порт будет работать на выход, на нём будет единица и будет нажата кнопка. Плюс можно будет без риска зажигать светодиод нулём и гасить единицей. Параллельно светодиоду можно впаять резистор на 10к так для уверенности, при работе ноги на вход.

    1. Или лучше резюк на 10к не параллельно светодиоду, а подтянуть им ногу МК. Получаем: нога МК, подтянутая на питание через резистор 10к, затем катод диода, анод этого диода на кнопке и катоде светодиода. Проще было бы на картинке показать)

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