Микроконтроллеры для начинающих

Микроконтроллеры для чайников
Что необходимо для того, чтобы стать профессиональным разработчиком программ для микроконтроллеров и выйти на этот уровень мастерства, который даст возможность без труда найти и трудоустроиться с высокой заработной платой (среднестатистическая заработная плата программиста микроконтроллеров по России на начало 2017 года составляет 80 000 рублей). Детальнее.

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

С данной публикации я начинаю длинный, и, надеюсь, увлекательнейший рассказ о микроконтроллерах. Но, так как этот цикл статей рассчитывается на начинающих, то рассказ этот будет с самых основ — с истории, с общих сведений и остальной околотехнической информации.
Давайте сразу договоримся, что я часто буду взамен длинного слова “микроконтроллер” принимать уменьшение МК.

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

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

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

Ну а пока перечень статей, которые доступны в наше время:

Микроконтроллеры PIC для начинающих

Сегодня на рынке есть ряд семейств и серий микроконтроллеров от популярных и неизвестных изготовителей, среди них можно отметить AVR, STM32 и PIC. Каждое из семейств нашло собственную область использования.
В данной публикации я расскажу начинающим о микроконтроллерах PIC, а конкретно, что это такое и что необходимо знать для начала работы с ними.

Микроконтроллеры для чайников

Что такое PIC
PIC – это наименование серии микроконтроллеров, которые производятся компанией Microchip Technology Inc (США). Наименование PIC происходит от Peripheral Interface Controller.
Микроконтроллеры PIC имеют RISC-архитектуру. RISC – сокращённый набор команд, применяется также в процессорах для мобильных устройств.
Есть множество примеров её применения: ARM, Atmel AVR и прочие.
Компания Microchip в 2016 году купила Atmel – изготовителя контроллеров AVR. Благодаря этому на официальном сайте представлены микроконтроллеры семейства и PIC и AVR.

Микроконтроллеры для чайников

Среди 8-битных микроконтроллеров PIC она состоит из 3-х семейств, которые выделяются архитектурой (разрядностью и набором команд).
Baseline (PIC10F2xx, PIC12F5xx, PIC16F5x, PIC16F5xx) ;
Mid-range (PIC10F3xx, PIC12F6xx, PIC12F7xx, PIC16F6xx, PIC16F7xx, PIC16F8xx, PIC16F9xx) ;
Enhanced Mid-range (PIC12F1xxx, PIC16F1xxx) ;
High-end или PIC18 (18Fxxxx, 18FxxJxx and 18FxxKxx).

Микроконтроллеры для чайников

Характеристики, которых приведены в таблице, которую увидите ниже.

Микроконтроллеры для чайников

Не считая 8 битных микроконтроллеров компания Microchip создает 16-битные:
DsPIC30/33F для обработки сигналов.
Представители 16-битного семейства работают со скоростью от 16 до 100 MIPS (исполнено миллионов руководств в секунду). Нужно отметить и характерности:
поддерживают ряд протоколов связи (UART, IrDA, SPI, I2S™, I2C, USB, CAN, LIN and SENT), ШИМ и другое.
Также есть семейство 32 битных микроконтроллеров – PIC32MX, главные особенности:

LCD дисплей на микроконтроллере ( перезапуск урок 3)

работают на частоте до 120 мГц;
АЦП: 10-бит, 1 Msps (скорость квантования), до 48 каналов.
С какого PIC начать?
Новичкам необходимо начать изучать микроконтроллеры PIC с 8-битной линейки. Вообще, изготовитель говорит про то, что спецификой всего семейства считается лёгкая переносимость программ с одного семейства на иное и совпадения цоколевки ряда моделей.
Одним из популярнейших в обстановке радиолюбителей микроконтроллеров считается PIC16f628A. Его технические свойства такие:
Есть встроенный тактовый генератор. Вы можете настроить для работы с частотой 4 или 8 МГц;
18 пинов, из них 16 – ввод/вывод, а 2 – питание;
Для работы на частотах до 20 МГц можно подключить кварцевый резонатор, однако в этом случае на ввод/вывод остается не 16, а 14 ног;
В маркировке есть буква F, это означает, что применяется FLASH-память, объёмом в 2048 слов;
14-битные инструкции, 35 штук;
На входах PORTB есть подтягивающие резисторы;
Два 8-битных таймера и один 16-битный;
Машинный цикл – 4 такта кварцевого резонатора или внутреннего генератора);
USART – методичный порт;
внутренний источник опорного напряжения;
Причинами популярности считается бюджетная цена и возможность тактирования от внутреннего генератора.
Какая цоколевка у 16f628 нарисовано ниже:

