Как стать программистом микроконтроллеров
У начинающих постоянно возникает один и тот же вопрос — с чего и в какой последовательности начать обучение. По любому предмету. В том числе и по микроконтроллерам.
Поэтому я решил написать эту статью, а для лучшего восприятия ещё и записал видео, где изложил свое видение того, что и как надо изучать, если целью является становление профессиональным программистом микроконтроллеров (ну или пусть даже не профессиональным, но высококлассным).
Это лишь обзор основных моментов, а не полное руководство к действию Назначение этой статьи — дать новичкам представление о том, что им нужно будет изучить, чтобы достичь своей цели. Итак, поехали…
Основы электротехники и электроники
Это первое, что должен знать человек, который хочет стать программистом микроконтроллеров. При чём здесь электроника, а тем более электротехника? Где инженер-электроник, и где программист микроконтроллеров?
Ну да. Для того, чтобы написать код на Ассемблере (или другом языке), не требуется знание электроники. Но неувязка в том, что вы не сможете создавать качественные программы, не понимая, как работает устройство на микроконтроллере. А понимать вы это не сможете, не зная основ электроники.
Поэтому электронику (ну хотя бы самые основы) вы должны знать. Если не знаете, и вам очень хочется приступить к изучению программирования, то можете отложить изучение электроники на потом. Но изучить её всё-равно придётся. Если уже созрели, то можете начать прямо се йчас с этого или вот этого курса.
Выбор микроконтроллера
Вообще микроконтроллер выбирается исходя из задач. Но на этапе обучения вам надо определиться с семейством микроконтроллеров, которые вы планируете изучать. Например, микроконтроллеры PIC или AVR.
Потом при необходимости вы можете перейти к изучению других микроконтроллеров. Но надо с чего-то начинать. И этот выбор я считаю важным. Потому что, честно говоря, сегодня я использую (по возможности) только то оборудование, которое уже знаю. Даже если есть другое оборудование, которое лучше подходит для решения конкретной задачи.
Почему? Потому что мне быстрее приспособить то, что я знаю, к задаче, чем изучить новое (особенно если решаемая задача — разовая, а таких у меня большинство). А время для любого профессионала — это главное. И я не могу его тратить впустую.
Поэтому, однажды выбрав семейство микроконтроллеров, вы, скорее всего, уже никогда не перейдёте на другое (ну разве что в этом будет очень сильная необходимость).
И поэтому я советую выбирать для обучения распространённое семейство микроконтроллеров, чтобы потом не пришлось переучиваться. А самыми распространёнными (ну во всяком случае среди любителей) являются микроконтроллеры PIC и AVR.
Документация на микроконтроллер
На начальном этапе обучения документацию на конкретный микроконтроллер можно не изучать. Однако при профессиональной разработке это будет необходимо. Так как чтобы выжать из микроконтроллера все его возможности, надо эти возможности знать на 100%. А узнать их (и при этом быть уверенным, что это соответствует реальности) можно только из официальной документации на конкретный прибор.
Здесь новичков ждёт неприятный сюрприз — практически вся оригинальная документация на английском языке. Поэтому, если вы только начинаете, то можете не расстраиваться из-за этой маленькой неприятности. Но на всякий случай английский лучше начать потихоньку изучать.
Среда разработки
Каждый профессионал должен в совершенстве владеть профессиональным инструментом.
Если солдат плохо владеет ножом или автоматом, то его просто убьют в первом же бою.
Законы выживания программистов не столь суровы. Однако и здесь умение владеть инструментом играет решающую роль.
Если вы не хотите быть пушечным мясом в конкурентной войне за высокооплачиваемые вакансии, то вы должны в совершенстве владеть вашим рабочим инструментом — средой разработки, в которой вы создаёте программы для микроконтроллера.
Возьмите за правило — каждый день читать один раздел (или хотя бы один абзац) из справочной документации на среду разработки.
Язык программирования
Ну и, разумеется, для того, чтобы стать программистом микроконтроллеров, вам надо знать хотя бы один язык программирования хотя бы для одного микроконтроллера.
При этом не забывайте, что у каждого микроконтроллера свой набор команд. А у микроконтроллеров разных моделей (и даже иногда у разных семейств одного производителя) ещё и свой язык Ассемблера.
Но знать язык тоже надо в совершенстве. И, несмотря на кажущуюся сложность, изучать программирование микроконтроллеров лучше именно на ассемблере, а не на языках высокого уровня (об этом я ещё поговорю в следующий раз). Впрочем, это лишь моё субъективное мнение.
Заключение
На этом обзор заканчиваю. Повторюсь — это лишь краткий обзор, а не пошаговый план. Если вас интересует пошаговый план становления программистом, то его можно найти здесь.
Ну а если вы уже созрели для серьёзного изучения микроконтроллеров, то в который уже раз советую начать вот с этого курса.
С чего начать изучение микроконтроллеров!