Микроконтроллеры для чайников

Блочная внутренняя схема этого микроконтроллера показана ниже.

Микроконтроллеры для чайников

На что необходимо посмотреть на схеме первым делом?
У этого микроконтроллера существует два порта PORTA и PORTB. Каждый пин, любого из них может применяться как выход и вход, и также для подсоединения периферии или задействования иных модулей микроконтроллера.
Рассмотрим данную часть схемы крупно.

Микроконтроллеры для чайников

К примеру, порты RB0-RB3 – выступают в роли аналоговых. К RA6, RA7 при необходимости подсоединяется источник тактирования (кварцевый резонатор).
Сами же выводы микроконтроллера настраиваются в режим входа/выхода при помощи регистра TRIS.
Для этого есть команды типа:
TRISA = 0; // Все выводы порта А монтируются как выходы
TRISB = 0xff; // Все выводы порта B назначаются как входы
TRISA0 = 1; // Так назначается отдельный пин как вход (1) или выход (0)
TRISA5 = 1 ; // тут 5 вывод порта А – назначен входом
Вообще рабочие режимы, включение WDT (сторожевого таймера) выбор источника тактирования микроконтроллера и другое настраевается при помощи регистров специализированного назначения — SFR, а память и данные хранятся в GFR – обычными словами это статическое ОЗУ.
В официальном Datasheet, на страничках 18-21 вы сможете найти 4 банка памяти регистров специализированного назначения SFR и регистров общего назначения GFR. Знание регистров важно, благодаря этому распечатайте и выучите указанные страницы из Datasheet .
Для удобства ниже приведены эти таблицы в виде картинок (нумерация регистров, как и все в цифровой электронике начинается с 0, благодаря этому номер 4-го – 3).

Микроконтроллеры для чайников
Микроконтроллеры для чайников
Микроконтроллеры для чайников
Микроконтроллеры для чайников

Как подключить и на каком языке программировать?
Чтобы запустить этот микроконтроллер нужно только подать плюс на Vdd и минус на Vss. Если необходим кварцевый резонатор, то он подсоединяется к выводам 16 и 15 (OSC1 и OSC2) микроконтроллера PIC16f628, для остальных контроллеров с большим или меньшим числом выводов – смотрите в datasheet.
Однако данный момент необходимо указывать при программировании и firmware.
Кстати о переносимости и совпадении цоколевки – на 16f84A – она аналогична, и на множестве прочих.

Микроконтроллеры для чайников

Фрагмент схемы с подключенным к pic16f628a внешним резонатором:

Микроконтроллеры для чайников

Существует два главных языка для программирования микроконтроллеров PIC – это assembler и C, есть и прочие, к примеру PICBasic и т.д. Еще можно отметить самый простой язык программирования JAL (just another language).
Например ниже приведена программа для «мигания светоизлучающим диодом» — своего рода «Hello World» для микроконтроллера PIC на языке C.

Микроконтроллеры для чайников

В 1 строке подсоединяется библиотека микроконтроллеров PIC, дальше подсоединяется библиотека программы задержки.
В функции main(void) перед началом монтируются начальные параметры, сродни тому как мы это делали в функции Void setup () – в статьях об ардуино. Дальше в строках 11-16 объявляется нескончаемый цикл while(1), в ходе которого и делается программа «мигания светоизлучающим диодом».
В примере состояние порта регулярно инвертируется, т.е. если он был в «0», то перейдет в «1» и наоборот. На C для PIC есть следующие команды управления команды:
PORTA = 0; // переводит все пины порта А в невысокий уровень (лог. 0)
PORTB = 0xff; // переводит все пины порта B в большой уровень (лог. 1)
RB5 = 1; // На пятом выводе порта B большой уровень
А так смотрится та же программа, однако уже на языке JAL, я перевел на русский язык комментарии от разработчиков вмонтированных примеров в JALedit (среда разработки).

Микроконтроллеры для чайников