Товарищи! Развейте сомнения и направьте на путь истинный, с чего начать изучать микроконтроллеры их программирование и разработку простеньких плат? Сижу читаю разные форумы особо не понимаю, ввиду слабых знаний. Но назрело пару вопросов:
1 Какой язык программирования нужен, С, С++ или еще какой.
2 Какие микроконтроллеры взять для начала AVR, Attiny.
3 Какие нужны программаторы и программы для них.

1. для простеньких плат пойдёт BASCOM AVR, это разновидность бейсика. смысла забивать голову тонкостями С не вижу.
2. если выбирать из предложенного, то я бы взял какую-нибудь мегу, например Atmega8. потом, по ходу пьесы, поймешь, как подбирать нужный камень под конкретную задачу.
3. программатор лучше всего конечно USBASP, заказать в китае. там же можно заказать и меги, выйдет дешевле, чем у нас покупать. шьющий софт — ну например Khazamaa, проще ничего нет. а вообще, если не ошибаюсь, баском сам и шить может.

Баском походу только платные, есть ломанные?


Баском походу только платные, есть ломанные?
платный баском, кстати, до 4 килобайт кода работает нормально. так что, для простых программ любой подойдет

мне бы 1килобайт написать:)

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

1. для простеньких плат пойдёт BASCOM AVR, это разновидность бейсика. смысла забивать голову тонкостями С не вижу.
2. если выбирать из предложенного, то я бы взял какую-нибудь мегу, например Atmega8. потом, по ходу пьесы, поймешь, как подбирать нужный камень под конкретную задачу.
3. программатор лучше всего конечно USBASP, заказать в китае. там же можно заказать и меги, выйдет дешевле, чем у нас покупать. шьющий софт — ну например Khazamaa, проще ничего нет. а вообще, если не ошибаюсь, баском сам и шить может.
плюсану за бейсик ).
из него же и шить можно, он много программаторов понимает.

я с ардуино начал и никак не слезу.
сегодня поставил Atmel Studio 7 на свой комп.
после настройки и русификации.
мне кажется ардуино и Atmel Studio
это как блокнот и Word. Excel.
:)))

Какие ардуинки брать? С Али нормальные?

ардуино нано328.
у меня все с али.
продавцы все разные и ок.
нано328 недорог и универсален.
168 то ко не берите

может есть какой форум на котором чайникам объясняют как все программировать и чем, а то чем больше узнаешь тем больше вопросов.


может есть какой форум на котором чайникам объясняют как все программировать и чем, а то чем больше узнаешь тем больше вопросов.

Какие ардуинки брать? С Али нормальные?
ардуино это легкий старт.
в первом классе не преподают «война и мир»

еще больше запутал 🙁

я хотел сказать ардуино очень легкий

Я б не советовал, если бы не было)

arduino.ru/Reference
на одной станице все поместилось


вступите в группу ардуино для авто.
почитывайте
www.drive2.ru/communities/941

А с аналоговой схемотехникой у вас полный порядок?

прямо вот полный порядок, думаю, только у профессионалов может быть)
а так, человеку должно хватить усвоения учебника по типу вот этого: www.labirint.ru/books/150354/


Народ, зря вы про бейсик, ИМХО. Очень уважаю этот язык, даже в некотором роде являюсь его хранителем для ретрокомпьютеров, но для МК он совсем не айс.
Лучше начинать или с визуального ассемблера типа Algorithm Builder (форум — getchip.net), или с облегченного и имеющего хороший встроенный мастер компилятора С, именуемого CodeVisionAVR. Ковыряюсь с МК уже лет 15-ть. Мучаю AVR8, STM8, STM32. Любимыми остались разумеется АВР 🙂



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