Появляется соблазн подобрать JAL, и вам он может показаться легче. Разумеется на нём можно осуществить разные проекты, но с точки зрения пользы для вас как для специалиста – это бесполезный язык.
Намного больших результатов вы добьетесь, изучая синтаксис и принципы программирования на языке C (подавляющая часть востребованных в настоящий момент языков C-подобны) или на Assembler – это низкоуровневый язык, который заставит вас понимать рабочий принцип устройства и что происходит в программе в каждый определенный момент времени.
В чем работать
Если сказать совсем обобщенно для работы с самыми разными микроконтроллерами необходимо:
3. Программа для загрузки firmware в микроконтроллер.
И я даже читал старые учебники, где автор, работая из-под DOS писал код, компилировал и прошивал его различными средствами. Сейчас же под все распространенные операционные системы есть среды для разработки, как узкоспециализированные (для определенного семейства микроконтроллеров или семейств от одного изготовителя) так и многофункциональные (либо содержат все инструменты которые понадобятся, либо они подключаются в виде плагинов).
К примеру, в цикле статей об Arduino мы разглядывали среду Arduino IDE в ней же мы и код писали и при помощи нее «заливали» прошивку в «камень». Для микроконтроллеров PIC есть подобные программы, как:
MPASM — применяется для разработки на языке Assembler от фирмы Microchip ;
MPLAB — также IDE от Microchip для PIC-контроллеров. Складывается из большого количества блоков для тестирования, проверки, работы с кодом и компиляции программ и загрузки в микроконтроллер. Также есть версия MPLAB X IDE – отличается расширенным функционалом и выстроена на базе платформы NetBeans ;
MikroC — многоцелевая среда (не только для ПИКов) для разработки. Как следует из названия «заточена» под программирование на C, и также есть подобные программы как MikroBasic и MikroPascal, для надлежащих языков ;
JALedit — подойдет для языка JAL, о котором мы говорили выше ;
И ряд прочих менее популярных.

Микроконтроллеры для чайников

Как прошивать микроконтроллер?
Для PIC-микронотроллеров есть ряд программаторов. Официальным считается PICkit.
Их 4 версии. Но вполне можно прошивать и многофункциональными, к примеру, TL866 (он поддерживает практически все, что может пригодится начинающему радиолюбителю, при этом очень недорогой).

Микроконтроллеры для чайников

Также в сети есть ряд разных схем программаторов для ПИКов, как для работы через COM-порт:

Микроконтроллеры для чайников

Так и через USB (в действительности тоже com, лишь через преобразователь на ИМС MAX232).

Микроконтроллеры для чайников

Микроконтроллеры PIC16 годятся для обычных проектов, типа простой автоматики, вольтметров, термометров и других мелочей. Однако это не означает, что ни вкоем случае не делайте на этом семействе непростые и большие проекты, я привел пример того для чего очень часто их применяют. Для всеобщего представления советую увидеть несколько видео:
В одной статье рассматривать темы про то, как программировать микроконтроллеры, не имеет значение какого семейства, безсмысленно. Потому как это огромнейший объём информации. Для начинающих рекомендую к прочтению:
Катцен С. — PIC-микроконтроллеры. Все что вам важно знать;
Кёниг А. — Полное руководство по PIC микроконтроллерам;
Шпак Ю.А. — Программирование на языке С для AVR и PIC микроконтроллеров;
Магда Ю.С. — Микроконтроллеры PIC: архитектура и программирование;
Яценков В.С. — Микроконтроллеры Microchip. Практичное руководство.

Программирование микроконтроллеров для начинающих

Микроконтроллерами именуют особенный вид микросхем, применяемый для управления разными электронными устройствами.

Введение в микроконтроллеры

Это очень маленькие компьютеры, все составляющие которых (процессор, ОЗУ, ПЗУ) размещаются на одном кристалле. От процессоров их выделяет наличие таймеров, контроллеров, компараторов и остальных периферийных устройств.
В наше время микроконтроллеры используются при производстве:

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

Управление выполняется с помощью специализированных программ.

Микроконтроллеры для чайников

Программирование микроконтроллеров для начинающих

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

  • встраиваемого типа;
  • 8-, 16- и 32-разрядные;
  • цифровые сигнальные процессоры.

Изготовителям микроконтроллеров приходится часто уравновешивать между размерами, мощностью и стоимостью изделий. Благодаря этому даже в наше время в ходу 8-разрядные модели.
Они обладают довольно невысокой работоспособностью, но в большинстве случаев этот факт считается преимуществом, т.к. дает возможность экономить энергетические ресурсы. Цифровые сигнальные процессоры способны обрабатывать в настоящем времени большие потоки данных. Правда их цена значительно выше.