Без машины
Язык Си. Тут как бы без вариантов. Все МК, что я знаю, программируются на Си. Не нужно даже серьезно воспринимать советы про всякие Бейсики и прочие извращения.
А дальше есть более простой путь и более сложный.
Более простой это проект/платформа Ардуино. Это быстрый и простой старт. Легко можно начать делать поделки. Куча примеров и готовых библиотек.
Ардуино это всего лишь обертка, набор функций, которая скрывает всю архитектуру МК от программиста. Например чтобы сменить уровень на ножке МК в Ардуино будет выполнено с десяток реальных инструкций МК, хотя если писать на Си самого МК это делается одной инструкцией. Соответственно производительность в данном случае падает на порядок. Можно взять платку на AVR, а завтра подумать что надо что-то побыстрее и взять STM32. Совсем другой МК, а функции все те же.
Уровень программистов Ардуино и их код в сети зачастую тоже соответствующий по определению, так как это люди которым влом было изучать МК :).
Более сложный путь это изучать архитектуру самого МК и писать код в средах разработки предоставляемых производителем МК. Так можно изучить реальные возможности МК, выбрать любой МК и получить быстрый и компактный код.
Если выбрать этот путь, то из 8бит популярны AVR, из 32бит STM32. Для них тоже достаточное количество кода, поделок и программистов в сети, которые могут поделиться кодом или советами.
Вывод.
Язык — Си.
Платформа:
1. Ардуино. Быстрый и простой старт. Но не эффективный код. Архитектура и возможности МК останутся скрыты.
2. Среда разработки самого МК и изучение его архитектуры. Потребуется чтение и изучение мануалов. Хотя можно было бы уже иметь готовое устройство на Ардуино. Но зато потом полное представление о возможностях МК, компактный и эффективный код. Можно выбрать себе какой хочешь МК.
По железу, бюджетный вариант. На алиэкспресс можно купить под популярные МК платки с напаянными МК и гребенками-выводами. Например если купить платку ардуино, это не значит что ее можно программировать только на ардуино. Это же обычный МК AVR на платке и можно так же в AtmelStudio на Си самого МК программировать.
Так же есть платки с разными датчиками, энкодерами, дисплеями, так же с гребенками. То есть без всякой пайки можно соединять проводками и программировать/изучать.
P.S. Невозможно в одном посте все рассказать подробно. Но старался быть не предвзятым :). Например, я для себя из 8мибиток вообще выбрал STM8/Keil. AVR, лично для меня, во всем проигрывает STM8. Но я этот вариант даже не предлагаю. Не для тех, кто только хочет начать.
P.P.S. Ток заметил что уже год прошел. Но не стирать же уже свою простыню :)))
Микроконтроллеры. Основы. Базовые принципы. Освоить, изучить
Вам просто необходимо сперва посмотреть на характеристики, почитать документацию, набор команд одного и другого типа, чтобы решить для себя, на чем остановиться. Да, да. Остановиться придется, если вы не собираетесь каждый день разрабатывать новые устройства. И не только на семействе, но и на моделях. Лучше знать одну-две модели микроконтроллеров на «отлично», чем 10 посредственно. Это скажется на качестве ваших разработок.