Кол-во применяемых кодов операций может быть неодинаковым. Поэтому используются системы команд RISC и CISC.
Первая считается сокращенной и делается за один такт генератора. Это дает возможность облегчить аппаратную реализацию ЦП, увеличить продуктивность микросхемы. CISC — непростая система, способная существенно повысить результативность устройства.

Выучить программирование микроконтроллеров для начинающих нереально без понимания алгоритмов. На ЦП микросхемы команды подаются в установленном порядке.
Причем их структура должна приниматься процессором определенно. Благодаря этому сначала программист составляет очередность выполнения команд.
Заставить ЦП немедленно остановить программу можно с помощью вызова прерывания. Чтобы это сделать применяют наружные сигналы либо встроенные периферийные устройства.

Семейства микроконтроллеров

Очень часто встречаются микроконтроллеры следующих семейств:

  • MSP430 (TI);
  • ARM (ARM Limited);
  • MCS 51 (INTEL);
  • STMB (STMicroelectronics);
  • PIC (Microchip);
  • AVR (Atmel);
  • RL78 (Renesas Electronics).

Одной из самых востребованных в электронной промышленности считается продукция компании Atmel, выстроенная на базе RISC-ядра. Первые микросхемы, разработанные в 1995 году, относятся к группе Classic.
Изучать программирование микроконтроллеров AVR для начинающих неплохо бы на более сегодняшних моделях:

  • Mega — семейство мощных микросхем с развитой архитектурой.
  • Tiny — дешевые изделия, которые имеют восемь выводов.

Нужно не забывать, что совместимость систем команд сохраняется лишь при переносе программы с малопроизводительного МК на более мощный.
Изделия компании «Атмел» просты и понятны.
Но для применения всего функционала придется создать ПО. Приступить к программированию микроконтроллеров AVR для начинающих рекомендуется с загрузки специальной среды Atmel Studio. Важная версия дается официальным сайтом изготовителя на бесплатной основе.
Для разработки ПО в данной обстановке дополнительные программные элементы не нужны.
Комплекс «Атмел Студио» включает большое количество примеров готовых проектов. Это поможет новичку быстрее постичь основные возможности и начать выполняя свой программы.
В нем также имеются модули для компиляции и финальной отладки кода. Одновременно с его освоением необходимо изучать языки программирования.
Без них создать ПО нереально.

Языки программирования

По собственной структуре языки программирования микроконтроллеров мало не похожи на те, что применяются для ПК. Среди них выделяют группы невысокого и большого уровня. Современные программисты по большей части применяют С/С++ и Ассемблер.
Между сторонниками таких языков ведутся бескрайние споры о том, какой самый лучший из них.
Низкоуровневый Ассемблер сейчас сдает позиции.
Он применяет прямые инструкции, обращенные конкретно к чипу. Благодаря этому от программиста требуется безупречное знание системных команд процессора.
Написание ПО на Ассемблере занимает долгое время. Важным преимуществом языка считается большая скорость выполнения готовой программы.
В действительности, можно применить фактически любые языки программирования микроконтроллеров.

Урок 27. EEPROM настройки | Часть 1 | Программирование микроконтроллеров AVR

Но актуальнее всех С/С++. Это язык большого уровня, дающий возможность работать со всеми удобствами.
Кроме того, в создании архитектуры AVR учавствовали создатели Си. Благодаря этому микросхемы производства «Атмел» приспособлены собственно к этому языку.

С/С++ — это прекрасное сочетание низкоуровневых и высокоуровневых возможностей. Благодаря этому в код можно внедрить вставки на Ассемблере.
Готовый программный продукт легко читается и модифицируется. Скорость разработки очень высокая. При этом подробное изучение архитектуры МК и системы команд ЦП не требуется.
Компиляторы Си снабжены библиотеками большого размера, что делает работу легче программиста.
Стоит отметить, что выбор благоприятного языка программирования зависит также от аппаратного обеспечения. При небольшом количестве оперативки применять высокоуровневый Си нецелесообразно.
В таком случае больше подойдёт Ассемблер. Он обеспечивает максимальное быстродействие за счёт короткого кода программы.
Многофункциональной среды программирования не существует, однако в большинстве бесплатных и коммерческих приложений можно применить как Ассемблер, так и С/С++.