Я для себя остановился на семействе AVR. Мне оно показалось как-то роднее, что ли. Я начинал еще с процессоров Z80, Intel 8088 и во мне простенькая 8-битная архитектура вызвала какие-то теплые чувства. Вот, признался в любви к процессорам. Прочитала бы это моя жена.
Поэтому дальше я уже продолжаю рассказывать вам об AVR устройствах. Многое из этого будет справедливо и для семейства PIC. В узкоспециальные функции я лезть в этой статье не буду, чтобы сохранять некую общую картину, справедливую для всех микроконтроллеров. В продолжении статей мы попытаемся разобраться и ‘изготовить’ наиболее простые устройства, с освоения которых вы сможете начать свой собственный путь.
Вашему вниманию подборка материалов:
Практика проектирования электронных схем Искусство разработки устройств. Элементная база. Типовые схемы. Примеры готовых устройств. Подробные описания. Онлайн расчет. Возможность задать вопрос авторам
Прежде чем продолжать, расстрою вас еще разок. Или даже не так. Предупрежу, куда вы собираетесь.
С чего начать. Основы
Фактически – микроконтроллер это ‘голый’ компьютер. Он оперирует битами, байтами, адресами и ячейками памяти. Вам необходимо хорошо разбираться в работе всей архитектуры. Вас не должны пугать машинные команды, вы должны хорошо знать системы счисления, уметь писать либо на Си, либо на ассемблере. Лучше и так и так. В крайнем случае, вам не должно составлять особой трудности в этом разобраться. Плюс – ваши познания в электронике.
Если вы не знаете закон Ома, то начните сперва с изучения основ электроники и электротехники. Это обойдется существенно дешевле спаленных микроконтроллеров и прочих деталей. А если вы собираетесь изготавливать силовые устройства, то без хорошего понимания электротехники и правил безопасности лучше к ним даже не подходите. Попросите лучше других людей!
Вам придется спаривать микроконтроллер с датчиками, исполнительными устройствами и разными прочими интерфейсами. Иногда, увы, приходится даже писать самому драйверы для взаимодействия с другими чипами и устройствами. Вы должны быть к этому готовы. Микроконтроллер может выдавать и получать сигналы только в одной форме – логического нуля и единицы, за неким исключением типа компаратора или АЦП. Соответственно, все цепи управления и данных нужно приводить к общему знаменателю, понятному микроконтроллеру (далее – МК).
В моем случае мне просто повезло. Си знаю, с основами электроники и электротехники знаком. На самом деле моих познаний в электронике, программировании и микропроцессорах оказалось (о чудо!) вполне достаточно, чтобы через два дня изучения материалов я принялся нечто создавать. Забегая вперед, скажу, что мое ‘нечто’ в итоге оказалось весьма навороченным трехблочным устройством с дисплеем и сохраняемыми настройками, которое (тьфу-тьфу) превосходно работает по сей день.
Я не электронщик и не гуру микроконтроллеров, хотя и закончил приборостроительный факультет. Есть люди гораздо глубже меня понимающие суть вопроса. Я лишь попробую вам рассказывать все с точки зрения вполне обычного человека. Если где ошибусь – пишите на сайт, поправим!
Преимущества схем на микроконтроллерах
Теперь о хорошем. Вам, наверное, повезло. Первоначально планировалась небольшая статья о микроконтроллерах. Я ее написал почти в том виде, как вы сейчас читаете. Лишь для того, чтобы рассказать некие основы и где, что искать. Но, как говорится, аппетит приходит во время еды. После того, как я отправил статью в редакцию, было принято решение о цикле статей, в которых будет более исчерпывающая информация с примерами схем и кода. Что я и буду пытаться сделать. Если у вас возникнут какие-то пожелания по содержанию будущих статей, пишите, пожалуйста, в редакцию. Я постараюсь их учесть. Сразу скажу – проектирование и описание сложных схем не входит в наши планы. Все примеры я буду делать на базе сборки ATMega 16, фото которой вы сможете увидеть ниже по тексту. Там у меня есть и динамик, и светодиоды, и кнопки, и дисплей.
К сожалению в статьях периодически встречаются ошибки, они исправляются, статьи дополняются, развиваются, готовятся новые. Подпишитесь, на новости, чтобы быть в курсе.
Если что-то непонятно, обязательно спросите!
Задать вопрос. Обсуждение статьи.
Понижающий импульсный источник питания. Онлайн расчет. Форма. Подавлен.
Как рассчитать понижающий импульсный преобразователь напряжения. Как подавить пу.
Повышающий импульсный преобразователь напряжения. Силовой ключ — бипол.
Как сконструировать повышающий импульсный источник питания. Как выбрать мощный т.
Источник высокого напряжения для озонатора, ионизатора, экспериментов.
Как изготовить преобразователь с высоким выходным напряжением для формирования и.
Повышающий импульсный стабилизатор напряжения, источник питания. Преим.
Как работает повышающий стабилизированный преобразователь напряжения. Где он при.
Прямоходовый импульсный преобразователь напряжения. Выбор ключа — бипо.
Как сконструировать прямоходовый импульсный источник питания. Как выбрать мощные.
Мощный полевой транзистор irfp2907. МОП, MOSFET. Свойства, параметры, .
Применение и параметры IRFP2907, мощного полевого транзистора, рассчитанного на .
Программирование микроконтроллеров. С чего начать?