Микроконтроллеры PIC

Первые микроконтроллеры PIC возникли во второй половине прошлого столетия. Быстрые 8-разрядные микросхемы компании Microchip быстро завоевали востребовательность. Двухшинная гарвардская архитектура обеспечивает беспрецедентную скорость.
Ее разрабатывали на основе набора регистров, для которого отличительно разграничение шин.
Подбирая язык программирования микроконтроллеров PIC, стоит предусмотреть, что в основе микросхем семейства лежит оригинальная конструкция RISC-процессора.
Симметричная система команд позволяет произвольно подбирать метод адресации, исполнять операции в любом регистре. На сегодняшний день компания «Микрочип» выпускает 5 разновидностей МК, которые совместимы по программному коду:

  1. PIC18CXXX (75 команд, встроенный аппаратный стек);
  2. PIC17CXXX (58 команд 16-разрядного формата);
  3. PIC16CXXX (35 команд, большой набор периферийных устройств);
  4. PIC16C5X (33 команды 12-разрядного формата, корпуса с 18–28 выводами);
  5. PIC12CXXX (версии с 35 и 33 командами, интегрированный генератор).

Во многих случаях МК PIC имеют однократно программируемую память. Встречаются не дешевые модели с Flash или ультрафиолетовым стиранием.
Выбор из 500 названий дает возможность подобрать изделие для любой задачи. В настоящий момент изготовитель концентрирует усилия на развитии 32-разрядных версий с увеличенным объемом памяти.

Языки программирования микроконтроллеров PIC — это Ассемблер и Си. Для кодирования подойдут любые объединенные среды разработки (IDE).
Программировать при их помощи особенно удобно. Они автоматично переводят текст программы в машинный код.
Важной характеристикой IDE считается возможность пошаговой симуляции работы готового ПО. Мы советуем пользоваться средой разработки MPLAB. Ее разработкой занималась компания Microchip.

Перед тем как приступить к работе в MPLAB рекомендуем каждый раз заводить отдельную папку. Это необходимо, чтобы не было путанницы в файлах проектов.
Интерфейс программы инстинктивно понятный, и проблем с ним возникнуть не должно. Для отладки применяются брендовые отладчики Pickit, ICD, REAL ICE, IC PROG.
В них есть возможность просмотра содержимого памяти, установки контрольных точек.

CAMOKAT-BETEPAHA › Блог › Программирование микроконтроллеров. С чего начинать?

Очень часто в личке ко мне обращаются люди с просьбой дать ссылки на полезные сайты, необходимую информацию по программированию микроконтроллеров, нужные программы и т.п. Находясь при этом в начале собственного познания микроконтроллеров. Сам я проходил через это буквально полтора года назад, имея нулевые знания и знаю, насколько это тяжело, дать себе первоначального пинка, разобраться в лавине информации по микроконтроллерам, которую предоставляют поисковые машины, когда на тебя обрушивается куча непонятной информации и т. п.
Постараюсь объяснить на простом языке, для людей, умеющих держать паяльный аппарат, знающих, Что такое цифровая микросхема логики, умеющих читать схемы и пользоваться мультиметром.
Микроконтроллеры бывают разнообразных фирм, которые выполняют одно и тоже дело, но различными методами. Сопоставить это можно с человеческими расами: жители стран Европы, китайцы и африканцы к примеру.
Я персонально работаю с микроконтроллерами фирмы Атмел, про них и буду говорить. Ну уж пошло сравнение с расами, пусть это будут жители стран Европы.) Программы для микроконтроллеров пишут на языках программирования.
Я советую начать с языка Си. Это старинный и обычный язык. Для написания текста програмы применяют программы компиляторы.
Они дают возможность создавать, редактировать и переваривать разработанный программистом текст программы в код (прошивку), который можно загрузить (прошить) в микроконтроллер. Подобных программ существует очень много.
Пример для Атмел: Code VisionAVR, родная от Атмел AVR Studio, Bascom-avr и ещё.
Данные программы выполняют одно и тоже дело, но собственными методами, характерностями плюсами и минусами. При это текст Си в тих программах компиляторах слегка отличается, однако в общем похож. Вполне уместно сравнить с различием украинского, русского и белорусского языка.
я применяю Code VisionAVR, что и рекомендую начинающим.
Дальше я приведу простой текст программы, написанный на языке Си в компиляторе Code VisionAVR для микроконтроллера ATTiny13A. В конце темы есть проект, прошивка и проект для эмулятора протеуса.
Микроконтроллер в данной программе умеет делать обычную вещь: с помощью кнопки менять логическое состояние на 2-ух выходах, при этом короткое нажатие меняет состояние первого выхода а длинное — второго. В автомобиле к примеру эту схему можно задействовать для управления одной кнопкой обогревом заднего стекла (которая есть у большинства штатно) и добавленным обогревом зеркал.
Нажал кратко на кнопку — сработал обогрев стекла, нажал ещё — обогрев стекла выключился. Если нажать и удерживать кнопку, то через некоторое время включиться обогрев зеркал.

Программирование микроконтроллеров avr для начинающих

Если нажать и удерживать кнопку еще раз — обогрев зеркал выключится.
Для понятия текста необходимо знать грамматику, правила писанины языка Си, данного материала в сети интернет множество. Также неплохо бы познакомиться хотя бы с материалом, по применению мастера создания проектов в 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
*****************************************************/

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

/*****************************************************
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 . Что это такое можно увидеть тут Вообще все непонятное копируем в буфер и ищем в поисковике.
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 мегагерца, как видно в шапке.

Микроконтроллеры для чайников

При firmware микроконтроллера эту же частоту необходимо показать во фьюзах.
CLKPR=0x80; и CLKPR=0x00; это команды настройки регистра внутреннего делителя этой частоты. Задается оно в мастере в первом окне "CHIP".
Если у нас подобран делитель 1, то тактовая частота делиться на 1, другими словами остается без изменений. Если показать к примеру делитель 128, то исходя из этого тактовая частота делиться на это число. 9.6Мгц / 128 = 75кГц. и значения регистра делителя будет смотреться:
CLKPR=0x80;
CLKPR=0x07;
Особо внимательные увидели, в регистр делителя CLKPR сначала пишется число 0x80 а потом сразу 0x00. Нафига пишется сначала одно значение а потом сразу другое?
Если у вас появляются какие либо вопросы по регистрам и не только, приучайтесь сразу читать даташиты. Там все развернутые ответы на чистом английском.
Открываете даташит, вставляете в поисковик текста наименование регистра (CLKPR ) и ищете его описание, за что какие биты данного регистра отвечают. Особенно у этого регистра для изменения делителя нужно записать единичку в седьмой бит, после этого микроконтроллер даст скорректировать и подобрать нужный делитель В первые четырех битах этого регистра.
После того, как пройдёт 4-ре такта выполнения команд процессора, скорректировать регистр нельзя уже будет. Необходимо опять сначала скорректировать седьмой бит CLKPR=0x80 а потом показать делитель CLKPR=необходимый делитель
Команды управления и настройкой портов микроконтроллеров — ножек чипа. Задается тоже в мастере. В таких регистрах задается работа на вход порта PB0 и подсоединяется к нему внутренний Pull-up резистор.
Порты PB1 и PB2 настраиваются "на выход" с логическим нулем на выходе в их состоянии.

Микроконтроллеры для чайников

Если увидеть сгенерированный компилятором объяснение, то можно заметить соответствие пинов и их настройку:
// 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=1;
DDRB=6;

Дальше по тексту кода идет:
Настройка таймера микроконтроллера, прерываний, АЦП, компаратора и всего такого пока сложного. Пока его не применяем — рановато.
У этих всех регистров стоят в значениях нули, это означает, что они отключены. А особо внимательные увидели, что какой-то регистр 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 более 100, то выполняем кучку кода в середине скобок.
Переменная b за каждый круг цикла добавляется на единичку и в конце концов через сто "кругов" основного цикла выполниться требование, которая расположена дальше в середине скобок <и >
Теперь рассмотрим что же там выполняется, если нажата кнопка, если прошло сто кругов цикла:
Тут мы видим ещё одно требование (жирная такая матрешка вышла))
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
Архив с firmware, исходником и моделью Протеуса:
umat.ru/files/Button_13.zip
ВНИМАНИЕ!
Архив перезалил 22 сентября 2014 года, обнаружил косяк в выставленной частоте в проекте. Теперь тактовая частота 1.2 Мегагерца, при этом фьюзы стоят по дефолту и их при firmware трогать совсем не нужно