Достаточно часто в личке ко мне обращаются люди с просьбой дать ссылки на полезные сайты, нужную информацию по программированию микроконтроллеров, необходимые программы и т.п. находясь при этом в самом начале своего познания микроконтроллеров. Сам я проходил через это буквально полтора года назад, имея нулевые знания и знаю, насколько это сложно, дать себе первоначального пинка, разобраться в лавине информации по микроконтроллерам, которую выдают поисковики, когда на тебя обрушивается куча непонятной информации и т. п.
Постараюсь объяснить на простом языке, для людей, умеющих держать паяльник, знающих, что такое цифровая микросхема логики, умеющих читать схемы и пользоваться мультиметром.
Микроконтроллеры бывают разных фирм, которые делают одно и тоже дело, но разными методами. Сравнить это можно с человеческими расами: европейцы, китайцы и африканцы например. Я лично работаю с микроконтроллерами фирмы Атмел, про них и буду говорить. Ну уж пошло сравнение с расами, пускай это будут европейцы.) Программы для микроконтроллеров пишут на языках программирования. Я рекомендую начать с языка Си. Это древний и простой язык. Для написания текста програмы используют программы компиляторы. Они позволяют создавать, редактировать и переваривать написанный программистом текст программы в код (прошивку), который можно загрузить (прошить) в микроконтроллер. Таких программ есть множество. Пример для Атмел: Code VisionAVR, родная от Атмел AVR Studio, Bascom-avr и ещё.
Эти программы делают одно и тоже дело, но своими методами, особенностями достоинствами и недостатками. При это текст Си в тих программах компиляторах немного отличается, но в общем похож. Можно сравнить с различием украинского, русского и белорусского языка. Я использую Code VisionAVR, что и советую начинающим.
Далее я приведу простой текст программы, написанный на языке Си в компиляторе Code VisionAVR для микроконтроллера ATTiny13A. В конце темы есть проект, прошивка и проект для эмулятора протеуса. Микроконтроллер в этой программе умеет делать простую вещь: при помощи кнопки менять логическое состояние на двух выходах, при этом короткое нажатие меняет состояние первого выхода а длинное — второго. В автомобиле например эту схему можно применить для управления одной кнопкой обогревом заднего стекла (которая есть у многих штатно) и добавленным обогревом зеркал. Нажал коротко на кнопку — сработал обогрев стекла, нажал ещё — обогрев стекла выключился. Если нажать и удерживать кнопку, то через какое-то время включиться обогрев зеркал. Если нажать и удерживать кнопку повторно — обогрев зеркал отключится.
Для понятия текста нужно знать грамматику, правила писанины языка Си, этого материала в интернете предостаточно. Так же желательно ознакомиться хотя бы с материалом, по использованию мастера создания проектов в CodeVisionAVR.
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
www.hpinfotech.com
Project :
Version :
Date : 28.01.2012
Author :
Company :
Comments:
Chip type : ATtiny13A
AVR Core Clock frequency: 9,600000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 16
*****************************************************/
unsigned char b, trig;
void main(void)
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTB=0x01;
DDRB=0x06;
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
GIMSK=0x00;
MCUCR=0x00;
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;
А теперь поподробнее.
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
www.hpinfotech.com
Project :
Version :
Date : 28.01.2012
Author :
Company :
Comments:
Chip type : ATtiny13A
AVR Core Clock frequency: 9,600000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 16
*****************************************************/
Это шапка, в которой содержится описание проекта, необходимые данные. Текст закомментирован знаками комментария /* в начале и */ в конце. Все, что находится между этими знаками программой не выполняется. Самое полезное здесь это указание типа микроконтроллера и его частота.
Это ссылка на библиотеку. Если какая либо библиотека необходима, то она должна быть здесь указана. У нас есть библиотека самого микроконтроллера tiny13a.h, и библиотека задержек времени.
unsigned char a, b, trig;
Объявление трех переменных. unsigned char . Что это такое можно посмотреть здесь Вообще всё непонятное копируем в буфер и ищем в поисковике.
void main(void)
// Declare your local variables here
void main(void) — это оператор, говорящий что началась основная часть программы на Cи и микроконтроллер будет её с этого места выполнять. Все что начинается с // — это комментарий. Старайтесь чаще ими пользоваться. Вообще конкретный комментарий генерирует сам компилятор, как и во многих других местах. Большинство комментариев я удалил, что уменьшить текст.
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
В комментарии по английски написано, что это такое. Это первая команда микроконтроллеру, одна из команд, которая настраивает нужные функции, порты и необходимые части микроконтроллера, необходимые для его работы и запуска.
Конкретно это настройка частоты делителя тактовой частоты микроконтроллера. Теперь подробнее:
Микроконтроллер имеет тактовый генератор, который задается в мастере и который потом можно изменить в свойствах проекта если что. У нас эта частота 9.6 мегагерца, как видно в шапке.
При прошивке микроконтроллера эту же частоту нужно указать во фьюзах.
CLKPR=0x80; и CLKPR=0x00; это команды настройки регистра внутреннего делителя этой частоты. Задается оно в мастере в первом окне «CHIP». Если у нас выбран делитель 1, то тактовая частота делиться на 1, то есть остается без изменений. Если указать например делитель 128, то соответственно тактовая частота делиться на это число. 9.6Мгц / 128 = 75кГц. и значения регистра делителя будет выглядеть:
CLKPR=0x80;
CLKPR=0x07;
Особо внимательные заметили, в регистр делителя CLKPR сначала пишется число 0x80 а затем сразу 0x00. Нафига пишется сначала одно значение а потом сразу другое? Если у вас возникают какие либо вопросы по регистрам и не только, приучайтесь сразу читать даташиты. Там все подробные ответы на чистом английском языке. Открываете даташит, вставляете в поисковик текста название регистра (CLKPR ) и ищете его описание, за что какие биты данного регистра отвечают. Конкретно у этого регистра для изменения делителя необходимо записать единичку в седьмой бит, после чего микроконтроллер даст изменить и выбрать необходимый делитель в первых четырех битах этого регистра. После того, как пройдет четыре такта выполнения команд процессора, изменить регистр будет уже нельзя. Нужно снова сначала изменить седьмой бит CLKPR=0x80 а затем указать делитель CLKPR=нужный делитель
PORTB=0x01;
DDRB=0x06;
Команды управления и настройкой портов микроконтроллеров — ножек чипа. Задается тоже в мастере. В этих регистрах задается работа на вход порта PB0 и подключается к нему внутренний Pull-up резистор. Порты PB1 и PB2 настраиваются «на выход» с логическим нулем на выходе в их состоянии.
В колонке DataDitection мы указывает тип порта: вход или выход (in или out)
В колонке PullUp/Output Value указываем подключение подтягивающего резистора pullup если порт настроен на вход (P — подключен, Т — неподключен) Если порт настроен на выход, то можно указать его логическое состояние 0 или 1. У нас нули. Строчки Bit0 — Bit5 это порты микроконтроллера PORTB0 — PORTB5
Если посмотреть сгенерированный компилятором комментарий, то можно увидеть соответствие пинов и их настройку:
// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=In
// State5=T State4=T State3=T State2=0 State1=0 State0=P
Если перевести из 16-тиричного в двоичный значение регистров, то можно понять даже без даташита назначение битов в регистре:
PORTB=0x01 PORTB=0b00000001
DDRB=0x06 DDRB=0b00000110
Напоминаю, что при разложении в двоичный код младшие значения справа а старшие слева.
Незначащие нули слева можно не писать:
PORTB=0b1;
DDRB=0b110;
А можно вообще написать в десятичной системе:
PORTB=1;
DDRB=6;
Далее по тексту кода идет:
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
GIMSK=0x00;
MCUCR=0x00;
TIMSK0=0x00;
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;
ADCSRA=0x00;
Настройка таймера микроконтроллера, прерываний, АЦП, компаратора и всего такого пока сложного. Пока его не используем — рановато. У всех этих регистров стоят в значениях нули, это значит, что они отключены. А особо внимательные заметили, что какой-то регистр ACSR имеет значение =0x80; Лезем в даташит и читаем:
Analog Comparator Control and Status Register – ACSR
Вообще, как правило название всех регистров это сокращение от первых букв или части их полного названия.
Если стоит значение данного регистра 0x80, значит в двоичной системе это число 10000000, значит стоит единичка в 7 бите этого регистра, значит читаем в даташите, что он означает:
• Bit 7 – ACD: Analog Comparator Disable
When this bit is written logic one, the power to the Analog Comparator is switched off.
This bit can be set at any time to turn off the Analog Comparator. This will reduce power
consumption in Active and Idle mode. When changing the ACD bit, the Analog Comparator
Interrupt must be disabled by clearing the ACIE bit in ACSR. Otherwise an interrupt
can occur when the bit is changed.
По-русски это означает, что установка единицы в этом бите отключает аналоговый компаратор, что его можно выключить в любой момент, что это приводит к снижению потребления электричества, и в конце текста написано про зависимости и что нужно соблюдать, если нужно изменять этот бит.
После того, как микроконтроллер настроен запущен и выполнена инициализация необходимых частей и выполнены необходимые первоначальные команды в void main(void) в дело вступает его величество главный цикл. Все что находиться внутри этого главного цикла while (1) и заключено в скобки начала и конца > будет крутиться, команды выполняться по кругу от начал до конца. А у нас в нашем коде будет крутиться алгоритм опроса кнопки, подключенной к порту PB0, от состояния которой (нажата кнопка или нет) будет меняться состояние выходных портов PB1 и PB2
На картинке видна схема собранную в эмуляторе Протеус схему, которая позволяет видеть работу кода программы.
Теперь про сами основные команды, которые находятся внутри цикла. Все команды используют один оператор if Это условие ЕСЛИ.
Если в регистре PINB в бите, отвечающем за порт PB0 микроконтроллера.0 содержится значение равное нулю ==0, то выполняем кучку кода, которая находится далее в границах скобок и >
Короче, если нажата кнопка то выполняется следующий код в границах последующих скобок и >
Далее после кучки кода в скобках видим оператор else и ещё кучку кода за ним в скобках и >
Оператор else переводится не как ещё а как иначе
Оператор if и else всегда работают в паре, сначала идет if затем else. Оператор else можно не использовать совсем, если он не нужен.
В нашей ситуации алгоритм можно описать так:
если (нажата кнопка подключенная к порту PB0)
то выполняем кучку кода;
>
иначе (кнопка не нажата)
выполняем эту кучку кода;
>
Так как это все находится внутри главного цикла, то этот код будет выполняться по кругу, будет постоянно опрашиваться кнопка и будет выполняться нужная кучка кода
Теперь рассмотрим кучку кода, которая выполняется, если кнопка нажата:
Операторы можно вкладывать друг в друга, как матрешку. то есть выполняется одно условие, потом если условие сработало, то другое внутри первого условия и т.д.
Если переменное значение trig равняется нулю, то выполняем инкремент переменной b Инкремент — операция увеличения значения, хранящегося в переменной, на 1. То есть при проходе выполнения кода, если процессор натыкается на команду инкремента b++, то процессор прибавляет единичку в число, которое находится в переменной b
Так же здесь применяется упрощенная «орфография» написания условия и команды, без скобок и >:
Такое представление используют, если после условия всего одна команда.
Немного отвлеклись, возвращаемся:
if (trig==0) b++; — если значение переменной равно нулю (а оно у нас равно нулю) то выполняем инкремент переменной b — переменная в была равна нулю, теперь стало единице.
Если переменная b больше ста, то выполняем кучку кода внутри скобок.
Переменная b за каждый круг цикла прибавляется на единичку и в итоге через сто «кругов» главного цикла выполниться условие, которая находится далее внутри скобок и >
Теперь рассмотрим что же там делается, если нажата кнопка, если прошло сто кругов цикла:
if (PINB.2==0)PORTB.2=1;
else PORTB.2=0;
trig=1;
b=0;
Здесь мы видим ещё одно условие (жирная такая матрешка получилась))
if (PINB.2==0)PORTB.2=1;
Если регистр состояния выходного порта PB, а точнее PB2 равен нулю, то меняем его состояние на единичку PORTB.2=1.
else PORTB.2=0;
Иначе пишем в регистр нолик. Или если по-другому: если регистр состояния выходного порта PB2 равен единице, то меняем его на ноль.
Короче если происходит выполнение этих условий и команд, то меняется логическое состояние выхода 2 (PB2) на схеме.
Если полностью описать: если нажата кнопка, если прошло сто кругов главного цикла, то меняем логическое состояние выхода 2 — PORTB.2 в коде он же порт PB2 на схеме.
Как уже стало понятно этот кусок кода отрабатывает длительное нажатие кнопки.
Но этого мало, дальше ещё есть две выполняемые команды присвоения:
trig=1; присвоение единице этой переменной необходимо, что бы описанное выше условие работы инкремента b++ перестало работать
b=0; обнуляем переменную b.
В итоге при длительном нажатии кнопки, условие при котором меняется состояние порта PB2 выполняется единожды, до тех пор, пока кнопка не будет отжата кнопка, ибо инкремент не будет работать и условие if (b>100) больше не сработает, если тупо нажать кнопку и не отпускать совсем.
Теперь вторая часть кучки кода, которая следует за первым условием:
else
if (b>4)
if (PINB.1==0)PORTB.1=1;
else PORTB.1=0;
b=0;
>
b=0;
trig=0;
>
Если кнопка отжата:
Опишем её с конца:
trig=0; присваиваем переменной trig значение ноль. Необходимо, что бы после длительного нажатия, когда наступит последующее отжатие кнопки микроконтроллер снова был готов к нажатиям кнопки ( срабатывало условие инкремента if (trig==0) b++;)
b=0; При не нажатой кнопке значение переменной b равняется нулю.
if (b>4)
if (PINB.1==0)PORTB.1=1;
else PORTB.1=0;
b=0;
>
Подробнее:
if (b>4)
Если значение переменной b больше четырех, то выполняем следующий код:
if (PINB.1==0)PORTB.1=1;
else PORTB.1=0;
Если состояние порта BP1 равно нулю, то делаем единицу, если нет, то ноль.
Это условие и команда отрабатывает кроткое нажатие кнопки. Если нажата кнопка, то начинает работать инкремент b++; значение которого начинает увеличиваться. Если отжать кнопку и при этом значение переменной b будет больше четырех ( но меньше ста — а то сработает длинное нажатие) то состояние выходного порта PB1 (он же выход 1 на схеме, он же PORTB.1 в коде) поменяется, сработает алгоритм короткого нажатия кнопки.
Если значение переменной b при отжатии меньше четырех, то условие не срабатывает и ничего не происходит. необходимо для работы «дребезга контактов» и ложных срабатываний.
И последнее это присвоение переменной b нулевого значения, что бы обработка алгоритма короткого нажатия происходило единожды.
В оконцовке главного цикла виднеется команда:
Это задержка в главном цикле. То есть, выполняется пошагово команды, затем процессор натыкается на команду delay_ms(10); и начинает её выполнять. В итоге процессор будет 10 миллисекунд ждать и ничего не делать в этой строчке, затем опять приступит к выполнению команд.
Находясь в одном общем цикле, скорость нарастания значения инкремента b++ зависит от времени задержки, указанной в delay_ms.
Команда delay_ms находится в библиотеке задержек #include , которую мы для этого и включили в начале кода.
Как видно из описания, длинное нажатие срабатывает от фронта сигнала нажатия кнопки ( начинает работать инкремент) а короткое нажатие кнопки — по спаду, то есть срабатывает по отжатию кнопки.
Вообще выполняемая здесь последовательность: условие + инкремент достаточно часто используемая команда и в языке Си присутствует отдельный оператор для этого for
Архив с прошивкой, исходником и моделью Протеуса:
umat.ru/files/Button_13.zip
ВНИМАНИЕ!
Архив перезалил 22 сентября 2014 года, обнаружил косяк в выставленной частоте в проекте. Теперь тактовая частота 1.2 Мегагерца, при этом фьюзы стоят по дефолту и их при прошивке трогать вообще не надо